6

私は非常に単純な数字推測ゲームを書こうとしています(コードは以下にあります)。1ラウンドが終了すると、ユーザーは次のラウンドをプレイするかどうかを決定できるようになります。問題は、プログラムが常に最後の質問をスキップすることです(ユーザーに「y」などと答えさせないでください。ここで何が欠けていますか?java.util.Scanner私が知らないことについて何かありますか?

import java.util.Random;
import java.util.Scanner;

public class GuessNum {

public GuessNum() {         

        int numRandom = 0;    
        int numGuess;    
        int life = 5;    
        String want = "";    
        Random rand = new Random();    
        Scanner scan = new Scanner(System.in);

        do {
            int lifeLeft = 5;
            numRandom = rand.nextInt(9)+1;

            System.out.print("\nGuess the Number [1..10]\n");
            System.out.print("===================\n");
            System.out.print("You have " + lifeLeft + " chances.\n");

            do {
                do {
                    System.out.print("What number do I have in mind: ");
                    numGuess = scan.nextInt();

                    if (numGuess < 1 || numGuess > 10)    
                        System.out.println("Invalid input. Range is 1-10.");    
                } while (numGuess < 1 || numGuess > 10);

                if (numGuess != numRandom && lifeLeft != 0)
                    System.out.println("Wrong! You only have " + --lifeLeft + " chances left.");

            } while (numGuess!=numRandom && lifeLeft > 0);

            if (numGuess == numRandom)
                System.out.println("Correct! -- in " + (life - lifeLeft) + " guess(es).");

            if (lifeLeft == 0) {
                System.out.println("You have no more lives..");
                System.out.println("This is the number: " + numRandom);
            }

            System.out.print("\nEnter 'y' if you want to play again or any other character to exit: ");
                want = scan.nextLine();
        } while (want.equals("y") || want.equals("Y"));
    }

    public static void main(String[] args) {            
        new GuessNum();
    }
}
4

2 に答える 2

16

want = scan.next();の代わりに使用してくださいnextLine()

問題の理由は、前nextInt()の行に続いて、同じ行にいてnextLine()、現在の行の残りを返すことです。

動作を再現するための最小のスニペットは次のとおりです。

Scanner sc = new Scanner(System.in);
System.out.println("nextInt() = " + sc.nextInt());
System.out.println("nextLine() = " + sc.nextLine());

たとえば、入力してEnterキーを押すと、出力は次のようになります5

nextInt() = 5
nextLine() = 

つまりnextLine()、現在の行にはまだ空の文字列が残っているため、入力をブロックしませんでした。

比較のために、たとえば入力してEnterキーを押すと、出力は次のようになります5 yeah!

nextInt() = 5
nextLine() =  yeah!

" yeah!"実際には。と同じ行から来ていることに注意してください5。これは、ドキュメントで指定されているとおりです。

String nextLine():このスキャナーを現在の行を超えて進め、スキップされた入力を返します。このメソッドは、最後の行区切り記号を除いて、現在の行の残りを返します。位置は次の行の先頭に設定されます。


ハーフオープンレンジ

推測する数が1から10の間であると仮定すると、次のコードは「間違っています」。

numRandom = rand.nextInt(9)+1; // this can only be in 1..9 range inclusive!

これは、次のドキュメントからの抜粋ですjava.util.Random

int nextInt(int n):0(包括的)と指定された値(排他的)の間の疑似ランダムで均一に分散されたint値を返します

つまり、JavaのAPIの多くのメソッドと同様に、Random.nextInt(int)包括的下限と排他的上限を持つハーフオープン範囲を使用します。

関連する質問

于 2010-07-13T11:54:34.770 に答える
3

scan.next()+ scan.nextLine();代わりに使用してください。

Scanner scan = new Scanner(System.in);

String s = scan.nextLine() +scan.nextLine();

問題が発生するのは、入力の最後の行の最後の改行文字がまだ入力バッファーのキューに入れられており、次の文字がnextLine()行の残りの部分(空)を読み取るためです。したがって、nextを使用すると、次のトークンに移動し、次を使用して残りの入力を取得できます。nextLine()

于 2017-04-07T19:16:09.057 に答える