【问题标题】: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());
它的输入和输出是什么?
代码的主要区别
注意新代码有两处不同:
- 您只需调用一次
in.next(),因此只需要一个输入,该输入存储为answer。
- 如果答案还不是“命中”,您只需检查答案是否为“通过”。
见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() 应该可以解决问题。