Java If语句在被调用一次后跳转到else?
我正在做一个简单的掷硬币游戏,我写了几个方法来调用并使我的主类简短。游戏玩一次后,第一个请求用户输入的If/Else语句直接跳到Else语句,而不提示输入Java If语句在被调用一次后跳转到else?,java,java.util.scanner,Java,Java.util.scanner,我正在做一个简单的掷硬币游戏,我写了几个方法来调用并使我的主类简短。游戏玩一次后,第一个请求用户输入的If/Else语句直接跳到Else语句,而不提示输入 package cointoss; import java.util.Random; import java.util.Scanner; public class Game { int money; int result; int bet; Random rn = new Random(); Scanner in = new Scanner
package cointoss;
import java.util.Random;
import java.util.Scanner;
public class Game {
int money;
int result;
int bet;
Random rn = new Random();
Scanner in = new Scanner(System.in);
String playerPick;
String aResult;
public void setMoney(int a)
{
money = a;
}
public int getMoney()
{
return money;
}
public void getBet()
{
System.out.println("How much would you like to bet?");
bet = in.nextInt();
do{
if(bet > money)
{
System.out.println("You cannot bet more than you have!");
System.out.println("You have bet " + (bet - money) + " too many coins.");
continue;
}
else
System.out.println("You have bet " + bet + " coins.");
}
while(bet > money);
}
public void getInput()
{
System.out.println("Pick Heads or Tails");
playerPick = in.nextLine();
playerPick.toLowerCase();
if(playerPick.contains("heads"))
playerPick ="heads";
else if(playerPick.contains("tails"))
playerPick ="tails";
else
System.out.println("Invalid Selection");
}
public void flipCoin()
{
result = rn.nextInt(2);
if(result == 0)
{
aResult = "heads";
}
else
aResult = "tails";
}
public void checkResult()
{
if(playerPick.equals(aResult))
{
System.out.println("You have won!");
money += bet;
System.out.println("You now have " + money + " coins");
}
else{
System.out.println("You have lost!");
money -= bet;
System.out.println("You now have " + money + " coins");
}
}
}
我的测试人员类别:
package cointoss;
public class GameTest {
public static void main(String[] args)
{
Game coinToss = new Game();
coinToss.setMoney(100);
while(coinToss.getMoney() > 0)
{
coinToss.getInput();
coinToss.getBet();
coinToss.flipCoin();
coinToss.checkResult();
}
}
}
不更改字符串的内容String
在Java中是一个不可变的类。toLowerCase()
方法返回结果。你需要改变
playerPick.toLowerCase();
到
当你使用
playerPick.toLowerCase();
它不执行任何操作,因为该值未分配给任何对象要更改对象的值,必须为其指定值,如下所示:
playerPick = Pick.toLowerCase();
这将分配值,而不是调用空方法
希望这有帮助:)您的问题是,您没有在每次运行测试仪循环时将“in”重新初始化为新的扫描仪。单个扫描器读取一行输入,并接受该行作为完整答案,而不确认可能有进一步的输入。问题是,当用户输入一行时,输入缓冲区将包含字符,后跟“换行符”(行尾)字符。使用
nextInt
时,扫描仪将查找并跳过一个整数。但它不会跳过最后一行。因此,当您在getInput()
中下一次调用nextLine
时,它将找到上一行的剩余内容,即一个空字符串,并返回该字符串。您需要做的一些事情:
(1) 在getBet
中,在方法末尾添加In.nextLine()
,以跳过行尾nextLine
将返回一个字符串,但您可以忽略它。另见
(2) getInput
需要有一个循环,这样,如果用户输入了无效的输入,您可以返回并要求他输入有效的字符串。否则,它将显示“无效选择”
,但随后要求下注,这不是您想要的
(3) 查看关于
toLowerCase
的其他答案,您甚至可以通过在.nextLine().toLowerCase()中写入playerPick=in来节省一些空间;小写值将保存在变量playerPick中。理想情况下,您不应该让游戏逻辑以字符串形式处理-创建枚举并仅使用单个字符串检查进行设置。使用System.out.println(“无效选择:+playerPick”)代码>以确定输入的真正内容。感谢您对toLowerCase的帮助。现在要为逻辑生成一个enum和一个switch语句,它看起来更“逻辑”;)这就解决了!非常感谢。
playerPick = Pick.toLowerCase();