Algoritmos utilizados - JoseAndres216/ProyectoI-DatosParty GitHub Wiki
Durante el desarollo de la solución del problema, se implementaron diferentes algorimos, a continuación se describen los más importantes:
Generacion de las fases:
Para la generación de las fases, se utilizó el método llamado generatePhase en la clase "Phase", el cual recibe como parámetros la cantidad de casillas de cada color que habrá que insertar a la lista, el método consiste de un while, dentro del cual se genera un número random con un valor entre 0 y 3 y mediante un switch se determina la casilla a insertar, además se lleva un control de la cantidad restante de casillas de cada color. La condición de parada de while es cuando ya no hayan casillas restantes por insertar a la fase. Un detalle importante a considerar es el hecho de que la lista de la fase ("phaseList") no siempre será el mismo tipo de lista, sin embargo, mediante el polimorfismo se logró tratar a todas las diferentes listas como una misma. El método es de tipo void, pues toda la generación se realiza dentro de la referencia de la lista, la cual es previamente inicializada en el constructor de la clase.
Generación del tablero:
Al implementar la generación del tablero, fue importante la implementación de la estrategia "divide and conquer", al separar el problema en sub problemas, el primero fue determinar la forma del tablero, para ello, se diseñó un prototipo de tablero, con la cantidad justa de casillas, así como la posición que ocuparía cada una en el mismo, además se determinó un número que identifica a cada casilla, el cual es fundamental para demás partes del juego, las cuales se explicarán más adelante, el prototipo final es el siguiente:

Luego se implementó el siguiente algoritmo, para generar el tablero principal, este está divido en dos métodos en la clase Table, el primero, getRandomBox(), retorna una casilla de color aleatorio.
Con respecto al método generateTable(), está encargado de generar el tablero principal (el cual es una fase, con la diferencia de que la lista se le da vacía y se llena mediante este método y no el "generatePhase", pues tiene consideraciones especiales) que como se aprecia en el prototipo presentado anteriormente, cuenta con 36 casillas, teniendo en consideración especial, las posiciones 2, 11 y 20, pues en ellas, se debe insertar una casilla de tipo intersección, la cual permite desviarse en el tablero a través de las fases. En las demás posiciones se insertará una casilla random, con el metodo getRandomBox(), anteriormente explicado.
Finalmente, se realiza la configuración de las fases ya inicializadas anteriormente, dandole a cada fase la instrucción de generar sus respectivas listas, pasando como parámetros la candidad y color de las casillas correspondientes. Además de la asignación de un "exit point", que corresponde al número de la casilla en la cual el camino de la fase se intersecciona con el tablero principal, este número se determinó mediante el prototipo del tablero de juego. Es importante como se configura la fase D con un boolean con valor true, esto porque la fase D debe ser identificada como una fase independiente y ya que no tiene conexión con el tablero principal, por eso el valor de -1 en el "exit point".

Representación gráfica del tablero:
Para la representación gráfica del tablero se decidió realizar un bosquejo inicial en Excel, en un principio solo se utilizó como una ayuda para comprender el funcionamiento del juego, sin embargo luego pasó a representar una referencia del tablero generado dentro del juego, esto debido a que se decidió implementar la variable excelId en la clase Box a partir de los numeros que poseían las casillas en el documento de Excel.
A partir de la creación de este excelId se indexaron las casillas a la hora de dibujarlas en la ventana de juego según el orden dictado por el documento de Excel.
Luego de esto fue un simple pero minucioso trabajo de calculos de los ejes X y Y del canvas de la ventana para lograr la correcta representación gráfica del tablero (código en la imagen anterior).
Busqueda de posibles caminos en el tablero:
El algoritmo encargado de determinar se llama calcPossibleMoves, que recibe como parametros el resultado del lanzamiento de los dados. Este recorre el tablero a partir de la posición actual del jugador, encontrando los posibles caminos, el resultado de este método es una lista simple, con referencias de las casillas a las cuales se puede avanzar, esta lista sería usada por la clase IOmanagaer, la cual determina la elección del usuario. Se deberá tomar en consideración en que fase se encuentra actualmente, y se divide a grandes rasgos en 3 posibilidades, las fases A, B y C, el tablero principal y la fase D, pues en cada una de ellas hay casos especiales que tomar en cuenta, como la cantidad de casillas disponibles para avanzar en la fase (en el caso de las fases A, B o C) y el manejo de la llegada al final de las listas en la fase D o el tablero principal, ya que ambas son listas circulares.

Metodología de minijuegos:
La metodología adoptada para el desarrollo de los minijuegos se basó en el uso un controller para el manejo de un archivo .fxml por minijuego, permitiendo así el uso de una interfáz gráfica diferente en cada minijuego.
A partir de esto se puede denotar una sequencia a grandes rasgos dentro de la codificación de cada controller, ya que es posible apreciar la existencia de métodos con un mismo objetivo en cada clase controller.
Llegado a este punto, cabe mencionar que se procuró el desarrollo de minijuegos basados en la suerte y la interacción repetitiva con una tecla por juegador, por lo que resulta comprensible que todos los minijuegos siguieran la misma sequencia a nivel interno.
Inicialmente cada minijuego es llamado mediante su método play(), que se encarga de establecer la lista de jugadores que participarán en el minijuego, luego de esto cada minijuego posee un método que se encarga de realizar acciones específicas para cada minijuego (este no entra dentro de la sequencia mencionada), tales como asignaciones de variables, declaraciones de métodos para el funcionamiento de botones, etc.
Posterior a ello los jugadores pueden jugar por turnos, y cada vez que un juegador juega se llama a un método isNextplayer() que se encarga de verificar si queda algún jugador pendiente de jugar, si es así, entonces el jugador o jugadores restantes podrán efectuar su turno, de lo contrario (si ya no faltan jugadores por jugar), se efectúa el método finishGame(), encargado de recopilar los datos de variables modificadas durante el turno de cada jugador y evaluar las decisiones para posteriormente asignar puntos de 1 a 4 para cada jugador, siendo 4 la máxima puntucion y la opción que permitirá al jugador ganar mas monedas.