【问题标题】:Need to type "pass" twice to advance需要输入“pass”两次才能前进
【发布时间】:2012-07-15 19:44:12
【问题描述】:

感谢您阅读本文。我正在使用 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();
        }
    }

【问题讨论】:

  • 请将代码的相关部分发布在问题本身中。

标签: java validation blackjack


【解决方案1】:

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

String input = in.next();

if (input.equalsIgnoreCase("Hit"))
{
    hit();
}
else if (input.equalsIgnoreCase("Pass"))
{
    pass();
}

【讨论】:

    【解决方案2】:

    你当然想要:

    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 documentation

    【讨论】:

    • 感谢这完美解决了我的问题!
    【解决方案3】:

    在第 112 行你这样做:

    in.next()
    

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-06
        • 1970-01-01
        • 1970-01-01
        • 2015-05-23
        • 2016-06-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多