# Trabajo Práctico del Taller de Programación Avanzada ## Introducción Durante el taller desarrollaremos un juego pensado para ser resuelto por medio de código Java, enfocado principalmente en puzzles o desafios por niveles. En las clases del taller se les proveerá de herramientas para poder realizarlo en Java, con las buenas prácticas que irán adquiriendo. ### Metodología de trabajo La realización del juego, tendrá tres etapas con sus respectivas entregas: | Fecha | Contenido de la entrega | |-------|----------------------------------------------------------------------------------------------------------------| | 01/10 | Diagrama de clases del modelo del juego, implementado y testeado (código) | | 29/10 | Posibilidad de interactuar con los elementos del juego en tiempo real en un entorno simulado, de forma gráfica | | 26/11 | Posibilidad de creación y carga de un segundo juego utilizando el mismo motor | > Se espera que las prácticas de programación sean buenas, y adecuadas al conocimiento adquirido en la materia. > Esto incluye evitar el código aglomerado, tener una buena interacción de clases, no duplicar funcionalidades, tener el código indentado y prolijo, entre otras. --- ## Mecánica del juego de puzzle Para guiarnos en el desarrollo de este juego (que en realidad es un generador de juegos) utilizaremos como base el [Adventures of Lolo](https://en.wikipedia.org/wiki/Adventures_of_Lolo) de NES (1989). Puede jugarse [aqui](https://www.retrogames.cz/play_276-NES.php). - Existirá un personaje (o más) controlable por el jugador mediante código fuente. - Existirán obstáculos inamovibles que impiden el paso al jugador y a los enemigos. - Existirán obstáculos movibles que pueden ser empujados para obstaculizar ataques o movimientos de enemigos, o incluso ser usados como puentes para permitir el paso. - Existirán enemigos de diversos tipos que complicarán la aventura. Estos pueden atacar o no, moverse o no, ser destruidos o no. - El objetivo de cada nivel es llegar a la salida. - Es posible que la salida esté cerrada, y para abrirla hubiera que recoger uno o más ítems. - El personaje puede recoger algún ítem que lo ayude en su tarea, para combatir a los enemigos. - Ninguna mecánica del juego puede depender del azar: un algoritmo que resuelva el puzzle debe funcionar siempre para ese mismo puzzle. Se pueden agregar mecánicas adicionales a consideración. Se sugiere presentarla ante los docentes antes de programarla, para evitar desarrollos muy largos o muy breves. ## Ejemplo de algoritmo ``` _ _ _ _ _ _ D P _ _ K _ _ _ ``` Siendo P el personaje, K la llave y D la puerta de salida, un algoritmo posible podría ser: ```java // Forma 1: public class MiPersonajeNivel1 extends PersonajeNivel1 { public Accion paso(Mapa mapa, ....) { if (getDerecha(this, mapa) == Cosa.VACIO) return Accion.MOVER_DERECHA; else return Accion.MOVER_ARRIBA; } } // Forma 2: public class MiPersonajeNivel1 extends PersonajeNivel1 { public MiPersonajeNivel1() { this.moverDerecha(); this.moverDerecha(); this.moverArriba(); this.moverDerecha(); this.moverDerecha(); this.moverDerecha(); this.moverDerecha(); } } public class Main() { public static void main(String[] args) { MiPersonajeNivel1 miPersonaje = new MiPersonajeNivel1(); Nivel nivel1 = new Nivel1(); nivel1.add(miPersonaje); nivel1.run(); // Se abre pantalla con resolución } } ```