为什么我的程序只让我在for循环的第一次迭代后输入一个值?

时间:2013-07-25 14:19:40

标签: java eclipse for-loop

我是Java编程的新手,我正在尝试制作一个扑克手评估员。我问一个卡的套装和价值,使用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 + ".");
    }

}

}

2 个答案:

答案 0 :(得分:2)

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

我对解决方案的建议是交换行

card1.value = in.nextInt();

使用:

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

这应该适合你。

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

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
reader.readLine();

答案 1 :(得分:1)

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

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

告诉你我的意思(因为那些只是单词) - &gt;

假设您输入

Diamond,然后按enter键。

这将输入程序

'钻石\ 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())。