Scanner in Java funktioniert nicht
Ich bin versucht, zu schreiben eine sehr einfache Zahl Ratespiel (code ist unten). Nach 1 Runde ist beendet, der Benutzer soll in der Lage sein zu entscheiden, ob er/Sie will, um eine weitere Runde spielen oder nicht. Problem ist, das Programm immer überspringt die Letzte Frage (nicht dass der Benutzer die Antwort " y " oder sonst. Was vermisse ich hier? Gibt es etwas über java.util.Scanner
ich weiß nicht, über?
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();
}
}
Nach einem Jahrzehnt der Klagen darüber, wie schwierig es ist, einfach zu Holen, ein bisschen input von der Konsole aus, so Gaben uns die
Weitere Informationen zur Verwendung
Scanner
Klasse, so "Beginning Java" Texte schreiben konnte, prägnante Beispiele. Aber Scanner
ist weit entfernt von harmlos. Ich in der Regel die Mühe machen, explizit zu Lesen und scan-Linien über BufferedReader
etc.Weitere Informationen zur Verwendung
Scanner
und Validierung der Eingabe (z.B. zahlen, Vokale-only, etc) finden Sie unter: stackoverflow.com/questions/3059333/...
InformationsquelleAutor bow | 2010-07-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
want = scan.next();
stattnextLine()
.Den Grund für Ihr problem ist, dass die folgende die vorhergehenden
nextInt()
, du bist immer noch auf der gleichen Linie, undnextLine()
gibt den rest der aktuellen Zeile.Hier ist eine kleinste-snippet, das Verhalten zu reproduzieren:
Wenn Sie in, sagen wir,
5
und dann drücken Sie Geben Sie, die Ausgabe ist:Dass
nextLine()
nicht blockieren für Ihre Eingabe, weil die aktuelle Linie hat immer noch einen leeren string übrigen.Zum Vergleich, wenn Sie in, sagen
5 yeah!
und dann drücken Sie Geben Sie, dann ist die Ausgabe:Beachten Sie, dass
" yeah!"
kommt tatsächlich aus der gleichen Linie wie die5
. Das ist genauso, wie in der Dokumentation angegebenen:Auf halb-offenen Bereiche
Unter der Annahme, dass die Zahl zu erraten, ist zwischen 1 und 10 einschließlich ist, der folgende code ist "falsch":
Hier ein Auszug aus der Dokumentation der
java.util.Random
:Ist, wie eine Menge von Methoden in der Java-API
Random.nextInt(int)
verwendet die half-open-range, inklusive Untergrenze und exklusive Obere Grenze.Fragen
InformationsquelleAutor polygenelubricants
Verwenden
scan.next()+ scan.nextLine();
stattzB.
Problem tritt auf, weil der Letzte neue-Zeile-Zeichen für die Letzte Zeile der Eingabe ist immer noch in der Warteschlange in der Eingabe-Puffer und der nächste
nextLine()
Lesen werden, der Rest der Zeile (die leere).Also, wenn du mit next geht es zum nächsten token, dann kannst du den anderen Eingang mit
nextLine()
scan.nextLine()
?InformationsquelleAutor Navdeep Jha