EL CÓDIGO DE MASTERMIND

En este documento pretendo explicar y resaltar algunas partes del código para su mejor comprensión, ya que, aún en el mismo lenguaje, cada persona programa a su manera.

1.-El programa

-Datos de interés:

Sobre todo, mi mayor obsesión al crear el juego, ha sido controlar TODOS los fallos posibles. Seguramente haya dejado mil errores sin solucionar, pero todos los que he visto lo he arreglado a mi manera.

Con el manejo del ratón, comentar que cuando saltábamos de menú en menú, al paso de uno a otro, si coincidía la posición del puntero con una opción del siguiente menú, la ejecutaba, pues en no daba tiempo a que el estado del ratón cambiara a “botón sin pulsar”. La manera de arreglarlo fue que antes de pasar al siguiente menú, se ejecutara un bucle que se repitiera hasta que el botón no pasara a modo “sin pulsar”.

También me mosqueó mucho el hecho de que mientras se ejecutaba cualquier acción o presentación, si pulsabas una o varias teclas y después si te pedía por ejemplo, introducir un nick, las teclas anteriormente pulsadas se mostraban el la entrada de nick.

El problema lo solucioné llamando a dos interrupciones del teclado, una para leer el estado del buffer y borrarlo, la otra para lo contrario. El único problema fue que llamando a estas dos funciones a mi interés, solo me servia para desactivar una pulsación, pero no varias. El problema lo solucioné con un bucle while(kbhit())…

Otro dato a resaltar es que el código ocupa más de 64 k y por ese motivo está fraccionado en varios ficheros. Además usa el modelo largue de memoria.

-Ficheros:

Corre en modo gráfico durante todo el juego. Usa el driver VGAHI 640x480 16 colores.

Al ejecutar el juego y registrar un jugador, se creará jugadore.dat. Este fichero binario contendrá los jugadores registrados en el juego.

En el momento que juguemos una partida, se creará combinac.dat. Este fichero binario contendrá las combinaciones aleatorias creadas por el ordenador.

Al término de la partida también se creará Historia.dat. Este fichero binario contendrá los datos de la partida finalizada.

Si modificamos la configuración del juego, se creará config.dat. Este fichero contendrá la configuración modificada y se cargará cada vez que arranquemos el juego.

Si guardamos una partida sin acabar se creará medias.dat. Este fichero binario contendrá todos los datos necesarios para guardar la partida. TODOS.

-Estructuras:

  • t_raton: El uso será para manejar los datos del ratón (posición y estado).
  • t_usuario: El uso será para manejar los datos del usuario.
  • t_configuracion: El uso será para manejar la configuración del juego.
  • t_historial: El uso será para manejar los datos de cada partida finalizada.
  • t_sinfinal: El uso será para guardar y cargar las partidas a medias.

-Variables globales:

Se puede observar que hay variables como int colores y char col o int pivotes y char piv. La razón de estas es que en modo gráfico no se pueden mostrar nada más que cadenas, por eso convierto los enteros en cadenas de esta forma.

-Declaración de funciones:

He tratado de desmenuzar el código en pequeñas funciones para así controlar cada paso en que se mueve el programa y poder detectar los posibles errores.

-El juego:

Como he comentado anteriormente, el juego corre en modo gráfico y el uso del ratón está restringido a los menús solamente.

El nick del jugador debe tener entre 2 y 15 caracteres y la clave entre 5 y 10.

No puede haber dos jugadores con el mismo nick, pero sí con la misma clave.

Si un jugador es borrado del fichero jugadores.dat, se borrará también de la lista de mejores puntuaciones. Y el nick del jugador borrado podrá ser utilizado por otro jugador.

Hay tres tipos de jugadores; Novatos, SuperUsuarios, Maestro.

Solo habrá un Maestro cuando alcance los 1000 puntos.

Para ser SuperUsuario hay que alcanzar los 500 puntos.

Un Maestro puede borrar cualquier usuario, un SuperUsuario puede borrar a cualquier Novato.

Cualquier tipo de jugador puede borrarse así mismo.

En el menú Historial se podrá consultar las partidas jugadas por un usuario.

2.-Funciones:

Aquí mencionaré algunos datos de interés de algunas funciones.

-Main():

Mientras que carga la presentación, si presionamos algunas teclas, uso el filtro del teclado anteriormente comentado:

while(kbhit()) //si se han pulsado teclas mientras la presentación las anula
	{
	quitateclado();
	ponteclado();
	}

Después de volver de un menú esperamos a que el ratón se actualice con:

while(raton.estado!=0) raton=posraton();// esperamos a que el ratón est‚ en _BX=0

-cargar_configuracion():

Esta función abrirá (si existe) el fichero con la última configuración modificada.

Si el fichero no existe la configuración será la que viene por defecto en el juego.

-grabar_configuracion():

Esta función grabará la configuración del juego (si se modifica) en el fichero config.dat.

-altas():

Se encarga de dar de alta un usuario.

-bajas():

Se encarga de dar de baja un usuario, siempre y cuando el jugador que quiere dar de baja a otro tiene poder para hacerlo.

-modificaciones():

Se encarga de modificar un usuario.

-consultas():

Esta función mostrará los datos del usuario introducido por teclado.

Jugar():

Quizás la función más importante, pués es la que maneja la parte más difícil tanto de gráficos como de algoritmos.

Explico a continuación los pasos que contiene:

  • Abre el fichero jugadores, sino está creado muestra un mensaje y retorna.
  • Lee el fichero, sin no hay jugadores registrados muestra un mensaje y retorna.
  • Lee nick y lo busca en el fichero, sino lo encuentra muestra un mensaje y retorna.
  • Lee clave y comprueba que pertenece a ese nick. Sino es así, muestra un mensaje y retorna.
  • Guarda la posición de registro del usuario para después poder machacarlo al sumar puntos.
  • Se llama a la función que abre y busca, en el fichero medias.dat , si hay alguna partida a medias de ese jugador, si lo encuentra mostrará un mensaje y la respuesta será lo que devuelva esa función SI=0 NO=1.

Nota: Ahora hay dos vertientes A) jugar nueva partida B) cargar y jugar partida guardada.

A) Jugar nueva partida:
  • Ponemos variables a 0.
  • Se llama a la función que dibuje la pantalla del juego.
  • Se llama a la función que busca y guarda una combinación aleatoria.
  • Se muestran los datos del jugador en pantalla.
  • Si configuramos más de 6 colores en juego, ahora los pinta en su lugar (indicativos).
  • Colocamos la combinación secreta en pantalla.
  • Comienza la rutina de juego, vamos rellenando de color a los círculos (pivotes).
  • En este punto si presionamos ESC podemos salir guardando la partida si queremos.
  • Si salimos sin guardar, borramos pantalla, cerramos fichero y retornamos sin guardar nada.
  • Si salimos guardando, llamamos a la función guardar partida.
  • Compara cada tirada con la jugada maestra, sino acertaste nada lo muestra con mensaje.
  • Si se gana, se pierde o se acaba la partida, muestra en pantalla la jugada maestra (con colores).
  • Si se ha ganado, suma puntos y actualiza el registro del fichero.
  • Después de cada partida acabada, la guarda en el fichero historial.dat y se pregunta si se desea seguir jugando.
  • Si es SI, volvemos al punto inicial. Si es NO cierra fichero y retorna.
B) Cargar y jugar partida guardada:
  • Llamamos a la función cargar partida del jugador en cuestión.
  • Puede haber varias partidas a medias guardadas, pero siempre cargará la más antigua.
  • Recuperamos las variables y datos necesarios para continuar la partida y restauramos dichas variables en el juego.
  • Rellena las jugadas anteriores pintando los círculos necesarios.
  • Nos coloca en posición para continuar la partida y vuelve al juego para terminar la partida.

Ficheros

Master fuente:

  • altabaj.c 09/06/2003 (5.431 bytes)
  • clave.c 09/06/2003 (3.118 bytes)
  • master.c 10/06/2003 (62.535 bytes)
  • menus.c 09/06/2003 (4.567 bytes)
  • nick.c 09/06/2003 (1.307 bytes)
  • sobre el código.doc 10/06/2003 (36.352 bytes)
  • egavga.obj 18/03/2000 (5.658 bytes)
  • mastermi.prj 10/06/2003 (5.506 bytes)

Master ejecutable:

  • mastermi.exe 10/06/2003 (138.060 bytes)
  • instalar.bat 02/03/2003 (1.062 bytes)
  • manual.htm 29/05/2003 (598 bytes)
  • mastermind.htm 29/05/2003 (523 bytes)
  • proyecto__mastermind.htm 02/06/2003 (10.358 bytes)
  • dibujo.gif 29/05/2003 (2.542 bytes)
  • prelude1.mid 03/02/2001 (10.435 bytes)

Descarga