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

求助:如何为C#四子棋游戏设置胜利判定条件

嘿,我来帮你搞定这个四子棋的胜利判定逻辑!结合你已经完成的初始化代码,咱们一步步实现完整的胜利触发流程:

C#四子棋胜利判定与收尾流程实现

一、先搞定核心:胜利检测逻辑

首先你需要一个二维数组来记录棋盘状态(比如用int[,] board,0代表空位置,1代表玩家1的棋子,2代表玩家2的棋子)。每次玩家落子后,调用下面这个方法检测是否达成四子连线:

private bool CheckWin(int currentPlayer, int[,] board, int totalRows, int totalCols)
{
    // 1. 横向检测:每一行找连续4个同色棋子
    for (int row = 0; row < totalRows; row++)
    {
        for (int col = 0; col <= totalCols - 4; col++)
        {
            if (board[row, col] == currentPlayer && 
                board[row, col+1] == currentPlayer && 
                board[row, col+2] == currentPlayer && 
                board[row, col+3] == currentPlayer)
            {
                return true;
            }
        }
    }

    // 2. 纵向检测:每一列找连续4个同色棋子
    for (int col = 0; col < totalCols; col++)
    {
        for (int row = 0; row <= totalRows - 4; row++)
        {
            if (board[row, col] == currentPlayer && 
                board[row+1, col] == currentPlayer && 
                board[row+2, col] == currentPlayer && 
                board[row+3, col] == currentPlayer)
            {
                return true;
            }
        }
    }

    // 3. 斜向(左上→右下)检测
    for (int row = 0; row <= totalRows - 4; row++)
    {
        for (int col = 0; col <= totalCols - 4; col++)
        {
            if (board[row, col] == currentPlayer && 
                board[row+1, col+1] == currentPlayer && 
                board[row+2, col+2] == currentPlayer && 
                board[row+3, col+3] == currentPlayer)
            {
                return true;
            }
        }
    }

    // 4. 斜向(右上→左下)检测
    for (int row = 3; row < totalRows; row++)
    {
        for (int col = 0; col <= totalCols - 4; col++)
        {
            if (board[row, col] == currentPlayer && 
                board[row-1, col+1] == currentPlayer && 
                board[row-2, col+2] == currentPlayer && 
                board[row-3, col+3] == currentPlayer)
            {
                return true;
            }
        }
    }

    return false;
}

二、落子后触发检测与收尾操作

假设你在玩家落子的方法里,每次成功放置棋子后,调用上面的检测方法,一旦判定胜利就执行后续操作:

// 假设当前落子的玩家是currentPlayer,棋盘是6行7列的标准四子棋尺寸
if (CheckWin(currentPlayer, board, 6, 7))
{
    // 1. 弹出胜利提示
    MessageBox.Show($"玩家{currentPlayer}获胜!恭喜!");

    // 2. 更新胜场负场变量(假设你定义了player1Wins、player2Wins、player1Losses、player2Losses这几个变量)
    if (currentPlayer == 1)
    {
        player1Wins++;
        player2Losses++;
    }
    else
    {
        player2Wins++;
        player1Losses++;
    }

    // 3. 向列表框添加对战记录(比如你的列表框叫listBoxGameHistory)
    listBoxGameHistory.Items.Add($"[{DateTime.Now:HH:mm:ss}] 玩家{currentPlayer}达成四子连线,获得胜利!");

    // 4. 清空棋盘(需要单独写个重置方法)
    ResetChessBoard();

    // 5. 恢复按钮状态(让玩家可以重新开始游戏)
    btnStartGame.Enabled = true;
    btnStartGame.Visible = true;
    btnExitGame.Enabled = false;
    btnExitGame.Visible = false;
}

三、补充棋盘重置方法

你需要一个专门的方法来清空棋盘的状态和UI:

private void ResetChessBoard()
{
    // 重置棋盘状态数组
    Array.Clear(board, 0, board.Length);

    // 清空棋盘UI(假设你用PictureBox数组或者Panel里的控件来显示棋子)
    foreach (Control ctrl in panelChessBoard.Controls)
    {
        if (ctrl is PictureBox chessPiece)
        {
            chessPiece.Image = null; // 或者设置成空位置的默认图片
        }
    }
}

小提醒

  • 记得在游戏初始化的时候,把player1Wins、player2Wins这些胜负统计变量初始化为0。
  • 如果追求性能,可以优化胜利检测逻辑——只在当前落子的位置附近检测,不过四子棋棋盘很小,全量检测完全够用,不用纠结这点性能。

内容的提问来源于stack exchange,提问作者Xekyl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:55:15