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

C# Windows Forms四子棋游戏:无法实现获胜检测功能求助

修复C# Windows Forms四子棋的获胜检测问题

嘿,我帮你搞定这个获胜检测的问题!结合你给出的代码框架,我整理了完整的修复方案,包含符合四子棋规则的落子逻辑、四个方向的连珠检测,还有获胜提示和游戏重置功能。

核心思路

四子棋的获胜检测需要围绕每一步落子的位置,检查横向、纵向、左上→右下斜向、右上→左下斜向四个方向是否存在连续4个同色棋子。关键要做好边界判断,避免数组越界,同时只检测当前落子周边的区域,提升效率。

完整实现代码

这里我补全了你未写完的代码,并加入了完整的获胜检测模块:

namespace ConnectFour {
    public partial class Form1 : Form {
        Button[] gameButtons = new Button[42]; // 7列×6行的棋盘按钮数组
        bool blueTurn = true; // 蓝色方先行动

        public Form1() {
            InitializeComponent();
            InitializeGameBoard();
        }

        // 初始化棋盘按钮布局
        private void InitializeGameBoard() {
            int buttonIndex = 0;
            for (int row = 0; row < 6; row++) {
                for (int col = 0; col < 7; col++) {
                    Button btn = new Button();
                    btn.Size = new Size(70, 70);
                    btn.Location = new Point(col * 70, row * 70);
                    btn.FlatStyle = FlatStyle.Flat;
                    btn.Click += GameButton_Click;
                    gameButtons[buttonIndex++] = btn;
                    this.Controls.Add(btn);
                }
            }
        }

        // 落子按钮点击事件
        private void GameButton_Click(object sender, EventArgs e) {
            Button clickedBtn = sender as Button;
            // 计算当前点击的列索引
            int col = clickedBtn.Location.X / 70;
            // 找到当前列最下方的空位(四子棋规则:只能落子在列的底部空位)
            int availableRow = GetAvailableRow(col);
            if (availableRow == -1) return; // 当前列已满,无法落子

            // 找到对应按钮的索引并设置颜色
            int buttonIndex = availableRow * 7 + col;
            gameButtons[buttonIndex].BackColor = blueTurn ? Color.Blue : Color.Red;
            gameButtons[buttonIndex].Enabled = false; // 落子后禁用按钮

            // 落子后立即检测是否获胜
            if (CheckWin(availableRow, col)) {
                string winner = blueTurn ? "蓝色方" : "红色方";
                MessageBox.Show($"{winner}获胜!", "游戏结束", MessageBoxButtons.OK, MessageBoxIcon.Information);
                ResetGame(); // 获胜后重置游戏
                return;
            }

            // 切换回合
            blueTurn = !blueTurn;
        }

        // 获取指定列的可用空位行(从下往上找)
        private int GetAvailableRow(int col) {
            for (int row = 5; row >= 0; row--) {
                int index = row * 7 + col;
                if (gameButtons[index].BackColor == SystemColors.Control) {
                    return row;
                }
            }
            return -1; // 列已满
        }

        // 核心:四方向连珠检测
        private bool CheckWin(int row, int col) {
            Color currentColor = gameButtons[row * 7 + col].BackColor;

            // 1. 横向检测(同一行左右方向)
            int consecutiveCount = 1;
            // 向右检测
            for (int c = col + 1; c < 7; c++) {
                if (gameButtons[row * 7 + c].BackColor == currentColor) {
                    consecutiveCount++;
                    if (consecutiveCount == 4) return true;
                } else break;
            }
            // 向左检测
            for (int c = col - 1; c >= 0; c--) {
                if (gameButtons[row * 7 + c].BackColor == currentColor) {
                    consecutiveCount++;
                    if (consecutiveCount == 4) return true;
                } else break;
            }

            // 2. 纵向检测(同一列上下方向)
            consecutiveCount = 1;
            // 向下检测
            for (int r = row + 1; r < 6; r++) {
                if (gameButtons[r * 7 + col].BackColor == currentColor) {
                    consecutiveCount++;
                    if (consecutiveCount == 4) return true;
                } else break;
            }
            // 向上检测
            for (int r = row - 1; r >= 0; r--) {
                if (gameButtons[r * 7 + col].BackColor == currentColor) {
                    consecutiveCount++;
                    if (consecutiveCount == 4) return true;
                } else break;
            }

            // 3. 斜向1:左上→右下
            consecutiveCount = 1;
            int r1 = row + 1, c1 = col + 1;
            while (r1 < 6 && c1 < 7) {
                if (gameButtons[r1 * 7 + c1].BackColor == currentColor) {
                    consecutiveCount++;
                    if (consecutiveCount == 4) return true;
                } else break;
                r1++; c1++;
            }
            r1 = row - 1; c1 = col - 1;
            while (r1 >= 0 && c1 >= 0) {
                if (gameButtons[r1 * 7 + c1].BackColor == currentColor) {
                    consecutiveCount++;
                    if (consecutiveCount == 4) return true;
                } else break;
                r1--; c1--;
            }

            // 4. 斜向2:右上→左下
            consecutiveCount = 1;
            int r2 = row + 1, c2 = col - 1;
            while (r2 < 6 && c2 >= 0) {
                if (gameButtons[r2 * 7 + c2].BackColor == currentColor) {
                    consecutiveCount++;
                    if (consecutiveCount == 4) return true;
                } else break;
                r2++; c2--;
            }
            r2 = row - 1; c2 = col + 1;
            while (r2 >= 0 && c2 < 7) {
                if (gameButtons[r2 * 7 + c2].BackColor == currentColor) {
                    consecutiveCount++;
                    if (consecutiveCount == 4) return true;
                } else break;
                r2--; c2++;
            }

            return false;
        }

        // 重置游戏状态
        private void ResetGame() {
            foreach (Button btn in gameButtons) {
                btn.BackColor = SystemColors.Control;
                btn.Enabled = true;
            }
            blueTurn = true;
        }
    }
}

关键细节说明

  • 落子逻辑合规:按照四子棋规则,只能落在每列最底部的空位,我用GetAvailableRow方法实现了这个逻辑,避免玩家在非空位落子。
  • 高效检测:每次落子后只围绕当前位置检测四个方向,不需要遍历整个棋盘,既高效又准确。
  • 边界防护:每个方向的检测都加入了棋盘范围判断(行0-5,列0-6),彻底避免数组越界异常。
  • 用户反馈:检测到获胜后立即弹出提示框,告知获胜方,并自动重置游戏(你可以根据需求调整重置逻辑)。

之前代码可能的问题点

如果你之前的检测失效,大概率是这几个原因:

  • 没有正确处理边界条件,导致漏检或越界;
  • 落子后没有及时调用检测方法,或者检测时机不对;
  • 棋盘按钮的索引计算错误(正确的索引是行×7+列,因为是7列6行的布局);
  • 颜色判断逻辑有误,比如没有正确获取当前落子的颜色。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:10:34