无法退出此循环?

时间:2018-10-28 19:00:33

标签: java loops while-loop

我写了一个使用while循环的简单猜谜游戏。 如果用户键入任何以“ y”开头的单词,游戏将再次运行,但是如果用户键入任何其他单词,游戏将退出并给出报告。

public static void loopcalc(Scanner console) {
  int totalRounds = 0, totalGuesses = 0, best = 1000000;
  boolean want = true;

  while (want = true) {
    int eachguess = playOneGame(console);
    totalRounds++;
    totalGuesses += eachguess;

    System.out.println("Do you want to play again?");
    String input = console.next();

    if (input.toLowerCase().charAt(0) == 'y') {
      want = true;
    } else {
      want = false;
    }
    best = Math.min(eachguess, best);
  }
  report(console, totalGuesses, totalRounds, best);
}

对不起,我不知道如何正确键入代码。

3 个答案:

答案 0 :(得分:6)

您写道:

while(want = true) {

您肯定要检查want是否为true。因此改写:

while(want == true) {

或者更好:

while(want) {

在Java中,=是为变量赋值的运算符。它还返回值。因此,当您输入wanted = true时,您将:

  • want设置为true
  • 返回true

在这里,while返回得到true,并无限地继续循环。

Ps:这是一个非常常见的问题。在2003年,在Linux内核中插入后门的famous attempt使用了此功能(C语言也有此功能)。

答案 1 :(得分:0)

=中的

want = true是一个赋值运算符。相反,您应该尝试使用等式==运算符。

while(want == true)while(want)

答案 2 :(得分:0)

这是您的最新答案。

public static void loopcalc(Scanner console) {
  int totalRounds = 0, totalGuesses = 0, best = 1000000;
  boolean want = true;

  while (want) {
    int eachguess = playOneGame(console);
    totalRounds++;
    totalGuesses += eachguess;

    System.out.println("Do you want to play again?");
    String input = console.next();

    if (input.toLowerCase().charAt(0) == 'y') {
      want = true;
    } else {
      want = false;
    }
    best = Math.min(eachguess, best);
  }
  report(console, totalGuesses, totalRounds, best);
}

您还可以尝试以下方法来摆脱旺旺变量:

public static void loopcalc(Scanner console) {
int totalRounds = 0, totalGuesses = 0, best = 1000000;
boolean want = true;

while (true) {
int eachguess = playOneGame(console);
totalRounds++;
totalGuesses += eachguess;

System.out.println("Do you want to play again?");
String input = console.next();

if (input.toLowerCase().charAt(0) == 'n') {
  break;
}
best = Math.min(eachguess, best);
}
report(console, totalGuesses, totalRounds, best);
}