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(); }
代码说明
- 用
currentIndex记录当前查找的起始位置,初始设为0 - 每次调用
word.indexOf(this.letterGuessed, currentIndex),从currentIndex开始查找下一个匹配的字符索引 - 找到索引后,用
setCharAt替换clone中对应位置的下划线 currentIndex++确保下次查找从当前位置的下一位开始,不会重复处理同一个字符- 当
indexOf返回-1时,说明已经找完所有匹配的字符,循环结束
这样修改后,当你猜r时,burrito里的两个r都会被替换,输出会变成bur_r__,完全符合预期!
另外提个小细节:你原来代码里的letter变量其实是多余的,直接用this.letterGuessed就可以完成替换啦。
内容的提问来源于stack exchange,提问作者Tlat
相关产品推荐
相关产品推荐

