# 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
}
}
```