El Tesoro de MonteCristo
El Tesoro de MonteCristo
por Baltasar
1. Introducción
Este es un juego de los de género conversacional. Al jugador se le presenta una
situación mediante un texto descriptivo, a la vez que él mismo da órdenes como
texto. Las más comunes son moverse al norte, sur, este y oeste, pero en este juego
se permitirán también empujar y coger, para poder empujar y coger los objetos que
haya en una determinada sala. Las órdenes serán de una sola palabra, y en cada
sala no habrá más de un objeto.
2. El tesoro de MonteCristo
Todos aquellos que conozcan la obra de Alejandro Dumas, llamada “El Conde de
MoteCristo”, sabrán que Edmundo Dantés se fugó de manera espectacular del
Castillo de If, yendo a parar con el tiempo a la isla desierta de MonteCristo, donde
debÃa encontrar el tesoro de la familia del cardenal Spada.
El objetivo de este juego es encontrar dicho tesoro en la isla. El jugador
empieza en la localidad número 0, y el objetivo es llegar hasta la localidad 6
portando el tesoro. Las únicas dificultades son las rocas que hay que empujar en
las localidades 2 y 4, y la llave, que es necesario portar para abrir la puerta
descubierta en la localidad 4.
3. Acciones
El juego entiende un conjunto limitado de acciones a realizar por parte del jugador,
que se representan mediante el siguiente enumerado.
/** Representa una accion */typedef enum _Accion {Conexion, Fin, Inventario, Coge, Empuja, SinAccion} Accion;
AsÃ, si ha hecho o intentado hacer cualquier movimiento, la acción del juego
es Conexion, y asà sucesivamente.
• Conexion: Se ha realizado un movimento, correcto o no.
• Fin: Termina el juego.
• Inventario: Visualiza los objetos portados por el jugador.
• Coge: El jugador pasa a tener en su poder el objeto en la localidad actual.
Sólo puede haber un objeto en cada localidad.
• Empuja: El jugador empuja el objeto en la localidad actual.
• SinAccion: No ha sido posible reconocer ninguna acción permitida en la
cadena de entrada del jugador.
4. Movimientos
El juego entiende un conjunto limitado de movimientos a realizar por parte del
jugador, que se representan mediante el siguiente enumerado.
/** Representa el movimiento */typedef enum _Movimiento {Norte, Sur, Este, Oeste, SinMovimiento} Movimiento;const char StrMovimiento[][10] = {"Norte", "Sur", "Este", "Oeste"};
Sólo es posible moverse en cuatro direcciones: norte (adelante), sur(atrás),
este(derecha) y oeste(izquierda). La razón de que los movimientos se representen
de esta manera (mediante los puntos cardinales) es histórica: los primeros juegos
lo hacÃan asÃ, y todos los juegos posteriores la mantuvieron.
El vector de cadenas StrMovimiento permitirá visualizar un movimiento dado
en cualquier momento que se precise (por ejemplo, para visualizar las salidas).
5. Localidades
Las localidades se representan mediante una estructura, y el conjunto de
localidades se carga desde un archivo de texto en un vector. El formato de dicho
archivo se explica en la práctica de esta unidad didáctica.
/** Representa localidades */typedef struct _Localidad {char nombre[MaxNombre];char desc[MaxDesc];int conexiones[MaxConexiones];} Localidad;
La descripción de cada campo es la siguiente:
• nombre: El nombre de la localidad.
• desc: La descripción de la localidad.
• conexiones: Un pequeño vector de cuatro posiciones para indicar a donde
es necesario mover el jugador cuando se mueva en dicha dirección. El Ãndice
del vector es la dirección, y el contenido el destino. Por ejemplo,
conexiones[ Norte ] contiene el número de localidad al que se dirigirá el
jugador en caso de tomar esa dirección, o -1 si con ese movimiento no hay
salida.
6. Objetos
Los objetos se representan mediante una estructura, y el conjunto de objetos se
carga desde un archivo de texto en un vector.
/** Representa objetos */typedef struct _Objeto {char nombre[MaxNombre];char desc[MaxDesc];int numLoc;bool empujable;bool cogible;bool cogido;bool empujado;} Objeto;
La descripción de cada campo es la siguiente:
• nombre: El nombre del objeto.
• desc: La descripción de objeto.
• numLoc: La localidad en la que se encuentre el objeto, o -1 si es que está
fuera del juego.
• empujable: Si el objeto debe responder a la acción empuja.
• cogible: Si el objeto debe responder a la acción coge.
• cogido: Si el objeto ha sido cogido y lo tiene el jugador.
• empujado: Si el objeto ya ha sido empujado.
7. Funciones
Las funciones más importantes en el juego son las siguientes:
unsigned int cargaLocalidades(const char fichero[], Localidad locs[]);
• Carga las localidades de un archivo de texto
• fichero El fichero del que cargar las localidades
• locs El vector de localidades a rellenar
• El num. de localidades cargadas.
unsigned int cargaObjetos(const char fichero[], Objeto objs[]);
• Carga los objetos de un archivo de texto con un formato dado
• fichero El fichero del que cargar los objetos
• locs El vector de objetos a rellenar
• El num. de objetos cargados.
void pideEntrada(char entrada[]);
• Pide una orden al jugador.
Movimiento extraeMovimiento(const char entrada[]);
• Busca un movimiento en la entrada del jugador
• El movimiento, si lo hay, SinMovimiento en otro caso
Accion extraeAccion(const char entrada[]);
• Busca una accion en la entrada del jugador
• La accion, si lo hay, SinAccion en otro caso
int tomaMovimiento(Localidad locs[], unsigned int numLoc, Movimiento mov);
• Devuelve la loc segun la conexion dada por mov en una loc
• locs El vector de localidades
• numLoc El num. de la loc
• mov El movimiento a comprobar.
• El indice de la loc de destino, o -1 si no hay.
void hazDesc(Localidad locs[], Objeto objs[], unsigned int numObjs, unsigned int
numLoc);
• Muestra por pantalla la desc. de una localidad
• locs El vector de localidades
• objs El vector de objetos
• numObjs El total de objetos
• numLoc El num. de localidad a describir.
Accion hazAccion(Localidad locs[], Objeto objs[], unsigned int numLocs, unsigned int
numObjs, unsigned int numLoc, Accion accion);
• Comprueba la acc. a llevar a cabo y muestra por pantalla el
resultado.
• locs El vector de localidades
• objs El vector de objetos
• numLocs El total de locs
• numObjs El total de objetos
• La misma accion pasado si fue exitosa, SinAccion en otro caso.
Accion hazRespuesta(Localidad locs[], Objeto objs[], unsigned int numLocs, unsigned
int numObjs, unsigned int numLoc, Accion accion);
• Muestra por pantalla una respuesta detallada a la accion
realizada. Debe ser llamada tras hazAccion().
• locs El vector de localidades
• objs El vector de objetos
• numLocs El total de locs
• numObjs El total de objetos
• accion La nueva accion (solo para terminar la aventura)
void listaObjetos(Objeto objs[], unsigned int numObjs, int numLoc);
• Lista por pantalla los objetos presentes en la localidad actual.
• objs El vector de objetos
• numObjs El total de objetos
• numLoc La localidad en la que buscar objetos.
void listaSalidas(Localidad locs[], unsigned int numLoc);
• Lista por pantalla las salidas disponibles.
• locs El vector de localidades
• numLoc La localidad actual.
int buscaObjEnLoc(Objeto objs[], unsigned int numObjs, unsigned int numLoc);
• Busca un objeto por su localidad
• objs El vector de objetos
• numObjs El num. total de objetos
• numLoc El num. de localidad donde puede haber un obj.
• El num. de objeto si encontrado, -1 en otro caso.
int buscaObj(Objeto objs[], unsigned int numObjs, const char nombre[]);
• Busca un objeto por su nombre
• objs El vector de objetos
• numObjs El num. total de objetos
• nombre El nombre del objeto
• El num. de objeto si encontrado, -1 en otro caso.
void hazPresentacion();
• Informa al jugador
8. Para saber más...
Referencias bibliográficas:
1. Kernighan & Ritchie (1995). Lenguaje de Programacion C. Prentice Hall.
ISBN 978-9688802052
• Referencias web:
1. Club de aventuras AD:
â—¦ http://www.caad.es/
2. Wikipedia:
â—¦ http://es.wikipedia.org/wiki/Aventura_conversacional
â—¦ http://es.wikipedia.org/wiki/C_(lenguaje_de_programaci%C3%B3n)
3. Estándar Internacional ISO/IEC 9899:TC3:
â—¦ http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf