Tron 2006

=TRON: Un proyecto de juego en MP1=

Esta página está destinada a alumnos de la asignatura Metodología de la Programación I de la Ingeniería Técnica en Informática de Sistemas de la Universidad de Granada.

Como parte de esta asignatura pretendemos crear el juego "Tron", basado en la escena de las carreras de "Motos de luz" de la película Tron(Disney, 1982).

http://decsai.ugr.es/~jmd/imagenes/top-geek-tron.jpg

Captura de pantalla del vídeojuego original de Tron

http://upload.wikimedia.org/wikipedia/en/thumb/9/94/Tron_Video_Game._Lightcycles.png/150px-Tron_Video_Game._Lightcycles.png

La forma de jugar es simple:

Dos jugadores parten desde puntos distintos de la pantalla montando sus "motos de luz", unas motos que van dejando un rastro de luz, a modo de muro, a su paso. Conforme van avanzando ese rastro va formando líneas en la pantalla. El objetivo es no chocar contra esas líneas ni contra los límites del tablero de juego.

Nosotros queremos crear algo menos sofisticado. Aquí os dejo una captura de la pantalla de mi versión básica.

http://decsai.ugr.es/~jmd/imagenes/tron_registros.png

El código fuente tiene 359 líneas de las 118 son comentarios, 69 están en blanco y sólo 172 son de código real. Mi diseño incluyó nueve funciones, de las que tres son instrumentales, es decir, no resuelven el problema realmente sino que tratan problemas "estéticos" como son parar la ejecución durante X milisegundos (para que el juego no vaya excesivamente rápido), leer una tecla (incluyendo cursores, escape, etc.) o escribir un carácter en una posición dada de la pantalla. Para el manejo de la pantalla usé la biblioteca conio2 por su sencillez y comodidad.

Os dejo el ejecutable, por si queréis jugar un rato. Es una versión para dos jugadores: El izquierdo juega con las teclas W, A, D, X y el derecho con los cursores.

22 de noviembre de 2006
Decidimos qué queremos hacer:


 * El juego permitirá jugar varias veces (hasta que decidamos salir). Puesto que es un juego para 2 jugadores llevaremos un contador de victorias de cada jugador.
 * Se permitirá configurar las siguientes opciones:
 * Nivel de juego (a mayor nivel mayor velocidad a la que se mueven las motos).
 * Nombre de cada jugador.
 * Teclas para cada jugador.
 * Carácter para la moto de cada jugador.
 * Color de la moto de cada jugador.

24 de noviembre de 2006
Discutimos sobre la descripción básica del programa (algoritmo) llegando a la siguiente estructura:


 * Iniciar información del juego
 * do
 * Presentar un menú con las siguientes opciones:
 * 1. Jugar
 * 2. Nivel de dificultad
 * 3. Configurar juego
 * 4. Poner marcadores a 0
 * 0. Salir
 * Elegir una opción
 * Dependiendo de la opción elegida
 * 1. Jugar al juego
 * 2. Ajustar el nivel de dificultad
 * 3. Configurar las opciones del juego
 * 4. Reiniciar el número de victorias de ambos jugadores
 * 0. salir = true
 * while (!salir)

Comentamos sobre la pantalla:

En la primera línea de la pantalla siempre pondremos los nombres de ambos jugadores y su número de victorias. Incluso en la pantalla del menú. ¡¡Atención!! Se nos ha olvidado borrar pantalla y esta tarea (imprimir línea de estado) en nuestro algoritmo. Deben incorporase tras el do y antes de presentar el menú.

Discutimos sobre la información a guardar para cada jugador llegando a la siguiente conclusión:
 * nombre
 * teclas (arriba, abajo, izquierda y derecha)
 * color
 * carácter
 * victorias

Recordad que tenemos un tipo de dato jugador y otro pantalla. Podremos decir que jugador1 es de tipo jugador y manejar atributos como el "color de jugador1". Véase un ejemplo en la especificación de la tarea imprimir línea de estado.

Asignamos la especificación de las tareas a diferentes equipos:

Estos equipos añadirán las especificaciones antes del martes 28 de noviembre para que todos podamos estudiarlas y discutirlas el miércoles 29 de noviembre

Especificación de las tareas
Si podéis usad este formato:

nombre_del_modulo
\brief descripción breve de que hace el módulo Una descripción larga de los pasos y objetivos del módulo. Esta descripción debe ser lo suficientemente clara como para que cualquier otra persona sea capaz de especificar las tareas que componen el módulo o implementar el mismo basándose en esta descripción. \param[in] nombre descripción de un parámetro de entrada \param[out] nombre descripción de un parámetro de salida \param[in|out] nombre descripción de un parámetro de entrada/salida.

Poner_a_cero_marcadores
\brief Pone a cero las victorias de ambos jugadores Pone a cero el campo victorias de jugador1 y de jugador2 \param[out] jugador1 El jugador a la izquierda de la pantalla \param[out] jugador2 El jugador a la derecha de la pantalla void Poner_a_cero_marcadores(jugador &jugador1, jugador &jugador2);

Imprimir_línea_de_estado
\brief escribe un línea con los nombres de los jugadores y el número de victorias de cada uno Escribe en la primera línea de la pantalla el nombre del jugador1 a partir de la posición 4 de la pantalla seguido de dos espacios en blanco y el número de victorias de jugador1. Después, escribe en la primera línea de la pantalla el nombre del jugador2 de forma que quede a 8 espacios del borde derecho de la pantalla, seguido de dos espacios en blanco y el número de victorias de jugador2. \param[in] jugador1 El jugador a la izquierda de la pantalla \param[in] jugador2 El jugador a la derecha de la pantalla void Imprimir_línea_de_estado(jugador jugador1, jugador jugador2);

Nivel_dificultad
\brief Selecciona el nivel de dificultad Imprime un menú con las opciones (F)==>facil, (N)==>normal y (D)==>dificil y recibe una tecla: Si es una (F) la velocidad de la estela se movera dos posiciones por segundo Si es una (N) la velocidad de la estela se movera cuatro posiciones por segundo Si es una (D) la velocidad de la estela se movera seis posiciones por segundo \param[out] jugador1 El jugador a la izquierda de la pantalla \param[out] jugador2 El jugador a la derecha de la pantalla void Nivel_dificultad(jugador &jugador1, jugador &jugador2);

inicialización del juego
\brief asigna los atributos iniciales del juego Este modulo se ocupará de condicionar algunos atributos iniciales del juego,de modo que cuando iniciemos una partida nueva lo tengamos configurado y listo para poder jugar.Los atributos que tratara de cubrir son aquellos que se refieren a los jugadores,que son:nombre,teclas,color,caracter,victorias y nivel de dificultad. El nivel de dificultad debera ser igual para ambos jugadores, evitando asi que ninguno yeve ventaja inicial sobre el otro, y debera poder ademas modificarse dentro de la opcion del menu "nivel de dificultad".Tambien los atributos iniciales nombre,teclas,color y caracter podran ser modificados siempre que se quiera desde la opcion "configuracion del juego". Este modulo no tendra entrada de datos, sino que siempre se encargara de de dar por salida la configuracion inicial del juego. \param[out] jugador 1: -nombre:jugador 1 -teclas: arriba,abajo,derecha,izquierda -color:azul -caracter:'<' -victorias:0 -nivel de dificultad:medio \param[out] jugador 2: -nombre:jugador 2 -teclas:'w','s','a','d'             -color:amarillo -caracter:'('             -victorias:0              -nivel de dificultad:medio