如何编写函数判断井字棋二维数组的获胜方?
井字棋胜负判断函数实现指导
需求说明
需要编写一个通用函数,接收井字棋二维数组(用"X"、"O"表示玩家,"-"表示空位),判断是否出现获胜局面,并在控制台输出胜负结果——比如传入diagonalWin时,控制台应打印"O Won and X Lost"(注:你给出的diagonalWin示例是O的对角线获胜)。
示例测试数组:
const rowWin = [ ["O", "O", "O"], ["-", "-", "-"], ["-", "-", "-"] ]; const colWin = [ ["-", "X", "-"], ["-", "X", "-"], ["-", "X", "-"], ]; const diagonalWin = [ ["-", "-", "O"], ["-", "O", "-"], ["O", "-", "-"], ]; const diagonalWinInverse = [ ["X", "-", "-"], ["-", "X", "-"], ["-", "-", "X"], ];
硬编码方案的问题
你当前的代码只能针对特定数组做判断,不具备通用性,且逻辑判断有误:
- 仅针对固定的行、列、对角线位置写死判断,无法覆盖所有可能的获胜情况(比如第二行全X的情况就检测不到)
- 用
&&仅检查元素是否存在,没有验证三个元素是否完全相同且不是空位"-"
你的硬编码代码:
if(rowWin[0][0] && rowWin[0][1] && rowWin[0][2]){ console.log("O wins, X lost") }else console.log("X wins") if(colWin[0][1] && colWin[1][1] && colWin[2][1]){ console.log("X wins, O lost") }else console.log("O wins") if(diagonalWin[0][2] && diagonalWin[1][1] && diagonalWin[2][0]){ console.log("O wins, X lost") }else console.log("X wins") if(diagonalWinInverse[0][0] && diagonalWinInverse[1][1] && diagonalWinInverse[2][2]){ console.log("X wins, X lost") }else console.log("O wins")
通用解决方案
实现思路
- 遍历所有可能的获胜线路:3行、3列、2条对角线
- 对每条线路,检查三个位置的元素是否完全相同,且不是空位
"-" - 找到获胜玩家后,直接输出胜负结果;若所有线路都无获胜情况,输出“无胜负”
完整代码
function checkTicTacToe(board) { // 检查行 for (let row = 0; row < 3; row++) { const cell1 = board[row][0]; const cell2 = board[row][1]; const cell3 = board[row][2]; if (cell1 !== "-" && cell1 === cell2 && cell2 === cell3) { const loser = cell1 === "X" ? "O" : "X"; console.log(`${cell1} Won and ${loser} Lost`); return; } } // 检查列 for (let col = 0; col < 3; col++) { const cell1 = board[0][col]; const cell2 = board[1][col]; const cell3 = board[2][col]; if (cell1 !== "-" && cell1 === cell2 && cell2 === cell3) { const loser = cell1 === "X" ? "O" : "X"; console.log(`${cell1} Won and ${loser} Lost`); return; } } // 检查主对角线(左上到右下) const diag1Cell1 = board[0][0]; const diag1Cell2 = board[1][1]; const diag1Cell3 = board[2][2]; if (diag1Cell1 !== "-" && diag1Cell1 === diag1Cell2 && diag1Cell2 === diag1Cell3) { const loser = diag1Cell1 === "X" ? "O" : "X"; console.log(`${diag1Cell1} Won and ${loser} Lost`); return; } // 检查副对角线(右上到左下) const diag2Cell1 = board[0][2]; const diag2Cell2 = board[1][1]; const diag2Cell3 = board[2][0]; if (diag2Cell1 !== "-" && diag2Cell1 === diag2Cell2 && diag2Cell2 === diag2Cell3) { const loser = diag2Cell1 === "X" ? "O" : "X"; console.log(`${diag2Cell1} Won and ${loser} Lost`); return; } // 无获胜情况 console.log("无胜负"); } // 测试示例 checkTicTacToe(rowWin); // 输出:O Won and X Lost checkTicTacToe(colWin); // 输出:X Won and O Lost checkTicTacToe(diagonalWin); // 输出:O Won and X Lost checkTicTacToe(diagonalWinInverse); // 输出:X Won and O Lost
代码解释
- 遍历行时,逐行检查三个单元格是否一致且非空位
- 遍历列时,逐列检查三个单元格是否一致且非空位
- 对角线单独检查两条特殊线路
- 找到获胜者后立即返回,避免多余判断
- 通过三元运算符快速确定败方,简化逻辑
内容的提问来源于stack exchange,提问作者Ruben
相关产品推荐
相关产品推荐

