0

我对 Java 编程非常陌生,我正在尝试制作一个 Poker Hand Evaluator。我正在使用 for 循环询问卡片的花色和价值。出于某种原因,它在 for 循环的第一次迭代中起作用,但之后只要求我输入一个值。这是我的代码:

import java.util.Scanner;
public class PokerRun {

public static void main(String[] args) {

    int [] suit = new int[5];
    int [] value = new int[20];
    Card card1 = new Card();
    Scanner in = new Scanner(System.in);
    int counter = 1;
    System.out.println("Welcome to the Poker Hand Evaluator!");
    for(int i = 1; i<6; i++)
    {
        System.out.println("What is the suit of card " + i + "?\nPlease type the suit in all lowercase letters: ");
        card1.suit = in.nextLine();
        System.out.println("What is the value of card " + i + "?  (J = 11, Q = 12 K = 13, A = 14");
        card1.value = in.nextInt();
        //checks if face card, if true, then changes card.facecard
        if(card1.value == 11)
            card1.facecard = "Jack";
        else if(card1.value == 12)
            card1.facecard = "Queen";
        else if(card1.value == 13)
            card1.facecard = "King";
        else if(card1.value == 12)
            card1.facecard = "Ace";

        if(card1.value<11)
            System.out.println("You entered a " + card1.value + " of " + card1.suit + ".");
        else
            System.out.println("You entered a " + card1.facecard + " of " + card1.suit + ".");
    }

}

}
4

2 回答 2

2

Rohit Jain,是的,正是这个问题。

我对解决方案的建议是更换线路

card1.value = in.nextInt();

和:

card1.value= Integer.parseInt(in.nextLine());

这应该适合你。

为了解释它,扫描仪是为文件的字符串解析等而构建的。它对命令行输入不太好。我会使用 BufferedReader:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
reader.readLine();
于 2013-07-25T14:27:11.560 回答
1

当您从 Scanner 类调用下一个方法时,如果没有可用的输入,它会冻结程序,直到您按下回车键(并输入一个换行符)。然而,当它解冻程序时,如果调用下一个方法不会使用所有输入,它将继续运行任何未来的下一个命令,直到用完。只有这样它才会再次等待输入命令。

在这种情况下,nextInt 命令的输入与下一次迭代的 nextLine 命令重叠。

向您展示我的意思(因为这些只是文字)->

假设您输入

菱形,然后按回车键。

这将输入到程序中

'钻石\n'

第一次调用 in.nextLine(); 将吸收每个字符直到新行,所以 card1.suit = "Diamond"。

接下来假设您输入数字 3,然后按回车键。

这将输入

'3\n'

调用 in.nextInt(); 将吸收每个字符,直到数字结束。但是它不会吸收新线,所以

card1.value 将等于 3。

但是它仍然需要对输入的其余部分做一些事情 '\n'

因此,当它到达循环的下一次迭代时,对 in.nextLine() 的第二次调用将吸收每个字符,直到 '\n',也就是说,空白空间。

所以现在 card1.value = ""

要解决此问题,您可以在调用 in.nextInt() 之后立即添加对 in.nextLine() 的调用,或者您可以执行 Integer.parseInt(in.nextLine())。

于 2013-07-25T14:35:02.230 回答