Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数学,随机性并不那么随机_Javascript - Fatal编程技术网

Javascript 数学,随机性并不那么随机

Javascript 数学,随机性并不那么随机,javascript,Javascript,我正在做一个弹出框的基本游戏 我的问题是,如果你看一下地精攻击功能,它会一直重复,直到地精死亡,但伤害是随机的 例如,我每次对地精造成6点伤害,直到它死亡,而不是1到25之间的随机数,地精每次对我造成4点伤害。太无聊了。我希望每次点击都是随机的,但每次重复这个函数似乎不会给出一个随机数 //VARIABLES var dmgMultiply = Math.floor(Math.random() * 10 + 1); var dmg = 10; var armour

我正在做一个弹出框的基本游戏

我的问题是,如果你看一下地精攻击功能,它会一直重复,直到地精死亡,但伤害是随机的

例如,我每次对地精造成6点伤害,直到它死亡,而不是1到25之间的随机数,地精每次对我造成4点伤害。太无聊了。我希望每次点击都是随机的,但每次重复这个函数似乎不会给出一个随机数

    //VARIABLES
    var dmgMultiply = Math.floor(Math.random() * 10 + 1);
    var dmg = 10;
    var armour = 0;
    var hp = 100;

    //ENEMY VARIABLES
    var dmgGoblin = Math.floor(Math.random() * 10 + 1);
    var goblinHP = 100;

    //ARRAYS
    var choiceArray = ["Type 'sword' equip your sword.", 
                       "Type 'run' if you're scared.",
                       "Type 'stats' to see your stats."];
    var answerArray = ["sword", "run", "stats"];
    var outcomeArrayOne = ["You equip your sword.", 
                           "You run away. Game Over."];            
    var outcomeArrayTwo = ["Sword Equipped."]

    //GAME CHOICE
    function choice(a, b, c, x, y, z, aa, bb)
    {
         var answer = prompt(a + "\n" + b + "\n" + c);

         if(answer == x)
         {
              alert(aa);
              swordEquipped(outcomeArrayTwo[0]);
         }

         if(answer == y)
         {
              alert(bb);
         }

         if(answer == z)
         {
              displayStats();   
         }
    }

    //EQUIPPED SWORD
    function swordEquipped(a)
    {
        dmg = 25;
        dmgMultiply = Math.floor(Math.random() * 25 + 1);
        alert(a + "\n" + "DMG : " + dmg);
        goblinCombatStart("goblin");
    }

    //GOBLIN COMBAT START
    function goblinCombatStart(g)
    {
        alert("A wild " + g + " appears!" + "\n" + "The " + g + " has 100 HP!");
        goblinAttack("goblin")
    }

    function goblinAttack(g)
    {
        alert("The " + g + " swings his axe at you!" + "\n"  + "The " + g + " does " + dmgGoblin + " damage to you!");
        hp -= dmgGoblin;
        var attack = prompt("Type 'attack' to swing your sword at the " + g + "\n" + "HP : " + hp);

        if(attack == "attack")
        {
            alert("You swing your sword at the " + g + "\n" + "You did " + dmgMultiply + " to the " + g);
            goblinHP -= dmgMultiply;
            alert("The " + g + " is on " + goblinHP + "HP");

            if(goblinHP < 0)
            {
                goblinDead();
            }

            if(goblinHP > 0)
            {
                goblinAttack("goblin");
            }
        }
        else
        {
            alert("You dropped your sword an shouted " + "'" + attack + "'" + " in the goblins face. It wasn't very effective and the goblin choppped your head off");
        }
    }

    function goblinDead()
    {
        alert("You have slain the puny goblin with only a few scratches!");
    }

    //GAME START
    choice(choiceArray[0], choiceArray[1], choiceArray[2], 
           answerArray[0], answerArray[1], answerArray[2],
           outcomeArrayOne[0], outcomeArrayOne[1]);

    //STATISTICS
    function displayStats()
    {
         var statCheck = confirm("HP : " + hp + "\n" + 
                                 "ARMOUR : " + armour + "\n" + 
                                 "DMG : " + dmg + "\n" +
                                 "Press OK to continue");
         if(statCheck == true)
         {
              choice(choiceArray[0], choiceArray[1], choiceArray[2], 
                     answerArray[0], answerArray[1], answerArray[2],
                     outcomeArrayOne[0], outcomeArrayOne[1]);
         }
    }
//变量
var dmgMultiply=Math.floor(Math.random()*10+1);
var-dmg=10;
var=0;
var hp=100;
//敌人变数
var dmgGoblin=Math.floor(Math.random()*10+1);
var goblinHP=100;
//阵列
var choiceArray=[“输入‘剑’装备你的剑。”,
“如果你害怕,请键入‘run’。”,
“键入'stats'以查看您的统计信息。”];
var answerArray=[“剑”、“跑”、“统计数据”];
var Outcome Arrayone=[“你装备了你的剑。”,
“你跑了,游戏结束了。”;
var outcomeArrayTwo=[“装备了剑。”]
//游戏选择
功能选择(a、b、c、x、y、z、aa、bb)
{
var应答=提示(a+“\n”+b+“\n”+c);
如果(答案=x)
{
警报(aa);
剑术(结果表2[0]);
}
如果(答案==y)
{
警报(bb);
}
如果(答案==z)
{
displayStats();
}
}
//佩剑
已装备的功能(a)
{
dmg=25;
dmgMultiply=Math.floor(Math.random()*25+1);
警报(a+“\n”+“DMG:”+DMG);
地精战斗开始(“地精”);
}
//地精战斗开始
功能goblinCombatStart(g)
{
警报(“出现一个野生“+g+”+“\n”+“+g+”有100点生命!”);
地精攻击(“地精”)
}
功能goblinAttack(g)
{
警惕(“该“+g+”向您挥动斧头!”+“\n”+“该“+g+”对您造成“+dmgGoblin+”伤害!”);
hp-=dmgGoblin;
var-attack=prompt(“键入'attack'以在“+g+”\n“+”HP:“+HP”下挥剑);
如果(攻击=“攻击”)
{
警惕(“您在“+g+”\n“+”处挥剑,您在“+g”处挥剑了“+DMG多次+”);
goblinHP-=dmg倍数;
警报(“+g+”开启“+goblinHP+”HP”);
if(goblinHP<0)
{
戈布林德();
}
如果(goblinHP>0)
{
地精攻击(“地精”);
}
}
其他的
{
警惕(“你丢了剑,对着地精的脸喊了一声“+”+“+”+“+””+”,效果不太好,地精把你的头砍掉了”);
}
}
函数goblinDead()
{
警惕(“你只擦伤了几下就杀死了这个小妖精!”);
}
//比赛开始
选项(choiceArray[0]、choiceArray[1]、choiceArray[2],
应答器阵列[0],应答器阵列[1],应答器阵列[2],
outcomeArrayOne[0],outcomeArrayOne[1]);
//统计数字
函数displayStats()
{
var statCheck=确认(“HP:+HP+”\n“+
“装甲:“+装甲+”\n“+
DMG:“+DMG+”\n+
“按OK继续”);
如果(statCheck==true)
{
选项(choiceArray[0]、choiceArray[1]、choiceArray[2],
应答器阵列[0],应答器阵列[1],应答器阵列[2],
outcomeArrayOne[0],outcomeArrayOne[1]);
}
}

不要在脚本开始时只计算一次随机伤害值,而是在需要时计算它们。这可能在你的攻击功能中

也许你在这里误解了什么:
Math.random
不会返回一些特殊的魔法值,每次读取时都会发生变化。它返回一个数字,该数字不会改变


如果需要多个随机值,则必须多次调用
Math.random
。如果你想在妖精攻击时使用不同的随机值,你必须在它攻击时调用
Math.random

这里的问题是你在开始时将变量初始化为随机变量

这意味着,在每次移动中,它将使用与开始时生成的相同的随机数

如果希望每次都是随机的,则必须在每次移动时调用
Math.random()

目前,
dmgMultiply
dmgGoblin
被随机计算一次,并在每次回合中使用相同的值,因此你每次受到的伤害和造成的伤害是相同的

    //VARIABLES
    var dmgMultiply = Math.floor(Math.random() * 10 + 1);
    var dmg = 10;
    var armour = 0;
    var hp = 100;

    //ENEMY VARIABLES
    var dmgGoblin = Math.floor(Math.random() * 10 + 1);
    var goblinHP = 100;

    //ARRAYS
    var choiceArray = ["Type 'sword' equip your sword.", 
                       "Type 'run' if you're scared.",
                       "Type 'stats' to see your stats."];
    var answerArray = ["sword", "run", "stats"];
    var outcomeArrayOne = ["You equip your sword.", 
                           "You run away. Game Over."];            
    var outcomeArrayTwo = ["Sword Equipped."]

    //GAME CHOICE
    function choice(a, b, c, x, y, z, aa, bb)
    {
         var answer = prompt(a + "\n" + b + "\n" + c);

         if(answer == x)
         {
              alert(aa);
              swordEquipped(outcomeArrayTwo[0]);
         }

         if(answer == y)
         {
              alert(bb);
         }

         if(answer == z)
         {
              displayStats();   
         }
    }

    //EQUIPPED SWORD
    function swordEquipped(a)
    {
        dmg = 25;
        dmgMultiply = Math.floor(Math.random() * 25 + 1);
        alert(a + "\n" + "DMG : " + dmg);
        goblinCombatStart("goblin");
    }

    //GOBLIN COMBAT START
    function goblinCombatStart(g)
    {
        alert("A wild " + g + " appears!" + "\n" + "The " + g + " has 100 HP!");
        goblinAttack("goblin")
    }

    function goblinAttack(g)
    {
        alert("The " + g + " swings his axe at you!" + "\n"  + "The " + g + " does " + dmgGoblin + " damage to you!");
        hp -= dmgGoblin;
        var attack = prompt("Type 'attack' to swing your sword at the " + g + "\n" + "HP : " + hp);

        if(attack == "attack")
        {
            alert("You swing your sword at the " + g + "\n" + "You did " + dmgMultiply + " to the " + g);
            goblinHP -= dmgMultiply;
            alert("The " + g + " is on " + goblinHP + "HP");

            if(goblinHP < 0)
            {
                goblinDead();
            }

            if(goblinHP > 0)
            {
                goblinAttack("goblin");
            }
        }
        else
        {
            alert("You dropped your sword an shouted " + "'" + attack + "'" + " in the goblins face. It wasn't very effective and the goblin choppped your head off");
        }
    }

    function goblinDead()
    {
        alert("You have slain the puny goblin with only a few scratches!");
    }

    //GAME START
    choice(choiceArray[0], choiceArray[1], choiceArray[2], 
           answerArray[0], answerArray[1], answerArray[2],
           outcomeArrayOne[0], outcomeArrayOne[1]);

    //STATISTICS
    function displayStats()
    {
         var statCheck = confirm("HP : " + hp + "\n" + 
                                 "ARMOUR : " + armour + "\n" + 
                                 "DMG : " + dmg + "\n" +
                                 "Press OK to continue");
         if(statCheck == true)
         {
              choice(choiceArray[0], choiceArray[1], choiceArray[2], 
                     answerArray[0], answerArray[1], answerArray[2],
                     outcomeArrayOne[0], outcomeArrayOne[1]);
         }
    }
在开始时声明变量:

var dmgMultiply;
var dmgGoblin;
然后,在你的攻击函数中将它们设置为一个随机数,以便它每回合计算一个随机数:

function goblinAttack(g)
    {
        dmgMultiply = Math.floor(Math.random() * 10 + 1);
        dmgGoblin = Math.floor(Math.random() * 10 + 1);
        ...
    }

这和JavaScript(或任何其他数学上确定的)随机性一样随机。如果您需要真正的随机性,请检查:可能是原因。请,请不要再编写这样的代码:
函数选择(a、b、c、x、y、z、aa、bb)
。这是我见过的最糟糕的变量命名。其他人(比如你请求帮助的人)应该如何理解这个函数在做什么以及它需要什么输入?所以每次我重复这个函数时,它都会造成随机的伤害。是的,很明显,它是“impsoible”,仅仅因为你在前5分钟内没有得到答案。你在向陌生人求助。与其举手喊“这不可能”,不如等一会儿。更好的是,修复您的代码:为我们提供可以重现您的问题的最小完整示例,而不是您的整个程序。让我们能轻松地