Java Elimination游戏最低分统计功能逻辑错误修复求助
问题原因
- 最低分变量作用域错误:你把
lowestScore声明在了每轮游戏的循环内部,每次新开游戏都会被重新初始化为Integer.MAX_VALUE,因此当前游戏得分永远小于这个初始值,每次都会触发新最低分的判定。 - 原代码逻辑不完善:原代码仅在用户选择彻底结束游戏时才打印得分,选择重开游戏时不会输出本轮得分,也没有对应的分数统计逻辑。
修改后完整可运行代码
import java.util.Scanner; public class Elimination { public static void main(String[] args) { try (Scanner in = new Scanner(System.in)) { // 历史最低分声明在最外层,不会随每轮游戏重置 int lowestScore = Integer.MAX_VALUE; boolean playAgain = true; // 修正原代码赋值笔误,直接用布尔值判断即可 while (playAgain) { Board B = new Board(); int die1, die2; boolean legalMove; String choice = " "; while (!choice.equalsIgnoreCase("Q")) { System.out.println("\n" + B); die1 = (int) (1 + Math.random() * 6); die2 = (int) (1 + Math.random() * 6); legalMove = false; System.out.println("Dice roll: " + die1 + " " + die2); while (!legalMove) { System.out.print("What is your move (V=values, S=sum, Q=quit)? "); choice = in.next(); if (choice.equalsIgnoreCase("Q")) { legalMove = true; // 退出当前游戏时先统计分数 int currentScore = B.score(); System.out.println("----------------- Game Ended -----------------"); if (currentScore < lowestScore) { lowestScore = currentScore; System.out.println("Score = " + currentScore + " NEW LOWEST SCORE!"); } else { System.out.println("Score = " + currentScore); } System.out.println("Lowest Score = " + lowestScore); // 再询问是否重开 System.out.println("Do you want to play again (Y=yes, N=no)?"); String YorN = in.next(); if (YorN.equalsIgnoreCase("Y")) { System.out.println("----------------- New Game -----------------"); playAgain = true; // 重置choice状态,进入下一轮游戏 choice = " "; } else if (YorN.equalsIgnoreCase("N")) { playAgain = false; } else { System.out.println("Invalid input, game will exit."); playAgain = false; } } else if (choice.equalsIgnoreCase("S") && B.removeTile(die1 + die2)) { legalMove = true; } else if (choice.equalsIgnoreCase("V") && B.removeTiles(die1, die2)) { legalMove = true; } else { System.out.println("Try again."); } } } } } } }
核心修改点说明
- 将
lowestScore变量移到所有游戏循环的外层,程序运行期间只会初始化一次,永久保留历史最低分记录 - 把分数统计逻辑放到用户触发Q退出当前游戏的位置,不管用户选择重开还是彻底退出,都会先输出本次得分和历史最低分
- 修正了原代码
while (playAgain = true)的笔误,该写法是给变量赋值而非比较,直接使用while (playAgain)即可正常判断循环条件
内容的提问来源于stack exchange,提问作者Jane
相关产品推荐
相关产品推荐

