2

感谢您阅读本文。我正在使用 java 创建一个简单的通用版本的二十一点。其他一切都很好,除了当它问你“击中或传球”并且你输入 pass 时,你必须输入两次才能重新调整它,我似乎无法找出原因。这是我在 pastebin 上的代码,以便于阅读: http: //pastebin.com/GF7Rzusx

来自 pastebin 的相关代码:

  public void ask()
    {
        System.out.println("Hit or Pass?");
        if (in.next().equalsIgnoreCase("Hit"))
        {
            hit();
        }
        if (in.next().equalsIgnoreCase("Pass"))
        {
            pass();
        }
    }
4

4 回答 4

5

如果输入的字是"Pass"从标准输入读取然后丢失,则不存储。必须存储它以便在后续检查中再次可用:

String input = in.next();

if (input.equalsIgnoreCase("Hit"))
{
    hit();
}
else if (input.equalsIgnoreCase("Pass"))
{
    pass();
}
于 2012-07-16T22:00:49.453 回答
4

你当然想要:

public void ask()
{
    System.out.println("Hit or Pass?");
    String answer = in.next();
    if (answer.equalsIgnoreCase("Hit"))
    {
        hit();
    } else if (answer.equalsIgnoreCase("Pass"))
    {
        pass();
    }
}

每次调用in.next()它都会丢弃先前的输入并期望另一个令牌(输入)。

例子

想象一下如果你有会发生什么:

System.out.println(in.next());
System.out.println(in.next());

它期望输入什么,输出什么?

代码的主要区别

请注意,新代码有两个不同之处:

  1. 您只需调用in.next()一次,因此只需要一个输入,该输入存储为answer.
  2. 如果答案还不是“命中”,您只需检查答案是否为“通过”。

请参阅Java Scanner.next 文档

于 2012-07-16T22:00:40.730 回答
3

在第 112 行,您执行以下操作:

in.next()

这将读取一个字符串标记。所以如果你写pass,这个函数会返回“pass”。

问题是你没有保存这个值。相反,您在第 116 行再次运行 in.next(),这将要求您再次编写 pass。

相反,您希望将 in.next() 返回的字符串存储在第 112 行。

于 2012-07-16T22:01:38.867 回答
1

这是因为 ask() 方法的结构方式。由于您有两个 if 语句,因此在检查响应是否“命中”时调用 in.next() 一次,然后在检查“通过”时调用第二次。当您输入“pass”时,第一个 if 语句调用 next(),它返回“pass”并检查是否等于“hit”,然后继续。那么当第二个 if 语句调用 next() 时,没有下一个要返回的条目,所以你必须再次输入“pass”。但是,当您输入“hit”时,这会起作用,因为这是检查的第一种情况。

重构所以 ask 只调用一次 next() 应该可以解决问题。

于 2012-07-16T22:13:18.720 回答