o's and x's(井字棋)获胜检测函数无法识别横斜向胜利的优化问题
井字棋获胜检测逻辑修复方案
原有代码问题
- 对角线判断逻辑存在语法错误:逗号表达式
(0, 0), (0, 1), (0, 1)最终仅会取最后一个值作为数组索引,every()方法未传入判断条件,完全无法实现对角线检测 - 缺少纵向胜利场景的检测逻辑
- 现有判断逻辑零散,后续维护成本高
优化实现方案
推荐通过枚举所有获胜线坐标的方式实现检测,逻辑统一清晰,覆盖所有横、纵、斜获胜场景,代码如下:
detectWinner = () => { // 枚举所有获胜的坐标组合:3横 + 3纵 + 2斜 const winningLines = [ // 横向 [[0,0], [0,1], [0,2]], [[1,0], [1,1], [1,2]], [[2,0], [2,1], [2,2]], // 纵向 [[0,0], [1,0], [2,0]], [[0,1], [1,1], [2,1]], [[0,2], [1,2], [2,2]], // 对角线 [[0,0], [1,1], [2,2]], [[0,2], [1,1], [2,0]] ]; // 遍历所有获胜线判断是否满足条件 for (const line of winningLines) { const [p1, p2, p3] = line; const val1 = board[p1[0]][p1[1]]; // 第一个位置是空格直接跳过该线 if (val1 === ' ') continue; const val2 = board[p2[0]][p2[1]]; const val3 = board[p3[0]][p3[1]]; // 三个位置棋子一致则判定获胜 if (val1 === val2 && val2 === val3) { return true; } } return false; };
方案优势
- 一次性覆盖所有8种获胜场景,不会遗漏横、纵、斜任意一种情况
- 逻辑直观易读,不需要分别处理不同方向的检测规则
- 不需要依赖JSON序列化对比,性能更优,也避免序列化带来的潜在问题
内容的提问来源于stack exchange,提问作者dcode
相关产品推荐
相关产品推荐

