javascript - 检查数组的更好方法

标签 javascript arrays sorting

我正在玩一个井字游戏,但在如何简化一些检查方面确实遇到了瓶颈。您会在下方看到水平、垂直和对 Angular 线检查,以查看玩家是否获胜。

问题:我可以用什么来简化这个而不重复那么多代码?非常感谢任何正确方向的指导。

数组看起来像这样:

gridArray: [
    ['', '', ''],
    ['', '', ''],
    ['', '', ''],
  ]

playerTurn 变量只是在您玩游戏时从 x 变为 o。

// Horizontal check
state.gridArray.map((item, index) => {
  if(
    item[0] === playerTurn &&
    item[1] === playerTurn &&
    item[2] === playerTurn) {
    console.log(playerTurn + ' has won!');
  }
});



// Vertical check
if(
  state.gridArray[0][0] === playerTurn &&
  state.gridArray[1][0] === playerTurn &&
  state.gridArray[2][0] === playerTurn
) {
  console.log(playerTurn + ' has won!');
}

if(
  state.gridArray[0][1] === playerTurn &&
  state.gridArray[1][1] === playerTurn &&
  state.gridArray[2][1] === playerTurn
) {
  console.log(playerTurn + ' has won!');
}

if(
  state.gridArray[0][2] === playerTurn &&
  state.gridArray[1][2] === playerTurn &&
  state.gridArray[2][2] === playerTurn
) {
  console.log(playerTurn + ' has won!');
}



// Diagonal check
if(
  state.gridArray[0][0] === playerTurn &&
  state.gridArray[1][1] === playerTurn &&
  state.gridArray[2][2] === playerTurn
) {
  console.log(playerTurn + ' has won!');
}

if(
  state.gridArray[0][2] === playerTurn &&
  state.gridArray[1][1] === playerTurn &&
  state.gridArray[2][0] === playerTurn
) {
  console.log(playerTurn + ' has won!');
}
}

谢谢!

最佳答案

您可以使用稍微不同的数据结构,只有一维和数字内容。然后,您可以定义另一个变量,列出该结构中代表获胜的所有三元组索引。通过该设置,检测获胜的函数几乎变成了一行代码:

var gridArray = [
    0, 0, 0,
    0, 0, 0,
    0, 0, 0,
]; 

var lines = [
    [0,1,2],
    [3,4,5],
    [6,7,8],
    [0,3,6],
    [1,4,7],
    [2,5,8],
    [0,4,8],
    [2,4,6]
];

function hasWon(gridArray, lines, playerTurn) {
    return lines.some(line => line.every(cell => gridArray[cell] === playerTurn));
}

注意:网格中的数值对于“X”将变为 1,对于“O”将变为 2。使用字符串 display = [' ', 'X', 'O'] 很容易将一个字符串转换为另一个字符串。

备选

如果你真的想获得高效的代码,你可以恢复到位操作,并用两个整数表示网格,一个用于“X”位置,一个用于“O”位置。您将使用每个整数的 9 位。使用相同的原则,您可以定义构成胜利的所有位掩码,并用它们执行 & 以查看是否匹配。

var gridArray = [0b000000000, 0b000000000]; // X bits, O bits

var lines = [
    0b111000000,
    0b000111000,
    0b000000111,
    0b100100100,
    0b010010010,
    0b001001001,
    0b100010001,
    0b001010100
];

function hasWon(gridArray, lines, playerTurn) {
    return lines.some(line => (line & gridArray[playerTurn]) == line);
}

关于javascript - 检查数组的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38557608/

相关文章:

javascript - 具有顶部导航和左侧导航的自定义母版页

javascript - 如何制作图表的多个实例

objective-c - 创建可获胜的 "random"单人纸牌洗牌

python - 基于分类列对极坐标数据帧进行排序时出现的问题

javascript - 重新排序数组

javascript - angularjs 选中复选框时隐藏具有特定类的对象

javascript - 是否有可能将 "freeze"设为一个 Set(或 Map)?

python - 20 x 20 block 数组中的坐标对列表

arrays - Rust-如何初始化包含HashSet字段的结构数组?

javascript - 在生成相同的数组之前清除数组