Java中用Stack实现反向猜词游戏时无法按指定顺序输出的问题
异常原因
- 字符拼接顺序错误:每次将栈弹出的字符追加到
test字符串末尾,但栈弹出顺序是从后往前的字母(以cheese为例,弹出顺序为e→s→e→e→h→c),追加到末尾会导致已揭示的字母顺序完全倒置。比如第一次弹出e存入test,第二次弹出s追加到test末尾得到es,展示时栈顶s加test会得到ses,和预期的se顺序相反。 - 输出逻辑错误:每轮开头先输出
letters.peek() + test,把当前栈顶还没弹出的字母直接拼在已揭示的test前面,随后又把该字母弹出追加到test末尾,双重逻辑导致顺序进一步错乱。 - 循环条件错误:用
guesses < letters.size()作为循环判断条件,但letters.size()会随着pop操作不断减小,会导致循环次数和预期的单词长度不一致。
修复方案
修改核心逻辑:提前保存单词总长度控制循环;每次将新弹出的字符拼在test的最前面,而非末尾;调整输出逻辑,下划线数量为剩余未揭示的字母数,直接输出下划线加已揭示的格式化test字符串即可。
修复后代码如下:
// 提前保存单词总长度 int totalLength = letters.size(); int guesses = 0; String test = ""; int score = 0; Scanner sc = new Scanner(System.in); while(guesses < totalLength){ System.out.print("Your word is: "); // 计算需要输出的下划线数量 int underLineCount = totalLength - test.length() - 1; for(int i = 0; i < underLineCount; i++){ System.out.print("_ "); } // 格式化输出已揭示的字母,字母之间加空格 if(test.isEmpty()){ System.out.println(letters.peek()); }else{ System.out.println(letters.peek() + " " + String.join(" ", test.split(""))); } System.out.println("Score: " + score); System.out.print("What letter do you guess? "); char guess = sc.next().charAt(0); Character current = letters.pop(); if(guess == current){ score++; }else{ score--; } // 新弹出的字符拼在test最前面保证顺序正确 test = current + test; guesses++; } // 循环结束输出完整单词 System.out.println("Your word is: " + String.join(" ", test.split(""))); System.out.println("Gameover!");
内容的提问来源于stack exchange,提问作者Joseph Attia
相关产品推荐
相关产品推荐

