math.floor и math.radom - это один индекс - PullRequest
0 голосов
/ 24 апреля 2018

Я создаю небольшую игру в крестики-нолики.

Когда наступает очередь за компьютером, я заставляю его выбирать случайное число, чтобы выбрать элемент из массива.

Моя проблема в том, что случайное число будет, например, 3, но элемент, выбранный из массива, будет не arr [3], а arr [4].

, это проблема, потому что если выбранное числоэто конец массива, он вернет неопределенное значение.

вот код 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"] -> новый измененный массив послеusing splice.

8 -> длина нового массива

5 - случайное число, выбранное компьютером

["item8"] -> элемент, выбранный компьютером в массиве (arr [6])

'item6' - это флажок в игре Tic Tac Toe.

Вот ссылка на мой кодовый блок, чтобы увидеть код в действии.

https://codepen.io/nico3d911/pen/odvmPR?editors=0001

чтAnks за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Моя проблема возникла из-за того, что я использовал 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);
}

Журнал консоли здесь, чтобы помочь мне исправить ошибку.

Спасибо за вашу помощь!

0 голосов
/ 24 апреля 2018

Обратите внимание, что JS использует индексацию с нуля - следовательно, item1 имеет индекс 0, item2 имеет индекс 1 и т. Д. До item9 с индексом 8.

Math.random () возвращает число от 0 до 1включительно, что означает, что Math.random () * 9 может возвращать 9, что находится за пределами - максимальный индекс равен 8 для массива длины 9.

Изменение верхней границы должно решить вашу проблему:

var ran = Math.floor(Math.random() * (choice - 1))

Небольшой придира: grid.indexOf(res) всегда равен ran, вы можете просто использовать grid.splice(ran, 1);

...