JavaScript井字棋游戏胜负判断逻辑异常:无获胜组合却判定获胜
搞定井字棋胜负误判的问题!
嘿,我帮你梳理下可能导致这个bug的几个常见原因,都是开发井字棋时容易踩的坑:
1. 事件重复绑定搞的鬼
看你代码里在display()函数里写了square.on('click', first);——如果这个display()函数被多次调用(比如每次玩家切换都跑一遍),那每个格子都会被绑定好几个点击事件!这就导致每次点格子时,胜负判断逻辑会触发好几次,说不定某次判断就因为状态没更新完全,误判出了获胜方。
解决起来很简单:要么绑定事件前先解绑旧的,改成这样:
square.off('click').on('click', first);
要么干脆把事件绑定移到$(document).ready()最外层,只绑一次,在点击事件内部处理玩家切换,别重复绑定啦。
2. 胜负判定逻辑有漏洞
你说已经写了所有获胜组合,但可能检查的时候没严格卡条件:比如有没有忽略空格子?比如某个获胜组合里有个格子还没下,就被判定成获胜了?或者是不是用了==而非===,导致类型转换搞出乌龙?
给你个靠谱的获胜检查逻辑参考(假设你用data-player存玩家标记):
// 所有获胜组合 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] // 对角线 ]; function checkWin() { for (let combo of winCombos) { const [a,b,c] = combo; const $cellA = $(square[a]), $cellB = $(square[b]), $cellC = $(square[c]); // 必须三个格子都被占了,而且全是同一个玩家的标记 if ($cellA.data('player') && $cellA.data('player') === $cellB.data('player') && $cellA.data('player') === $cellC.data('player')) { return $cellA.data('player'); // 返回获胜的玩家 } } return null; // 没人获胜 }
3. 玩家切换时机不对
要是你在点完格子后,还没做完胜负判断就切换了player状态,那后续的判断逻辑可能拿到错误的玩家值,导致误判。
正确的流程应该是:
- 玩家点格子,标记上当前玩家的符号
- 立刻跑胜负判断
- 有获胜方?那就宣布结果,把所有格子的点击事件禁用掉
- 没获胜?再切换玩家状态
4. 平局逻辑没处理好
虽然你说的是没获胜组合却宣布获胜,但要是平局逻辑没写对,也可能搞出奇怪的判定。比如所有格子都填满了但没获胜,这时候应该宣布平局,而不是硬判某一方赢。
你可以先优先排查事件重复绑定的问题,这个是最容易导致这种误判的原因!
内容的提问来源于stack exchange,提问作者Shirl
相关产品推荐
相关产品推荐

