JavaScript井字棋switch语句平局判断分支失效问题
问题根因
你的平局分支无法触发,核心是两个问题:
- 错误使用了
||运算符:("X" || "O")在JS中会直接返回第一个真值"X",等价于你在判断每个格子是否等于"X",只要棋盘上存在"O",这个判断就会返回false,永远匹配不到平局分支。 - 单个格子的「值为X或O」判断,正确写法是
cell === "X" || cell === "O",不能把两个候选值放在||两侧直接和变量做全等比较。
修复方案
方案1:直接修正现有switch结构的平局判断
把你原来的平局case替换成如下写法即可。因为获胜分支都在平局分支之前,匹配到获胜场景会直接break跳出switch,走到平局分支时必然不存在获胜方,只需要判断棋盘是否被填满:
case ( (gameBoard.board[0] === "X" || gameBoard.board[0] === "O") && (gameBoard.board[1] === "X" || gameBoard.board[1] === "O") && (gameBoard.board[2] === "X" || gameBoard.board[2] === "O") && (gameBoard.board[3] === "X" || gameBoard.board[3] === "O") && (gameBoard.board[4] === "X" || gameBoard.board[4] === "O") && (gameBoard.board[5] === "X" || gameBoard.board[5] === "O") && (gameBoard.board[6] === "X" || gameBoard.board[6] === "O") && (gameBoard.board[7] === "X" || gameBoard.board[7] === "O") && (gameBoard.board[8] === "X" || gameBoard.board[8] === "O") ): alert("You Tied, No Winner") break;
如果觉得逐格写判断太繁琐,可以用数组every方法简化判断逻辑,效果完全一致:
case gameBoard.board.every(cell => cell === "X" || cell === "O"): alert("You Tied, No Winner") break;
方案2:优化冗余的获胜判断逻辑(推荐)
你现在写了16个重复的获胜判断case,维护成本很高,可以先把所有获胜的格子组合预定义成数组,大幅简化代码:
// 所有获胜的三格连线组合 const winLines = [ [0,1,2], [3,4,5], [6,7,8], // 横向连线 [0,3,6], [1,4,7], [2,5,8], // 纵向连线 [0,4,8], [2,4,6] // 对角线连线 ]; // 按优先级判断:先判玩家1胜,再判玩家2胜,最后判平局 if (winLines.some(line => line.every(idx => gameBoard.board[idx] === "X"))) { alert("Player1 Wins"); } else if (winLines.some(line => line.every(idx => gameBoard.board[idx] === "O"))) { alert("Player2 Wins"); } else if (gameBoard.board.every(cell => cell === "X" || cell === "O")) { alert("You Tied, No Winner"); }
注意:判断平局的逻辑必须放在获胜判断之后,避免出现「玩家最后一步落子连成获胜线,同时棋盘填满,被误判为平局」的bug。
内容的提问来源于stack exchange,提问作者Miguel Gil
相关产品推荐
相关产品推荐

