You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:为井字棋实现纵向与对角线获胜检测逻辑

井字棋纵向与对角线获胜检测实现方案

你现有的代码已经完成了横向行的获胜检测,接下来我们分别实现纵向列和对角线的检测逻辑,最终整合为完整的获胜判断方法:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 07:20:11