java codebreaker - 循环不会结束

java codebreaker - loop won't end

我正在尝试 "codebreaker"。用户尝试猜测随机密码(4 位整数) 程序说如果输入的密码太 low/high/equal。但是我卡住了,我不明白为什么我的循环不会结束。

public static void main(String[] args) {
    int password = 1234;
    startGame(checkNumber(loadNumber(),password));
}

public static void startGame(boolean isAWinner) {
    int lives = 5;
    do {
        loadNumber();
        lives--;
    } while (lives > 0 || !isAWinner);  //has lives or is not a winner
}

public static int loadNumber() {
    System.out.println("Type the number");
    Scanner scan = new Scanner(System.in);
    int givenNumber = scan.nextInt();
    return givenNumber;
}
//check if greater,lower or equal
public static boolean checkNumber(int number, int password) {
    boolean isAWinner = false;
    if (number == password) {
        System.out.println("congratulations");
        isAWinner = true;
    }
    if (number > password) {
        System.out.println("too much");
    }
    if (number < password) {
        System.out.println("too little");
    }
    return isAWinner;
}

你需要做的

do {
    isAWinner = checkNumber(loadNumber(), password);
    lives--;
} while (lives > 0 && !isAWinner);

否则,如果第一次猜测不正确,!isAWinner 将始终评估为真。我还将 OR 更改为 AND 以便循环中断一次 lives == 0isAWinner == True.

此外,我会在 main 方法之外设置您的 password 变量(作为 class 的一个字段),这样您就可以在 startGame 方法中访问它。

您需要在游戏 运行 时检查从用户输入加载的号码,并将结果分配给 isAWinner

现在 while 循环还在继续,因为 isAWinner 从未在初始 false 值之后分配新值。

public static void startGame(boolean isAWinner) {
    int lives = 5;
    do {
        //TODO: run checkNumber on result of loadNumber and assign its result to isAWinner
        loadNumber();
        lives--;
    } while (lives > 0 || !isAWinner);  //TODO: has lives AND is not a winner
}

此外,您会希望循环在生命大于零且结果不是赢家时继续。

您的代码强制用户在第一次尝试时就正确。逐步完成它(您可以使用调试器和断点来完成此操作,或者只是在头脑中解决这个规模的问题)。

  1. 你打电话给startGame(checkNumber(loadNumber(), password));
  2. 首先调用最里面的函数,在本例中是loadNumber()
  3. 假设用户输入了一个不正确的号码(例如4321)
  4. 接下来调用下一个最里面的函数 checkNumber(4321, 1234) 它将打印 "too much" 然后 return false
  5. 现在,您的外部函数被这样调用 startGame(false),因为 checkNumber() 函数 return 为它设置了 false。
  6. 它给你5条命,然后调用loadNumber()
  7. 加载了一个新号码,但是从未进行过检查号码的函数调用!!
  8. 这种情况会发生,直到生命值达到 0,也就是当您期望它终止时,但是您的 while 条件是这样说的:如果用户有生命,则继续玩游戏OR 如果用户没有获胜。

由于第一次迭代后不可能获胜,条件的第二部分在第一次初始错误猜测后永远不会改变。您可以通过将代码更改为 while (lives > 0 && !isAWinner); 来解决您提出的原始问题,但您仍然会遇到在第一个答案之后没有检查任何答案的问题。