math.floor和math.radom是一个索引

时间:2018-04-24 18:37:06

标签: javascript arrays math random floor

我正在建立一个小型的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

感谢您的帮助!

2 个答案:

答案 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);
}

控制台日志就在这里帮我修复错误。

感谢您的帮助!