Java 而loop赢了';不要重复

Java 而loop赢了';不要重复,java,string,loops,while-loop,Java,String,Loops,While Loop,这是我的方法main中的代码,代码应该调用其他方法来玩数字猜测游戏。我设置了我的while循环,以便它运行游戏,在游戏运行后,它会询问用户是否愿意再次玩。然后,用户将键入任何内容,如果他/她键入的字符串以“y”或“y”开头,则游戏将再次进行。(如果用户没有键入除“n”或“n”以外的任何其他字母,则程序将转到方法调用stats();) 问题是,在游戏运行一次并且用户猜对之后,程序甚至不要求再次玩,它直接进入stats();方法调用。我做错了什么?如何修复它,以便它会要求用户重新播放,并且只要用户键

这是我的方法main中的代码,代码应该调用其他方法来玩数字猜测游戏。我设置了我的while循环,以便它运行游戏,在游戏运行后,它会询问用户是否愿意再次玩。然后,用户将键入任何内容,如果他/她键入的字符串以“y”或“y”开头,则游戏将再次进行。(如果用户没有键入除“n”或“n”以外的任何其他字母,则程序将转到方法调用stats();)


问题是,在游戏运行一次并且用户猜对之后,程序甚至不要求再次玩,它直接进入stats();方法调用。我做错了什么?如何修复它,以便它会要求用户重新播放,并且只要用户键入以“y”或“y”开头的任何单词,它就会继续播放?

您再次将
初始化为空字符串。因此,当它击中您的
时,它不会以任何一个开头。您需要使用
do
/
而不是
循环

public static void main(String[] args) {
  Scanner console = new Scanner(System.in);
  Random r = new Random();
  intro();
  int numGames = 0;
  int numGuesses = game(console, r);
  int max = max(numGuesses);
  String again = "";
  while (again.startsWith("y") || again.startsWith("Y")) {
     game(console, r);
     System.out.println("Do you want to play again?");
     again = console.next();
     numGames++;
  }
  stats(numGames, numGuesses, max);
}

这将允许您在尝试循环之前再次设置
变量。

再次
在第一次检查时是空字符串,因此while根本不执行。
您正在寻找一个
do。。当
构造时。

由于
又是一个循环作用域变量,我将使用for循环:

do {
    // Same content as your other loop
} while (again.startsWith("y") || again.startsWith("Y"))

还添加了一个简化的案例检查。

看起来像
控制台。next()
生成的既不是“y”也不是“y”。您是否尝试过在循环结束之前再次打印
是什么?尝试转储内容(不仅仅是字符,还包括读取值的长度)


请参见

它使用do/while循环工作,但现在它在要求再次玩游戏之前玩了两次游戏。这是为什么?很可能是从您调用
游戏(控制台,r)的位置开始的
当设置
numguesss
时。您应该将其默认为零,并且只能从循环中调用
game
。我不能将其默认为0,因为我正在执行返回语句。此外,只有当猜数大于1时,程序才会要求在第一场游戏后再次玩,如果我在第一次尝试时猜得正确,它才会玩如果我在两次或更多的时间内猜对了游戏,那么在第一次游戏之后,它会要求再次玩。返回语句是什么?您没有显示
游戏
方法的作用,但这超出了这个问题的范围。我想您会想将是否要要求猜一个游戏的条件化通过一步一步地跟踪代码的行为来了解重构。
for (String again = "y"; again.toLowerCase().startsWith("y"); again = console.next()) {
   game(console, r);
   numGames++;
   System.out.println("Do you want to play again?");
}