java - 如何修复内部 While 循环
问题描述
帮助!
内部 while 循环 (askAgain) 无法正常工作。我想要它,这样当用户按“y”开始新游戏时,它将退出内部循环并返回到外部 whileloop(keepPlaying)并按“n”退出游戏。
如果用户既没有按 'y' 也没有按 'n',也没有按任何其他键,它将循环回到:askAgain,直到用户做出有效的选择。
该程序未按预期工作。请帮忙。
import java.util.Random;
import java.util.Scanner;
public class Game {
private int playerGuess;
private boolean keepPlaying = true;
private boolean askAgain = true;
Random randomNumber;
int generatedYear;
int generatedMonth;
int generatedDay;
/**
*
*/
public Date getRandomDate() {
randomNumber = new Random();
generatedYear = randomNumber.nextInt(600) + 1600;
generatedMonth = randomNumber.nextInt(12) + 1;
generatedDay = randomNumber.nextInt(31) + 1;
Date generatedDate = new Date (generatedYear, generatedMonth, generatedDay);
return generatedDate;
}
/**
*
*/
public void guessTheDate() {
Scanner userInput = new Scanner(System.in);
while(keepPlaying) {
int ranDateYear= getRandomDate().getYear();
System.out.println("New Game!!");
System.out.println();
System.out.print("Please guess the year. (0 - 2199): ");
while(userInput.hasNext()) {
if(userInput.hasNextInt()) {
playerGuess = userInput.nextInt();
if(playerGuess > ranDateYear) {
System.out.println("Out of bounds, too high: " + playerGuess + " (Randomized Number: " + ranDateYear+ ")");
System.out.println();
System.out.println("Try again!");
System.out.print("Please guess the year (0 - 2199): ");
}else if(playerGuess < ranDateYear) {
System.out.println("Out of bounds, too low: " + playerGuess + " (Randomized Number: " + ranDateYear + ")");
System.out.println();
System.out.println("Try again!");
System.out.print("Please guess the year (0 - 2199): ");
}else{
if (playerGuess == ranDateYear) {
System.out.println("Correct! It is a match: " + playerGuess + " (Randomized Number: " + ranDateYear + ")");
System.out.println();
System.out.print("Play again? (Y/N): ");
while (askAgain) {
while (userInput.hasNext()) {
if (userInput.hasNext()) {
String input = userInput.next();
if (input.equalsIgnoreCase("y")) {
keepPlaying = true;
} else if (input.equalsIgnoreCase("n")){
keepPlaying = false;
} else {
askAgain = true;
}
break;
}
}
}
}
}
} else {
System.out.println("Invalid input, not a number.");
System.out.print("Enter another number: ");
userInput.next();
}
}
}
System.out.println("The end. Thank you for playing!");
}
}
解决方案
if (userInput.hasNext()) {
String input = userInput.next();
if (input.equalsIgnoreCase("y")) {
keepPlaying = true;
askAgain = false;
} else if (input.equalsIgnoreCase("n")){
keepPlaying = false;
askAgain = false;
} else {
askAgain = true;
}
break;
}
并参考下一条和下一条线的区别
编辑:
将 while(userInput.hasNext()) {替换为告诉用户正在输入的变量,因此在 askAgain 循环中,该变量将变为 false。
尝试这个:
while(enteringInput) {
try{
playerGuess = userInput.nextInt();
if(playerGuess > ranDateYear) {
System.out.println("Out of bounds, too high: " + playerGuess + " (Randomized Number: " + ranDateYear+ ")");
System.out.println();
System.out.println("Try again!");
System.out.print("Please guess the year (0 - 2199): ");
}else if(playerGuess < ranDateYear) {
System.out.println("Out of bounds, too low: " + playerGuess + " (Randomized Number: " + ranDateYear + ")");
System.out.println();
System.out.println("Try again!");
System.out.print("Please guess the year (0 - 2199): ");
}else{
if (playerGuess == ranDateYear) {
System.out.println("Correct! It is a match: " + playerGuess + " (Randomized Number: " + ranDateYear +")");
System.out.println();
System.out.print("Play again? (Y/N): ");
while (askAgain) {
System.out.print(askAgain);
while (userInput.hasNext()) {
String input = userInput.nextLine();
if (input.equalsIgnoreCase("y")) {
keepPlaying = true;
askAgain = false;
} else if (input.equalsIgnoreCase("n")){
keepPlaying = false;
askAgain = false;
enteringInput = false;
} else {
askAgain = true;
}
break;
}
}
}
}
}catch(Exception e){
System.out.println("Invalid input");
userInput.nextLine();
}
}
推荐阅读
- angular - 使用异步功能完成地图时执行操作
- c# - 如何将 IHttpActionResult(内部带有 JSON)转换为我可以使用 LINQ 处理的对象
- excel - 单元格的值不被识别为等于列表框项目,即使它是
- reactjs - 更新数组中对象的状态并使用 react-native 更改文本样式
- neural-network - 我们可以从图像分割任务中创建显着图吗?
- linux - xfce 中的窗饰缺失
- azure - 无法保存 Azure 机器人名称
- sql - SQL - 在特定子字符串之后全选
- wcf - 如何在服务和windows窗体之间做一个wcf?
- hibernate - 在 Spring Boot 2.x 及更高版本中使用 QueryDSL