【问题标题】:java codebreaker - loop won't endjava codebreaker - 循环不会结束
【发布时间】:2019-11-21 17:01:04
【问题描述】:

我正在尝试制作“密码破解者”。用户尝试猜测随机密码(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;
}

【问题讨论】:

  • 当 living == 0 AND isAWinner == TRUE 时,循环将结束。这可能不是您想要的 - 如果您希望用户最多尝试 5 次,请使用 &&。

标签: java passwords decode


【解决方案1】:

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

现在 while 循环继续进行,因为在初始 false 值之后从未为 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】:

    你需要做的

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

    否则!isAWinner 将始终评估为真,如果它在第一次猜测时不正确。我还将 OR 更改为 AND,这样循环就会中断一次 lives == 0isAWinner == True

    我还将在 main 方法之外设置您的 password 变量(作为您的类的一个字段),以便您可以在您的 startGame 方法中访问它。

    【讨论】:

      【解决方案3】:

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

      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 条件表明:如果用户有生命值,则继续玩游戏 如果用户没有获胜。

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

      【讨论】:

      • 谢谢,你的解释让我明白了:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多