GianLucaSpagnolo / TP-Algo3-2023C2

TP Final de Algoritmos y Programación 3 | Solitario ♠️♥️♣️♦️ (Version 1.0.1)
2 stars 0 forks source link

Planificacion de la Inicializacion del Juego #3

Closed GianLucaSpagnolo closed 1 year ago

GianLucaSpagnolo commented 1 year ago

Buenas noches! Nos ha surgido una duda al implementar la inicializacion del juego. A continuacion esta nuestra clase Klondike que contiene la mesa del juego, la cual dispone de las columnas y los mazos correspondientes:

public class Klondike implements Reglas {
    private Mesa mesa;

    public Klondike() {
        ArrayList<Palos> palos = new ArrayList<>();
        palos.add(Palos.PICAS);
        palos.add(Palos.TREBOLES);
        palos.add(Palos.CORAZONES);
        palos.add(Palos.DIAMANTES);
        Mazo mazo = new Mazo(52, palos);
        mazo.mezclar();

        Mesa nuevaMesa = new Mesa(mazo);
        nuevaMesa.inicializarColumnasMesa(7, new ColumnaKlondike());
        nuevaMesa.inicializarColumnasFinales(4, new ColumnaKlondike());
        nuevaMesa.crearBarajaDescarte();
        this.mesa = nuevaMesa;
    }

Nuestra semilla aleatoria se basa en un mezclado aleatorio de la baraja de cartas para que esta sea repartida en cada columna como lo dispone, en este caso, las reglas del klondike. De esta forma, la clase Klondike dispone de todos los metodos necesarios para realizar las verificaciones y los movimientos correspondientes (aunque no son definitivos, ya que podemos modularizarlos para mejorar la apariencia del codigo) pero nuestra consulta proviene en el momento de querer inicializar un juego en un estado particular. Con esta implementacion, seria tan facil como enviar (via un setter) una instancia de mesa con su respectivas barajas y columnas con cartas. Pero, que tan recomendable es esto pensando para la etapa 2 del tp? Es valido o existiria una forma mas conveniente para aprovechar la persistencia usando nuestra querida clase Mesa?

Captura de pantalla (894)

Y otra pregunta: en esta Etapa 1 tenemos que programar la logica de la ejecucion del juego via las reglas determinadas? (no la interfaz). O con tener la logica base de las reglas y del modelo de datos es suficiente?

salluzziluca commented 1 year ago

Buenass, ahi elevo la duda porque lo de poder "inicializar en un estado en particular" a mi tambien me hacia ruido. Por otro lado tenia 2 comentarios:

  1. Por que crear un arrayList para luego llenarlo con los 4 valores del enum Palos? No convendría directamente usar el enum?
  2. Lo bueno de la semilla aleatoria es que cada vez que vos le pases la misma semilla, vas a obtener el mismo solitario (repartido igual). Esto es practico sobre todo a la hora de testear
GianLucaSpagnolo commented 1 year ago

Con respecto al uso del enum, no lo teniamos visto asi, por lo que ya lo modificamos para que quede mas practico. Y sobre el mezclado del mazo, nosotros lo habiamos planteado como una funcion de mezclado aleatorio:

    public void mezclar() {
        ArrayList<Carta> auxiliar = new ArrayList<>();
        while (!baraja.empty()) {
            auxiliar.add(sacarCarta());
        }
        Random generador = new Random();
        int cantidad = auxiliar.size();
        for (int i = 0; i < cantidad; i++) {
            int indice = generador.nextInt(0, cantidad - i);
            agregarCarta(auxiliar.get(indice));
            auxiliar.remove(indice);
        }
    }

No teniamos en consideracion una semilla aleatoria, pero este metodo como la creacion correcta del mazo (con las cartas que queremos) se pudieron testear automaticamente, y el mezclado es efectivo. Sin embargo, pensandolo con la semilla podemos imaginar que el testeo de la clase Klondike (con el armado de la mesa y el mazo determinado) se puede volver mil veces mas sencillo si sabes cuales cartas hay, por lo que vamos a ver en modificarlo.

Estaremos atento para ver que onda con la inicializacion del juego 👀 y tambien: hasta que punto conlleva la etapa 1? incluyendo la ejecucion del juego tambien o solo con los modelos de datos y la logica base de las reglas??

salluzziluca commented 1 year ago

En la etapa1 debe estar implementada la lógica completa de un solitario. Debe ser "casi" jugable (digo casi porque no les estamos pidiendo que se pueda jugar por consola, sino que cuando lleguen a la etapa 3 solo tengan que enlazar la parte visual con la logica que ya tienen, modificando el codigo pero no teniendo que agregar nada super nuevo). En otras palabras, tienen que hacer tambien la ejecución del juego

GianLucaSpagnolo commented 1 year ago

Genial buenisimo! No tenemos mas dudas por el momento, pero dejo el Issue abierto para ver que onda con la inicializacion del juego en un estado particular

salluzziluca commented 1 year ago

No me respondio ninguno de los 3 profes pero maca me dijo que vendria a ser pasarle como parametro el estado actual del solitario. Es decir, las diferentes pilas/stacks de cartas. Me cierra que sea por ahi. Cualquier cosa les aviso