Java单词解谜程序循环异常:输入正确单词后无法重复接收猜测
单词解谜程序问题排查与修复
问题背景
我正在开发一个基础单词解谜个人项目:用户看到一组字母,需用这些字母组成单词(比如字母I T E R可组成rite、tire、er等)。规则是:输入匹配预设String数组的正确单词,得分累加;输入错误单词(不在数组内),则显示最终得分和耗时。
当前问题:输入第一个正确单词(比如re)后,再输入第二个正确单词(比如tire),程序直接退出循环,且得分仅统计首次正确值。期望实现:能按任意顺序输入数组内的所有单词,得分正确累加。
我尝试过将cont布尔变量移到for循环外,也尝试在判断输入不匹配数组项时添加else if语句控制cont,但问题依旧。
原代码
import java.sql.SQLOutput; import java.time.Duration; import java.time.Instant; import java.util.Scanner; public class Main { public static void main(String[] args) { Instant starts = Instant.now(); String guess; int score = 0; Scanner input = new Scanner(System.in); String seconds; String[] puzzle1 = {"iter", "rite", "tier", "tire", "trie", "ire", "rei", "ret", "rit", "tie", "er", "et", "re", "te", "ti"}; Boolean cont = true; System.out.println("How many words can you create with the following letters:" + "\n T I E R"); System.out.println("Enter a guess: "); String userInput = input.nextLine(); int k= 0; while (cont) { for (int i = 0; i < puzzle1.length; i++) { if (puzzle1[i].equals(userInput)) { score += 100; System.out.println("Good! Enter another guess: "); userInput = input.nextLine(); } } cont = false; } Instant ends = Instant.now(); long mins = Duration.between(starts, ends).toMinutes(); long time = Duration.between(starts, ends).toSeconds(); long actual = time % 60; if (time <= 9) { seconds = "0" + actual; } else { seconds = String.valueOf(time); } System.out.println("Your time was " + mins + ":" + seconds + " and with a score of " + score + " points."); }}
运行输出
How many words can you create with the following letters: T I E R Enter a guess: re Good! Enter another guess: tire Your time was 0:05 and with a score of 100 points.
问题分析
- 循环逻辑错误:
while(cont)循环内,遍历完数组后直接设置cont = false,导致仅执行一次循环,第二次输入的单词还未校验就退出程序。 - 输入处理混乱:在for循环内匹配到正确单词后直接读取下一个输入,但循环仍会继续遍历剩余数组项,且无重复猜词校验,可能出现重复计分。
- 错误输入判断缺失:未处理输入不在数组内的情况,无法触发游戏结束逻辑。
修复方案
优化后的代码
import java.time.Duration; import java.time.Instant; import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class Main { public static void main(String[] args) { Instant starts = Instant.now(); int score = 0; Scanner input = new Scanner(System.in); String[] puzzle1 = {"iter", "rite", "tier", "tire", "trie", "ire", "rei", "ret", "rit", "tie", "er", "et", "re", "te", "ti"}; // 用Set存储有效单词,提升查找效率 Set<String> validWords = new HashSet<>(); for (String word : puzzle1) { validWords.add(word); } // 记录已猜中单词,避免重复计分 Set<String> guessedWords = new HashSet<>(); System.out.println("How many words can you create with the following letters:" + "\n T I E R"); System.out.println("Enter a guess: "); while (true) { String userInput = input.nextLine().trim().toLowerCase(); if (validWords.contains(userInput)) { if (!guessedWords.contains(userInput)) { // 正确且未猜过的单词,累加得分 score += 100; guessedWords.add(userInput); System.out.println("Good! Enter another guess: "); // 猜完所有单词提前结束 if (guessedWords.size() == validWords.size()) { System.out.println("Congratulations! You guessed all words!"); break; } } else { // 已猜过的单词,提示用户 System.out.println("You already guessed this word! Try another one: "); } } else { // 输入错误,结束游戏 break; } } Instant ends = Instant.now(); long mins = Duration.between(starts, ends).toMinutes(); long totalSeconds = Duration.between(starts, ends).toSeconds(); long actualSeconds = totalSeconds % 60; String secondsStr = actualSeconds <= 9 ? "0" + actualSeconds : String.valueOf(actualSeconds); System.out.printf("Your time was %d:%s and with a score of %d points.%n", mins, secondsStr, score); } }
关键优化点
- 使用
HashSet存储有效单词和已猜单词:快速判断输入有效性,避免重复计分,同时提升查找效率。 - 重构循环逻辑:通过
while(true)持续接收输入,直到输入错误单词或猜完所有单词才退出。 - 增加重复猜词处理:提示用户已猜过该单词,避免无效操作。
- 完善结束条件:猜完所有单词时主动结束并给出祝贺,输入错误单词时直接终止游戏。
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

