Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: Enzo en 04 de Noviembre 2015, 17:43
-
Hola,
Adjunto mi solución al ejercicio del tema "CU00672B numeros aleatorios java clase random ejercicio resuelto" para su corrección:
// 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,
-
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.
-
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:
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:
// 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
-
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
entradaScaner.nextLine();
antes de esta otra...
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.
-
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.