[解決済み] Javaでのスキャナが動作しない
質問
非常にシンプルな数字当てゲームを書こうとしています(コードは以下の通り)。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)
は、下限を含み上限を含まない、半開放的な範囲を使用します。
関連する質問
関連
-
[解決済み] Eclipse- Dynamic Web Module 3.0 で新しいプロジェクトを作成するときに Java 1.6 以降が必要なエラーが発生する。
-
[解決済み] java.lang.ClassNotFoundException: クラス com.ibm.db2.jcc.DB2Driver が Worklight プラットフォームまたはプロジェクトに見つかりませんでした。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] トークンのシンタックスエラー、これらのトークンを削除してください [closed].
-
[解決済み] maven. -source 1.5ではラムダ式がサポートされていません。
-
[解決済み] ストリングビルダー.イコール Java
-
[解決済み] XX:MaxDirectMemorySizeの既定値
-
[解決済み] Java Swingで複数のボタンに対して複数のActionListenersを追加する方法
-
[解決済み] javax.naming.NameNotFoundException
-
[解決済み] 1行目2列目でBEGIN_ARRAYを期待したが、BEGIN_OBJECTだった。
-
[解決済み] publicId と systemId の間に空白が必要です。
-
[解決済み] javaでメソッドを呼び出すプログラムのエラー修正
-
[解決済み] 文字列の巻き方