Java while循环无法回到开头生成新题目 开发问题求解
加法游戏问题修复方案
你的代码核心问题出在Scanner输入读取和答题逻辑结构上,具体问题和修复方案如下:
存在的问题
- 重复调用
sc.nextInt():每调用一次该方法就会等待用户输入一次新值,你的代码里打印题目后先在correct()方法里读了一次输入,紧接着while判断条件又读了一次,correct()内部又读一次,用户每次答题需要连续输3次值才能走完一轮逻辑,看上去就像程序卡住不刷新题目。 - 答题逻辑混乱:答对校验和答错重试逻辑拆分在两处,既重复又没有处理答对后进入下一轮出题的跳转逻辑。
- 终止条件有误:主循环设置的
wrong <= 3会允许最多4次答错,不符合答错3次结束的需求。
修复后的代码
import java.util.Random; import java.util.Scanner; import java.util.ArrayList; public class AddingGame { Random rand1, rand2; int points = 0, wrong = 0, sum; String str = ""; Scanner sc; ArrayList <Integer> mem; public AddingGame() { sc = new Scanner(System.in); rand1 = new Random(); rand2 = new Random(); int r1, r2, i, userInput; mem = new ArrayList <> (); System.out.println("输入任意整数获取题目,答对即可进入下一题,每答对一题得1分,答错3次游戏结束。"); // 修正终止条件:答错3次就结束 while (wrong < 3) { mem.clear(); // 比removeAll更高效 sum = 0; i = 0; str = ""; r1 = rand1.nextInt(5) + 2; // 决定题目的项数 while (mem.size() < r1) { r2 = rand2.nextInt(50) + 1; // 决定每一项的值 mem.add(r2); sum += r2; if (i == (r1 - 1)) { str = str + mem.get(i) + " = ?"; } else { str = str + mem.get(i) + " + "; } i++; } System.out.println(str); // 单次答题逻辑,只读取一次输入 while(true) { userInput = sc.nextInt(); if(userInput == sum) { points++; if (points != 1) { System.out.println("答对了!你当前的积分为 " + points + " 分!" ); } else { System.out.println("答对了!你当前的积分为 " + points + " 分!" ); } // 答对直接跳出答题循环,进入下一轮出题 break; } else { wrong++; if (wrong >= 3) { System.out.println("你的答题次数已用尽!"); // 答错3次直接结束游戏 return; } System.out.println("再试一次!"); System.out.println(str); } } } } public static void main(String[] args) { new AddingGame(); } }
优化说明
- 移除了冗余的
correct()方法,将答题逻辑合并到一处,避免重复读取Scanner输入 - 替换
mem.removeAll(mem)为mem.clear(),性能更好也更易读 - 补充了main方法,保证程序可以直接运行
- 所有输入只读取一次存入变量,避免重复等待用户输入
- 将提示文本调整为中文,更符合使用习惯
内容的提问来源于stack exchange,提问作者eerieghoul
相关产品推荐
相关产品推荐

