# Informe Trabajo Práctico 2 JuegoDeLaVida 2.0 #### Grupo Life Compiler | Integrantes | Padrón | | ----------- | ------ | | Julián Morales | 106999 | | Zoilo Pazos | 107740 | | Tapia Francisco | 107128 | | Villarinos Luca | 104975 | ## Objetivo Realizar una aplicación que lleve adelante la ejecución del juego de la vida en un tablero tipo cubo definido por usuario, de n filas por m columnas por l planos, a partir de una configuración inicial de células vivas inidcadas por el usuario. Adicionalmente a la versión desarrollada en el TP1 se agregan funcionalidades al juego: * Posibilidad de elegir la dificultad del juego * Comportamientos de las celdas del juego que modifican la dificultad del juego ## Herramientas usadas Para la realización de la estructura de trabajo como equipo en primera instancia desarrollamos el código en el lenguaje C++. Por cuestiones de compilador incorporado al IDE, utilizamos VSCode. De todas formas todo lo que desarrollamos en este IDE también lo probamos en Eclipse con los flags correspondientes. Para sincronizar el trabajo y tener un repositorio en común decidimos utilizar Github. Con el fin de evitar perdidas de memoria en el código utilizamos Valgrind. Nos resultó de gran utilidad ya que en algunos casos no eramos conscientes de que estabamos dejando leaks de memoria. A pesar de esto, detecta dos bloques de perdidas de memoria que se deben a la función remove(). Estas creemos que no son realmente perdidas, pero la verificación de esto escapa de nuestras manos. ## Estructura Para la realización del código decidimos establecer y usar clases para simular el comportamiento real de los distintos objetos que interactúan en el juego. Por esa razón establecimos las clases Nodo, ListaDoblementeEnlazada, Celula, Celda, Tablero, JuegoDeLaVida, Configuraciones. La división fundamental que planteamos es que todas las clases funcionan como contenedores de información en su generalidad. En cambio, la clase JuegoDeLaVida contiene en sus métodos las funciones para orquestrar el funcionamiento del juego. A continuación una breve descripción de los aspectos importantes a tener en cuenta para el desarrollo de las clases: * **Nodo**: Como decidimos hacer una lista doblemente enlazada la clase Nodo con diferencia a la ofrecida en el Github de la cátedra también tiene un atributo puntero anterior. Esta implementada en forma de template. * **ListaDoblementeEnlazadaCircular**: Para el fácil acceso a los vecinos de las células decidimos que los mejor sería una lista doblemente enlazada y circular ya que permite moverse sobre ella en ambas direcciones. A través de la sobrecarga de el operador indexación [] logramos que el acceso a las vecinas de una célula sea mucho mas rapido que O(n), sino que si se accede a la misma lista con la diferencia en 1 es O(1). El método esta implementado como un template. * **Tablero**: El tablero tiene la funcionalidad de formar una estructura tridimensional simulada a traves de la anidación de objetos de lista y establece el tipo de dato contenido como una celda. Tiene los métodos para obtener una celda y para mostrar a través de capas por la terminal el estado de las células del juego y las estadísticas. * **JuegoDeLaVida**: Contiene instancias de el resto de Clases desarrolladas, fundamentalmente sincroniza los turnos y la lógica de vida o muerte. Además contiene la lógica de como se pasan los genes y como los comportamientos de las celdas afectan al juego. Tiene un método particular que a traves del módulo EasyBMP muestra el estado del juego y las estadísticas en tantos archivos como capas hayan en el juego y una adicional para las estadísticas. * **Configuraciones**: Esta clase tiene la funcionalidad de ser reutilizable (del modo que esta implementada no lo es, pero con algunos cambios podría serlo) ya que su función principal es la gestión de distintas dificultades y la carga de estas a través de archivos. La dificultad del juego se define a través de un Struct Dificultad que solo contiene datos.