Java基于类与继承实现Hangman游戏方法运行异常求解
Hangman猜词游戏错误排查与修复方案
核心错误原因
- 未持久化存储当前目标词与猜测状态:每次调用
getWord()都会随机生成新单词,导致displayGuess和updateWord操作的不是同一个目标词,所有修改都无法落地。 displayGuess逻辑错误:每次调用都直接生成全占位符字符串,完全没有用到已猜对的字母状态,所以永远显示全*。updateWord逻辑严重错误:- 循环比对每个字符时,只要当前字符不匹配就立即输出「字母不存在」,所以会按单词长度重复输出N次提示。
- 存储修改后的字符数组是局部变量,方法执行完就销毁,没有保存到类成员变量,修改完全无效。
- 基础成员变量逻辑错误:构造函数传入的最大尝试次数参数没有存储,直接把
tries初始化为0,胜负判定方法完全缺失。
修复方案
前置修改
在HangWord.java开头新增必要导入:
import java.util.Arrays; import java.util.Random; import java.util.Scanner;
第一步:新增必要成员变量
在HangWord类中新增3个私有成员变量:
private String targetWord; // 存储当前局的目标猜词 private char[] currentGuess; // 存储当前猜测状态,猜对的位置存字母,其余存占位符 private int maxTries; // 存储最大允许猜错次数
原有的getWord()方法可以直接删除,逻辑整合到初始化方法中。
第二步:修改构造函数,新增游戏初始化方法
构造对象时直接初始化当前局的游戏状态,抽离公共初始化逻辑方便重开局调用:
public HangWord(char S, int t) { symbol = S; maxTries = t; initGame(); } // 游戏初始化/重置公共方法 private void initGame() { // 随机选择当前局目标词 int len = wordList.length; int index = randGen.nextInt(len); targetWord = wordList[index]; // 初始化猜测状态为全占位符 currentGuess = new char[targetWord.length()]; Arrays.fill(currentGuess, symbol); // 重置猜错次数 tries = 0; }
第三步:修复displayGuess方法
直接输出当前存储的猜测状态即可:
public void displayGuess() { System.out.println("Guess:" + new String(currentGuess)); }
第四步:修复updateWord方法
修改比对逻辑,仅当完全没匹配到字母时才输出一次提示,修改落地到成员变量:
public void updateWord(char a) { boolean hit = false; for (int i = 0; i < targetWord.length(); i++) { if (targetWord.charAt(i) == a) { currentGuess[i] = a; hit = true; } } if (!hit) { tries++; System.out.println("Sorry..." + a + " is not in the word, remaining tries: " + (maxTries - tries)); } }
第五步:实现缺失的核心方法
// 判断是否获胜:没有剩余占位符就说明全猜对了 public boolean win() { return new String(currentGuess).indexOf(symbol) == -1; } // 判断是否失败:猜错次数超过上限 public boolean lose() { return tries >= maxTries; } // 重置游戏,供重开局调用 public void clear() { initGame(); }
第六步:放开父类Hang中注释的代码
把main方法里两行注释的代码放开:
gameOver = game.win() || game.lose(); // 和 game.clear();
修复后效果
运行后会正常显示猜对的字母,仅当字母完全不存在时输出一次提示,猜错8次结束游戏,支持重开功能。
内容的提问来源于stack exchange,提问作者yeah man12345
相关产品推荐
相关产品推荐

