You are on page 1of 11

Licenciatura en Arte Digital

Fundamentos de Programacin
Otoo 2013
Proyecto Final
PAC-MAN

FECHA DE ENTREGA:
Mircoles 8 de enero de 2014

Fundamentos de Programacin 2
Proyecto Final

Objetivo:
Desarrollar un programa en C++ que simule el funcionamiento del juego Pacman (Namco,
1980), con las siguientes restricciones:
El programa ser una aplicacin de consola Win-32, el mapa y los personajes sern
representados con caracteres de texto.
Los fantasmas no perseguirn a pacman ni escaparn de l, se movern
aleatoriamente por el terreno.
El jugador pierde si es tocado por un fantasma, excepto si ha recogido una cpsula
de poder, en cuyo caso el jugador puede comer fantasmas por un tiempo
determinado.
El jugador gana si se come todos los puntos del tablero.
Requisitos:
Para desarrollar el programa se necesita los siguiente:
El archivo de encabezado consola.h utilizado en clase.
Dominio de todos los temas vistos en el curso.
Criterios de Evaluacin:
El proyecto vale el 30% de la calificacin final. Se utilizarn los siguientes criterios:
Porcentaje
5%
10%
15%

Descripcin
Asistencia a la cita programada para evaluar el proyecto
Funcionamiento del programa.
Evaluacin personal (Examen oral y prctica de programacin)

El equipo contar con 30 minutos para presentar el proyecto. Durante los primeros 5
minutos deber instalar y preparar su programa. Tendr 5 minutos para ejecutar y
demostrar el funcionamiento. Luego, cada integrante del equipo ser evaluado
personalmente con una sesin de preguntas de 5 minutos.

Fundamentos de Programacin 3
Proyecto Final

Instrucciones
El flujo del programa debe ser el siguiente:

Fundamentos de Programacin 4
Proyecto Final

Declaracin de Variables
Tanto Pacman como los fantasmas sern definidos con un nuevo tipo de variable llamado
Figura.
Este tipo de datos se definir como una estructura que contendr los siguientes datos:
Su posicin en el terreno (x, y).
El carcter que ser usado para dibujar la figura (WCHAR).
La velocidad a la que se mueve la figura (float).
El nmero de posiciones en el terreno que se calcula debera moverse (float).
La direccin en la que se mueve (ARRIBA, ABAJO, IZQUIERDA o DERECHA).
En main se deben declarar las siguientes variables:
Figura pacman;
Figura fantasmas[NUM_FANTASMAS];
bool encuentraPildora = false;
float tiempoTranscurrido = 0;
Donde NUM_FANTASMAS es una constante entera global que define cuntos fantasmas
estarn presentes en el terreno.
Deber definir globalmente una matriz de enteros,
int mapa[FILAS][COLUMNAS];
Donde FILAS y COLUMNAS son constantes enteras globales y definen el ancho y alto del
terreno.
Inicializacin
Pacman debe inicializarse al ser declarado utilizando una lista de inicializacin que
contenga:
Su posicin (x, y).
El carcter que lo representa en la pantalla (defina una constante global para
cambiar este carcter de ser necesario).
Su velocidad (tambin definida como una constante global).
El nmero de posiciones en cero.

Fundamentos de Programacin 5
Proyecto Final

Su direccin de movimiento (la direccin debe ser un valor de una enumeracin


definida globalmente que contenga los valores ARRIBA, ABAJO, IZQUIERDA y
DERECHA).

Para los fantasmas escriba una funcin para crearlos. El prototipo debe ser:
Figura CreaFantasma();
La funcin debe declarar una variable de tipo Figura y establecer su posicin (x, y) en el
punto de creacin de los fantasmas (definido por constantes globales), su velocidad como
un valor aleatorio entre un valor mnimo y mximo (definidos como constantes globales) y
el nmero de posiciones para moverse en cero.
En main deber crear cada uno de los fantasmas utilizando esta funcin y guardando cada
nuevo fantasma en el arreglo fantasmas.
La matriz de enteros llamada mapa debe inicializarse leyendo los datos de un archivo
externo. Este archivo debe contener el mismo nmero de lneas que el nmero de filas de
la matriz y el mismo nmero de valores por lnea que el nmero de columnas. Por
ejemplo, si la matriz es de 4 X 5 (4 filas, 5 columnas), el archivo contendr lo siguiente:
11111
10201
10001
11111
Donde cada nmero representa:
0 punto
1 - pared
2 - pldora
Defina una funcin que lea este archivo y guarde los valores en la matriz mapa. Su
prototipo debe ser:
void LeeArchivo();
Recuerde que la matriz mapa debe ser declarada globalmente, al igual que las constantes
que definen el nmero de filas y columnas de la matriz.

Fundamentos de Programacin 6
Proyecto Final

Defina tambin una constante de tipo string que defina el nombre del archivo que ser
ledo. Por ejemplo,
const string NOMBRE_ARCHIVO = mapa.txt;
La funcin debe:
Abrir el archivo NOMBRE_ARCHIVO y verificar que se pudo abrir. Si el archivo no se
puede leer el programa debe terminar inmediatamente.
Leer del archivo todos los valores y guardarlos en la matriz.
Cada vez que se lea un valor, imprimir en pantalla el carcter correspondiente
utilizando la funcin printConsole. Por ejemplo, si la variable i recorre las filas de la
matriz y la variable j recorre las columnas se hara lo siguiente:
if (mapa[i][j] == 1)
printConsole(PARED, j, i);
Donde PARED es una constante de tipo WCHAR que define el carcter que se
utiliza para imprimir las paredes. Debe definir tambin los caracteres para la
pldora y los puntos.

Colisiones
Escriba una funcin con este prototipo:
bool Come(Figura pacman, Figura fantasmas[], bool& encuentraPildora,
float& tiempoTranscurrido);
La funcin regresa true si el jugador puede seguir jugando o false si ya perdi (se lo comi
un fantasma).
La funcin debe hacer lo siguiente:
Revisar si en la posicin donde se encuentra pacman hay un punto en la matriz
mapa (si hay un 0), en ese caso, pacman se come el punto (se coloca un -1 en la
matriz). Una vez que se lo coma, se debe buscar en la matriz si no hay ms puntos,
si no los hay, quiere decir que el jugador gana, en este caso se debe imprimir el
mensaje de que gan el jugador y regresar false para impedir que siga jugando.

Fundamentos de Programacin 7
Proyecto Final

Revisar si en la posicin donde se encuentra pacman hay una pldora en la matriz


mapa (si hay un 2), en ese caso, pacman se come la pldora (se coloca un -1 en la
matriz) y la variable encuentraPildora se establece en true y la variable
tiempoTranscurrido en cero.
Revisar si la posicin de alguno de los fantasmas coincide con la posicin de
pacman, si es as, revisar si el efecto de la pldora est activo (recuerde que cuando
pacman se come la pldora, se puede comer a los fantasmas por un tiempo
determinado), si est activo, se debe destruir el fantasma, llamando a la funcin
CreaFantasma() para asignarle de nuevo la posicin de inicio a ese fantasma. En
caso de que no est activo y pacman choque con un fantasma, se debe notificar al
jugador que perdi y se debe regresar false para impedir que siga jugando.
Al final de la funcin regrese true.

Entrada del usuario


El jugador puede cambiar la direccin de pacman utilizando las flechas del teclado. Para
saber si un jugador presion una flecha utilice la funcin arrowPressed(), de esta forma,
int tecla = arrowPressed(false);
La variable tecla tendr uno de los siguientes valores: VK_UP, VK_DOWN, VK_LEFT,
VK_RIGHT o -1 si no se presion ninguna flecha.
Dependiendo de la tecla presionada se debe revisar si pacman puede cambiar de
direccin, es decir, si no hay una pared en esa direccin, si no hay pared entonces se
cambia la direccin, en caso contrario no se hace nada.
Actualiza Pacman
En cada iteracin del ciclo infinito se debe mover y dibujar a pacman.
Escriba una funcin con el siguiente prototipo,
void Mueve(Figura& figura);
Esta funcin debe:

Fundamentos de Programacin 8
Proyecto Final

Calcular el movimiento real de la figura, recuerde que estamos en un espacio


discreto pero el movimiento se calcula en un espacio continuo. El clculo se hace
de la siguiente manera,
// se calcula el cambio de posicin en el espacio contnuo
// que sucedi en el ltimo frame, MILISEGUNDOS es una constante global
// que define la tasa de refresco del juego, MILISEGUNDOS = 33
// recuerde que velocidad = distancia / tiempo, luego,
// distancia = velocidad * tiempo
figura.numeroPosiciones += figura.velocidad * (MILISEGUNDOS / 1000.0);
// se calcula el cambio de posicin en el espacio discreto de la pantalla
int movimiento = floor(figura.numeroPosiciones);
// si no hay movimiento perceptible en la pantalla se abandona la funcin
if (movimiento <= 0)
return;
else // si s lo hay, entonces se contina y se resta ese cambio a la variable global
figura.numeroPosiciones -= movimiento;
// se calcula la siguiente posicin
int x = figura.x;
int y = figura.y;
// dependiendo de la direccin en la que se mueve
switch (figura.direccion)
{
case ARRIBA: y -= movimiento; break;
case ABAJO: y += movimiento; break;
case IZQUIERDA: x -= movimiento; break;
case DERECHA: x += movimiento; break;
}

Se debe verificar si en la siguiente posicin no hay una pared, esto se puede hacer
preguntando si en la matriz mapa en la siguiente posicin hay un 1, en ese caso se
abandona la funcin y la figura no se mueve.

Fundamentos de Programacin 9
Proyecto Final

Si el movimiento es vlido, antes de cambiar la posicin se debe borrar la figura


que se dibuj en la posicin actual utilizando la funcin Borra(figura); (ver ms
adelante).
Despus de borrar la figura, se le asigna la nueva posicin a la figura.
La funcin Borra tiene el siguiente prototipo,
void Borra(Figura figura);
Esta funcin debe utilizar la funcin printConsole para dibujar un carcter en la posicin
de la figura. Normalmente, se dibujara un espacio en blanco para borrar la figura, por
ejemplo,
printConsole( , figura.x, figura.y);
Pero esto provocara que los fantasmas tambin se coman los puntos y las pldoras al
pasar encima de ellos, cuando solo pacman se los puede comer. Para solucionar esto, se
debe preguntar qu hay en la matriz mapa en esa posicin,
Si hay un 0 (punto), se debe imprimir un punto.
Si hay un 2 (pldora), se debe imprimir una pldora.
Si hay un -1 (nada), se debe imprimir un espacio en blanco.
Recuerde que cuando pacman pasa encima de un punto o una pldora se los come
(asignando un -1 a la matriz en esa posicin), por lo que solo pacman puede borrar los
puntos y las pldoras.
Dentro del ciclo infinito de main, despus de llamar a la funcin Mueve(pacman); se debe
dibujar a pacman, utilizando la funcin Dibuja(pacman); que tiene el siguiente prototipo,
void Dibuja(Figura figura);
Esta funcin simplemente dibuja el carcter de la figura en su posicin. Por ejemplo,
printConsole(figura.caracter, figura.x, figura.y);
Actualiza Fantasmas
Dentro del ciclo infinito se debe mover y dibujar a cada uno de los fantasmas del arreglo.

Fundamentos de Programacin 10
Proyecto Final

Defina una funcin con el siguiente prototipo,


void Decide(Figura& figura);
Esta funcin se encarga de definir el movimiento de los fantasmas y debe hacer lo
siguiente:

A partir de su posicin actual, el fantasma debe revisar cuntos caminos puede


tomar (ARRIBA, ABAJO, IZQUIERDA o DERECHA), sin tomar en cuenta el camino de
donde viene. Por ejemplo, si su direccin actual es ARRIBA, el camino de donde
viene est ABAJO.
Si no hay caminos, el fantasma debe regresar por donde viene, es decir su
direccin se debe invertir (ARRIBA ABAJO, IZQUIERDA DERECHA).
Si se encontraron caminos, se debe seleccionar uno de ellos de manera aleatoria
(recuerde que no se est tomando en cuenta el camino por donde viene, por lo
que el fantasma solo regresar por donde viene si no tiene otra opcin).
Seleccionar un camino significa cambiar la direccin del fantasma hacia ese
camino.

En main se debe hacer un ciclo para actualizar cada uno de los fantasmas,
for (int i = 0; i < NUM_FANTASMAS; i++)
{
Decide(fantasmas[i]);
Mueve(fantasmas[i]);
Dibuja(fantasmas[i]);
}
Actualiza juego
Adems de actualizar a pacman y los fantasmas, se debe procesar el tiempo que dura el
efecto de la pldora, para hacerlo, defina la siguiente funcin,
void EfectoPildora(bool& encuentraPildora, float& tiempoTranscurrido);
La cual se llamar solo si encuentraPildora es igual a true.

Fundamentos de Programacin 11
Proyecto Final

Dentro de la funcin, sume al tiempoTranscurrido el tiempo que ha pasado desde el


ltimo ciclo, esto es,
tiempoTranscurrido += MILISEGUNDOS / 1000.0;
Donde MILISEGUNDOS = 33, definida como constante global.
Defina otra constante global float llamada TIEMPO_PILDORA, que dir cuntos segundos
dura el efecto de la pldora.
Dentro de la funcin EfectoPildora(), despus de sumar el tiempo transcurrido pregunte si
tiempoTranscurrido >= TIEMPO_PILDORA, de ser as, el efecto de la pldora ha expirado y
la variable encuentraPildora se debe establecer en false y tiempoTranscurrido en cero.

Duerme
La ltima instruccin del ciclo infinito debe ser Sleep(MILISEGUNDOS); esto simula una
tasa de refresco de 30 cuadros por segundo (frames per second).

You might also like