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

入门级Tic Tac Toe游戏无效输入时无法重复询问问题求助

解决井字棋无效输入直接终止的问题

你的代码核心问题是遇到无效输入就直接终止循环/程序,而非重新提示输入。下面给你修正后的代码,同时解释关键修改点:

原代码的问题点

  • 输入非X/O时用break直接跳出游戏循环,导致程序结束
  • 输入0-8以外的数字时用return直接终止整个程序
  • 没处理输入非整数(比如字母)时nextInt()抛出的异常,会直接崩掉

修正后的代码

import java.util.Scanner;
import java.util.InputMismatchException;

public class Subject {
    public static void main(String[] args) {

        Scanner myScanner = new Scanner(System.in);
        char[][] GameBoard = new char[3][3];

        // 初始化棋盘
        for (int row = 0; row < GameBoard.length; row++) {
            for (int col = 0; col < GameBoard[row].length; col++) {
                GameBoard[row][col] = (char)('0' + row * 3 + col);
                System.out.print(GameBoard[row][col] + "|" + "\t");
            }
            System.out.println();
            for (int i = 0; i < GameBoard[row].length * 3; i++) {
                System.out.print("-");
            }
            System.out.println();
        }
        boolean GameOver = false;

        while (!GameOver) {
            char playerSymbol = ' ';
            // 循环获取有效符号,直到输入X或O
            while (true) {
                System.out.println("Please enter 'X' or 'O' to choose your character: ");
                String input = myScanner.next();
                // 确保输入是单个字符
                if (input.length() == 1) {
                    playerSymbol = input.charAt(0);
                    if (playerSymbol == 'X' || playerSymbol == 'O') {
                        break; // 输入有效,跳出符号输入循环
                    }
                }
                System.out.println("Invalid input! Please enter only 'X' or 'O'.");
            }

            int NumbersOnBoard = -1;
            // 循环获取有效位置,直到输入0-8的整数
            while (true) {
                System.out.println(" Please enter a number from 0 to 8 to place your character ");
                try {
                    NumbersOnBoard = myScanner.nextInt();
                    // 检查数字范围
                    if (NumbersOnBoard >= 0 && NumbersOnBoard <= 8) {
                        break; // 输入有效,跳出位置输入循环
                    } else {
                        System.out.println("Invalid number! Please enter between 0 and 8.");
                    }
                } catch (InputMismatchException e) {
                    System.out.println("That's not a number! Please enter an integer.");
                    myScanner.next(); // 清空输入缓冲区的无效内容
                }
            }

            // 根据输入数字更新棋盘,用数学计算替代冗长的switch
            int row = NumbersOnBoard / 3;
            int col = NumbersOnBoard % 3;
            GameBoard[row][col] = playerSymbol;

            // 打印更新后的棋盘
            for (int r = 0; r < GameBoard.length; r++) {
                for (int c = 0; c < GameBoard[r].length; c++) {
                    System.out.print(GameBoard[r][c] + "|" + "\t");
                }
                System.out.println();
                for (int i = 0; i < GameBoard[r].length * 3; i++) {
                    System.out.print("-");
                }
                System.out.println();
            }
        }
    }
}

关键修改说明

  1. 符号输入循环:用嵌套while(true)循环,直到用户输入有效的X/O才跳出,不再用break终止游戏循环
  2. 位置输入循环:
    • 用try-catch捕获非整数输入的异常,避免程序崩溃
    • 捕获异常后用myScanner.next()清空输入缓冲区,防止死循环
    • 检查数字是否在0-8范围内,无效则重新提示
  3. 简化棋盘更新:用数学计算row = 数字/3、col = 数字%3代替冗长的switch语句,更简洁且不易出错
  4. 移除终止程序的操作:去掉原代码中break和return的终止逻辑,改为循环重试

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:34:52