我正在创建一个战舰游戏,我试图将计算机的船随机化。但是,它有时会不止一次地将同一位置随机化,因此在某些轮次中创建的船只少于8艘。我尝试使用indexOf修复此问题,但无论我如何更改代码,我似乎无法使其工作。如果随机数在数组shipLocations中,那么我想再次重新编号,直到它是一个与数组中任何数字都不匹配的数字。有什么想法吗?
var shipLocations = [];
function randShips() {
for (i = 0; i < 8; i++) {
var randomize = Math.floor(Math.random() * 64 + 1);
if (shipLocations.indexOf(randomize) == true) {
var randomize = Math.floor(Math.random() * 64 + 1);
}
else {
shipLocations.push(randomize);
}
} //end of i loop
} //end of randShips()
randShips();
console.log(shipLocations);
编辑:因此,在尝试了一些答案之后,这似乎在测试大约100次之后应该是这样的。
var shipLocations = [];
function randShips() {
while (shipLocations.length < 8) {
var randomize = Math.floor(Math.random() * 64 + 1);
while (shipLocations.indexOf(randomize) > -1) {
randomize = Math.floor(Math.random() * 64 + 1);
}
shipLocations.push(randomize);
}
}
randShips();
答案 0 :(得分:0)
indexOf
不返回布尔值,它返回匹配元素的索引(int)。
所以代码应该是
if (~shipLocations.indexOf(randomize)) {
var randomize = Math.floor(Math.random() * 64 + 1);
}
您可以使用此函数获取阵列的真正唯一编号。
function uniqueRandom( arr) {
var num = Math.floor(Math.random() * 64 + 1);
if (~arr.indexOf(num)) {
uniqueRandom(arr);
} else {
return num;
}
}
不过,你写的逻辑有问题。如果找到重复的数字,则只需将其重新随机化,而不将其推入数组。所以使用while
或递归函数应该可以很好地完成这项工作。
答案 1 :(得分:0)
var shipLocations = [];
function randShips() {
while ( shipLocations.length < 8 ) {
var randomize = Math.floor(Math.random() * 64 + 1);
while ( shipLocations.indexOf(randomize) >= 0 ) {
randomize = Math.floor(Math.random() * 64 + 1);
}
shipLocations.push(randomize);
}
} //end of randShips()
randShips();
console.log(shipLocations);
答案 2 :(得分:0)
由于您需要8个唯一值,因此连续创建的2个数字很可能都在数组中。所以我想你会想做一个while
:
while (shipLocations.indexOf(randomize) != -1) {
randomize = Math.floor(Math.random() * 64 + 1);
}
var
部分不应该存在,这只是变量的第一个实例所必需的。
答案 3 :(得分:0)
在javascript中,返回值为 -1 的错误条件。
因此,将 if-else 条件更改为:
if (shipLocations.indexOf(randomize) != -1) { //true condition equivalent
var randomize = Math.floor(Math.random() * 64 + 1);
}
else {
shipLocations.push(randomize);
}