Autor Tema: Java cómo elegir dos números aleatorios enteros que no sean iguales CU00909C  (Leído 3859 veces)

PatAs

  • Sin experiencia
  • *
  • Mensajes: 19
  • ¿Libre...? - Solo cuando pienso y aprendo!!
    • Ver Perfil
Buenas tardes. Presento código como posible solución del ejercicio de referencia CU00909C del curso avanzado de Java. Saludos.

Enunciado:
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.
Ejemplo de ejecución:
Apuestas por A o por B ? : A
A saca un 9 y B saca un 6 HAS GANADO!!!
Llevas 1 partidas ganadas y 0 partidas perdidas
Quieres probar otra vez ? (S/N) : S
Apuestas por A o por B ? : A
A saca un 1 y B saca un 8 HAS PERDIDO!!!
Llevas 1 partidas ganadas y 1 partidas perdidas
Quieres probar otra vez ? (S/N) : N
Adiós



Código: [Seleccionar]
package CU00909C;
import CU00903C.EntradaPorTeclado;

/**
 * Write a description of class TestEjercicio1 here.
 *
 * @author (Arnaldo R. Martinez)
 * @version (20-Ago-2017 ) Ejercicio propuesto por aprenderaprogramar.com
 */
public class TestEjercicio1 {
public static void main (String [] arg) {
NumeroAleatorio nuevoAleatorio = new NumeroAleatorio();
EntradaPorTeclado entradaTcl = new EntradaPorTeclado();
NumeroMayor mayor = new NumeroMayor();
int A,B;
Apuesta apostado = new Apuesta();
String apuesta ="";
char tecla;
do {//Ciclo 'do-while' que determina la elección del usuario para continuar el juego
do {//Ciclo 'do-while' para asegurar que los dos números generados no sean iguales
nuevoAleatorio.setNuevoNumero(0,10);
A = nuevoAleatorio.getNuevoNumero();
nuevoAleatorio.setNuevoNumero(0,10);
B = nuevoAleatorio.getNuevoNumero();
} while (A == B);
System.out.println("Se han generado dos números aleatorios comprendidos entre [0,10] (incluidos los extremos)");
System.out.println("¿Apuestas por 'A' o por 'B'?: ");
entradaTcl.setEntrada();
apuesta = entradaTcl.getEntrada();
System.out.println("La apuesta fue por: " +apuesta);
//Se determina cual de los números generador es el mayor
mayor.setNumeros(A,B);
mayor.numeroMayor();
//Se resuelve como se ejecuta la apuesta
apostado.setAleatorios(A,B);
apostado.setMayor(mayor.numeroMayor());
apostado.setApuesta(apuesta);
//Se muestran los resultados
System.out.print("A saca un " +A+ " y B saca un " +B+ " ");
apostado.determinaGanador();
System.out.println("Llevas " +apostado.getAciertos()+ " partidas ganadas y " +apostado.getDesaciertos()+ " partidas perdidas.");
//Consulta para continuar o salir del programa
System.out.println("¿Otra ronda...?");
entradaTcl.setEntrada();
tecla = (entradaTcl.getEntrada()).charAt(0);
}
while (tecla == 's' || tecla == 'S');
System.out.println("Adios");//Fin del programa
}
}


Código: [Seleccionar]
package CU00909C;
import java.util.Random;

/**
 * Write a description of class NumeroAleatorio here.
 *
 * @author (Arnaldo R. Martinez)
 * @version (20-Ago-2017 ) Ejercicio propuesto por aprenderaprogramar.com
 */
public class NumeroAleatorio {
Random rnd;
int inicioIntervalo, finalIntervalo, nuevoNumero;

public NumeroAleatorio() {
rnd = new Random();
nuevoNumero = 0;
}

public int setNuevoNumero(int inicioIntervalo,int finalIntervalo) {
int n = (finalIntervalo-inicioIntervalo+1); //Se le suma 1 para incluir el extremo superior del intervalo
nuevoNumero = rnd.nextInt(n)+inicioIntervalo;
return nuevoNumero;
}

public int getNuevoNumero() {return nuevoNumero;}

}


Código: [Seleccionar]
package CU00909C;


/**
 * Write a description of class Apuesta here.
 *
 * @author (Arnaldo R. Martinez)
 * @version (20-Ago-2017 ) Ejercicio propuesto por aprenderaprogramar.com
 */
public class Apuesta {
int mayor,A,B;
String apuesta;
int contadorAciertos;
int contadorDesaciertos;

public Apuesta() {
A = 0;
B = 0;
mayor = 0;
apuesta = "";
contadorAciertos = 0;
contadorDesaciertos = 0;
}

public void setMayor(int mayor) {
this.mayor = mayor;
}
public void setApuesta(String apuesta) {
this.apuesta = apuesta;
}
public void setAleatorios(int A,int B) {
this.A = A;
this.B = B;
}
public void determinaGanador() {

if (mayor == A && apuesta.equals("A") || mayor == B && apuesta.equals("B")) {
System.out.println("HAS ACERTADO...!!");
contadorAciertos++;
} else {
System.out.println("HAS PERDIDO...!!");
contadorDesaciertos++;
}
}

public int getAciertos() {return contadorAciertos;}
public int getDesaciertos() {return contadorDesaciertos;}
}


Código: [Seleccionar]
package CU00909C;


/**
 * Write a description of class NumeroMayor here.
 *
 * @author (Aranaldo R. Martinez)
 * @version (20-Ago-2017 ) Ejercicio propuesto por aprenderaprogramar.com
 */
public class NumeroMayor {
int A,B,mayor;

public NumeroMayor() {
A = 0;
B = 0;
mayor = 0;
}

public void setNumeros(int A,int B) {
this.A = A;
this.B = B;
}

public int numeroMayor() {
if (A > B) {
this.mayor = A;
} else {
this.mayor = B;
}
return mayor;
}

public int getNumeroMayor() {return mayor;}

}


Código: [Seleccionar]
package CU00903C;

import java.util.Scanner;
/**
 * Para obtener entradas por teclado
 *
 * @author (Arnaldo R. Martinez) - [Old: Foro de aprenderaprogramar.com (Corregido (16-Ago-2017) por feedback desde aprenderaprogramar.com)]
 *
 * @version (02_2017).#Se agregó variable (int) y métodos para resolver números enteros. [Old:(01_2016)] -
 */
public class EntradaPorTeclado{
     //Campos de la clase
    private String entrada;
private int numero;
private Scanner entradaTcl;
   
    public EntradaPorTeclado(){
        entrada = "";
numero = 0;
        entradaTcl = new Scanner(System.in);
    }
//Métodos 'set' t 'get'
public void setEntrada() {
entrada = entradaTcl.nextLine();
}
public void setNumero() {
numero = entradaTcl.nextInt();
}

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

PatAs

  • Sin experiencia
  • *
  • Mensajes: 19
  • ¿Libre...? - Solo cuando pienso y aprendo!!
    • Ver Perfil
Buen día comunidad de aprenderaprogramar.com, presento código de posible solución al ejercicio N#2 de la lección de referencia.
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.
Ejemplo de ejecución:
Elige 6 numeros entre el 1 y el 49.
Elige el numero 1 : 3
Elige el numero 2 : 8
Elige el numero 3 : 14
Elige el numero 4 : 2
Elige el numero 5 : 34
Elige el numero 6 : 38
Numeros Elegidos : 3 8 14 2 34 38
Combinación ganadora : 6 14 21 27 30 48
Has acertado : 1 números
Quieres probar otra vez ? (S/N) : n
Adiós

Código: [Seleccionar]
package CU00909C;
import CU00903C.EntradaPorTeclado;
import java.util.Arrays;
/**
 * Write a description of class LoteriaPrimitiva here.
 *
 * @author (Arnaldo R. Martinez)
 * @version (22-Ago-2017) - Ejercicio propuesto #2 por aprenderaprogramr.com
 */
public class LoteriaPrimitiva {
private NumeroAleatorio nuevoAleatorio;
private EntradaPorTeclado eTcl = new EntradaPorTeclado();
private int contador,num;
private int[] combGanadora = new int[6];
private int[] numsElegidos = new int[6];
//Constructor de la clase
public LoteriaPrimitiva(){
nuevoAleatorio = new NumeroAleatorio();
this.combGanadora = combGanadora;
this.numsElegidos = numsElegidos;
}

public int[] setCombGanadora(int rangoInferior, int rangoSuperior) {
do {//Ciclo 'do-while' para asegurar que el array no contenga elementos repetidos.
contador=0;
for(int i=0;i<combGanadora.length;i++) {
nuevoAleatorio.setNuevoNumero(rangoInferior,rangoSuperior);
combGanadora[i] = nuevoAleatorio.getNuevoNumero();
}
//Bloque que verifica si hay números repetido y en caso afirmativo
//incrementa el contador en una unidad
for(int j=0;j<combGanadora.length;j++){
num = combGanadora[j];
for(int k=j+1;k<combGanadora.length;k++){
if(num == combGanadora[k]){
contador++;
}
}
}
//Bloque en desuso. -Utilizado para verificación mientras se generaba código
/*if(contador>0){
System.out.println("El array tiene elementos repetidos");
} else {
System.out.println("El array no tiene elementos repetidos");
}*/
}//Mientras el contador indique números repetidos el ciclo se repite
while (contador > 0);
//Retorno si no hay numeros repetidos
return combGanadora;
}

public void mostrarCombGanadora() {
Arrays.sort(combGanadora); //Función de la clase Arrays que ordena ascendente
System.out.print("Combinación ganadora : ");
for (int tmp:combGanadora){
System.out.print(tmp+", ");
}
System.out.println("\n");
}

public int[] setNumeroElegido() {
int j = 0;
System.out.println("Elige 6 números entre el 1 y el 49.");
do {
for (int i=0;i<numsElegidos.length;i++) {
System.out.print("Elige el número " +(i+1)+ ": ");
eTcl.setNumero();
if(eTcl.getEntradaNumero() >= 1){
if (eTcl.getEntradaNumero() <= 49) {
numsElegidos[i] = eTcl.getEntradaNumero();
j++;
} else {System.out.println("Número no válido"); break;}
} else {
System.out.println("Número no válido"); break;}
}
}
while (j<numsElegidos.length);
return numsElegidos;
}


public void mostrarNumerosElegidos() {
System.out.print("Números elegidos : ");
for (int tmp:numsElegidos) {
System.out.print(tmp+", ");
}
System.out.println("\n");
}
//Método que compara los números alamcenados en los dos arrays y cuenta los repetidos
//Se evalúa cuantos aciertos ocurren.
public int evaluaJuego() {
contador = 0;
for(int i=0;i<combGanadora.length;i++){
num = combGanadora[i];
for(int j=0;j<numsElegidos.length;j++){
if(num == numsElegidos[j]){
contador++;
}
}
}
return contador;
}
}
Código: [Seleccionar]
package CU00909C;
import CU00903C.EntradaPorTeclado;

/**
 * Write a description of class TestEjercicio2 here.
 *
 * @author (Arnaldo R. Martinez)
 * @version (22-Ago-2017) - Ejercicio propuesto #2 por aprenderaprogramar.com
 */
public class TestEjercicio2 {
public static void main (String [] arg) {
    char tecla;
do{//Ciclo 'do-while' que itera de acuerdo a voluntad del usuario
LoteriaPrimitiva loteria1 = new LoteriaPrimitiva();
loteria1.setCombGanadora(1,49);//Valores del rango incluidos
loteria1.setNumeroElegido();
loteria1.mostrarNumerosElegidos();
loteria1.mostrarCombGanadora();
System.out.println("Has acertado : " +loteria1.evaluaJuego()+ " números.");

//Consulta para continuar o salir del programa
System.out.println("¿Otra ronda...?");
EntradaPorTeclado entradaTcl= new EntradaPorTeclado();
entradaTcl.setEntrada();
tecla = (entradaTcl.getEntrada()).charAt(0);
}
while (tecla == 's' || tecla == 'S');
System.out.println("Adios");//Fin del programa
}
}
Código: [Seleccionar]
package CU00909C;
import java.util.Random;

/**
 * Write a description of class NumeroAleatorio here.
 *
 * @author (Arnaldo R. Martinez)
 * @version (20-Ago-2017 ) Ejercicio propuesto por aprenderaprogramar.com
 */
public class NumeroAleatorio {
Random rnd;
int inicioIntervalo, finalIntervalo, nuevoNumero;

public NumeroAleatorio() {
rnd = new Random();
nuevoNumero = 0;
}

public int setNuevoNumero(int inicioIntervalo,int finalIntervalo) {
int n = (finalIntervalo-inicioIntervalo+1); //Se le suma 1 para incluir el extremo superior del intervalo
nuevoNumero = rnd.nextInt(n)+inicioIntervalo;
return nuevoNumero;
}

public int getNuevoNumero() {return nuevoNumero;}

}
Código: [Seleccionar]
package CU00903C;

import java.util.Scanner;
/**
 * Para obtener entradas por teclado
 *
 * @author (Arnaldo R. Martinez) - [Old: Foro de aprenderaprogramar.com (Corregido (16-Ago-2017) por feedback desde aprenderaprogramar.com)]
 *
 * @version (02_2017).#Se agregó variable (int) y métodos para resolver números enteros. [Old:(01_2016)] -
 */
public class EntradaPorTeclado{
     //Campos de la clase
    private String entrada;
private int numero;
private Scanner entradaTcl;
   
    public EntradaPorTeclado(){
        entrada = "";
numero = 0;
        entradaTcl = new Scanner(System.in);
    }
//Métodos 'set' t 'get'
public void setEntrada() {
entrada = entradaTcl.nextLine();
}
public void setNumero() {
numero = entradaTcl.nextInt();
}

    public String getEntrada(){return entrada;}
public int getEntradaNumero(){return numero;}
}

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Buenas PatAs el ejercicio 1 funciona correctamente y cumple con lo que se pedía en el ejercicio, posiblemente yo no hubiera hecho el diseño de clases igual, pero se ve bien trabajado y que has estructurado el código en distintas clases con responsabilidades divididas

El ejercicio 2 también funciona bien. Una posible mejora sería evitar que el usuario pueda elegir dos números repetidos, por ejemplo ahora permite elegir 1, 22, 33, 23, 34, 33 donde como se ve el 33 está repetido, pero esto no debería ser legal (ya que se han de elegir 6 números distintos).

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