Hangman游戏中猜中字符后进度字符串全部被替换为猜字符的问题及修复咨询
Hangman游戏中猜中字符后进度字符串全部被替换为猜字符的问题及修复咨询
嘿,我完全懂你碰到的麻烦!咱们先拆解下问题出在哪儿,再给你搞定的办法~
问题根源
你现在用的progress.replace()方法会替换字符串里所有匹配的字符,而你的progress一开始全是下划线。每次循环里,progress.substring(i, i+1)取到的都是下划线,调用replace之后自然会把所有下划线一次性换成猜的字符——这就是为什么你明明只猜中了两个a,结果整个进度条全变成a了。
另外还有个小细节:你的循环条件i < secret.length() - 1会漏掉最后一个字符的检查,应该改成i < secret.length()才对哦。
修复方案
Java里的String是不可变的,要精准修改指定位置的字符,用StringBuilder会更合适(它是可变的字符串类)。这里有两种修改思路:
思路1:一开始就用StringBuilder存储进度
初始化progress的时候就用StringBuilder,后续修改更高效:
// 假设secret是已经获取到的目标单词 StringBuilder progress = new StringBuilder(); for (int i = 0; i < secret.length(); i++) { progress.append('_'); } // Java 11+可以用简化写法: // StringBuilder progress = new StringBuilder("_".repeat(secret.length()));
然后处理猜字符的逻辑:
if (secret.contains(guess)) { System.out.println(guess + " was in the word!"); for (int i = 0; i < secret.length(); i++) { // 因为guess是单个字符,直接用charAt(0)取出来比较 if (secret.charAt(i) == guess.charAt(0)) { // 只修改对应索引位置的字符 progress.setCharAt(i, guess.charAt(0)); } } }
思路2:临时把String转成StringBuilder修改(适合不想改原有初始化逻辑的情况)
如果你的progress一开始还是用String存储,那可以在修改的时候临时转成StringBuilder:
if (secret.contains(guess)) { System.out.println(guess + " was in the word!"); StringBuilder progressBuilder = new StringBuilder(progress); for (int i = 0; i < secret.length(); i++) { if (secret.charAt(i) == guess.charAt(0)) { progressBuilder.setCharAt(i, guess.charAt(0)); } } // 把修改后的结果存回progress字符串 progress = progressBuilder.toString(); }
效果验证
当secret是alphabet,猜a的时候,循环会找到索引0和4的位置,只把这两个位置的下划线换成a,最终得到a___a___,完全符合你的预期~
备注:内容来源于stack exchange,提问作者voided
相关产品推荐
相关产品推荐

