Javascript 数学,随机性并不那么随机
我正在做一个弹出框的基本游戏 我的问题是,如果你看一下地精攻击功能,它会一直重复,直到地精死亡,但伤害是随机的 例如,我每次对地精造成6点伤害,直到它死亡,而不是1到25之间的随机数,地精每次对我造成4点伤害。太无聊了。我希望每次点击都是随机的,但每次重复这个函数似乎不会给出一个随机数Javascript 数学,随机性并不那么随机,javascript,Javascript,我正在做一个弹出框的基本游戏 我的问题是,如果你看一下地精攻击功能,它会一直重复,直到地精死亡,但伤害是随机的 例如,我每次对地精造成6点伤害,直到它死亡,而不是1到25之间的随机数,地精每次对我造成4点伤害。太无聊了。我希望每次点击都是随机的,但每次重复这个函数似乎不会给出一个随机数 //VARIABLES var dmgMultiply = Math.floor(Math.random() * 10 + 1); var dmg = 10; var armour
//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分钟内没有得到答案。你在向陌生人求助。与其举手喊“这不可能”,不如等一会儿。更好的是,修复您的代码:为我们提供可以重现您的问题的最小完整示例,而不是您的整个程序。让我们能轻松地