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

Java实现Hangman猜词游戏无法替换掩码字符及存储猜测字母求助

Java Hangman猜词游戏实现方案

作业要求说明

  • 不允许使用数组,仅通过char类型操作字符串实现核心逻辑
  • 从txt词库文件读取随机单词生成掩码:元音用=替换,辅音用-替换
  • 支持存储已猜测字母,猜对的字母自动替换掩码对应位置

原代码核心问题

  1. 输入校验逻辑嵌套错误,未正确判断字母是否已猜测,也没有调用掩码更新方法
  2. 字符串相等判断用!=而非equals(),导致游戏胜利条件永远不触发
  3. 已猜测字母存储逻辑混乱,没有在正确时机追加新猜测的字母
  4. 临时存储新掩码的变量未每轮重置,导致字符串拼接冗余

修正后完整可运行代码

import java.util.Scanner;
import java.util.Random;
import java.io.*;

public class WordGame2 {
    static Random randomNum = new Random();

    public static void main(String[] args) throws IOException {
        Scanner keyboard = new Scanner(System.in);
        int numberGames = 0;
        int totalGuesses = 0;
        int highScore = Integer.MAX_VALUE;
        char anotherOne;

        System.out.print("Welcome to Words: The Word Guessing Game!\n");
        System.out.print("Play as many games as you like. I'll remember your top score.\n");
        System.out.print("and also compute your average for all games played.\n");
      
        do{
            numberGames++;
            int numGuesses = 0;
            String guessedLetters = "";
            String wordLookup = findWord();
            String hiddenWordGame = hideWord(wordLookup);
      
            System.out.println("\n- - - - - - - - - - - - - - - - - - - - - -");
            // 游戏主循环
            do{
                System.out.print("Letters already guessed: " + guessedLetters);
                System.out.println("\nGuess a letter in this word: " + hiddenWordGame + " ??");
                char guess = keyboard.next().toLowerCase().charAt(0);
                
                // 非字母输入校验
                if (!Character.isAlphabetic(guess)){
                    System.out.println("Not a letter, guess again:");
                    continue;
                }
                // 已猜测字母校验
                boolean isAlreadyGuessed = false;
                for (int l = 0; l < guessedLetters.length(); l++){
                    if (guessedLetters.charAt(l) == guess){
                        isAlreadyGuessed = true;
                        break;
                    }
                }
                if (isAlreadyGuessed) {
                    System.out.println ("==> " + guess + " was already guessed.");
                    continue;
                }
                // 追加到已猜测列表
                guessedLetters += guess;
                numGuesses++;
                // 更新掩码
                hiddenWordGame = updateHiddenWord(wordLookup, hiddenWordGame, guess);
            } while(!hiddenWordGame.equals(wordLookup));
            
            // 游戏结束结算
            System.out.println("Congratulations! You guessed the word: " + wordLookup);
            System.out.println("You used " + numGuesses + " guesses.");
            if (numGuesses < highScore) {
                highScore = numGuesses;
                System.out.println("New high score!");
            }
            totalGuesses += numGuesses;
            System.out.println("Current high score: " + highScore);
            System.out.printf("Average guesses per game: %.2f\n", (double)totalGuesses / numberGames);
            
            System.out.println("Want to play again? (Y/y for another): ");
            anotherOne = keyboard.next().charAt(0);
        } while (anotherOne == 'Y' || anotherOne == 'y');
        keyboard.close();
    }
    
    // 从词库读取随机单词
    public static String findWord() throws IOException {
        String secretWord = "";
        File wordList = new File("wordlist.txt");
        Scanner wordListNew = new Scanner(wordList);
        int wordNumber = randomNum.nextInt(33735) + 1;   
          
        for(int i = 1; i <= wordNumber; i++){
            secretWord = wordListNew.nextLine();
        }
        wordListNew.close();
        return secretWord;
    }
           
    // 生成初始掩码词
    public static String hideWord(String wordLookup) {
        String hiddenWord = "";
        for (int j = 0; j < wordLookup.length(); j++) {
            char c = wordLookup.charAt(j);
            if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'){
                hiddenWord += "=";
            } else {
                hiddenWord += "-";
            }
        }
        return hiddenWord;
    }
        
    // 更新掩码词:替换猜对的字母
    public static String updateHiddenWord(String wordLookup, String hiddenWordGame, char guess) {
        String hiddenWordNew = "";
        for (int k = 0; k < wordLookup.length(); k++) {
            if(wordLookup.charAt(k) == guess){
                hiddenWordNew += guess;
            } else {
                hiddenWordNew += hiddenWordGame.charAt(k);
            }
        }
        return hiddenWordNew;
    }
}

关键逻辑说明

  • 已猜测字母校验:遍历已猜测字符串的每个char判断是否重复,符合不使用数组的要求
  • 掩码更新:每轮猜测传入当前掩码和猜对的字母,逐字符比对生成新的掩码字符串
  • 胜利条件判断:使用String.equals()方法比对当前掩码和目标单词,相等则游戏胜利

内容的提问来源于stack exchange,提问作者beansers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:36:03