Autor Tema: Java números aleatorios sin repetición generación a suerte clase Random CU00909C  (Leído 4763 veces)

paramonso

  • Intermedio
  • ***
  • Mensajes: 241
  • El ignorante afirma, el sabio duda y reflexiona.
    • Ver Perfil
Hola dejo el ejercicio CU00909C del manual pdf de programación Java avanzada. Ejemplos de números aleatorios clase Random. Enteros con nextInt ().

Citar
EJERCICIO Nº 1

Crea un programa que elija dos números enteros aleatorios A y B pero no los muestre por pantalla aún. Si los dos números fueran iguales, deberá repetirse la elección hasta que sean distintos. El programa preguntará por quién apostamos, A o B (gana el número más alto). Una vez el usuario haya introducido su apuesta, el programa mostrará el valor de A y B, dirá si hemos ganado la apuesta (acertado el número más alto) o perdido y nos dirá cuántas partidas hemos ganado y perdido hasta el momento. Tras una jugada, nos preguntará si queremos jugar otra vez.

Código del ejercicio 1

Clase ApuestaAlMasAlto

Código: [Seleccionar]
import java.util.Scanner;

/**
 * Write a description of class AdivinarNumero here.
 *
 * @author (your name)
 * @version (a version number or a date)
 */
public class ApuestaAlMasAlto
{
    public static String entradaUsuario="";
    public static Scanner entrada=new Scanner(System.in);

    public static void main(String arg[ ]) {

        GenerarAleatorio rnd= new GenerarAleatorio();
        Marcador marcador= new Marcador();
        String separador = new String(new char[63]).replace("\0", "*");
        boolean fin=true;
        int a=0,b=0;//Variables para las apuestas
        int ganadas=0,perdidas=0;
        int rangoI=1, rangoF=100;
        rnd.setInicioRango(rangoI);
        rnd.setFinRango(rangoF);

        do{

            a=rnd.getEnteroRnd();
            b=rnd.getEnteroRnd();
            while(a==b){
                a=rnd.getEnteroRnd();

            }
            String introducidos="";
            System.out.print("\t\t\t"+separador+
                "\n\t\t\t** Ejercicio CU00909C-1 Java avanzado aprenderaprogramar.com **\n"+
                "\t\t\t***                                                         ***\n"+
                "\t\t\t***               JUEGO NUMERO MAS ALTO A o B               ***\n"+
                "\t\t\t***                                                         ***\n"+
                "\t\t\t"+separador+"\n\n");
            System.out.print("\t\t\t\t¿POR QUIEN APUESTA POR A O POR B?: ");
            entradaUsuario=entrada.nextLine().toUpperCase();
            boolean entraBucle=entradaUsuario.equals("A") || entradaUsuario.equals("B");
            //Mientras entradaUsuario no sea A o B se repite el bucle
            while (entraBucle==false){
                System.out.print("\t\t\t\t NO SOLO POR ¿ A O POR B ?: ");
                entradaUsuario=entrada.nextLine().toUpperCase();
                entraBucle=entradaUsuario.equals("A") || entradaUsuario.equals("B");

            }

            System.out.print("\n");
            if (a>b && entradaUsuario.equals("A")){
                System.out.print("\t\t\tA saca un "+a+" B saca un "+b+
                    "\n\n\t\t\t¡¡¡¡¡ PREMIO HAS GANADO !!!!!!");
                ganadas++;
                marcador.setAciertos(ganadas);
            }
            else if (b>a && entradaUsuario.equals("B")){
                System.out.print("\t\t\tA saca un "+a+" B saca un "+b+
                    "\n\n\t\t\t¡¡¡¡¡ PREMIO HAS GANADO !!!!!!");
                ganadas++;
                marcador.setAciertos(ganadas);
            }
            else {
                System.out.print("\t\t\tA saca un "+a+" B saca un "+b+
                    "\n\n\t\t\t¡¡¡¡¡ HAS PERDIDO !!!!!!");
                perdidas++;
                marcador.setFallos(perdidas);
            }
            System.out.print("\n\n\t\tLlevas "+ marcador.getAciertos()+" partidas ganadas y "+marcador.getFallos()+" partidas perdidas\n");
            System.out.print("\n\n\t\t\t¡¡ PULSE INTRO PARA CONTINUAR !!\n\n\t\t\tCualquier otra + intro FINALIZAR\n\n");
            entradaUsuario=entrada.nextLine();
            System.out.print('\u000C');
            fin=entradaUsuario.equals("");
        }while(fin);
        System.out.print("\n\n\n\n\n\t\t\t"+separador+
            "\n"+"\t\t\t"+separador+
            "\n\t\t\t\t\t\tADIOS"+
            "\n\t\t\t"+separador+
            "\n"+"\t\t\t"+separador+"\n");
    }//Fin main
    //Bucle para validar que solo se escriban numeros por teclado

}

Clase Marcador

Código: [Seleccionar]
public class Marcador
{
     int aciertos;
     int fallos;
     int numJugadas;
     //Constructores
    public Marcador()
    {
        this.aciertos=aciertos;
        this.fallos=fallos;
        this.numJugadas=numJugadas;
    }
    public int getAciertos(){
    return aciertos;
    }
    public int getFallos(){
    return fallos;
    }
    public int getNumJugadas(){
    return numJugadas;
    }
    public void setAciertos(int aciertos){
            this.aciertos=aciertos;
    }
    public void setFallos(int fallos){
           this.fallos=fallos;
    }
     public void setNumJugadas(int numJugadas){
            this.numJugadas=numJugadas;
    }
     
}


Clase GenerarAleatorio compartida por ApuestaAlMasAlto y LoteriaPrimitiva

Código: [Seleccionar]
import java.util.Random;
public class GenerarAleatorio
{
    private Random enteroRnd;
    private int finRango;
    private int inicioRango;

    /**
     * Constructor for objects of class GenerarAleatorio
     */
    //Constructores
    public GenerarAleatorio()
    {
        // initialise instance variables
        this.enteroRnd=new Random();
        this.finRango=0;
        this.inicioRango=0;
    }

    public GenerarAleatorio(Random enteroRnd,int finRango,int inicioRango)
    {
        // initialise instance variables
        this.enteroRnd=new Random();
        this.finRango=finRango;
        this.inicioRango=inicioRango;
    }
    // Metodos get
    public int getFinRango(){
        return finRango;
    }
     public int getInicioRango(){
        return inicioRango;
    }
    public int getEnteroRnd(){
      return enteroRnd.nextInt(finRango)+inicioRango;
   
    }
    //Metodos set
    public void setFinRango(int finRango){
    this.finRango=finRango;
    }
   
    public void setInicioRango(int inicioRango){
     this.inicioRango=inicioRango;
    }
}


Citar
EJERCICIO Nº 2

Ahora vamos a jugar a la “Lotería primitiva”. Para ello, se pedirá al usuario que introduzca 6 números enteros comprendidos entre el 1 y el 49 ambos incluidos. No estará permitido repetir número. Una vez elegidos los seis números el programa nos mostrará nuestros 6 números así como la combinación ganadora (ordenada de menor a mayor). Esta combinación constará de 6 números entre 1 y 49 elegidos al azar por el programa. Finalmente nos dirá cuántos aciertos hemos tenido y nos preguntará si queremos volver a jugar.


Nota: para ejecutar este ejercicio debe incluirse el código de la clase GenerarAleatorio que figura en el ejercicio anterior.

Codigo de la Clase LoteriaPrimitiva

Código: [Seleccionar]
import java.util.Scanner;
public class LoteriaPrimitiva
{
    //Crear variables y Objeto entrada para entrar numeros por teclado
    public static String entradaUsuario="";
    public static Scanner entrada=new Scanner(System.in);
    //Clase main
    public static void main(String arg[ ]) {
        //Separador par presentacion en pantalla
        boolean fin=true; //Variable para finalizar bulce
        do{
            String separador = new String(new char[63]).replace("\0", "*");
           
            int rangoI=1,rangoF=49;// Rango de numeros de inicio y fin de Random()
            int numLoteria=0; //Variable para coger los numeros de la loteria
            GenerarAleatorio rnd= new GenerarAleatorio();// Crear objeto que genera los numeros de la loteria
            rnd.setInicioRango(rangoI);// Poner el numero de inicio del rango de Random
            rnd.setFinRango(rangoF);// Poner el numero de fin del rango de Random
            int contador=0;// Variable contador para terminar el bucle cuando llege a 6 numeros que no sean iguales
            ListaApuestaSorteo listaApuesta=new ListaApuestaSorteo();// Lista para los numeros de la apuesta del usuario
            ListaApuestaSorteo listaSorteo=new  ListaApuestaSorteo();// Lista aleatoria de la loteria


            System.out.print("\t\t\t"+separador+
                "\n\t\t\t*** Ejercicio CU0090C2 Java avanzado aprenderaprogramar.com ***\n"+
                "\t\t\t***\t\t JUEGO LOTERIA PRIMITIVA \t\t    ***\n"+
                "\t\t\t***        Introduzca los 6 numeros de su apuesta           ***\n"+
                "\t\t\t***     del 1 al 49 no se admiten numeros repetidos         ***\n"+
                "\t\t\t"+separador+"\n\n");
            //Bucle para sacar los seis numeros del sorteo
            do{
                numLoteria=rnd.getEnteroRnd();
                //Validar que el numero no este repetido en la lista
                if(listaSorteo.numeroEnLista(numLoteria)!=true){
                    contador++;
                    listaSorteo.setNumero(numLoteria);//Si el numero no esta repetido incluir en la lista
                }
            }while(contador<6);

            contador=0;
            int aciertos=0, numeroApuesta=0;
            ValidarNumero NumAValidar=new ValidarNumero();
            //Bucle para sacar los seis numeros de la apuesta
            do{

                System.out.print(" \t\tIntroduzca la apuesta Nº "+(contador+1)+" Su numero: ");
                //Validar que solo sean numeros y entrada por teclado
                numeroApuesta=Integer.parseInt( ValidarNumero.validarNumero(entradaUsuario));
                // Comprobar que la horqulla numerica este entre 1 y 49 ambos inclusive
                if(numeroApuesta<1 || numeroApuesta>49){
                    System.out.print(" \t\tEl numero: "+numeroApuesta+" no es valido\n");
                    numeroApuesta=0;
                }
                //Comprobar que el numero no este repetido
                else if(listaApuesta.numeroEnLista(numeroApuesta)!=true){
                    contador++;//Se añade 1 al contador
                    listaApuesta.setNumero(numeroApuesta);//Si el numero no esta repetido incluir en la lista
                }
                else { System.out.print(" \t\tEl numero "+numeroApuesta+"esta repetido\n");}
            }while(contador<6);

            System.out.print('\u000C');
            //Odenar listas
            listaSorteo.getOrdenarLista();listaApuesta.getOrdenarLista();
            String numeroAcertado="";//Variable para los numeros acertados
            for (int i=0; i<listaSorteo.getTamañoLista();i++){
                if(listaApuesta.numeroEnLista(listaSorteo.getPosicionNumero(i))){
                    aciertos++;
                    numeroAcertado=numeroAcertado+ Integer.toString(listaSorteo.getPosicionNumero(i))+" ";
                }
            }
            // Presentar datos por pantalla
            String msgFinal= "\n\n\n\n\n\t\t\t"+separador+"\n\t\t\t"+separador+
                "\n\t\t\t\tResultado del sorteo:\t "+listaSorteo.getApuestaSorteo()+
                "\n\t\t\t\tSu Apuesta :\t\t "+listaApuesta.getApuestaSorteo()+
                "\n\t\t\t\tNumero de aciertos: "+aciertos+
                "\n\t\t\t\tEl/Los Numero(s) acertado(s) son: "+numeroAcertado+
                "\n\t\t\t\tPULSE INTRO PARA CONTINUAR  F+INTRO PARA FINALIZAR "+
                "\n\t\t\t"+separador+"\n"+"\t\t\t"+separador+"\n";
            System.out.print(msgFinal);
            entradaUsuario=entrada.nextLine();
            System.out.print('\u000C');
            fin=entradaUsuario.equals("");
        }while(fin); 
 System.out.print('\u000C'+"ADIOS");
    }//Fin main
}


Codigo de la clase ValidarNumero

Código: [Seleccionar]
import java.util.Scanner;
/**
 * Write a description of class ValidarNumero here.
 *
 * @author (your name)
 * @version (a version number or a date)
 */
public class ValidarNumero
{ //Bucle para validar que solo se escriban numeros por teclado
    public static Scanner entrada=new Scanner(System.in);
    public static String validarNumero(String entradaUsuario){
        int num=0;
        boolean ok=false;
        do{

            entradaUsuario= entrada.nextLine();
            //Comprobar que sea un numero entero
            if (isNumeric(entradaUsuario) == true) {
                ok=true;
            }
            else{
               
                System.out.print("Solo se admiten numeros\n");
                entradaUsuario="";
            }

        } while (!ok);
        return entradaUsuario;
    }

    public static boolean isNumeric(String str) {//Validacion numeros
        return (str.matches("[+-]?\\d.*[0-9]?") && str.equals("")==false);
    }
}


Codigo de la Clase ListaApuestaSorteo

Código: [Seleccionar]
import java.util.Collections;
import java.util.LinkedList;
public class ListaApuestaSorteo
{
    private LinkedList<Integer> apuestaCombinacion;
    //Constructor
    public ListaApuestaSorteo(){
        apuestaCombinacion=new LinkedList();
    }
    //Metodos get
    public LinkedList<Integer> getNumero(){
        return apuestaCombinacion;   
    }

    public int getTamañoLista(){
        return apuestaCombinacion.size();
    }

    public LinkedList getOrdenarLista(){
        Collections.sort(apuestaCombinacion);
        return apuestaCombinacion;
    }

    public int getPosicionNumero(int index) {
        return apuestaCombinacion.get(index);
    }

    public String getApuestaSorteo(){
        String msg = "";
        for(int numero: apuestaCombinacion) {
            msg += "["+numero + "] ";
        }
        return msg;
    }

   
    //Metodos set
    public void setNumero(int numero){
        apuestaCombinacion.add(numero);
    }

    public boolean numeroEnLista(int numero){
        return apuestaCombinacion.contains(numero);
    }


}

Gracias. Un saludo ;)
« Última modificación: 17 de Agosto 2019, 13:52 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Buenas, para quien revise esta entrega:

- Ejercicio 1, lo he revisado y lo veo perfecto: realiza lo pedido y funciona correctamente.

- Ejercicio 2: al compilar me aparece un mensaje "Warnings from last compilation: ListaApuestaSorteo.java uses unchecked or unsafe operations. Recompile with -Xlintunchecked for details

En este ejercicio hay algunos nombres de métodos o clases incorrectos o poco coherentes. Por ejemplo en la clase ListaApuestaSorteo en lugar de usar el nombre de método getOrdenarLista me parecería más correcto getListaOrdenada. En la misma clase setNumero(int numero) parece un nombre poco afortunado, ya que lo que hace el método es añadir (add) un número a la lista. Parece poco coherente que un método que realiza un add sea nombrado como set. Hubiera sido más lógico que el método se llamara addNumero. Estos detalles pueden no influir en el resultado obtenido del programa, pero si alguien evaluara el código éstas cosas serían evaluadas negativamente.

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