1. ホーム
  2. java

[解決済み] Javaでのスキャナが動作しない

2022-02-24 02:39:28

質問

非常にシンプルな数字当てゲームを書こうとしています(コードは以下の通り)。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();
    }
}

解決方法は?

使用方法 want = scan.next(); の代わりに nextLine() .

あなたの問題の原因は、前の nextInt() の場合、まだ同じ行にいることになり nextLine() は現在の行の残りを返します。

以下は、その動作を再現するための最小のスニペットです。

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

と入力すると、例えば 5 をクリックし 入力 と出力されます。

nextInt() = 5
nextLine() = 

ということです。 nextLine() が入力に対してブロックしなかったのは、現在の行にまだ空の文字列が残っているからです。

比較のために、例えば、次のように入力すると 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) は、下限を含み上限を含まない、半開放的な範囲を使用します。

関連する質問