java codebreaker-循环不会结束

时间:2019-11-21 17:01:04

标签: java passwords decode

我试图制作一个“密码破解者”。用户尝试猜测随机密码(4位整数) 程序会提示输入的密码是否太低/太高/相等。但是我被困住了,我不知道为什么我的循环不会结束。

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;
}

3 个答案:

答案 0 :(得分:1)

您需要做

JNIEnv*

否则,如果do { isAWinner = checkNumber(loadNumber(), password); lives--; } while (lives > 0 && !isAWinner); 在第一次猜测时不正确,则总会得出true。我还将“或”更改为“与”,以便循环将!isAWinnerlives == 0中断一次。

我也将isAWinner == True变量设置在main方法之外(作为类的字段),以便您可以在password方法内部访问它。

答案 1 :(得分:1)

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

现在,while循环继续进行,因为在初始错误值之后,从未为 isAWinner 分配新值。

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
}

此外,您将希望在生命大于零且结果不是赢家的情况下继续循环。

答案 2 :(得分:1)

您的代码强制在第一次尝试时使用户正确。逐步进行操作(您可以使用调试器和断点来完成此操作,或者只是在头脑中遇到这种大小的问题)。

  1. 您致电startGame(checkNumber(loadNumber(), password));
  2. 首先调用最里面的函数,在这种情况下为loadNumber()
  3. 假设用户输入的错误数字(例如4321)
  4. 下一个最里面的函数称为next checkNumber(4321, 1234),它将打印“太多”然后返回false
  5. 现在,您的外部函数将像startGame(false)这样被调用,因为checkNumber()函数向其返回了false。
  6. 它给您5条生命,然后呼叫loadNumber()
  7. 已加载新号码,但从未进行过检查该号码的函数调用!
  8. 这种情况一直发生,直到生命达到0,这就是您期望终止的时间,但是您的while条件表明:如果用户有生命,请继续玩游戏 OR (如果用户没有赢得比赛)。

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