Estoy tratando de escribir una muy simple número de juego de adivinanzas (código de abajo). Después de 1 ronda ha terminado, el usuario debe poder decidir si quiere jugar o no. El problema es que el programa siempre salta la última pregunta (nunca dejar a la respuesta del usuario ‘y’ o de otra manera. Lo que me estoy perdiendo aquí? Hay algo acerca de java.util.Scanner yo no sé?

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();
}
}
  • Después de una década de quejas sobre lo difícil que es simplemente coges un poco de entrada de la consola, el Sol nos dio la Scanner clase, de modo que «el Principio de Java» textos podría escribir sucinta ejemplos. Pero Scanner está lejos de ser infalible. Por lo general se toma la molestia explícitamente leer y líneas de barrido a través de BufferedReader etc.
  • Para más información sobre el uso de Scanner y validar la entrada (por ejemplo, los números enteros, las vocales-sólo, etc), ver: stackoverflow.com/questions/3059333/…
InformationsquelleAutor bow | 2010-07-13

2 Comentarios

  1. 12

    Uso want = scan.next(); en lugar de nextLine().

    El motivo de su problema es que después de la anterior nextInt(), todavía estás en la misma línea, y nextLine() devuelve el resto de la línea actual.

    He aquí un pequeñísimo fragmento de código para reproducir el comportamiento:

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

    Cuando escribe, por ejemplo, 5 y, a continuación, golpeó Entrar, el resultado es:

    nextInt() = 5
    nextLine() = 

    Que es, nextLine() no el bloque de entrada, porque la actual línea todavía tiene una cadena vacía restantes.

    Para la comparación, cuando se escribe en, digamos 5 yeah! y, a continuación, golpeó Entrar, entonces la salida es:

    nextInt() = 5
    nextLine() =  yeah!

    Nota que " yeah!" en realidad proviene de la misma línea como el 5. Esto es exactamente como se especifica en la documentación:

    String nextLine(): Los avances de este escáner pasado de la línea actual y devuelve la entrada que se ha omitido. Este método devuelve el resto de la línea actual, con exclusión de cualquier separador de línea al final. La posición se establece al principio de la línea siguiente.


    En medio abierto rangos

    Suponiendo que el número a adivinar es de entre 1 y 10 inclusive, el siguiente código es «malo»:

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

    Aquí es un extracto de la documentación de java.util.Random:

    int nextInt(int n): Devuelve un pseudo aleatorios uniformemente distribuidos int valor entre 0 (inclusive) y el valor especificado (exclusivo)

    Que es, como un montón de métodos en Java API, Random.nextInt(int) utiliza el medio abierta, inclusiva límite inferior y exclusivo límite superior.

    Preguntas relacionadas

    • Ah, gracias (por el generador de números aleatorios corrección)! Pensé nextLine() se inicia por defecto en una nueva línea. Deberían prestar más atención a la documentación de la próxima vez.
  2. 1

    Uso scan.next()+ scan.nextLine(); lugar
    por ejemplo.

    Scanner scan = new Scanner(System.in);
    String s = scan.nextLine() +scan.nextLine();

    Problema se produce debido a que el último carácter de nueva línea para la última línea de la entrada es todavía en la cola del buffer de entrada y la siguiente nextLine() va a leer el resto de la línea (que está vacía).
    Así, cuando se utilizan a continuación se pasa a la siguiente token, entonces usted puede conseguir el resto de la entrada con nextLine()

    • ¿por qué no scan.nextLine()?

Dejar respuesta

Please enter your comment!
Please enter your name here