我正在建立一个小型的tic tac toe游戏。
当计算机转向播放时,我让他选择一个随机数来从阵列中挑选一个元素。
我的问题是随机数例如是3,但从数组中挑选的元素不是arr [3],而是arr [4]。
这是一个问题,因为如果拾取的数字是数组的结尾,它将返回undefined。
这是javascript代码:
var grid = ['item1', 'item2', 'item3', 'item4', 'item5', 'item6', 'item7', 'item8', 'item9'];
var choice = 9;
function myFunction(clicked_id){
$('#' + clicked_id).html('X');
grid.splice(grid.indexOf(clicked_id), 1);
choice -= 1;
setTimeout(computer, 1000);
player.push(clicked_id);
findElement(player);
console.log(player);
console.log(grid);
console.log(grid.length)
}
function computer(){
var ran = Math.floor(Math.random() * choice);
var res = grid[ran - 1];
$('#' + res).html('O');
grid.splice(grid.indexOf(res), 1);
cpu.push(grid[ran]);
findElement(cpu);
choice -= 1;
console.log(ran);
console.log(cpu);
}
以下是控制台日志中记录的内容: [“item1”] - >我点击的内容
[“item2”,“item3”,“item4”,“item5”,“item6”,“item7”,“item8”,“item9”] - >使用拼接后的新修改数组。
8 - >新数组长度
5 - 计算机挑选的随机数
[“item8”] - >数组中的计算机选取的元素(arr [6])
'item6'是在tic tac toe game上检查的方框。
这是指向我的codepen的链接,以查看正在运行的代码。
https://codepen.io/nico3d911/pen/odvmPR?editors=0001
感谢您的帮助!
答案 0 :(得分:1)
请注意,JS使用从零开始的索引 - 因此item1具有索引0,item2具有索引1等,直到具有索引8的item9。
Math.random()返回0到1之间的数字,这意味着Math.random()* 9可以返回超出范围的9 - 对于长度为9的数组,最大索引为8。
更改上限应解决您的问题:
var ran = Math.floor(Math.random() * (choice - 1))
一个小的挑剔:grid.indexOf(res)
总是等于ran
,你可以使用grid.splice(ran, 1);
答案 1 :(得分:0)
我的问题来自于我在将数组元素推入新数组之前使用splice的事实。
这是正确的javascript代码:
function computer(){
var ran = Math.floor(Math.random() * choice);
var res = grid[ran];
$('#' + res).html('O');
cpu.push(grid[ran]); // this line needs to be before having the element removed.
grid.splice(grid.indexOf(res), 1);
findElement(cpu);
choice -= 1;
console.log(ran);
console.log(cpu);
}
控制台日志就在这里帮我修复错误。
感谢您的帮助!