Ejercicio Java

Iniciado por rollth, Abril 25, 2015, 01:03:23 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Abril 25, 2015, 01:03:23 PM Ultima modificación: Enero 23, 2016, 11:56:23 PM por rollth
Muy buenas gente, como ahora estoy empezando a estudiar java en la uni he pensado en traeros un ejercicio simple que he hecho, es para apostar tirando un dado.

numeroGenerator

Código: java
import java.util.Random;
/**
* Genera un numero al azar
*
*
* @1.0
*/
public class numeroGenerator{

    private Random generadorAzar;


    public numeroGenerator(){
        generadorAzar = new Random();
    }


    public int generarNumero(){
        return generadorAzar.nextInt(6) + 1;
    }
}


Dinero
Código: java

/**
* Controla el Dinero.
*
* @author
* @version 1.0
*/
public class Dinero{

    public int dinero;


    public Dinero(){
        dinero = 100;
    }


    public void aumentarDinero(int x){
        dinero = dinero + x;
    }
   
    public void disminuirDinero(int x){
        dinero = dinero - x;
    }
}


maquinaDeApuestas
Código: java

/**
* Maquina de apuestas con el dado
*
*
* @version 1.0
*/
public class MaquinaDeApuestas{   
    private Dinero dinero;


    public MaquinaDeApuestas(){
        dinero = new Dinero();
    }


    public int preguntarDinero(){
        return dinero.dinero;
    }
   
    public void apostar(int apuesta , int numero){
        if ((apuesta <= dinero.dinero) && (apuesta > 0)){
            numeroGenerator generador;
            generador = new numeroGenerator();
            int numero1 = generador.generarNumero();
            System.out.println("Su numero es: " + numero);
            System.out.println("El numero que ha salido en el dado es: " + numero1);
            if (numero == numero1){
                System.out.println("!HA GANADO¡");
                dinero.aumentarDinero(apuesta * 6);
            }
            else{
                System.out.println("Ha perdido...");
                dinero.disminuirDinero(apuesta);
            }
        }
        else{
            System.out.println("No puede apostar esa cantidad de dinero.");
        }
    }
}

RollthBuen hacker mejor No tienes permitido ver los links. Registrarse o Entrar a mi cuenta/No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Abril 25, 2015, 03:09:15 PM #1 Ultima modificación: Abril 26, 2015, 02:25:33 AM por Gus Garsaky
Muy bueno, rollth. Te recomendaría que apliques otra capa de abstracción y separes el objeto Dinero del proceso y apliques el encapsulamiento (es muy importante).

Por cuestiones de seguridad e integridad de datos, nunca se debe acceder a las variables de un objeto directamente. Ésto puede tener problemas si accidentalmente se cambia (ya que es visible desde cualquier contexto), el resultado final puede variar mucho.

Se me ocurre también crear un método play(), que inicie y controle el juego y que además, sea recursivo para controlar posibles excepciones como NumberFormatException. Además, lanzaríamos un IllegalAccessException si se escoje un número fuera del rango 1 - 6 para poder reiniciar el juego.

Modificando algo tu code, quedaría así:

Código: java
public class Generator {
public static Integer generate() {
Random random = new Random(System.nanoTime());
return 1 + random.nextInt(6);
}
}


Código: java
public class Cash {
private Double quantity;

public Cash() {

}
public Cash(Double quantity) {
this.quantity = quantity;
}
public Double getQuantity() {
return quantity;
}
public void setQuantity(Double quantity) {
this.quantity = quantity;
}
}


Código: java

public class CashManager {
public static void increase(Cash cash, Double quantity) {
dinero.setQuantity(dinero.getQuantity() + quantity);
}
public static void decrease(Cash cash, Double quantity) {
dinero.setQuantity(dinero.getQuantity() - quantity);
}
}


Código: java

public class Machine {
private Cash cash;

        public setCash(Double amount) {
            cash = new Cash(amount);
public Double checkCash() {
return cash.getQuantity();
}
public void bet(Double betSize , int choosedNumber){
if(choosedNumber < 1) {
System.out.println("Elija un número válido");
return;
}
if(betSize < checkCash()) {
System.out.println("Solo dispone de: "checkCash());
return;
}
        int generatedNumber = Generator.generate();
        System.out.println("Su numero es: " + choosedNumber);
        System.out.println("El numero que ha salido en el dado es: " + generatedNumber);
        (generatedNumber == choosedNumber) ? win(betSize) : lose(betSize);
    }
    public void play() {
    try {
    System.out.println("*** EMPIEZA EL JUEGO... ***\n\n"):
    while(checkCash() > 0) {
System.out.print("\nElija su número (1 al 6): ");
Integer number = reader.nextInt();
if(number < 0 || number > 6) {
throw new IllegalAccessException("Elija un número entre 1 y 6!");
}
System.out.print("\nIngrese el monto de apuesta: ");
Double betSize = reader.nextDouble();
bet(betSize, number);
}
} catch(NumberFormatException e) {
System.out.println("\nDebe ingresar un número");
play(); // volvemos a pedir número, (método recursivo)
} catch(IllegalAccessException e2) {
System.out.println(e.getMessage());
play();
}
    }
    private void win(Double betSize) {
    System.out.println("!HA GANADO¡");
        DineroManager.increase(cash, betSize * 6);
    }
    private void lose(Double betSize) {
    System.out.println("Ha perdido...");
        DineroManager.decrease(cash, betSize);
    }
}


Código: java

public class Main {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
System.out.print("Ingrese el monto inicial: ");
Double amount = reader.nextDouble();
Machine machine = new Machine();
machine.setCash(amount);
machine.play();
}
}


Un saludo.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Muy bueno, rollth. Te recomendaría que apliques otra capa de abstracción y separes el objeto Dinero del proceso y apliques el encapsulamiento (es muy importante).

Por cuestiones de seguridad e integridad de datos, nunca se debe acceder a las variables de un objeto directamente. Ésto puede tener problemas si accidentalmente se cambia (ya que es visible desde cualquier contexto), el resultado final puede variar mucho.

Se me ocurre también crear un método play(), que inicie y controle el juego y que además, sea recursivo para controlar posibles excepciones como NumberFormatException. Además, lanzaríamos un IllegalAccessException si se escoje un número fuera del rango 1 - 6 para poder reiniciar el juego.

Modificando algo tu code, quedaría así:

Código: java
public class Generator {
public static Integer generate() {
Random random = new Random(System.nanoTime());
return 1 + random.nextInt(6);
}
}


Código: java
public class Cash {
private Double quantity;

public Cash() {

}
public Cash(Double quantity) {
this.quantity = quantity;
}
public Double getQuantity() {
return quantity;
}
public void setQuantity(Double quantity) {
this.quantity = quantity;
}
}


Código: java

public class CashManager {
public static void increase(Cash cash, Double quantity) {
dinero.setQuantity(dinero.getQuantity() + quantity);
}
public static void decrease(Cash cash, Double quantity) {
dinero.setQuantity(dinero.getQuantity() - quantity);
}
}


Código: java

public class Machine {
private Cash cash;

public Double checkCash() {
return cash.getQuantity();
}
public void bet(Double betSize , int choosedNumber){
if(choosedNumber < 1) {
System.out.println("Elija un número válido");
return;
}
if(betSize < checkCash()) {
System.out.println("Solo dispone de: "checkCash());
return;
}
        int generatedNumber = Generator.generate();
        System.out.println("Su numero es: " + choosedNumber);
        System.out.println("El numero que ha salido en el dado es: " + generatedNumber);
        (generatedNumber == choosedNumber) ? win(betSize) : lose(betSize);
    }
    public void play() {
    try {
    System.out.println("*** EMPIEZA EL JUEGO... ***\n\n"):
    while(checkCash() > 0) {
System.out.print("\nElija su número (1 al 6): ");
Integer number = reader.nextInt();
if(number < 0 || number > 6) {
throw new IllegalAccessException("Elija un número entre 1 y 6!");
}
System.out.print("\nIngrese el monto de apuesta: ");
Double betSize = reader.nextDouble();
bet(betSize, number);
}
} catch(NumberFormatException e) {
System.out.println("\nDebe ingresar un número");
play(); // volvemos a pedir número, (método recursivo)
} catch(IllegalAccessException e2) {
System.out.println(e.getMessage());
play();
}
    }
    private void win(Double betSize) {
    System.out.println("!HA GANADO¡");
        DineroManager.increase(cash, betSize * 6);
    }
    private void lose(Double betSize) {
    System.out.println("Ha perdido...");
        DineroManager.decrease(cash, betSize);
    }
}


Código: java

public class Main {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
System.out.print("Ingrese el monto inicial: ");
Double ammount = reader.nextDouble();
Machine machine = new Machine();
machine.setCash(ammount);
machine.play();
}
}


Un saludo.

Muchas gracias por las  sugerencias, me vienen muy bien ahora que estoy estudiando java, las tendre en cuenta para proximas ocasiones.
RollthBuen hacker mejor No tienes permitido ver los links. Registrarse o Entrar a mi cuenta/No tienes permitido ver los links. Registrarse o Entrar a mi cuenta