Estoy empezando a aprender Java y a probar el ciclo while, he escrito un programa simple como un simple juego de adivinanzas en el que el usuario intenta adivinar una letra entre A y Z y la computadora imprime "correcta" y repite si la letra adivinada es mal, sin embargo, cada vez que intento ejecutarlo, la salida es de tres iteraciones por defecto, he tratado de cambiar el bucle while a do-while y obtuve la misma salida, incluso agregué la variable int i como contador para ver si realmente está haciendo 3 iteraciones y el valor de i siempre viene como 4 (3 iteraciones incorrectas cuando realmente debería ser 1 más uno cuando ingreso la respuesta correcta).

¿Me puede decir cuál es el error que estoy cometiendo?

class Guess {
    public static void main (String[] args) throws java.io.IOException {
        char answer = 'K', ignore, ch = 'a';
        int i=0;

        while (ch != 'K') {
            System.out.println("I am Thinking of a letter between A and Z, can you guess it?");
            ch = (char) System.in.read();
            if (ch !='K') 
                System.out.println("Wrong ! please try again");
            i++;
        }
        System.out.println("Correct!, you guessed after "+i+" attempts");
    }

}
-1
Ed Qas 8 sep. 2018 a las 20:47

3 respuestas

La mejor respuesta

El problema es que cuando presiona Enter después de escribir el carácter en la consola, el bucle se ejecuta una vez para el carácter ingresado y nuevamente para la nueva línea que es 10.

Así que simplemente edité su código para omitir la nueva línea y esperar a que se ingrese el siguiente carácter. También moví el mensaje inicial fuera del bucle. Espero que este código solucione su problema:

public static void main(String[] args) throws IOException {
        char answer = 'K', ignore, ch = 'a';
        int i = 0;
        System.out.println("I am Thinking of a letter between A and Z, can  you guess it?");
        while (ch != 'K') {
            ch = (char) System.in.read();
            if(!Character.isLetter(ch)){
                continue;
            }
            System.out.println("Wrong ! please try again");
            i++;
        }

        System.out.println("Correct!, you guessed after " + i + " attempts");

    }
0
Fullstack Guy 8 sep. 2018 a las 18:33

Hola, tengo un consejo para ti. Yo personalmente usaría un escáner en lugar de System.in.read. Un escáner es un objeto que lee una entrada.

Para crear uno, simplemente escriba esto:

Scanner sc = new Scanner(System.in); //System.in referes to a console input

Para saber qué escribió el usuario, use sc.nextLine();, que devuelve, como dije, la entrada. Sin embargo, devuelve una cadena, no un carácter. Entonces, en este caso, también necesita cambiar el tipo de 'ch'.

Para comparar las respuestas con la entrada, deberá utilizar el método equals(). Básicamente, si dos cosas son iguales, devuelve verdadero.

Dicho esto, su código debería verse así:

    Scanner sc = new Scanner(System.in);
    String answer = "K",ch;

    int i=0;
    boolean correct = false;
    while (!correct) { 
        System.out.println("I am Thinking of a letter between A and Z, can you guess it?");
        ch = sc.nextLine();
        i++;
        if (!ch.toUpperCase().equals(answer)) { // or ch.equals(answer) == false
            System.out.println("Wrong ! please try again");
         }else{ //if they are the same
             correct = true; //the answer is correct so you can leave the while loop
             System.out.println("Correct!, you guessed after "+i+" attempts");
         }

    }
    sc.close(); //you should always close a scanner after you use it, but you can ignore this step for now

Tenga en cuenta que también utilicé un método llamado toUpperCase(). Ese método transforma todos los caracteres de la cadena en mayúsculas, por lo que, incluso si escribe "k" en lugar de "K", también saldría del bucle.

-1
Fullstack Guy 8 sep. 2018 a las 22:28

Así es como debería verse. Su código simplemente perdió el bloque else que es muy necesario para salir del ciclo, cuando el usuario adivina el carácter correcto. He agregado uno.

class guess {
    public static void main (String[] args) throws java.io.IOException {
        char answer = 'K', ignore,ch='a';
        int i=0;

        while (ch != answer) {
            System.out.println("I am Thinking of a letter between A and Z, can you guess it?");
            ch = (char) System.in.read();
            i++;
            if (ch !=answer) {
                System.out.println("Wrong ! please try again");
             }
             else{
                System.out.println("Correct!, you guessed after "+i+" attempts");
                break;
             }

        }
    }
}
0
Lone_Coder 8 sep. 2018 a las 17:57