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

Java刽子手游戏重复字符替换问题求助

解决Hangman游戏中重复字符替换的问题

嘿,我太懂你这个困扰了!现在你的代码只会处理待猜单词里第一个匹配的字符,就像burrito里的两个r,每次猜r只能替换第一个下划线,剩下的那个直接被漏掉了。

问题出在哪?

你当前用word.indexOf(this.letterGuessed)只会返回字母第一次出现的索引,所以StringBuilder.setCharAt只修改了第一个位置,完全没考虑单词里重复出现的字符。

修复方案

我们需要遍历整个单词,找出所有和猜测字母匹配的位置,然后逐个替换clone里的下划线。可以用indexOf的重载方法(带起始查找位置参数)来循环查找,直到找不到匹配的字符为止。

修改后的代码如下:

while (this.guessesLeft >= 0) { 
    char letter; 
    int letterIndex; 
    getGuess(); 
    if(this.word.contains(this.letterGuessed)) { 
        StringBuilder newString = new StringBuilder(this.clone); 
        int currentIndex = 0;
        // 循环查找所有匹配的字符位置
        while((currentIndex = this.word.indexOf(this.letterGuessed, currentIndex)) != -1) {
            newString.setCharAt(currentIndex, this.letterGuessed);
            currentIndex++; // 移动到下一个位置,避免重复处理同一个索引
        }
        this.clone = newString.toString(); 
    } else { 
        this.guessesLeft--; 
    } 
    printGameBoard(); 
}

代码说明

  1. 用currentIndex记录当前查找的起始位置,初始设为0
  2. 每次调用word.indexOf(this.letterGuessed, currentIndex),从currentIndex开始查找下一个匹配的字符索引
  3. 找到索引后,用setCharAt替换clone中对应位置的下划线
  4. currentIndex++确保下次查找从当前位置的下一位开始,不会重复处理同一个字符
  5. 当indexOf返回-1时,说明已经找完所有匹配的字符,循环结束

这样修改后,当你猜r时,burrito里的两个r都会被替换,输出会变成bur_r__,完全符合预期!

另外提个小细节:你原来代码里的letter变量其实是多余的,直接用this.letterGuessed就可以完成替换啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:12:50