Java实现Hangman猜词游戏无法替换掩码字符及存储猜测字母求助
Java Hangman猜词游戏实现方案
作业要求说明
- 不允许使用数组,仅通过
char类型操作字符串实现核心逻辑 - 从txt词库文件读取随机单词生成掩码:元音用
=替换,辅音用-替换 - 支持存储已猜测字母,猜对的字母自动替换掩码对应位置
原代码核心问题
- 输入校验逻辑嵌套错误,未正确判断字母是否已猜测,也没有调用掩码更新方法
- 字符串相等判断用
!=而非equals(),导致游戏胜利条件永远不触发 - 已猜测字母存储逻辑混乱,没有在正确时机追加新猜测的字母
- 临时存储新掩码的变量未每轮重置,导致字符串拼接冗余
修正后完整可运行代码
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
相关产品推荐
相关产品推荐

