如何通过遍历对比获胜组合嵌套数组检测JS井字棋获胜
井字棋游戏获胜条件检测问题
我正在开发一款浏览器端井字棋游戏,卡在了获胜条件检测环节。游戏棋盘是一个包含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'后打印对应索引的值,确认已正确遍历winCombos数组,但不知如何推进。我的思路是生成包含获胜组合对应棋盘值的嵌套数组,若其中存在['X','X','X']或['O','O','O']则判定获胜,请问该如何实现,或是否有更优方案?
解决方案
你的思路完全可行,我们可以简化checkWin函数的逻辑,直接实现获胜检测,甚至额外加入平局判断:
核心逻辑
- 遍历每一组获胜组合,把索引转换成对应的棋盘符号
- 检查这三个符号是否完全相同且不为空(避免空棋盘的误判)
- 找到符合条件的组合就返回获胜符号;遍历完都没找到的话,检查棋盘是否已满,判断是否平局
优化后的完整代码
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] ]; // 遍历所有获胜组合 for (const combo of winCombos) { // 将组合索引映射为棋盘上的符号 const [first, second, third] = combo.map(idx => gameBoard.getBoardSpace(idx)); // 三个符号相同且不为空字符串,说明获胜 if (first && first === second && second === third) { return first; // 返回获胜的'X'或'O' } } // 检查是否平局:所有棋盘位置都已被填充 const isBoardFull = Array.from({ length: 9 }, (_, i) => gameBoard.getBoardSpace(i)) .every(sign => sign !== ""); if (isBoardFull) { return 'draw'; // 返回平局标识 } return null; // 游戏未结束,继续 }
代码解释
- 用
combo.map(idx => gameBoard.getBoardSpace(idx))直接把获胜组合的索引转换成对应的符号数组,比如[0,1,2]会变成['X','X','X'] first && first === second && second === third确保三个符号有效(不是空字符串)且完全一致,避免误判- 平局检测用
every方法遍历整个棋盘,判断所有位置都有符号填充 - 函数返回值清晰:获胜符号、'draw'(平局)、null(游戏继续)
使用示例
调用后根据返回值处理游戏状态:
const gameResult = checkWin(); if (gameResult === 'X' || gameResult === 'O') { alert(`玩家 ${gameResult} 获胜!`); gameBoard.clearBoard(); // 重置棋盘 } else if (gameResult === 'draw') { alert('平局!再来一局吧'); gameBoard.clearBoard(); } else { // 游戏继续,切换玩家落子 }
内容的提问来源于stack exchange,提问作者AlphaZer00
相关产品推荐
相关产品推荐

