2

我正在制作一个简单的抛硬币游戏,我编写了几个方法来调用并使我的主类简短而简单。游戏玩完一次后,第一个要求用户输入的 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();
    }
}
}
4

4 回答 4

7

该方法toLowerCase()不会改变字符串的内容;String是 Java 中的不可变类。该toLowerCase()方法返回结果。你需要改变

playerPick.toLowerCase();

playerPick = playerPick.toLowerCase();
于 2013-11-04T22:16:34.167 回答
1

问题是当用户输入一行时,输入缓冲区将包含后跟一个“换行符”(行尾)字符的字符。当您使用nextInt时,Scanner将查找并跳过一个整数。但它不会跳过行尾。因此,当您下一次调用 nextLinegetInput(),它将查找上一行的剩余内容,即一个空字符串,并将其返回。您需要做的一些事情:

(1) 在中,在方法末尾 getBet添加,以跳过行尾。将返回一个字符串,但您可以忽略它。另请参阅在 nextXXX 之后使用 nextLine 时的扫描仪问题in.nextLine()nextLine

(2)getInput需要有一个循环,这样如果用户输入了一个无效的输入,你就回去让他输入一个有效的字符串。否则,它会显示"Invalid Selection",然后要求下注,这不是您想要的。

(3) 参见关于 的其他答案toLowerCase

于 2013-11-04T22:29:44.657 回答
1

您的问题是,每次运行测试器循环时,您都没有将“in”重新初始化为新的 Scanner。单个扫描仪读取一行输入并将其作为完整答案接受,而不承认可能有进一步的输入。

于 2013-11-04T22:25:26.043 回答
0

当你使用

playerPick.toLowerCase();

它什么也不做,因为该值没有被分配给任何东西。为了更改对象的值,您必须为其赋值,如下所示:

 playerPick = Pick.toLowerCase();

这会分配值,而不是调用空方法

希望这可以帮助 :)

于 2013-11-04T22:21:56.310 回答