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:
System.out.println("Introduzca el crédito: ");
Scanner teclado = new Scanner(System.in);
double credito = teclado.nextDouble();
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:
Maquina maquina = new Maquina(3, 0.5, premio1, premio2);
if (getCredito() >= precJug) {
credDisp = credDisp - precJug;
Random generador = new Random();
Fruta[] frutas;
frutas = new Fruta[casillas];
Fruta[] frutas_aleatorias=Fruta.values();
for (int i = 0;i<casillas; i++){
int index = generador.nextInt(5);
frutas[i]=frutas_aleatorias[index];
}
int n = 1; // n = numero de premios
for (int i = 0; i <= n; i++) {
//comprueba si combinación esta en premios registrados
if (Arrays.equals(frutas, coleccion[i].getCombGanad()) == true){
credDisp = credDisp + coleccion[i].getPremio();
}
}
return frutas;
}
return null;
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:
public Maquina(int nCasillas, double precio, Premio... premio) {
precJug=precio;
casillas=nCasillas;
coleccion=premio;
}
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:
public double incrementarCredito(double incremento) {
return credDisp + incremento;
}
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í):
public void setCredDisp(double credito) {
credDisp = credito;
}
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':
public Premio(Fruta[] combinacion, int p) {
CombGanad=combinacion;
premio=p;
}
También tienes bastantes métodos que no sirven para nada porque no se usan en ningún lado:
System.out.println("Retirando "+credDisp+" euros de la maquina");
credDisp = 0;
return credDisp;
}
public int getnCasillas() {
return casillas;
}
public Premio[] getColeccion() {
return coleccion;
}
public double getPrecJug() {
return precJug;
}
Aquí, haces algo que es bastante divertido:
if (Arrays.equals(frutas, coleccion[i].getCombGanad()) == true){
…
}
Puedes simplificar esto:
if (Arrays.equals(frutas, coleccion[i].getCombGanad())){
…
}
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