5

私の推測ゲームはすべて問題ありませんが、ユーザーにもう一度プレイするかどうかを尋ねる部分になると、質問が 2 回繰り返されます。ただし、入力方法を nextLine() から next() に変更すると、質問が繰り返されないことがわかりました。何故ですか?

入力と出力は次のとおりです。

I'm guessing a number between 1-10
What is your guess? 5
You were wrong. It was 3
Do you want to play again? (Y/N) Do you want to play again? (Y/N) n

コードは次のとおりです:(Java で記述されています) 最後の do while ループ ブロックは、ユーザーにもう一度プレイするかどうかを尋ねる部分です。

import java.util.Scanner;

public class GuessingGame 
{   
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        boolean keepPlaying = true;

        System.out.println("Welcome to the Guessing Game!");

        while (keepPlaying) {
            boolean validInput = true;
            int guess, number;
            String answer;

            number = (int) (Math.random() * 10) + 1;
            System.out.println("I'm guessing a number between 1-10");
            System.out.print("What is your guess? ");
            do {
                validInput = true;
                guess = input.nextInt();
                if (guess < 1 || guess > 10) {
                    validInput = false;
                    System.out.print("That is not a valid input, " +
                            "guess again: ");
                }
            } while(!validInput);
            if (guess == number)
                System.out.println("You guessed correct!");
            if (guess != number)
                System.out.println("You were wrong. It was " + number);
            do {
                validInput = true;
                System.out.print("Do you want to play again? (Y/N) ");
                answer = input.nextLine();
                if (answer.equalsIgnoreCase("y"))
                    keepPlaying = true;
                else if (answer.equalsIgnoreCase("n"))
                    keepPlaying = false;
                else
                    validInput = false;
            } while (!validInput);
        }
    }
}
4

5 に答える 5

7

do whileループでは、 は必要ありません。必要なのはnextLine()だけですnext()

したがって、これを変更します。

answer = input.nextLine();

これに:

answer = input.next();

while他の人が示唆しているように、これをループに変換できることに注意してください。これはdo while、ループを少なくとも 1 回実行する必要がある場合にループが使用されるためですが、実行する必要がある頻度がわからないためです。この場合は確かに実行可能ですが、次のようなもので十分です。

System.out.println("Do you want to play again? (Y/N) ");
answer = input.next();
while (!answer.equalsIgnoreCase("y") && !answer.equalsIgnoreCase("n")) {
    System.out.println("That is not valid input. Please enter again");
    answer = input.next();
}

if (answer.equalsIgnoreCase("n"))
    keepPlaying = false;

while"y" または "n" (大文字と小文字を区別しない) が入力されない限り、ループはループし続けます。その時点で、ループは終了します。if条件は、必要に応じて keepPlaying 値を変更します。それ以外の場合は何も起こらず、外側のループwhileが再度実行されます (したがって、プログラムが再起動されます)。

編集:これは、元のコードが機能しなかった理由を説明しています

元のステートメントが機能しなかった理由は、最初のdo whileループが原因でした。その中で、次を使用します。

guess = input.nextInt();

これは、行から番号を読み取りますが、行の戻りは読み取りません。つまり、次を使用する場合:

answer = input.nextLine();

nextInt()ステートメントから残りのキャリッジをすぐに検出します。私の読書ソリューションを使いたくない場合は、次のようにしnext()て残り物を飲み込むことができます。

guess = input.nextInt();
input.nextLine();
rest of code as normal...
于 2013-08-19T18:47:29.813 に答える
4
    validInput = false;

    do {

        System.out.print("Do you want to play again? (Y/N) ");
        answer = input.next();

        if(answer.equalsIgnoreCase("y")){

            keepPlaying = true;
            validInput = true;

        } else if(answer.equalsIgnoreCase("n")) {

            keepPlaying = false;
            validInput = true;

        }        

    } while(!validInput);

この方法の方が読みやすいので、コーディングスタイルを変更しました。

于 2013-08-19T18:43:40.287 に答える