Autor Tema: Generar números aleatorios en Java dentro de un rango definido usuario CU00908C  (Leído 3521 veces)

DRANXZ88

  • Avanzado
  • ****
  • Mensajes: 356
    • Ver Perfil
Ejercicio CU00908C del curso de programación Java avanzado.

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


Clase principal main

Código: [Seleccionar]
package ejercicioscu00908c;

public class EjerciciosCu00908c {

    public static void main(String[] args) {
        EntradaDeTeclado entrada = new EntradaDeTeclado();
        GeneradorNumeroAleatorio numero = new GeneradorNumeroAleatorio();
        int numeroAdivinar;
        int numeroGenerado = 0;
        int acertado = 0;
        int fallado = 0;
        String continuar;

        do {

            System.out.println("Introduce el numero inicial del rango: ");
            entrada.Agregar();
            int numeroInicial = Integer.parseInt(entrada.getEntrada());
            System.out.println("Introduce el numero final del rango: ");
            entrada.Agregar();
            int numeroFinal = Integer.parseInt(entrada.getEntrada());
            System.out.println("Introduce el numero de intentos: ");
            entrada.Agregar();
            int intento = Integer.parseInt(entrada.getEntrada());

            for (int i = 0; i < intento; i++) {
                System.out.println("¿Qué numero estoy pensando? : ");
                entrada.Agregar();
                numeroAdivinar = Integer.parseInt(entrada.getEntrada());
                numeroGenerado = numero.adivinarNumero(numeroInicial, numeroFinal);
                numero.addNumeroGenerado(numeroGenerado);
                if (numeroAdivinar == numeroGenerado) {
                    System.out.println("Has acertado!!");
                    acertado++;
                } else {
                    System.out.println("No has acertado");
                    fallado++;
                }

            }

            System.out.print("Has acertado " + acertado + " veces y has fallado " + fallado + " veces. Eran solución: ");
            numero.listarNumeroGenerado();
            System.out.println("");
            System.out.println("¿Otro valor (s/n)? ");
            numero.vaciarArray();
            fallado = 0;
            acertado = 0;
            entrada.Agregar();
            continuar = entrada.getEntrada();

        } while (continuar.equalsIgnoreCase("s"));

    }
}


Clase entrada de teclado

Código: [Seleccionar]
package ejercicioscu00908c;

import java.util.Scanner;

public class EntradaDeTeclado {

    private String entradaTeclado;
    Scanner sc = new Scanner(System.in);

    public EntradaDeTeclado() {
        entradaTeclado = "";
    }

    public String Agregar() {
        entradaTeclado = sc.nextLine();
        return entradaTeclado;
    }

    public String getEntrada() {
        return entradaTeclado;
    }

}


Clase para gestionar el numero aleatorio

Código: [Seleccionar]
package ejercicioscu00908c;

import java.util.ArrayList;
import java.util.Random;

public class GeneradorNumeroAleatorio {
   
    private ArrayList<Integer> serieAleatoria;
   
    public GeneradorNumeroAleatorio() {
        this.serieAleatoria = new ArrayList<Integer>();
    }
   
    public void addNumeroGenerado(int valorNumero) {
        serieAleatoria.add(valorNumero);
    }
   
    public int adivinarNumero(int numeroInicial, int numeroFinal) {
        Random rnd = new Random();
        int numeroAleatorio = rnd.nextInt(numeroFinal - numeroInicial + 1) + numeroInicial;
       
        return numeroAleatorio;
       
    }
   
    public void listarNumeroGenerado() {
       
        for (Integer serieAleatoria1 : serieAleatoria) {
            System.out.print(serieAleatoria1 + ", ");
        }
       
    }

    public void vaciarArray() {
        for (int i = 0; i < serieAleatoria.size(); i++) {
            serieAleatoria.remove(i);
        }
    }
}
« Última modificación: 14 de Julio 2016, 18:02 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola DRANXZ88

En la clase EntradaDeTeclado veo una repetición:

Código: [Seleccionar]
    public String Agregar() {
        entradaTeclado = sc.nextLine();
        return entradaTeclado;
    }

    public String getEntrada() {
        return entradaTeclado;
    }

Tanto el método Agregar como el método getEntrada hacen un return entradaTeclado. Creo que sería mejor que reordenaras esta clase de modo que un método sea para obtener o pedir la cadena y el otro para obtenerla (el get), evitando la repetición.

En el ejercicio hay algo que no me funciona bien. Por ejemplo con esta ejecución:

Citar
Introduce el numero inicial del rango:
1
Introduce el numero final del rango:
5
Introduce el numero de intentos:
3
¿Qué numero estoy pensando? :
1
No has acertado
¿Qué numero estoy pensando? :
2
No has acertado
¿Qué numero estoy pensando? :
3
No has acertado
Has acertado 0 veces y has fallado 3 veces. Eran solución: 5, 3, 4,
¿Otro valor (s/n)?
s
Introduce el numero inicial del rango:
1
Introduce el numero final del rango:
5
Introduce el numero de intentos:
3
¿Qué numero estoy pensando? :
1
No has acertado
¿Qué numero estoy pensando? :
2
No has acertado
¿Qué numero estoy pensando? :
3
No has acertado
Has acertado 0 veces y has fallado 3 veces. Eran solución: 3, 4, 3, 1,
¿Otro valor (s/n)?


La primera vez tengo 3 intentos y me dice que las soluciones eran 5, 3 y 4. La segunda vez vuelvo a tener 3 intentos y sin embargo me dice que las soluciones eran 3, 4, 3, 1. Es decir, me está dando una solución más de la que debería darme


Saludos

DRANXZ88

  • Avanzado
  • ****
  • Mensajes: 356
    • Ver Perfil
Gracia por tu correcciones ahora modifique corrigiendo los errores.


Clase principal main

Código: [Seleccionar]
package ejercicioscu00908c;

public class EjerciciosCu00908c {

    public static void main(String[] args) {
        EntradaDeTeclado entrada = new EntradaDeTeclado();
        GeneradorNumeroAleatorio numero = new GeneradorNumeroAleatorio();
        int numeroAdivinar;
        int numeroGenerado = 0;
        int acertado = 0;
        int fallado = 0;
        String continuar;

        do {

            System.out.println("Introduce el numero inicial del rango: ");
            entrada.setAgregar();
            int numeroInicial = Integer.parseInt(entrada.getEntrada());
            System.out.println("Introduce el numero final del rango: ");
            entrada.setAgregar();
            int numeroFinal = Integer.parseInt(entrada.getEntrada());
            System.out.println("Introduce el numero de intentos: ");
            entrada.setAgregar();
            int intento = Integer.parseInt(entrada.getEntrada());

            for (int i = 0; i < intento; i++) {
                System.out.println("¿Qué numero estoy pensando? : ");
                entrada.setAgregar();
                numeroAdivinar = Integer.parseInt(entrada.getEntrada());
                numeroGenerado = numero.adivinarNumero(numeroInicial, numeroFinal);
                numero.addNumeroGenerado(numeroGenerado);
                if (numeroAdivinar == numeroGenerado) {
                    System.out.println("Has acertado!!");
                    acertado++;
                } else {
                    System.out.println("No has acertado");
                    fallado++;
                }

            }

            System.out.print("Has acertado " + acertado + " veces y has fallado " + fallado + " veces. Eran solución: ");
            numero.listarNumeroGenerado();
            System.out.println("");
            System.out.println("¿Otro valor (s/n)? ");
            entrada.setAgregar();
            continuar = entrada.getEntrada();
            numero.vaciarArray();
            fallado = 0;
            acertado = 0;
           

        } while (continuar.equalsIgnoreCase("s"));

    }
}


Clase entrada del teclado [/b

Código: [Seleccionar]
package ejercicioscu00908c;

import java.util.Scanner;

public class EntradaDeTeclado {

    private String entradaTeclado;
    Scanner sc = new Scanner(System.in);

    public EntradaDeTeclado() {
        entradaTeclado = "";
    }

    public void setAgregar() {
        entradaTeclado = sc.nextLine();
    }

    public String getEntrada() {
        return entradaTeclado;
    }

}

Modificado creando un set y un get en la clase entrada teclado.

Clase para generar numero aleatorio

Código: [Seleccionar]
package ejercicioscu00908c;

import java.util.ArrayList;
import java.util.Random;

public class GeneradorNumeroAleatorio {
   
    private ArrayList<Integer> serieAleatoria;
   
    public GeneradorNumeroAleatorio() {
        this.serieAleatoria = new ArrayList<Integer>();
    }
   
    public void addNumeroGenerado(int valorNumero) {
        serieAleatoria.add(valorNumero);
    }
   
    public int adivinarNumero(int numeroInicial, int numeroFinal) {
        Random rnd = new Random();
        int numeroAleatorio = rnd.nextInt(numeroFinal - numeroInicial + 1) + numeroInicial;
       
        return numeroAleatorio;
       
    }
   
    public void listarNumeroGenerado() {
       
        for (Integer serieAleatoria1 : serieAleatoria) {
            System.out.print(serieAleatoria1 + " ");
        }
       
    }

    public void vaciarArray() {
        serieAleatoria.clear();
    }
}

Le modifique para que vacié el arrayList cada vez que haga la condición.

Código: [Seleccionar]
public void vaciarArray() {
        serieAleatoria.clear();
    }
« Última modificación: 18 de Julio 2016, 18:24 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola DRANXZ88 ahora lo veo todo bien. Solo como detalle decirte que el método public void setAgregar() yo lo hubiera llamado simplemente public void setEntrada() ya que si tienes un getEntrada, su compañero set debería llevar el mismo nombre. Es un detalle nomas. Otro detalle sería mejorar los nombres, por ejemplo en lugar de GeneradorNumeroAleatorio numero usar GeneradorNumeroAleatorio generadorNumero. Los nombres deben ser claros de lo que representan las cosas. Es más claro generadorNumero que numero ya que ese objeto realmente no representa un número, sino un generador de números.

Saludos

DRANXZ88

  • Avanzado
  • ****
  • Mensajes: 356
    • Ver Perfil
Gracia por tu correcciones y aclaraciones voy a llevarlos en cuenta para mejorar.

 

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