Autor Tema: Java Números aleatorios. Clase Random Juego adivinar número propuesto CU00908C  (Leído 4467 veces)

PatAs

  • Sin experiencia
  • *
  • Mensajes: 19
  • ¿Libre...? - Solo cuando pienso y aprendo!!
    • Ver Perfil
Buenas noches. Presento posible solución al ejercicio de referencia CU00908C del tutorial de programación Java avanzado. Cordiales saludos.

EJERCICIO:
Crea un programa que cumpla lo indicado a continuación. El programa permitirá jugar a “adivinar un número entero” tantas veces como el usuario desee. En cada ocasión el programa pedirá al usuario el número inicial y el número final de la serie de números entre los que se encontrará el número a adivinar. También preguntará el número de intentos permitidos. En cada intento el número a adivinar será diferente y estará dentro del rango definido por el usuario. Trás los intentos el programa nos dirá cuantas veces hemos acertado y cuántas veces hemos fallado, los números que eran solución y nos preguntará si queremos volver a jugar.
Ejemplo de ejecución:
Introduce el numero inicial del rango: 40
Introduce el numero final del rango: 60
Introduce el numero de intentos: 2
¿Qué numero estoy pensando? : 44
No has acertado
¿Qué numero estoy pensando? : 42
No has acertado
Has acertado 0 veces y has fallado 2 veces. Eran solución: 49, 41.
Quieres probar otra vez ? (S/N): S
Introduce el numero inicial del rango: 4
Introduce el numero final del rango: 6
Introduce el numero de intentos: 2
¿Qué numero estoy pensando? : 4
No has acertado
¿Qué numero estoy pensando? : 5
Has acertado!!
Has acertado 1 veces y has fallado 1 veces. Eran solución: 6, 5
Quieres probar otra vez ? (S/N): N
Adiós



Código: [Seleccionar]
package CU00908C;
import CU00903C.EntradaPorTeclado;
import java.util.Random;
import java.util.ArrayList;
/**
 * Write a description of class TestAleatorio here.
 *
 * @author (Arnaldo R. Martinez)
 * @version (17-Ago-2017) - Ejercicio propuesto por aprenderaprogramar.com
 */
public class TestAleatorio {
    public static void main (String [] args) {
        Random rnd = new Random();
        EntradaPorTeclado etcl = new EntradaPorTeclado();
ArrayList<Integer> numerosSolucion = new ArrayList<Integer>();
        int numeroInicialRango = 0;
        int numeroFinalRango = 0;
        int numeroIntentos = 0;
        int contadorIntentos = 0;
        int contadorAciertos = 0;
        int contadorDesaciertos = 0;
        char tecla;
        int numeroAleatorio;
        do { //Ciclo do-while que itera según lo decida el usuario
//Se solicitan los ingresos e instancian las variables correspondientes
            System.out.println("Introduce el número inicial del rango: ");
            etcl.setEntrada();
numeroInicialRango = Integer.valueOf(etcl.getEntrada()); //Uso conversión porque el auxiliar 'EntradaPorTeclado' entrega 'String'
            System.out.println("Introduce el número final del rango: ");
            etcl.setEntrada();
numeroFinalRango = Integer.valueOf(etcl.getEntrada());
            System.out.println("Introduce la cantidad de veces que quieres intentar adivinar el número: ");
            etcl.setEntrada();
numeroIntentos = Integer.valueOf(etcl.getEntrada());
//Se genera el número aleatorio para el rango determinado según los parámetros introducido
            numeroAleatorio = (int)(rnd.nextDouble()*(numeroInicialRango-numeroFinalRango)+numeroFinalRango);
//Se ingresa el entero generado al ArrayList
numerosSolucion.add(numeroAleatorio);
do { //Ciclo do-while que itera según cantidad intentos informada por el usuario
                System.out.println("¿Que número piensas? ");
                etcl.setEntrada();

                if (Integer.valueOf(etcl.getEntrada()) != numeroAleatorio) {
                    System.out.println("No has acertado");
contadorDesaciertos++;
contadorIntentos++;
                } else {
                    System.out.println("Has acertado!!");
                    contadorAciertos++;
                    contadorIntentos = numeroIntentos;
                }

            }
while (contadorIntentos < numeroIntentos);
            contadorIntentos = 0;
//Se muestra información
            System.out.println("Veces que has acertado: " +contadorAciertos+ "\nveces que no has acertado: " +contadorDesaciertos);
System.out.print("Eran solución los números: ");
for (int tmp: numerosSolucion) {
System.out.print(tmp+ ", " );
}
            System.out.println("\n¿Otra ronda? (s/n)");
            etcl.setEntrada();
            tecla = (etcl.getEntrada()).charAt(0);
        }
        while (tecla == 's' || tecla == 'S');
System.out.println("Adios");//Fin del programa
    }
   
}


Código: [Seleccionar]
package CU00903C;

import java.util.Scanner;
/**
 * Para obtener entradas por teclado
 *
 * @author () Foro de aprenderaprogramar.com
 * @version (01_2016) -
 * Corregido (16-Ago-2017) por feedback desde aprenderaprogramar.com
 */
public class EntradaPorTeclado{
     //Campos de la clase
    private String entrada;
private Scanner entradaTcl;
    //Constructor
    public EntradaPorTeclado(){
        entrada= "";
        entradaTcl = new Scanner(System.in);
    }
   
public void setEntrada() {
entrada = entradaTcl.nextLine();
}

    public String getEntrada(){
        return entrada;
    }
}
« Última modificación: 06 de Octubre 2017, 18:24 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Buenas PatAs el programa funciona correctamente

Esta expresión

numeroAleatorio = (int)(rnd.nextDouble()*(numeroInicialRango-numeroFinalRango)+numeroFinalRango);

supongamos que tomamos inicial 1 y final 10.

Primero genera un decimal entre 0 y -9, luego le suma 10 y luego lo convierte a entero. Por ejemplo genera -3.2 y luego le suma 10, resulta 6.8 redondea a 7. Si genera 0, le suma 10, resulta 10. Si genera -9, le suma 10, resulta 1.

Aunque esto en principio funciona parece más fácil usar directamente el generador de enteros aleatorios en lugar de generar un decimal para luego convertirlo. Puede verse un ejemplo en https://www.aprenderaprogramar.com/foros/index.php?topic=5681.0

En ese ejemplo podemos ver también un diseño digamos que mejor orientado a objetos por cuanto usa distintas clases, cada una con sus responsabilidades

Salu2

 

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".