Probáblemente ya todos conozcan este juego.
Es una variante de los juegos de tablero de alinear 3 piezas (como el Bejeweled)
Pueden encontrar una descripción más amplia acá
La idea es que tenemos un tablero con dulces y debemos realizar movimientos para alinear al menos 3 iguales. Al hacerlo explotarán y desaparecerán.
El movimiento es de intercambio de dos dulces, pero solo los contiguos a: izquierda, derecha, arriba o abajo.
Luego hay más complejidades como que aparecen caramelos especiales, obstáculos, y muchas otras cosas, pero que no nos interesan a nosotros, a fín de simplificar un poco nuestro juego.
En el juego se van completando y pasando de niveles a través de un "caminito" como en la imagen:
La idea del TP es hacer una pequeña aplicación para construir un juego o mundo.
En nuestra variante un mundo es algo así como un mapa que consta de los niveles conectados. Fíjense que el camino no tiene bifurcaciones, es decir cada Nivel tiene un solo nivel posterior y anterior.
Como variante vamos a decir que nuestro "mundo" además de los niveles tendrá un nombre. Así uno podría crear diferentes mundos o juegos ejecutando varias veces el programa (y en un futuro teniendo alguna forma de guardar los mundos de alguna forma -archivos, base de datos, etc-).
Un nivel tiene un nombre también (a modo de simplificar pueden acotar esto a un string de 20 caracteres). Además, tiene las dimesiones del tablero (cantidad de filas y columnas).
Para pasar un nivel el jugador tiene que alcanzar un número mínimo de puntos, con lo cual el usuario de nuestra aplicacion para crear mundos y niveles, también deberá especificar este parámetro al momento de crear un nivel.
Además, solo tiene una máxima cantidad de movimientos que puede hacer. Esto también es parte de la configuración del nivel.
Objetivos
Por otro lado, los niveles pueden tener (o no) objetivos. Un objetivo es algo que el jugador debe hacer para poder pasar el nivel (además de conseguir la cantidad de puntos).
Para simplificar vamos a implementar un único tipo de objetivo. Entonces para nosotros acá vemos algunos ejemplos de Objetivos:
Donde la idea es que el usuario tiene que realizar al menos esa cantidad de explosiones de ese color.
Cuando el jugador completa el objetivo, éste le otorga puntos extra. Esa cantidad se define, y depende de cada objetivo.
Entonces el administrador debe además poder especificar todos los objetivos que quiera.
De acá se desprende que un Objetivo tiene dos datos:
Realizar un programa que permita (de la forma más simple, sin complicarse la vida) crear un mundo, especificando cada nivel. Y por cada nivel todos sus datos y objetivos.
No es necesario implementar la interfaz de usuario. Es decir que no hace falta escribir código que lea o escriba por consola.
De hecho, NO ESTA BIEN que mezclen la lógica de crear mundos, agregarle un nivel, etc. con código que lee o escribe de consola.
Para probarlo vamos a hacer aplicaciones de ejemplo en código que figuran más abajo en el enunciado.
Además de crear un mundo y agregarle niveles (a los que a su vez se le pueden agregar objetivos), se deberá poder destruir los mundos, con la consecuencia de eliminar también sus niveles y objetivos.
Es importante separar las aplicaciones de ejemplo de las funciones del dominio (todas las que sirvan para crear/eliminar mundo, niveles y objetivos).
NO ESTA BIEN que las aplicaciones de ejemplo tenga lógica más que llamar a las funciones con los parámetros propios (ej nombre del mundo, de los niveles, dimensiones, etc.)
Mundo Chocolatoso
Mundo Goma