求助:如何为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
相关产品推荐
相关产品推荐

