入门级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(); } } } }
关键修改说明
- 符号输入循环:用嵌套
while(true)循环,直到用户输入有效的X/O才跳出,不再用break终止游戏循环 - 位置输入循环:
- 用
try-catch捕获非整数输入的异常,避免程序崩溃 - 捕获异常后用
myScanner.next()清空输入缓冲区,防止死循环 - 检查数字是否在0-8范围内,无效则重新提示
- 用
- 简化棋盘更新:用数学计算
row = 数字/3、col = 数字%3代替冗长的switch语句,更简洁且不易出错 - 移除终止程序的操作:去掉原代码中
break和return的终止逻辑,改为循环重试
内容的提问来源于stack exchange,提问作者Gkdnzx707
相关产品推荐
相关产品推荐

