我有一个简单的猜数字游戏。它具有询问您是否需要提示的功能。如图所示,它将响应保存在称为boolean
的tips
中。
while (run) {
while (tinvalidrun){
System.out.println("Do you want any tips? y or n?");
input=in.next();
switch(input){
case "y":
System.out.println("Ok, we will tell you how close you are!");
tinvalidrun=false;
tips=true;
break;
case "n":
System.out.println("Wanna go hard eh? Well, go along!");
tinvalidrun=false;
break;
default:
System.out.println("You pressed the wrong key!\nDo you have butter fingers?");
}
}
然后,我还有更多的代码,可以编写更多的变量并生成一个随机数。最后,我得到用户输入以进行猜测并进行测试:
do {
System.out.println("Enter a number: ");
guess = in.nextByte();
times++;
if (guess == gval) {
break;
} else {
System.out.println("No luck! Try again!");
if (tips=true) {
if (guess < gval) {
System.out.println("You are too low!");
}
else {
System.out.println("You are too high!");
}
}
}
我尝试将
tips=true
和guess < gval
与if
放在一个&&
中,但是它不起作用。我这样做:if(guess<gval && tips=true)
它要求我将
=
替换为<=
或类似的东西。我尝试使用两个if
语句,但是当您拒绝时,它仍然显示提示。我试着看一下括号,但看起来不错。请帮忙!如果我可以对代码进行任何简化,改进或构想,欢迎使用它们。我还有更多问题。当您尝试向整数键入字母时,它会崩溃(显然)。我尝试使用字符串和
tinvalidrun
循环来避免这种情况,但我不能。有没有办法做到这一点?谢谢! :)
最佳答案
测试平等
在测试tips == true
时,您需要if (guess<gval && tips)
,或者只需要if (tips)
和boolean
。=
是assignment operator,==
是equality operator。将两者混合起来很容易,但是区别是巨大的...
boolean 分配也是(意外)相等性测试
您说:“我尝试使用两个if语句,但是当您拒绝时,它仍然显示提示。” if
语句需要一个表达式must have type boolean
。任何赋值表达式(即tips = true
)都将作为分配给变量的新值求值。从JLS §15.26.1 Simple Assignment Operator:
因此if (tips = true)
是有效的语法,因为tips = true
既是赋值又是boolean
表达式,因此可以在if
中使用。
在您的情况下,tips = true
将true
分配给tips
(即使它开始于false
),然后返回tips
的新值。 if
看到新值(true
)并愉快地继续。因此,不是测试tips
最初是true
。例如,这意味着以下内容将打印出"Oops!"
文本:
boolean tips = false;
if (tips=true){
System.out.println("Oops! This tests as true, but that isn't what we wanted");
}
如您所见,混合分配和测试通常是一个坏主意。如果在
=
/if
/do
表达式中使用while
,通常是一个错误。有时它可以帮助您简洁起见,但这通常是不明智的做法。if (guess<gval && tips = true)
为什么不起作用?这是由于operator precedence。在表达式
if (guess<gval && tips = true)
中,运算符的优先级是<
,然后是&&
,然后是=
,因此编译器不再将tips = true
部分作为true
分配给技巧的评估。您可以使用方括号来包含tips = true
,但是正如我在上文所述,您实际上并不需要分配,因此您可以忽略此详细信息†。测试有效字节输入
对于问题的最后一部分,您说如果有人输入字母,您将得到一个无效字节。我猜你会收到
java.util.InputMismatchException
。您可以使用
Scanner.hasNextByte()
在使用前测试输入是否为字节。如果返回false,则可以使用nextLine()
消耗并丢弃输入,打印出错误消息并再次循环。†根据您编写代码的方式,您可能还会从eclipse中看到一条消息,例如“对于参数类型boolean,Boolean,运算符