Java实现无跳转语句的猜数字游戏:含异常处理与5次尝试限制
猜数字游戏代码修正需求
- 系统随机生成1-99(含)的数字
- 用户拥有5次尝试机会,猜对则显示“success”
- 循环中禁止使用break、continue、return
- 通过try-catch、if-else处理异常:输入非int类型触发InputMismatchException,或输入超出范围时,仅提示重新输入,不扣除尝试次数
- 每次尝试后需显示当前尝试进度及数字范围,示例格式如下:
(1/5) 0 < ? < 100 : 50 (2/5) 50 < ? < 100 : 75 (3/5) 50 < ? < 75 :
用户原代码
import java.util.InputMismatchException; import java.util.Random; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); Random r = new Random(); int nbGenere = r.nextInt(100); int nb1; // first number from user int nb2; // second number from user int borneMini; // minimum int borneMax; // max boolean valide1 = false; // variable do #1 boolean valide2 = false; // variable do #2 System.out.println(nbGenere); System.out.print("You got 5 tries to find a number 1 and 99 (inclusive)\n(1/5) 0 < ? < 100: "); do { // do #1 try { nb1 = scan.nextInt(); borneMini = 0; borneMax = 100; valide1 = nb1 > borneMini && nb1 < borneMax; if (!valide1) System.out.print("Enter a valide number 1\n(1/5)" + borneMini + " < ? < " + borneMax + ": "); else if (nb1 == nbGenere) System.out.print("Success!"); else if (nb1 < nbGenere) System.out.print("(2/5) " + nb1 + " < ? < 100: "); else System.out.print("(2/5) 0 < ? < " + nb1 + ": "); } catch (InputMismatchException e) { System.out.print("Enter a valide number 2\n(1/5)" + borneMini + " < ? < " + borneMax + ": "); scan.nextLine(); } do { // #2 try { nb2 = scan.nextInt(); if (nb1 < nbGenere) borneMini = nb1; else borneMini = 0; if (nb1 > nbGenere) borneMax = nb1; else borneMax = 100; valide2 = ((nb1 > nb2 || nb1 < nb2) && nb1 > borneMini && nb1 < borneMax); if (!valide2) System.out.print("Enter a valide number 3\n(2/5)" + borneMini + " < ? < " + borneMax + ": "); else if (nb2 == nbGenere) System.out.print("success!"); else if (nb1 > nb2 ) System.out.print(); } catch (InputMismatchException f) { System.out.print("Enter a valide number 4\n(2/5"); } } while (!valide2); } while (!valide1); } }
修正后的代码
import java.util.InputMismatchException; import java.util.Random; import java.util.Scanner; public class GuessNumberGame { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Random random = new Random(); // 生成1-99的随机数 int targetNumber = random.nextInt(99) + 1; int minRange = 0; int maxRange = 100; int attemptCount = 1; boolean gameOver = false; System.out.println("你有5次机会猜1-99之间的数字"); // 外层循环控制5次尝试机会,用布尔变量控制结束 while (attemptCount <= 5 && !gameOver) { boolean isValidInput = false; int userGuess = 0; // 内层循环处理输入验证,无效输入不消耗尝试次数 while (!isValidInput) { try { // 按要求格式打印进度和范围 System.out.printf("(%d/5) %d < ? < %d : ", attemptCount, minRange, maxRange); userGuess = scanner.nextInt(); // 验证输入是否在当前范围内 if (userGuess <= minRange || userGuess >= maxRange) { System.out.println("请输入符合当前范围的数字"); } else { isValidInput = true; } } catch (InputMismatchException e) { System.out.println("请输入有效的整数"); scanner.nextLine(); // 清除输入缓存中的无效内容 } } // 判断猜测结果 if (userGuess == targetNumber) { System.out.println("success"); gameOver = true; } else { // 更新数字范围 if (userGuess < targetNumber) { minRange = userGuess; } else { maxRange = userGuess; } // 仅有效输入才消耗尝试次数 attemptCount++; } } // 5次机会用完且未猜对的提示 if (!gameOver) { System.out.println("机会用完,正确数字是:" + targetNumber); } scanner.close(); } }
修改说明
- 修正随机数生成逻辑:原代码生成0-99的数字,改为
random.nextInt(99)+1生成符合要求的1-99数字 - 重构循环逻辑:用外层循环控制5次尝试,内层循环处理输入验证,通过
gameOver和isValidInput布尔变量控制循环结束,符合禁止使用break/continue/return的要求 - 统一输入验证:将异常处理和范围验证合并到内层循环,无效输入不消耗尝试次数
- 修复变量初始化问题:解决原代码中异常处理时变量未初始化导致的错误
- 规范输出格式:严格按照示例格式打印进度和范围,统一提示语为中文
- 优化代码结构:删除冗余变量,使用更清晰的变量名提升可读性
- 补充游戏结束逻辑:当5次机会用完且未猜对时,提示正确数字
内容的提问来源于stack exchange,提问作者Ash
相关产品推荐
相关产品推荐

