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

C#编写井字棋游戏遇运行异常,求问题排查与修复指导

C#井字棋游戏运行异常排查与修复

核心问题定位

  1. 无效输入无处理:当输入非数字或0时,int.TryParse失败或输入范围判断不通过,程序没有重新获取输入的逻辑,导致玩家回合卡住,无法切换。
  2. 右对角线获胜判断错误:原代码的右对角线循环遍历了所有行列,计数器会错误累加非对角线位置的棋子,无法正确识别(0,2)、(1,1)、(2,0)的三连。
  3. 玩家切换逻辑漏洞:当输入已占用位置时,Console.Read()后直接break,没有重新触发输入流程,导致同一玩家重复操作但回合不推进。
  4. 代码冗余:棋盘打印逻辑重复出现三次,X和O的输入处理逻辑完全一致,可复用性差。

修复步骤

  1. 完善输入验证逻辑

    • 将输入范围限制为1-9,排除0的无效输入。
    • 当输入非数字或超出范围时,提示错误并重新获取输入,确保只有有效输入才会处理。
    • 处理已占用位置时,提示后重新触发输入流程,而非直接break。
  2. 修复获胜判断逻辑

    • 右对角线改为直接检查三个固定位置:board[0,2]、board[1,1]、board[2,0],避免错误累加计数器。
  3. 消除代码冗余

    • 提取棋盘打印为独立的PrintBoard方法,减少重复代码。
    • 合并X和O的输入处理逻辑,通过当前玩家标记动态处理,避免重复代码块。
  4. 优化变量作用域

    • 移除全局的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:39:14