Autor Tema: Ejercicio CU00672B numeros aleatorios java clase random ejercicio resuelto  (Leído 4080 veces)

Enzo

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 82
    • Ver Perfil
Hola,

Adjunto mi solución al ejercicio del tema "CU00672B numeros aleatorios java clase random ejercicio resuelto" para su corrección:

Código: [Seleccionar]
// EJERCICIO DE UTILIZACIÓN DE LA CLASE RANDOM
// ----> CU00672B numeros aleatorios java clase random ejercicio resuelto ejemplo.pdf

// Importación de clases Necesarias
import java.util.Scanner; //Importación de la clase Scanner para intro valores por teclado
import java.util.Random; // Importación clase Random para generar nums. Aleatorios

public class AdivinaNumero_CU00672B {

    public static void main (String [ ] Args) {

        Scanner entradaScaner = new Scanner (System.in); // Creación del objeto Scanner para introducir los números
        Scanner entradaScaner2 = new Scanner (System.in); // Creación del objeto Scanner para preguntar si se quiere volver a jugar o no
        int valorIntro = 0; // Incicialización de una Variable para guardar el num. convertido del dato intro por teclado
        String jugar = "S"; // Inicialización de una Variable para ver si se quiere volver a jugar o no

        // Bucle que se repite mientras se conteste "si" a volver a jugar
        do {
            int numAleatorio = new Random().nextInt(100)+1; // Se inicializa una variable en la que se intro un numero aleatorio entre 1 y 100
            int intentos = 0; // Incicialización de una Variable para guardar el num. de intentos hasta adivinar el num. aleatorio

            // Mensaje de comienzo de la ronda para adivinar el número aleatorio creado
            System.out.println("Se ha generado un número aleatorio entero entre 1 y 100.");
            System.out.print("Intente Adivinarlo: ");

            // Bucle que se repite mientras no se adivine el número
            do {
                // Se convierte el valor introducido de String a int
                valorIntro = entradaScaner.nextInt();
                // Se suma 1 al num. de intentos
                intentos++;

                // Se ccmprueba si el num. intro no es igual al generado aleatoriamente para genera mensaje de error
                if (valorIntro != numAleatorio){

                    // Se compueba si el num. intro es menor o mayor que el generado aleatoriamente para generar el mensaje correspondiente
                    if (numAleatorio < valorIntro){
                        System.out.println("No ha acertado: el número es menor.");
                    } else {
                        System.out.println("No ha acertado: el número es mayor.");
                    }

                    // Se vuelve a solicitar otro número
                    System.out.print("Pruebe otra vez: ");

                } // fin del if una vez generados los mensajes de que no se ha adivinado

            } while (valorIntro != numAleatorio); // fin del Do...While. Se sale cuando en num. intro es igual al generado aleatoriamente

            // Mensaje de que se ha acertado
            System.out.println("Ha Acertado. ¡¡¡FELICIDADES!!!. ");
            System.out.println("Lo ha conseguido en " + intentos + " intentos.");

            // Preguntar si se quiere volver a jugar
            System.out.print("¿Quiere volver a jugar? S/N :");
            jugar = entradaScaner2.nextLine();

            // Bucle para comprobar que solo se responde "S" o "N"
            while(!jugar.equalsIgnoreCase("s") && !jugar.equalsIgnoreCase("n")){
                System.out.print("Respuesta invalida. Introduzca S o N :");
                jugar = entradaScaner2.nextLine();
            }
           
            // Se imprime una línea en blanco
            System.out.println("");

        } while (jugar.equalsIgnoreCase("s")); // Fin del Do...While porque se ha contestado que no se quiere volver a jugar

        // Mensaje de finalización del programa
        System.out.println("FIN. Muchas Gracias por haber jugado");

    } // Fin del Main

} // Fin de la Clase

Espero vuestros comentarios,

Muchas Gracias,

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Re:Ejercicio CU00672B numeros aleatorios java clase random ejercicio resuelto
« Respuesta #1 en: 05 de Noviembre 2015, 01:22 »
Hola Enzo.

Tu solución al ejercicio la veo muy bien.
Lo único que podría decirte para poder mejorar el código es que con que crees un objeto Scanner te valdría para resolver el ejercicio.

Saludos.


Enzo

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 82
    • Ver Perfil
Re:Ejercicio CU00672B numeros aleatorios java clase random ejercicio resuelto
« Respuesta #2 en: 05 de Noviembre 2015, 13:22 »
Hola Pedro,

Lo intente hacer con un solo objeto Scanner, pero me daba un problema:
Cuando llegaba a la primera pregunta de si se quiere volver a jugar no se espera a que se introduzca nada y sigue la ejecución pasando al bucle que comprueba si se introduce 'S' o 'N'. Adjunto un ejemplo para que lo veas:
Código: [Seleccionar]
Se ha generado un número aleatorio entero entre 1 y 100.
Intente Adivinarlo: 50
No ha acertado: el número es mayor.
Pruebe otra vez: 70
No ha acertado: el número es menor.
Pruebe otra vez: 60
No ha acertado: el número es menor.
Pruebe otra vez: 55
No ha acertado: el número es menor.
Pruebe otra vez: 53
No ha acertado: el número es menor.
Pruebe otra vez: 52
No ha acertado: el número es menor.
Pruebe otra vez: 51
Ha Acertado. ¡¡¡FELICIDADES!!!.
Lo ha conseguido en 7 intentos.
¿Quiere volver a jugar? S/N :Respuesta invalida. Introduzca S o N :

También adjunto el código tal y como lo tengo cuando me da este problema:
Código: [Seleccionar]
// EJERCICIO DE UTILIZACIÓN DE LA CLASE RANDOM
// ----> CU00672B numeros aleatorios java clase random ejercicio resuelto ejemplo.pdf

// Importación de clases Necesarias
import java.util.Scanner; //Importación de la clase Scanner para intro valores por teclado
import java.util.Random; // Importación clase Random para generar nums. Aleatorios

public class AdivinaNumero0_CU00672B {

    public static void main (String [ ] Args) {

        Scanner entradaScaner = new Scanner (System.in); // Creación del objeto Scanner para introducir los números
        //Scanner entradaScaner2 = new Scanner (System.in); // Creación del objeto Scanner para preguntar si se quiere volver a jugar o no
        int valorIntro = 0; // Incicialización de una Variable para guardar el num. convertido del dato intro por teclado
        String jugar = "S"; // Inicialización de una Variable para ver si se quiere volver a jugar o no

        // Bucle que se repite mientras se conteste "si" a volver a jugar
        do {
            int numAleatorio = new Random().nextInt(100)+1; // Se inicializa una variable en la que se intro un numero aleatorio entre 1 y 100
            int intentos = 0; // Incicialización de una Variable para guardar el num. de intentos hasta adivinar el num. aleatorio

            // Mensaje de comienzo de la ronda para adivinar el número aleatorio creado
            System.out.println("Se ha generado un número aleatorio entero entre 1 y 100.");
            System.out.print("Intente Adivinarlo: ");

            // Bucle que se repite mientras no se adivine el número
            do {
                // Se convierte el valor introducido de String a int
                valorIntro = entradaScaner.nextInt();
                // Se suma 1 al num. de intentos
                intentos++;

                // Se ccmprueba si el num. intro no es igual al generado aleatoriamente para genera mensaje de error
                if (valorIntro != numAleatorio){

                    // Se compueba si el num. intro es menor o mayor que el generado aleatoriamente para generar el mensaje correspondiente
                    if (numAleatorio < valorIntro){
                        System.out.println("No ha acertado: el número es menor.");
                    } else {
                        System.out.println("No ha acertado: el número es mayor.");
                    }

                    // Se vuelve a solicitar otro número
                    System.out.print("Pruebe otra vez: ");

                } // fin del if una vez generados los mensajes de que no se ha adivinado

            } while (valorIntro != numAleatorio); // fin del Do...While. Se sale cuando en num. intro es igual al generado aleatoriamente

            // Mensaje de que se ha acertado
            System.out.println("Ha Acertado. ¡¡¡FELICIDADES!!!. ");
            System.out.println("Lo ha conseguido en " + intentos + " intentos.");

            // Preguntar si se quiere volver a jugar
            System.out.print("¿Quiere volver a jugar? S/N :");
            jugar = entradaScaner.nextLine();

            // Bucle para comprobar que solo se responde "S" o "N"
            while(!jugar.equalsIgnoreCase("s") && !jugar.equalsIgnoreCase("n")){
                System.out.print("Respuesta invalida. Introduzca S o N :");
                jugar = entradaScaner.nextLine();
            }
           
            // Se imprime una línea en blanco
            System.out.println("");

        } while (jugar.equalsIgnoreCase("s")); // Fin del Do...While porque se ha contestado que no se quiere volver a jugar

        // Mensaje de finalización del programa
        System.out.println("FIN. Muchas Gracias por haber jugado");

    } // Fin del Main

} // Fin de la Clase

No se porque me hace eso.

Muchas gracias por tu ayuda,

Un Saludo

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Re:Ejercicio CU00672B numeros aleatorios java clase random ejercicio resuelto
« Respuesta #3 en: 05 de Noviembre 2015, 14:06 »
Hola nuevamente Enzo.

Lo que te ocurre es esto, haber si me explico bien:

introduces un número y pulsas intro.

5 [intro]

Ejecutas...

valorIntro = entrdaScaner.nextInt();

lo que quiere decir es que valorIntro recoge el valor numérico tipo int nada mas, el [intro] se queda en el buffer.

Luego al ejecutar...

 jugar = entradaScaner.nextLine()

recoge el [intro] que quedaba en el buffer

Por eso pasa directamente al bucle que hace la comprobación de si la respuesta es correcta.

Así que la solución es hacer una limpieza de buffer, por ejemplo introduciendo esta linea

Código: [Seleccionar]
entradaScaner.nextLine();
antes de esta otra...

Código: [Seleccionar]
jugar = entradaScaner.nextLine();
Esa es la solución que encontré en su día, cuando tuve el mismo problema que tu.
Si hay alguna otra forma de hacerlo, no la sé. Y si la hay, espero que alguno de los profesionales que pasan por aquí nos la cuente. ;D

Saludos.

Enzo

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 82
    • Ver Perfil
Re:Ejercicio CU00672B numeros aleatorios java clase random ejercicio resuelto
« Respuesta #4 en: 05 de Noviembre 2015, 16:43 »
Hola Pedro,

Me imaginaba algo así, pero me descuadraba que no me hiciera lo mismo en el bucle de pedir los números.
Y tampoco se me ocurría como limpiarlo.

Muchas Gracias.
De verdad, te agradezco un motón lo que me estas ayudando.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".