Código fuente C y C++

En esta sección iremos incluyendo ficheros fuente, de algunos problemas que nos hemos ido encontrando. Rebuscaremos en nuestras bibliotecas, e intentaremos incluir todo aquello que pueda ser de utilidad o que tenga alguna característica didáctica.

También incluímos aquí algunos programas que los colaboradores han ido enviándonos.

Intentaremos que los programas o funciones estén lo mejor documentadas posible, y explicaremos la necesidad que hizo surgir cada programa y la utilidad que pueda tener, así como sus limitaciones y fallos.

Temas:

Los programas y enlaces están clasificados por temas, elige el tema que prefieras de la lista siguiente:

Tema actual: Juegos

Mastermind (2003-06-14)

Autor: Andrés Pérez (Platero)

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.

Detalles:

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)

Fichero: masterfuente.zip
Tamaño: 30496 bytes

Número de descargas: 18305

Fichero 2: masterejecutable.zip
Tamaño: 84306 bytes

Número de descargas: 14377

El ahorcado (2003-06-14)

Autor: Andrés Pérez (Platero)

El ahorcado en modo texto. Para compiladores Borland.

Nota del Webmaster: Se hace uso de funciones de conio y de macros como "randomize" y "random", así como de la función "sleep". Pero es fácilmente adaptable a otros compiladores.

Detalles:

  • Ahorcado.c 06/05/2003 (31.241 bytes)
  • palabras.dat 06/05/2004 (2.050 bytes)
  • instalar.bat 10/06/2003 (1.057 bytes)
  • desinstalar.bat 06/05/2003 (928 bytes)

Fichero: ahorcado.zip
Tamaño: 7209 bytes

Número de descargas: 35225

Invaders (2002-08-12)

Autor: José Antonio Llopis

Este es el famoso juego "Invaders".

Está hecho basado en BGI, por lo tanto es necesario un compilador de Borland para DOS.

Detalles:

  • INVA12.CPP 12/8/2002 (41.062 bytes)

Fichero: INVA12.zip
Tamaño: 7362 bytes

Número de descargas: 18733

Aleatorio (2002-03-04)

Autor: Carlos Fernando Valarezo Loaiza

Este es el juego del número aleatorio, desarrollado en DEV-C++ en entorno windows.

Gracias, contactos, preguntas, sugerencias a cfervl@yahoo.com, soy Carlos valarezo Loaiza, Diviertanse.

Detalles:

  • Define.h: 04/03/2002 (239 bytes)
  • Numeros.cpp: 04/03/2002 (9.134 bytes)
  • Aleatorio.dev: 09/02/2003 (958 bytes)
  • Timon.ico: 30/01/1999 (2.238 bytes)
  • Manual.inf: 04/03/2002 (499 bytes)
  • Rsrc.rc: 09/02/2003 (129 bytes)

Fichero: aleatorio.zip
Tamaño: 5900 bytes

Número de descargas: 17815

Pac-man (sin terminar) (2001-08-13)

Autor: Eddie Morocho Tinoco

"Éste es un juego no terminado, pues como no sé cómo insertar gráficos, utilice esos gráficos tan feos de TC, bueno, este juego puede servir para aprender un pequeña noción de como programar un juego.... cualquier comentario a mis dudas o sugerencias escribanme"

Detalles:

  • pacman.cpp: 13/08/2001 (46.648 bytes)

Fichero: pacman.zip
Tamaño: 6761 bytes

Número de descargas: 11588

Animales (2000-08-27)

Autor: Salvador Pozo

Clásico juego de Animal, vegetal, mineral; aunque sólo con animales. El jugador debe pensar en un animal, el programa irá haciendo preguntas hasta que lo adivine o se le acaben las preguntas. Lo interesante es que el programa "aprende". Si el animal que el jugador está pensando no está en la base de datos, el programa hará preguntas al jugador para poder añadirlo. De este modo, el programa se convertirá poco a poco en un pequeño experto, (en animales). En esta técnica se basan los programas expertos que ayudan a buscar averías en sistemas complejos, acotando con sus preguntas las posibles causas. Aunque estos programas son mucho más complejos, la idea básica es la misma.

Este programa ilustra el uso de árboles binarios, memoria dinámica y el acceso a ficheros de texto.

Inicialmente el programa es un completo ignorante. No se suministra ninguna base de datos de conocimiento, por lo que el futuro usuario será el responsable de enseñarle. Es fácil cambiar el tema del juego, en lugar de animales pueden ser vegetales, minerales, equipos de fútbol, amigos... Basta con cambiar los literales de los diálogos y el primer elemento de la base de datos.

Este programa está disponible en dos versiones, una C, y otra C++.

Detalles:

  • animal.c: 20/08/2000 (11.078 bytes)
  • animal.cpp: 27/08/2000 (13.204 bytes)

Fichero: animal.zip
Tamaño: 21212 bytes

Número de descargas: 7686

Criptogramas (2000-08-10)

Autor: Salvador Pozo Coronado

En el siguiente juego se trata de resolver problemas de encriptado de textos. El juego propone un pequeño fragmento de texto, previamente encriptado con el sencillo método de sustituir cada letra por otra, el jugador debe recuperar el texto original, adivinando las correspondencias entre caracteres. El entorno gráfico ayuda a una resolución fácil del problema.

Los textos para el juego se extraen de una DLL de recursos, no hay muchos, se tarda mucho más en escribir estos textos que en el propio programa, con el tiempo proporcionaré librerias de recursos actualizadas, con más textos.

Creo que este programa es un buen ejemplo de la utilización de recursos en DLL, hay una biblioteca dinámica de texto, y otra de gráficos. De hecho, hice este programa hace cuatro años para entrenarme en el uso de DLL de recursos, y las he usado a partir de entonces para hacer versiones multilingües de mis aplicaciones.

Detalles:

Modo de jugar

Existe una pequeña ayuda incluida en el cuadro "Sobre" del juego.

Fichero: fuente_cripto.zip
Tamaño: 135493 bytes

Número de descargas: 12684

Fichero 2: ejecutable_cripto.zip
Tamaño: 58585 bytes

Número de descargas: 9860

Barquitos (2000-06-19)

Autor: Salvador Pozo Coronado

Para empezar el clásico juego de los barquitos, en versión Windows. El juego no es gran cosa, al menos como entretenimiento, pero me ha proporcionado varios pequeños retos a nivel de programación. Pido disculpas, ya que no me ha salido muy listo, pero si no le buscas complicaciones te ganará tres o cuatro veces de cada diez, (al menos a mi me gana).

Si alguien está interesado podemos investigar e implementar métodos para aumentar su inteligencia, agregando nuevas habilidades de análisis, y personalizando estrategias para el estilo de juego de cada jugador, el límite aún está muy lejos.

También se podrían inventar nuevas reglas, de modo que pasaríamos al juego de los barquitos "versión 2". Podríamos aumentar el tamaño del tablero, incluir islas, o bombas con mayor radio de acción, distintos grados de "tocados", etc.

Detalles:

Modo de juego

Pulsar el botón de "Nuevo" para comenzar una partida, el programa te preguntará si quieres colocar tus barcos. Si quieres cambiar la posición de los barcos, pulsa "si".

Para cambiar la posición de un barco pínchalo con el botón izquierdo del ratón y arrástralo a la posición que quieras, si algún sector del barco está rojo es porque la posición no está permitida, los barcos nunca pueden tocarse. Para rotar un barco pulsa el botón derecho del ratón. Para mover algún barco es posible que tengas que mover antes otros.

Una vez que tengas los barcos colocados pulsa "Comenzar" para empezar a jugar. El turno se elegirá aleatoriamente. Cuando un jugador toque un barco podrá volver a tirar.

Para interrumpir la partida, pulsa "Detener", para salir, "Salir".

Fichero: fuente_barquitos.zip
Tamaño: 35656 bytes

Número de descargas: 25020

Fichero 2: ejecutable_barquitos.zip
Tamaño: 111016 bytes

Número de descargas: 18677



suministrado por FreeFind
Valid HTML 4.0! Valid CSS!