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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:40:34