有人可以弄清楚gamewon对象是一个数组吗?

时间:2019-06-27 02:25:28

标签: javascript arrays

我对board.reduce((a,e,i)感到困惑。到目前为止,我在循环内执行四个循环,以检查是否有人在我的井字游戏中拥有自己的游戏。但是此功能看起来很小,而且很难理解。可以对这一点进行澄清:checkwin()函数。此外,该对象是否将gameWon返回为Array类型的对象。此外,该语句的工作原理是:for(让winCombos [gameWon.index]的索引)

对象值:squareID是{0、1、2、3、4、5、6、7、8,}之一 玩家是A或B board是[0,1,2,3,4,5,6,7,8]的数组

function turn(squareId, player) {
  origBoard[squareId] = player;
  document.getElementById(squareId).innerHTML = player;
  let gameWon = checkWin(origBoard, player);
  if (gameWon) gameOver(gameWon);
  checkTie();
}

function checkWin(board, player) {
  let plays = board.reduce((a, e, i) => (e === player) ? a.concat(i) : a, []);
  let gameWon = null;
  for (let [index, win] of winCombos.entries()) {
    if (win.every(elem => plays.indexOf(elem) > -1)) {
      gameWon = {index: index, player: player};
      break;
    }
  }
  return gameWon;
}

function gameOver(gameWon){
  for (let index of winCombos[gameWon.index]) {
    document.getElementById(index).style.backgroundColor = 
      gameWon.player === huPlayer ? "blue" : "red";
  }
  for (let i=0; i < cells.length; i++) {
    cells[i].removeEventListener('click', turnClick, false);
  }
  declareWinner(gameWon.player === huPlayer ? "You win!" : "You lose");
}

3 个答案:

答案 0 :(得分:1)

for (let [index, win] of winCombos.entries()) {
if (win.every(elem => plays.indexOf(elem) > -1)) {
  gameWon = {index: index, player: player};
  break;
}

我在理解这部分时遇到了一些麻烦,尤其是带有 if 条件的部分

答案 1 :(得分:0)

let plays = board.reduce((a, e, i) => (e === player) ? a.concat(i) : a, [])

相同
let results = [];

for (let i = 0; i < board.length; i++) {
  const e = board[i];
  if (e === player) {
    results = results.concat(i);
  }
}

let plays = result;

Reduce接受一个数组并将一个函数应用于每个元素以给出结果,这与具有更好的变量名的reduce相同

board.reduce((result, item, index) => (item === player) ? result.concat(index) : result, [])

[]是空的起始结果数组,结果是前一次迭代的结果,item是数组中的当前项目,而index是数组中的当前索引。每次迭代我们都返回结果,或者如果当前是播放器,则我们将其合并。

答案 2 :(得分:0)

此处是同一函数,但更改了一些名称并添加了空格以提高可读性:

function checkWin(board, playerSymbol) {
  let plays = board.reduce((accumulator, position, index) => {
    if (position === playerSymbol) { // i.e. the X or O player claimed the square
      return accumulator.concat(index);
    }
    return accumulator;
  }, []);

  let gameWon = null;
  for (let [index, win] of winCombos.entries()) {
    if (win.every(elem => plays.indexOf(elem) > -1)) {
      gameWon = {index: index, player: player};
      break;
    }
  }
  return gameWon;
}

此处的主要见解是您将电路板视为二维的。但这不是必须的:您可以将3x3网格表示为长度为9的数组,并执行index % 3来获取行。比嵌套循环快得多。

因此plays变量只是一个表示3x3板的数组长度9,而reduce会创建一个由玩家声明的每个正方形的数组。然后,它会根据一系列已知的获胜组合(例如[1,2,3],[1,5,9],[3,5,7] ...)进行核对,以查看玩家是否赢得了比赛。