我正在尝试创建一个摇滚,纸张,剪刀游戏,在继续之前需要用户提供有效的输入。我试图解决这个问题的方法是在内部使用do while循环和if else语句来验证输入。如果它不是给出的选择,那么条件保持为假并且程序循环。但是我试图弄清楚如何返回用户输入的正确值,这些值存储在UserChoice中,这样我就可以访问循环外的变量并继续使用该程序。
这是我的代码:
do{
System.out.println("Enter in rock, paper or scissors:");
Scanner user = new Scanner(System.in);
String UserChoice = user.nextLine();
if(!UserChoice.equals("rock") && (!UserChoice.equals("paper")) && (!UserChoice.equals("scissors"))){
System.out.println("You must enter either rock, paper or scissors. Try again: ");
}else{
isRight = true;
}
}while(isRight==false);
答案 0 :(得分:1)
只需将变量声明移出循环,使其在do-while块的范围之外可用,就像:
String userChoice = null;
do{
System.out.println("Enter in rock, paper or scissors:");
Scanner user = new Scanner(System.in);
userChoice = user.nextLine();
if(!"rock".equals(userChoice) && (!"paper".equals(userChoice)) && (!"scissors".equals(userChoice))){
System.out.println("You must enter either rock, paper or scissors. Try again: ");
}else{
isRight = true;
}
}while(isRight==false);
//here you can still use it
System.out.println(userChoice);
您可以阅读有关变量范围的信息,例如here。
只是一些评论。在调用"rock".equals(userChoice)
时,优先使用equals
表示法,以便在任何原因导致userChoice
对象为NULL时防止NullPointerException。此外,您可以将此行Scanner user = new Scanner(System.in);
移出循环。没有理由在每次迭代时创建扫描程序的新实例。最后一个,虽然条件isRight==false
可以用!isRight
代替,但不需要将它与某些东西进行比较,因为变量本身就是布尔值。
答案 1 :(得分:1)
在do while之前初始化UserChoice
。
String UserChoice = "";
do
....
while ();
System.out.println(UserChoice);
答案 2 :(得分:1)
接下来在循环之外声明变量(正如我在之前的评论中所建议的)对你的代码做了一些评论:
System.out.println("Enter in rock, paper or scissors:");
Scanner user = new Scanner(System.in);
String userChoice = user.nextLine(); //stick to naming conventions, it makes your code easier to read
while(!userChoice.equals("rock") && (!userChoice.equals("paper")) && (!userChoice.equals("scissors"))){
System.out.println("You must enter either rock, paper or scissors. Try again: ");
System.out.println("Enter in rock, paper or scissors:");
userChoice = user.nextLine(); //stick to naming
}
根本不需要每次循环整个代码块。所有需要重复的是错误消息并为userChoice读取新值,并且仅当原始条目无效时才会重复。
例如,在您的代码中,每次循环时都会创建一个新的Scanner实例,而您可以只重用现有的实例。