Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

[Java] Maquina Tragaperras

  • 5 Respuestas
  • 6528 Vistas

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado /d3v/nu11

  • *
  • Underc0der
  • Mensajes: 26
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
    • Email
« en: Abril 08, 2015, 08:39:12 pm »
Ejercicio de Maquina tragaperras que he hecho para la universidad.

1. Main
Código: Java
  1. import java.util.Scanner;
  2. import java.util.Arrays;
  3.  
  4. public class Programa {
  5.         public static void main(String[] args) {
  6.                
  7.                 // 1. Declara dos variables locales de tipo Premio
  8.                 Fruta[] combinacion1 = {Fruta.FRESA, Fruta.FRESA, Fruta.FRESA};
  9.                 Premio premio1 = new Premio(combinacion1, 20);
  10.                 Fruta[] combinacion2 = {Fruta.SANDIA, Fruta.FRESA,Fruta.SANDIA};
  11.                 Premio premio2 = new Premio(combinacion2, 10);
  12.                
  13.                 /* 2. Crea una máquina con un tamaño de combinación de 3 frutas,
  14.                 * un precio por partida de 0,5 euros
  15.                 * y los dos premios declarados previamente
  16.                 */
  17.                 Maquina maquina = new Maquina(3, 0.5, premio1, premio2);
  18.                
  19.                 /* 3. Solicita al usuario que introduzca por teclado la cantidad
  20.                 * de crédito para jugar.
  21.                 */
  22.                 System.out.println("Introduzca el crédito: ");
  23.                 Scanner teclado = new Scanner(System.in);
  24.                 double credito = teclado.nextDouble();
  25.                 teclado.nextLine();
  26.                 maquina.incrementarCredito(credito);
  27.                 System.out.println(credito);
  28.                
  29.                
  30.                 // 4. Jugamos mientras haya crédito disponible
  31.                 Fruta[] combinacion;
  32.                 maquina.setCredDisp(credito);
  33.                 while (maquina.getCredito() > 0){
  34.                        
  35.                         //4.1 Realiza la jugada
  36.                         combinacion = maquina.jugar();
  37.                        
  38.                         //4.2 Muestra la combinación obtenida y el crédito
  39.                         System.out.println(Arrays.toString(combinacion)+" --- "+maquina.getCredito());
  40.                        
  41.                         //4.3 Pide al usuario que pulse intro para continuar
  42.                         System.out.println("Pulse intro para volver a jugar");
  43.                         teclado.nextLine();
  44.                 }
  45.                 System.out.println("Fin del juego: no dispone de credito suficiente");
  46.         }
  47. }
  48.  

2. Maquina
Código: Java
  1. import java.util.Random;
  2. import java.util.Arrays;
  3.  
  4. public class Maquina {
  5.         private int casillas;
  6.         private double precJug;
  7.         private double credDisp;
  8.         private Premio[] coleccion;
  9.        
  10.         public Maquina(int nCasillas, double precio, Premio... premio) {
  11.                 precJug=precio;
  12.                 casillas=nCasillas;
  13.                 coleccion=premio;
  14.         }
  15.        
  16.         public double getPrecJug() {
  17.                 return precJug;
  18.         }
  19.         public void setPrecJug(double precio) {
  20.                 precJug = precio;
  21.         }
  22.         public double getCredito() {
  23.                 return credDisp;
  24.         }
  25.         public void setCredDisp(double credito) {
  26.                 credDisp = credito;
  27.         }
  28.         public int getnCasillas() {
  29.                 return casillas;
  30.         }
  31.         public Premio[] getColeccion() {
  32.                 return coleccion;
  33.         }
  34.        
  35.         public double incrementarCredito(double incremento) {
  36.                 return credDisp + incremento;
  37.         }
  38.        
  39.         public double cobrar() {
  40.                 System.out.println("Retirando "+credDisp+" euros de la maquina");
  41.                 credDisp = 0;
  42.                 return credDisp;
  43.         }
  44.        
  45.         public Fruta[] jugar() {
  46.                 setPrecJug(precJug);
  47.                 if (getCredito() >= precJug) {
  48.                         credDisp = credDisp - precJug;
  49.                        
  50.                         Random generador = new Random();
  51.                         Fruta[] frutas;
  52.                         frutas = new Fruta[casillas];
  53.                         Fruta[] frutas_aleatorias=Fruta.values();
  54.                        
  55.                         for (int i = 0;i<casillas; i++){
  56.                                 int index = generador.nextInt(5);
  57.                                 frutas[i]=frutas_aleatorias[index];
  58.                         }
  59.                        
  60.                         int n = 1; // n = numero de premios
  61.                         for (int i = 0; i <= n; i++) {
  62.                                 //comprueba si combinación esta en premios registrados
  63.                                 if (Arrays.equals(frutas, coleccion[i].getCombGanad()) == true){
  64.                                         credDisp = credDisp + coleccion[i].getPremio();
  65.                                 }      
  66.                         }
  67.                         return frutas;
  68.                 }
  69.                 return null;
  70.         }
  71. }
  72.  

3.Premio
Código: Java
  1. public class Premio {
  2.         private Fruta[] CombGanad;
  3.         private int premio;
  4.        
  5.         public Fruta[] getCombGanad() {
  6.                 return CombGanad;
  7.         }
  8.  
  9.         public int getPremio() {
  10.                 return premio;
  11.         }
  12.  
  13.         // CONSTRUCTORES
  14.         public Premio(Fruta[] combinacion, int p) {
  15.                 CombGanad=combinacion;
  16.                 premio=p;
  17.         }
  18. }
  19.  

4.Frutas
Código: Java
  1. public enum Fruta {
  2.         FRESA, SANDIA, PLATANO, MELOCOTON, PERA
  3. }
  4.  


Piensa por ti mismo y cuestiona a la autoridad.

Desconectado Gus Garsaky

  • *
  • Underc0der
  • Mensajes: 93
  • Actividad:
    0%
  • Reputación -1
    • Ver Perfil
  • Skype: gus.garsaky
« Respuesta #1 en: Abril 10, 2015, 06:39:56 pm »
Buen aporte. Sería bueno que ahora lo hagas con una GUI. Lo complicado sería la animación de las figuras corriendo si es que lo haces en Swing. JavaFX provee una API para animaciones, inténtalo.

Saludos.

Desconectado /d3v/nu11

  • *
  • Underc0der
  • Mensajes: 26
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
    • Email
« Respuesta #2 en: Abril 11, 2015, 01:04:44 pm »
La verdad es que no estoy muy puesto en el tema de interfaces graficas. Pero lo intentare de todos modos.

Un saludo compañero!!!


Piensa por ti mismo y cuestiona a la autoridad.

Desconectado Adalher

  • *
  • Underc0der
  • Mensajes: 84
  • Actividad:
    83.33%
  • Reputación 0
    • Ver Perfil
« Respuesta #3 en: Agosto 26, 2019, 11:31:49 am »
Hola /d3v/nu11,

realmente relevantes son solamente los dos últimos. Puede que en semejantes programas pequeños la entrada de usuario invalidante todavía este okay; y simplemente se debe al formato. Pero el bucle con el índice fijo es justamente un bug que nunca debería pasar.

Citar
Código: Java
  1. int n = 1; // n = numero de premios
  2.                         for (int i = 0; i <= n; i++) {
  3.                                 //comprueba si combinación esta en premios registrados
  4.                                 if (Arrays.equals(frutas, coleccion[i].getCombGanad()) == true){
  5.                                         credDisp = credDisp + coleccion[i].getPremio();
  6.                                 }      
  7.                         }
  8.  
Código: Java
  1. for (Premio premio : coleccion) {
  2.     if (Arrays.equals(frutas, premio.getCombGanad()) == true){
  3.         credDisp = credDisp + premio.getPremio();
  4.     }  
  5. }
  6.  

Sobre todo evita el bug de sencillamente presuponer una longitud de Array fija en una clase pero no comprobar esto en ninguna parte.


Saludos

Desconectado tr0n

  • *
  • Underc0der
  • Mensajes: 44
  • Actividad:
    10%
  • Reputación 1
    • Ver Perfil
    • Chat Latino
« Respuesta #4 en: Agosto 26, 2019, 09:49:47 pm »
Hola /d3v/nu11,

Gran aporte, como dice @GUS Garsaky, sería una gran idea que este programa tuviera GUI. También te recomiendo que subieras este código a GIthub.

Saludos

Desconectado Adalher

  • *
  • Underc0der
  • Mensajes: 84
  • Actividad:
    83.33%
  • Reputación 0
    • Ver Perfil
« Respuesta #5 en: Octubre 27, 2019, 08:47:44 pm »
Hola /d3v/nu11,

revisando de nuevo tu código, se me ocurre esto:
produjiste algo que en realidad es mucho mejor que las publicaciones de otros usuarios. Mejor, pero no fantástico o bueno en absoluto. Hay bastantes comentarios que puedo hacer para permitirte mejorar.

En primer lugar, tu clase principal:
Código: Java
  1. System.out.println("Introduzca el crédito: ");
  2. Scanner teclado = new Scanner(System.in);
  3. double credito = teclado.nextDouble();
  4.  

Sin manejo de excepciones. Simplemente puedo ingresar cualquier valor de NaN y tu aplicación se bloqueará porque no estás verificando la entrada. Para empezar, puedo detener completamente tu juego simplemente ingresando un crédito negativo, que es algo que probablemente quieras restringir.

También puedo interrumpir tu aplicación ingresando un valor de crédito que es menor que el costo de "jugar". Debes verificar esto:

Código: Java
  1. Maquina maquina = new Maquina(3, 0.5, premio1, premio2);
  2.  

Código: Java
  1. if (getCredito() >= precJug) {
  2.                         credDisp = credDisp - precJug;
  3.                        
  4.                         Random generador = new Random();
  5.                         Fruta[] frutas;
  6.                         frutas = new Fruta[casillas];
  7.                         Fruta[] frutas_aleatorias=Fruta.values();
  8.                        
  9.                         for (int i = 0;i<casillas; i++){
  10.                                 int index = generador.nextInt(5);
  11.                                 frutas[i]=frutas_aleatorias[index];
  12.                         }
  13.                        
  14.                         int n = 1; // n = numero de premios
  15.                         for (int i = 0; i <= n; i++) {
  16.                                 //comprueba si combinación esta en premios registrados
  17.                                 if (Arrays.equals(frutas, coleccion[i].getCombGanad()) == true){
  18.                                         credDisp = credDisp + coleccion[i].getPremio();
  19.                                 }      
  20.                         }
  21.                         return frutas;
  22.                 }
  23.                 return null;
  24.  

Esto hace que tu función retorne null en lugar de una excepción adecuada o simplemente no permitir jugadas cuando el crédito < la cantidad requerida para jugar. En este momento estoy atrapado en un bucle infinito. Gracias por el bucle infinito, /d3v/nu11…

No tienes que seguir configurando el 'prec jug', sea lo que sea que eso signifique. Hacerlo una vez es más que suficiente y no tiene absolutamente ningún propósito establecer un valor para que sea igual a sí mismo una y otra vez cuando se juega. Ya has establecido este valor en el constructor:
Código: Java
  1. public Maquina(int nCasillas, double precio, Premio... premio) {
  2.                 precJug=precio;
  3.                 casillas=nCasillas;
  4.                 coleccion=premio;
  5.         }
  6.  

Pero tu constructor no maneja adecuadamente los valores de variables ilegales. Puedes hacer fácilmente una Máquina con un 'precJug' (mierhw hombre, usa nombres de variables adecuados) negativo, por ejemplo.

Este método aquí devuelve un valor, pero nunca usas este valor:
Código: Java
  1. public double incrementarCredito(double incremento) {
  2.                 return credDisp + incremento;
  3.         }
  4.  

También usas esto solo una vez al comienzo del 'juego', lo que hace que esta función sea completamente redundante. No sirve para nada. No hace nada. Tienes otra función que establece el crédito correctamente si eso es lo que pretendías hacer, pero por alguna razón la nombraste mal (como suelen hacer los usuarios de aquí):
Código: Java
  1. public void setCredDisp(double credito) {
  2.                 credDisp = credito;
  3.         }
  4.  

Además del nombramiento de esta función, no debes permitir que se pase crédito negativo.

En tu clase de Premio, se supone que tu constructor agregue un crédito al saldo total del usuario si gana, sin embargo, puedes poner fácilmente números negativos y vectores null aquí ya que una vez más no verificas los valores de las variables que son pasadas. Esto puede causar un comportamiento que no deseas para el propósito de este 'juego':
Código: Java
  1. public Premio(Fruta[] combinacion, int p) {
  2.                 CombGanad=combinacion;
  3.                 premio=p;
  4.         }
  5.  

También tienes bastantes métodos que no sirven para nada porque no se usan en ningún lado:
Código: Java
  1. System.out.println("Retirando "+credDisp+" euros de la maquina");
  2.                 credDisp = 0;
  3.                 return credDisp;
  4.         }
  5. public int getnCasillas() {
  6.                 return casillas;
  7.         }
  8. public Premio[] getColeccion() {
  9.                 return coleccion;
  10.         }
  11. public double getPrecJug() {
  12.                 return precJug;
  13.         }
  14.  

Aquí, haces algo que es bastante divertido:
Código: Java
  1. if (Arrays.equals(frutas, coleccion[i].getCombGanad()) == true){
  2.                                         …
  3.                                 }
  4.  

Puedes simplificar esto:
Código: Java
  1. if (Arrays.equals(frutas, coleccion[i].getCombGanad())){
  2.                                         …
  3.                                 }
  4.  

Por cierto, tampoco cierras tu Scanner.

Entonces para concluir:
. Usa nombres de variables apropiados
. Usa getters y setters adecuados
. Usa nombres de funciones adecuados
. Utiliza manejos de errores adecuados
. Restringe la entrada de usuario a valores que tengan sentido
. Elimina funciones no utilizadas
. Cierra tu Scanner de mierhw


Saludos

 

¿Te gustó el post? COMPARTILO!



[Video Curso] Iniciacion a Java por DesarrolloWeb y EscuelaIT Mayo 2014

Iniciado por graphixx

Respuestas: 3
Vistas: 3631
Último mensaje Febrero 23, 2015, 10:13:28 am
por Hu3c0
[LIBRO] Programación avanzada en Java - Sonia Jaramillo Valbuena

Iniciado por graphixx

Respuestas: 5
Vistas: 8420
Último mensaje Enero 23, 2019, 07:14:41 pm
por jashin
Java Extremo [Video Cursos Completos] [Español] [ISO] 2009

Iniciado por graphixx

Respuestas: 9
Vistas: 9324
Último mensaje Diciembre 04, 2017, 02:36:34 am
por graphixx
Como compilar programas Java en la consola de comandos de Windows

Iniciado por tar3kw0rm3d

Respuestas: 2
Vistas: 3964
Último mensaje Junio 04, 2013, 02:55:07 pm
por tar3kw0rm3d
[VIDEOTUTORIAL] Java 7 (2011) Creación de aplicaciones de escritorio

Iniciado por graphixx

Respuestas: 3
Vistas: 5552
Último mensaje Diciembre 13, 2017, 12:15:55 pm
por Jean Grey