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

Java基于类与继承实现Hangman游戏方法运行异常求解

Hangman猜词游戏错误排查与修复方案

核心错误原因

  • 未持久化存储当前目标词与猜测状态:每次调用getWord()都会随机生成新单词,导致displayGuess和updateWord操作的不是同一个目标词,所有修改都无法落地。
  • displayGuess逻辑错误:每次调用都直接生成全占位符字符串,完全没有用到已猜对的字母状态,所以永远显示全*。
  • updateWord逻辑严重错误:
    1. 循环比对每个字符时,只要当前字符不匹配就立即输出「字母不存在」,所以会按单词长度重复输出N次提示。
    2. 存储修改后的字符数组是局部变量,方法执行完就销毁,没有保存到类成员变量,修改完全无效。
  • 基础成员变量逻辑错误:构造函数传入的最大尝试次数参数没有存储,直接把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:15:08