Fandom

Scratchpad

Tron 2006

215,808pages on
this wiki
Add New Page
Discuss this page1 Share

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

Welcome to the Tron 2006 mini wiki at Scratchpad!

You can use the box below to create new pages for this mini-wiki. Make sure you type [[Category:Tron 2006]] on the page before you save it to make it part of the Tron 2006 wiki (preload can be enabled to automate this task, by clicking this link and saving that page. Afterwards, you may need to purge this page, if you still see this message).


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).

Image

Captura de pantalla del vídeojuego original de Tron

Image


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.

Image

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
borrar pantalla
imprimir línea de estado
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ú.

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:

Tarea Personas
Iniciar Adrian Pérez
Jugar Paco y José
nivel Marfil
configuración Manuel Maldonado y Federico Cabrera
Poner a cero Javier Mateos
Imprimir línea de estado Javier Mateos

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


9 de enero de 2007

Ya sabemos crear estructuras: Nuestro jugador tendrá la siguiente:

struct jugador{
   char nombre[21];
   int arriba;
   int abajo;
   int izquierda;
   int derecha;
   int color;
   int caracter;
   int victorias;
};

Yo creo que faltan algunas cosas como su posición, direccion y si sigue vivo pero eso es algo a discutir --Jmd 11:50, 9 January 2007 (UTC)


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.

\return descripción del valor devuelto (sólo en caso de que la 
función devuelva un valor por \c return)

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 derecha de la pantalla
\param[out] jugador2 El jugador a la izquierda 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 jugador2 a 
partir de la posición 4 de la pantalla seguido de dos espacios en
blanco y el número de victorias de jugador2.
Después, escribe en la primera línea de la pantalla el nombre del
jugador1 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 jugador1. 

\param[in] jugador1 El jugador a la derecha de la pantalla
\param[in] jugador2 El jugador a la izquierda 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 "cuatro" posiciones por segundo
Si es una (N) la velocidad de la estela se movera "seis" posiciones por segundo
Si es una (D) la velocidad de la estela se movera "ocho" posiciones por segundo

\param[out] nivel nivel de dificultad

void Nivel_dificultad(int &nivel);                                                    __MaRFiL__

configurar_juego

\brief Abre un submenú con las opciones de cada uno de los dos jugadores en el que 
aparecen las siguientes opciones y se puede configurar 'Cambiar nombre de jugador', 
'Configurar controles', 'Seleccionar color del jugador', 'Seleccionar carácter de la 
moto'.

Al llamar a la función se procederá a un borrado de pantalla, se hará una llamada a la 
función 'Imprimir_línea_de_estado' y se mostrará a contnuación un menú con las siguientes 
opciones de configuración que seguidamente serán explicadas:
1.Cambiar nombre de jugador
2.Configurar controles
3.Seleccionar color del jugador
4.Seleccionar carácter de la moto
0.Salir a menú principal

Cambiar nombre de jugador: En esta opción podremos cambiar el nombre de cada uno de los 
jugadores y se nos presentará un submenu en el que se podrá elegir el jugador al cual 
queremos cambiar el nombre (1.Jugador1, 2.Jugador2, 0.Salir al menú de configuración).

Configurar controles: Aquí podremos cambiar los controles de los jugadores. Primero se nos 
presentará un submenu para elegir el jugador al cual queremos cambiar los controles (como 
en la opción anterior) y a continuación, una vez elegido el jugador se nos dará la 
posibilidad de cambiar la tecla para realizar las acciones de juego (1.Arriba, 2.Abajo, 
3.Derecha, 4.Izquierda, 0.Salir al menú de configuración). En esta opción, además, se 
tendrá en cuenta que el carácter seleccionado para una acción no se esté usando para otra 
acción o para un movimiento del otro jugador para que no halla ambigüedad en las teclas.

Seleccionar color del jugador: Nos permitirá elegir un color para cada una de las motos. 
Ésta opción se detallará más adelante, ya que aun no disponemos del tipo de dato para el 
color de la moto y no sabemos cómo podríamos implementar esta parte.

Seleccionar carácter de la moto: Aquí podremos seleccionar un carácter cualquiera para 
cada una de las motos.

Salir a menú principal: Hace que termine la función y nos permite volver al menú principal 
haciendo un borrado de pantalla y llamando a las funciones de 'Imprimir_línea_de_estado' y 
mostrar el menú principal.

Para cada una de las funciones se mostrará un submenu en el cual se mostrará la cabecera 
de estado y un título de la opción y el jugador para el cual se vá a realizar la 
configuración en cada momento (Ej.- "Configuración de los Controles: Jugador1")

\param[in,out] jugador1 El jugador a la derecha de la pantalla de tipo jugador
\param[in,out] jugador2 El jugador a la izquierda de la pantalla de tipo jugador

void configurar_juego(jugador &jugador1, jugador &jugador2);

cambiar_nombre

\brief Nos dá la posibilidad de cambiar el nombre a cualquiera de ambos jugadores.

Al llamar a ésta función se procederá a hacer un borrado de pantalla, llamará a la función
Imprimir_linea_de_estado y a continuación se presentará un menú cuyo título será "Cambiar
nombre de los jugadores" y cuyas opciones serán:
 1.Cambiar nombre de Jugador1. (en lugar de jugador1 aparecerá el nombre de dicho jugador si
tiene otro nombre que no sea el que tiene por defecto).
 2.Cambiar nombre de Jugador2.
 3.Salir al menú de configuración.

Cambiar nombre de Jugador1/Jugador2: al seleccionar el jugador al que deseamos cambiar el nombre se hará
el "tradicional" borrado de pantalla y la llamada a imprimir línea de estado, se escribirá un
título "Cambiar nombre de jugador1" (o jugador2 o el nombre que tenga por el momento) y el programa
pedirá que se le introduzca un nuevo nombre o escriba exit/EXIT si desea cancelar y volver al menu
de configuración. Se introducirá el nombre y el módulo al pasarlo por referencia lo cambiará
en la función.

Salir al menú de configuración: Terminará el módulo cambiar_nombre y volverá al menú de configuración.

\param[in,out] jugador1 El jugador a la derecha de la pantalla de tipo jugador
\param[in,out] jugador2 El jugador a la derecha de la pantalla de tipo jugador

void cambiar_nombre(jugador &jugador1, jugador &jugador2);

configurar_controles

\brief  Nos permite cambiar los controles de cada jugador.

Al llamar a esta función se hará un borrado de pantalla, se ejecutará
Imprimir_linea_de_estado y se mostrará un menú llamado "Configurar Controles"
con las siguientes opciones:

    1.Controles de <nombre de jugador 1>.
    2.Controles de <nombre de jugador 2>.
    3.Controles Predeterminados.
    4.Volver a: Configuracion.

La opción 1 y 2 abrirá otro menú cuyas opciones son los controles existentes
(arriba, abajo, izquierda, derecha,  ó  girar a la izquierda, girar a la derecha, según acordemos)
y la opción "Volver a: Configurar Controles". Además, los controles
introducidos no se aceptarán si ya están configurados para otro control.
Si coinciden se le informará al usuario y volverá al menú "Controles de <jugador>".

La opción 3 ajustará los controles de la siguiente forma:
   -jugador 1: arriba, abajo, izquierda, derecha.
   -jugador 2: 'w','s','a','d'.

La opción 4 volverá al menú de Configuración.

\param[in,out] jugador1 El jugador a la derecha de la pantalla.
\param[in,out] jugador2 El jugador a la izquierda de la pantalla.

void configurar_controles(jugador &jugador1, jugador &jugador2);

Editado por Cristian Moreno.

seleccionar_color

el color es un entero. 

seleccionar_moto

\brief Nos permite cambiar el simbolo que representara
a cada moto.

Al llamar a esta función se hará un borrado de pantalla,
se ejecutará Imprimir_linea_de_estado y se mostrará un
menú llamado "Seleccionar Moto" con las siguientes opciones: 

    1.Moto de <nombre de jugador 1>.

    2.Moto de <nombre de jugador 2>. 

    3.Motos Predeterminadas. 

    4.Volver a: Configuración.



La opción 1 y 2 permitirá introducir el caracter que 
el jugador quiera.

La opción 3 seleccionara automaticamente las motos
de los dos jugadores de la siguiente forma:

    -jugador 1: '<'

    -jugador 2: '('

La opción 4 volverá al menú de Configuración.



\param[in,out] jugador1 El jugador a la derecha de
la pantalla.

\param[in,out] jugador2 El jugador a la izquierda de
la pantalla.

void seleccionar_moto(jugador &jugador1, jugador &jugador2);

                                             --Cristian Moreno--

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 lleve ventaja inicial sobre el otro.

Este modulo no tendra entrada de datos, sino que siempre se 
encargara de devolver la configuracion inicial del juego.

Valores iniciales:

Jugador 1 ;
   - nombre: jugador 1
   - teclas: arriba, abajo, derecha, izquierda
   - color: azul
   - caracter: '<'
   - victorias: 0

Jugador 2: 
   - nombre: jugador 2
   - teclas: 'w','s','a','d'
   - color: amarillo
   - caracter: '('
   - victorias: 0

nivel: medio

\param[out] jugador1 El jugador a la derecha de la pantalla
\param[out] jugador2 El jugador a la izquierda de la pantalla
\param[out] nivel nivel de dificultad del juego

void inicializacion_juego (jugador &jugador1, jugador &jugador2, int &nivel);

Jugar

\brief el modulo debe ser capaz de inicializar la posicion, definir
el area de juego, recrear los movimientos, guardar los movimientos,
mostrar el marcador y saber si continua vivo.

\param [in,out]  jugador1 jugador a la derecha de la pantalla
\param [in,out]  jugador2 jugador a la izquierda de la pantalla
\param [in]  nivel nivel de dificultad del juego
 
Primero se definirá el area de juego, dejando el espacio libre
para poder mostrar el marcador. Despues se inicializará la 
posicion para lo cual se podria conseguir generando dos 
numeros aleatorios que representarian la fila y la columna 
donde empieza.
De esta manera añadiriamos al juego un cierto factor suerte.

Una vez hecho esto se comenzaría a jugar. 
Primero se espera que el usuario introduzca una tecla que nos 
dirá la direccion en la que se moverá el usuario (podriamos 
usar en vez de cuatro teclas, solo dos que podrian ser girar
a la izquierda y girar a la derecha, si no se introduce 
ninguna tecla se supone que continua recto, y no tiene sentido 
volver para atras, ya que se chocaria consigo mismo). Despues se
mostrara por pantalla el movimiento, y al mismo tiempo se 
guardara para saber por donde a ido pasando el jugador. 
Por cada movimiento introducido por el jugador, se comprobara 
si continua vivo, esto es, si se a chocado con la estela del 
otro jugador, con los bordes, o consigo mismo. 

En el momento que uno de los dos jugadores gane, se mostrará 
un mensaje por pantalla diciendo que jugador ha ganado, se
actualizarán los marcadores y se le preguntará al usuario
si quiere volver a jugar, o si no, volverá al menu principal.



void Jugar(jugador &jugador1, jugador &jugador2, int nivel);

inicializar_posicion

\param [in] caracter definido por el usuario
\param [out] posicion en la que empieza el usuario

Se genererara una posicion aleatoria que definira un 
punto del area de juego en la empezara cada usuario.

definir_el_area_de_juego

Aparecera por pantalla un rectangulo que ocupara toda la pantalla. 
La fila superior se guardara para mostrar los marcadores y el 
nombre de los jugadores.

recrear_movimientos

\param [in,out] caracter definido por el usuario
\param [in] tecla que da la direccion
El modulo sera capaz de que una vez que el usuario le de a una tecla
aparecera por pantalla el movimiento reflejado.

guardar_movimientos

\param [in,out] matriz de posicion.
El módulo será capaz de guardar los movimientos realizados por los
jugadores y asi saber si ha pasado por una posición o no lo ha hecho.

continua_vivo

Comprobara en todo momento si los jugadores continuan vivos o no.
Es decir, si se han chocado consigo mismo, con el otro o con los 
margenes del terreno de juego.

mostrar_marcador

\param [in] puntos_anteriores
\param [out] puntos_actuales
El modulo sera capaz de almacenar el marcador anterior y una vez 
terminado sumara uno al marcador del ganador.



para

\brief Realiza una parada de \a milisegundos ms. 

\p para realiza una pausa de \a milisegundos milisegundos.
La rutina no es especialmente precisa, pudiendo pasarse algún milisegundo
dependiendo de la velocidad del procesador y del tiempo que necesite para
ejecutarse la rutina \p clock().

\param [in] milisegundos número de milisegundos a parar
\pre \a milisegundos >=0

void para(int milisegundos);


leetecla()

\brief lee una tecla del teclado

Lee una de las teclas del teclado. Si la tecla es una letra, devuelve la mayúscula. 
Si es una tecla alfanumérica o signo de puntuación, devuelve su código ASCII,
como lo devuelve \p getch(). Si es una tecla especial devuelve 1000 + el valor
devuelto por \p getch().

\return Si la tecla es una letra, devuelve la mayúscula. Si es una tecla 
alfanumérica o signo de puntuación, devuelve su código ASCII,
como lo devuelve \p getch(). Si es una tecla especial devuelve 1000 + el valor
devuelto por \p getch().

\see getch, http://conio.sourceforge.net/, http://decsai/~jmd/docencia.html (programa getch_codes)

int leetecla();


muestra_caracter

\brief escribe un caracter en una posición de la pantalla física.

\p muestra_caracter escribe el caracter \a car en la posicion (\a y,\a x) 
de la pantalla física. 
Hay que tener en cuenta que las coordenadas de la pantalla fisica 
empiezan en el (1,1).

\param [in] x coordenada x de la pantalla
\param [in] y coordenada y de la pantalla
\param [in] car carácter a escribir en la pantalla
\param [in] attr atributos de color del carácter: color_fondo*16 + color_frente

\see gotoxy, textattr, COLORS, http://conio.sourceforge.net/

void muestra_caracter(int x, int y, char car, int attr);

Also on Fandom

Random wikia