C#编写井字棋游戏遇运行异常,求问题排查与修复指导
C#井字棋游戏运行异常排查与修复
核心问题定位
- 无效输入无处理:当输入非数字或0时,
int.TryParse失败或输入范围判断不通过,程序没有重新获取输入的逻辑,导致玩家回合卡住,无法切换。 - 右对角线获胜判断错误:原代码的右对角线循环遍历了所有行列,计数器会错误累加非对角线位置的棋子,无法正确识别(0,2)、(1,1)、(2,0)的三连。
- 玩家切换逻辑漏洞:当输入已占用位置时,
Console.Read()后直接break,没有重新触发输入流程,导致同一玩家重复操作但回合不推进。 - 代码冗余:棋盘打印逻辑重复出现三次,X和O的输入处理逻辑完全一致,可复用性差。
修复步骤
完善输入验证逻辑
- 将输入范围限制为1-9,排除0的无效输入。
- 当输入非数字或超出范围时,提示错误并重新获取输入,确保只有有效输入才会处理。
- 处理已占用位置时,提示后重新触发输入流程,而非直接break。
修复获胜判断逻辑
- 右对角线改为直接检查三个固定位置:
board[0,2]、board[1,1]、board[2,0],避免错误累加计数器。
- 右对角线改为直接检查三个固定位置:
消除代码冗余
- 提取棋盘打印为独立的
PrintBoard方法,减少重复代码。 - 合并X和O的输入处理逻辑,通过当前玩家标记动态处理,避免重复代码块。
- 提取棋盘打印为独立的
优化变量作用域
- 移除全局的
choiceX、choiceO,改为局部变量传递,降低全局依赖。
- 移除全局的
修复后的完整代码
using System; class TicTacToe { private static string[,] board = new string[,] { {"1","2","3"}, {"4","5","6"}, {"7","8","9"} }; private static int playerTurn = 0; static void Main(string[] args) { while (!CheckForWinner()) { PrintBoard(); GetValidInput(); } Console.Clear(); PrintBoard(); Console.WriteLine(playerTurn % 2 == 0 ? "Player 2 wins!" : "Player 1 wins!"); Console.Read(); } private static void PrintBoard() { Console.Clear(); Console.WriteLine($"{board[0, 0]} | {board[0, 1]} | {board[0, 2]}"); Console.WriteLine("__|___|__"); Console.WriteLine($"{board[1, 0]} | {board[1, 1]} | {board[1, 2]}"); Console.WriteLine("__|___|__"); Console.WriteLine($"{board[2, 0]} | {board[2, 1]} | {board[2, 2]}"); } private static void GetValidInput() { string currentPlayerMark = playerTurn % 2 == 0 ? "X" : "O"; Console.WriteLine($"Player {playerTurn % 2 + 1}'s turn: Please choose a position to place '{currentPlayerMark}':"); while (true) { string input = Console.ReadLine(); if (int.TryParse(input, out int position) && position >= 1 && position <= 9) { int row = (position - 1) / 3; int col = (position - 1) % 3; if (board[row, col] != "X" && board[row, col] != "O") { board[row, col] = currentPlayerMark; playerTurn++; break; } else { Console.WriteLine($"Position {position} is already taken by {board[row, col]}. Please try again:"); } } else { Console.WriteLine("Invalid input! Please enter a number between 1 and 9:"); } } } private static bool CheckForWinner() { // 检查行 for (int i = 0; i < 3; i++) { if (board[i, 0] == board[i, 1] && board[i, 1] == board[i, 2]) { return true; } } // 检查列 for (int i = 0; i < 3; i++) { if (board[0, i] == board[1, i] && board[1, i] == board[2, i]) { return true; } } // 检查左对角线 if (board[0, 0] == board[1, 1] && board[1, 1] == board[2, 2]) { return true; } // 检查右对角线 if (board[0, 2] == board[1, 1] && board[1, 1] == board[2, 0]) { return true; } return false; } }
内容的提问来源于stack exchange,提问作者Cody
相关产品推荐
相关产品推荐

