我有一个简单的猜数字游戏。它具有询问您是否需要提示的功能。如图所示,它将响应保存在称为booleantips中。

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=trueguess < gvalif放在一个&&中,但是它不起作用。我这样做:
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 = truetrue分配给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,运算符
07-27 21:00