我正在尝试用javascript编写骰子游戏,使用Math.random()生成骰子的值和一个数组来保存每个骰子的当前值。
我遇到的问题是1),数组最后包含6个数字,循环只运行5次,2)我无法弄清楚如何让Math.random()返回不同的数字在每个骰子上。
这是有问题的功能:
var array = []
function rollDice() {
for (var i = 0; i <= 4; i++) {
var roll = Math.floor(Math.random() * 6) + 1;
array[i] = roll;
//array.splice(i, 1, roll);
}
}
你可以看到'i'在循环中从零迭代到4(等于五个循环),并且在每个循环上生成另一个随机数并将其插入到等效位置的数组中。
关于数组中的项目数:如果我运行上面写的代码,我会得到这样的东西:[1,2,3,4,5,undefined]。 如果我使用带有'splice'函数的注释行运行它(它应该删除存储在'i'处的值并用新值替换它),我会得到[1,2,3,4,5, 6]。如果循环只运行五次,这是怎么回事?
至于难以让我更随机地更改随机数:我在循环中尝试了以下内容......
var roll;
while (roll === hand[i] || roll === null) {
roll = Math.floor(Math.random() * 6) + 1;
}
...希望'roll'能够保持随机数旋转,直到它出现不同的数字,但没有骰子。有没有人有任何建议?
编辑:我添加了一个显式数组声明,因为我没有说清楚我的数组实际上是在之前显式声明的。答案 0 :(得分:1)
我按照你的意图运作了。
代码中的错误:
array
未定义undefined
变量上定义属性。while
循环非常糟糕。以下是使用for
的代码:
function rollDice() {
for (var i = 0, array = []; i <= 4; i++)
{
array[array.length] = Math.floor(Math.random() * 6) + 1;
}
return array;
}
的变化:
roll
变量。length
设置下一个位置(类似于array.push(value)
但更快)。array
使用do ... while
循环:
function rollDice() {
var array = [];
do
{
array[array.length] = Math.floor(Math.random() * 6) + 1;
}
while ( array.length < 5 );
return array;
}
的差异:
i
。array.length
关于编辑:
不要这样做!
不要访问在外部函数声明的变量。
这是最容易出错的方式!
答案 1 :(得分:0)
随机返回1到5之间的5个唯一数字:
var array = [1,2,3,4,5]
function rollDice() {
array.sort(function(){
return Math.random() - 0.5;
});
}
答案 2 :(得分:0)
现在您已经澄清了您想要的是,对roll()
的连续调用不会重复数组中该特定插槽中的值,您可以这样做:
function rollDice() {
var roll;
for (var i = 0; i <= 4; i++) {
// keep generate a new random value until it is different
// than what was in this slot of the array before
while ((roll = Math.floor(Math.random() * 6) + 1) === array[i]) {}
array[i] = roll;
}
}