Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java If语句在被调用一次后跳转到else?_Java_Java.util.scanner - Fatal编程技术网

Java If语句在被调用一次后跳转到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

我正在做一个简单的掷硬币游戏,我写了几个方法来调用并使我的主类简短。游戏玩一次后,第一个请求用户输入的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(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();