我正在尝试创建一个浏览器内井字游戏。我一直在检查获胜条件。游戏板是一个由 9 个空字符串组成的平面数组,当进行移动时,这些空字符串会被“X”或“O”替换。这里不应该有任何错误,但我将包含它的代码以防万一。
const gameBoard = (function() {
const board = [];
for (let i = 0; i < 9; i++) {
board.push("");
}
const setBoardSpace = (i, sign) => {
board[i] = sign;
return board;
}
const getBoardSpace = (i) => {
return board[i];
}
const clearBoard = () => {
for (let i = 0; i < 9; i++) {
board[i] = "";
}
}
return {setBoardSpace, getBoardSpace, clearBoard};
})();
我想通过将棋盘数组与所有可能的获胜组合的嵌套数组进行比较来检查获胜的举动。我使用了两个指针来循环 winCombos 数组。让我困惑的部分是如何使用正确的语法来执行我在伪代码中布置的内容。
const checkWin = () => {
const winCombos = [
[0,1,2],
[3,4,5],
[6,7,8],
[0,3,6],
[1,4,7],
[2,5,8],
[0,4,8],
[2,4,6]
];
const checkSameSign = () => {
for (let i = 0; i < winCombos.length; i++) {
for (let j = 0; j < winCombos[i].length; j++) {
console.log(gameBoard.getBoardSpace(winCombos[i][j]));
//if every element of a sub array is equal
//return win
}
}
}
return checkSameSign();
}
我尝试在将一些“X”和“O”字符串输入到棋盘数组中后记录棋盘索引的值:
console.log(gameBoard.getBoardSpace(winCombos[i][j]));
结果显示我正在正确地迭代 winCombos 数组,但我不确定如何继续前进。
我当前的思考过程是输出一个新的嵌套数组,其中包含 winCombo 索引处的棋盘数组值,并且如果其中之一包含 ['X','X','X'] 或 ['O','O', 'O']然后返回胜利。如果这是一个好方法,有人可以让我知道如何实现这一目标,或者如果我缩进的解决方案效率低下或不正确,可以为我指出正确的方向吗?
利用数组函数获取每个潜在胜利的字符串表示形式,并检查它是“XXX”还是“OOO”。返回一个布尔值(假/真):
const checkSameSign = () =>
winCombos.some(winCombo =>
["XXX", "OOO"].includes(
winCombo.map(cell => gameBoard.getBoardSpace(cell))
.join("")
)
);
感谢 trincot 的回答和解释。我没有使用他的代码,因为我不熟悉那些数组函数,但他的解释帮助我继续前进。这就是我最终的结果。
const checkWin = () => {
const winCombos = [
[0,1,2],
[3,4,5],
[6,7,8],
[0,3,6],
[1,4,7],
[2,5,8],
[0,4,8],
[2,4,6]
];
const checkSameSign = () => {
for (let i = 0; i < winCombos.length; i++) {
const combo = winCombos[i];
const values = combo.map(index => gameBoard.getBoardSpace(index));
if (values.every(value => value === 'X')) {
return 'X wins!';
} else if (values.every(value => value === 'O')) {
return 'O wins!';
}
}
return null;
}
return checkSameSign();
}