求助:为井字棋实现纵向与对角线获胜检测逻辑
井字棋纵向与对角线获胜检测实现方案
你现有的代码已经完成了横向行的获胜检测,接下来我们分别实现纵向列和对角线的检测逻辑,最终整合为完整的获胜判断方法:
1. 纵向列检测逻辑
纵向检测需要遍历每一列(列索引从0到2),检查当前列的三个格子是否完全相同且不为空值'N':
- 循环变量用
y表示列索引,范围是0到2 - 对比
gameGrid[0, y]、gameGrid[1, y]、gameGrid[2, y]三者是否相等 - 同样需要先判断该列第一个格子是否为
'N',避免空行误判
2. 对角线检测逻辑
井字棋有两条获胜对角线:
- 左上到右下对角线:坐标为
(0,0)、(1,1)、(2,2),需要检查这三个位置的格子是否相同且非空 - 右上到左下对角线:坐标为
(0,2)、(1,1)、(2,0),同样检查三者是否相同且非空
完整整合后的代码
把横向、纵向、对角线的检测逻辑整合到同一个方法中,一旦检测到任意一种获胜情况,立即更新状态并返回结果:
public Boolean CheckForWinnerRowsColsDiagonals() { isDone = false; // 初始默认未结束 PlayerWon = true; // 初始默认玩家获胜(假设'X'是玩家) // 1. 检测横向行获胜 for (int x = 0; x < 3; ++x) { if (!gameGrid[x, 0].Equals('N')) { if (gameGrid[x, 0] == gameGrid[x, 1] && gameGrid[x, 0] == gameGrid[x, 2]) { isDone = true; PlayerWon = !gameGrid[x, 0].Equals('O'); // 如果是'O'则玩家未获胜 return isDone; } } } // 2. 检测纵向列获胜 for (int y = 0; y < 3; ++y) { if (!gameGrid[0, y].Equals('N')) { if (gameGrid[0, y] == gameGrid[1, y] && gameGrid[0, y] == gameGrid[2, y]) { isDone = true; PlayerWon = !gameGrid[0, y].Equals('O'); return isDone; } } } // 3. 检测左上到右下对角线获胜 if (!gameGrid[0, 0].Equals('N')) { if (gameGrid[0, 0] == gameGrid[1, 1] && gameGrid[0, 0] == gameGrid[2, 2]) { isDone = true; PlayerWon = !gameGrid[0, 0].Equals('O'); return isDone; } } // 4. 检测右上到左下对角线获胜 if (!gameGrid[0, 2].Equals('N')) { if (gameGrid[0, 2] == gameGrid[1, 1] && gameGrid[0, 2] == gameGrid[2, 0]) { isDone = true; PlayerWon = !gameGrid[0, 2].Equals('O'); return isDone; } } return isDone; // 未检测到任何获胜情况 }
关键逻辑说明
- 每一种检测逻辑都先判断起始格子是否为
'N',避免空棋盘或未填满的行/列/对角线被误判为获胜 - 当检测到获胜时,通过
!gameGrid[xx].Equals('O')来设置PlayerWon:如果获胜的是'O',则玩家(默认'X')未获胜,反之则获胜 - 每检测到一种获胜情况就立即返回,无需继续后续检测,提升效率
内容的提问来源于stack exchange,提问作者Avieah
相关产品推荐
相关产品推荐

