Videojuego de Pacman en leguaje C.
Bueno, hoy les presento un pequeño proyecto que desarrollé en Algoritmia y Programación Estructurada en mi universidad (ESCOM). Este proyecto final* consistía en desarrollar un videojuego que asemejara al clásico juego de Pacman. La finalidad de la asignatura es basarnos en el estándar ANSI C, no depender de hardware (Utilizar los recursos mínimos) ni software (Esta enfocado a S. O.´s).
Pero lamentablemente hay librerias especiales de cada Sistema Operativo por el cual no se pudo seguir el estandar xD, en el caso de este código presentado en este apartado será para Windows (XP, Vista y 7) y próximamente publicare uno para S.O. basados en Unix (Linux y Mac OS).
En la siguiente imagen se muestra como esta visualmente configurada la interfaz del videojuego, ejecutado desde consola

El código que se detalla a continuación trata básicamente de la construcción de una matriz en la que se basará el videojuego, y todos los efectos visuales se deberán al digito que se encuentre en cada atributo de la matriz. En el código ya vienen unas partes comentadas para una mejor comprensión, pero en caso de que tengan duda pueden dejar su comentario.
/*
*AUTOR: Rogelio Maldonado Zárate (C) Diciembre 2010
*VERSIÓN: 2.5
*
*DESCRIPCIÓN: Programa del juego de PacMan.
*
*COMPILACIÓN: gcc pacman.c -o pacman
*EJECUCIÓN: pacman (Windows)
*/
#include<stdio .h>
#include<windows .h>
void Movimientos_Phantom( int *phx, int *phy);
void Muestra_Escenario_PacMan();
void Reconstruye_Escenario();
void Movimientos_PacMan();
void Grafix(int x,int y);
void Super_PacMan();
void Dead_PacMan();
void Dead_Ghost();
void Menu_Final();
void Graficos();
void Counter();
void Score();
void gotoxy( short x, short y );
char Escenario_Estandar[19][50]={
'o',9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,'p',
8,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,8,
8,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,1,8,
8,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,1,8,
8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,
8,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,8,
8,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,8,
8,5,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,5,0,0,1,1,1,1,1,1,0,0,5,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,5,8,
'a',0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,'x',2,2,'w',1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,'a',
2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,'z','s','s','z',1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
'b',0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,6,'r','r',7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,'b',
8,5,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,5,8,
8,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,8,
8,1,1,1,0,1,0,0,0,0,1,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,1,1,8,
8,0,0,1,0,1,0,0,1,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,1,1,1,1,0,0,1,0,1,0,0,8,
8,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,0,5,1,1,1,1,0,0,0,0,1,1,1,1,5,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,8,
8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,8,
8,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,8,
'n',9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,'m'};
char Escenario[19][50]={0};
int i,j,p,q,Tecla,score,up,opcionFinal;
int v,w,phx1,phy1,phx2,phy2,force;
int main(void)
{
Menu_Inicial:
Inicio_Juego:
system("cls");
system("color 9f");
Reconstruye_Escenario();
Muestra_Escenario_PacMan();
Reinicio_Juego:
score=0,up=3;
Score();
q=27,p=15,i=11,j=24;//Condiciones iniciales del Pacman.
v=3,w=4;//referencia con respecto al plano.
phx1=1,phy1=1,phx2=48,phy2=17;//Condiciones iniciales de los fantasmas.
gotoxy(q,p);
putchar('C');
gotoxy(phx1+v,phy1+w);
putchar(258);
gotoxy(phx2+v,phy2+w);
putchar(258);
Movimientos_PacMan();
if(score==440||up==0){
Menu_Final();
switch(opcionFinal){
case 1: goto Inicio_Juego;
break;
case 2: goto Menu_Inicial;
break;
}
}
}
void Muestra_Escenario_PacMan(){//Función que nos permite imprimir el tablero.
short k=4;
for(i=0;i0){
Tecla=getch();
if(Tecla==72){
while((!kbhit())&&((Escenario[i-1][j]==1)||(Escenario[i-1][j]==2)||(Escenario[i-1][j]==5))){
i-=1,p-=1;
gotoxy(q,p+1),putchar(' ');
gotoxy(q,p),putchar('C');
Movimientos_Phantom(&phx1,&phy1);
Movimientos_Phantom(&phx2,&phy2);
Super_PacMan();
Sleep(155);
Counter();
Dead_PacMan();
Score();
}//Movimiento Pacman Arriba.
}
if(Tecla==80){
while((!kbhit())&&((Escenario[i+1][j]==1)||(Escenario[i+1][j]==2)||(Escenario[i+1][j]==5))){
i+=1,p+=1;
gotoxy(q,p-1),putchar(' ');
gotoxy(q,p),putchar('C');
Movimientos_Phantom(&phx1,&phy1);
Movimientos_Phantom(&phx2,&phy2);
Super_PacMan();
Sleep(155);
Counter();
Dead_PacMan();
Score();
}//Movimiento Pacman Abajo.
}
if(Tecla==77){
while((!kbhit())&&((Escenario[i][j+1]==1)||(Escenario[i][j+1]==2)||(Escenario[i][j+1]==5))){
j+=1,q+=1;
gotoxy(q-1,p),putchar(' ');
gotoxy(q,p),putchar('C');
Movimientos_Phantom(&phx1,&phy1);
Movimientos_Phantom(&phx2,&phy2);
Super_PacMan();
Sleep(155);
if(i==9&&j==49){
gotoxy(q,p),putchar(' ');
j=0,q=3;
gotoxy(q,p),putchar('C');
}
Counter();
Dead_PacMan();
Score();
}//Movimiento Pacman Der.
}
if(Tecla==75){
while((!kbhit())&&((Escenario[i][j-1]==1)||(Escenario[i][j-1]==2)||(Escenario[i][j-1]==5))){
j-=1,q-=1;
gotoxy(q+1,p),putchar(' ');
gotoxy(q,p),putchar('C');
Movimientos_Phantom(&phx1,&phy1);
Movimientos_Phantom(&phx2,&phy2);
Super_PacMan();
Sleep(155);
if(i==9&&j==0){
gotoxy(q,p),putchar(' ');
j=49,q=52;
gotoxy(q,p),putchar('C');
}
Counter();
Dead_PacMan();
Score();
}//Movimiento Pacman Izq.
}
}
return;
}
void Movimientos_Phantom( int *phx, int *phy){
if(force==0){//Depredadores.
if(((*phx+v)q)&&((Escenario[*phy][*phx-1]==1)||(Escenario[*phy][*phx-1]==2)||(Escenario[*phy][*phx-1]==5))){
gotoxy(*phx+v,*phy+w);
Grafix(*phx,*phy);
*phx-=1;
gotoxy(*phx+v,*phy+w),putchar(258);
}//Movimiento Phantom Der.
if(((*phy+w)>p)&&((Escenario[*phy-1][*phx]==1)||(Escenario[*phy-1][*phx]==2)||(Escenario[*phy-1][*phx]==5))){
gotoxy(*phx+v,*phy+w);
Grafix(*phx,*phy);
*phy-=1;
gotoxy(*phx+v,*phy+w),putchar(258);
}//Movimiento Phantom Arriba.
if(((*phy+w)0){//Huida.
if(((*phx+v)>q)&&((Escenario[*phy][*phx+1]==1)||(Escenario[*phy][*phx+1]==2)||(Escenario[*phy][*phx+1]==5))){
gotoxy(*phx+v,*phy+w);
Grafix(*phx,*phy);
*phx+=1;
gotoxy(*phx+v,*phy+w),putchar(258);
}//Movimiento Phantom Izq.
if(((*phx+v)p)&&((Escenario[*phy+1][*phx]==1)||(Escenario[*phy+1][*phx]==2)||(Escenario[*phy+1][*phx]==5))){
gotoxy(*phx+v,*phy+w);
Grafix(*phx,*phy);
*phy+=1;
gotoxy(*phx+v,*phy+w),putchar(258);
}}//Movimiento Phantom Abajo.
return;
}
void Menu_Final(){//Pequeño menú al final de la partida, cuando se gana o pierde.
if(score==440&&up!=0){
gotoxy(55,6), printf("Has Ganado!! ");
}
else{
gotoxy(55,6), printf("Has Perdido!!");
}
gotoxy(55,8),printf("Que deseas hacer%?");
gotoxy(55,9),printf("1.- Reiniciar juego");
gotoxy(55,10),printf("2.- Ir al Menu inicial");
gotoxy(55,11),printf("3.- Salir");
gotoxy(55,13),printf("Opci242n: ");
scanf("%d",&opcionFinal);
while(opcionFinal3){
gotoxy(60,13);
printf("Opci242n: ");
scanf("%d",&opcionFinal);
}
return;
}
void Graficos(){//Usado para la impresión de todo el tablero.
if(Escenario[i][j]==1) printf(".");
if(Escenario[i][j]==2) printf(" ");
if(Escenario[i][j]==0) printf("%c",219);
if(Escenario[i][j]==5) printf("%c",271);
if(Escenario[i][j]==9) printf("%c",205);
if(Escenario[i][j]==8) printf("%c",186);
if(Escenario[i][j]==6) printf("%c",192);
if(Escenario[i][j]==7) printf("%c",217);
if(Escenario[i][j]=='s') printf("%c",258);
if(Escenario[i][j]=='r') printf("%c",196);
if(Escenario[i][j]=='o') printf("%c",201);
if(Escenario[i][j]=='n') printf("%c",200);
if(Escenario[i][j]=='a') printf("%c",202);
if(Escenario[i][j]=='b') printf("%c",203);
if(Escenario[i][j]=='p') printf("%c",187);
if(Escenario[i][j]=='m') printf("%c",188);
if(Escenario[i][j]=='z') printf("%c",179);
if(Escenario[i][j]=='w') printf("%c",191);
if(Escenario[i][j]=='x') printf("%c",218);
}
void Grafix(int x, int y){//Reposición del tablero, en los caminos de fantasmas.
if(Escenario[y][x]==1) printf(".");
if(Escenario[y][x]==2) printf(" ");
if(Escenario[y][x]==0) printf("%c",219);
if(Escenario[y][x]==5) printf("%c",271);
}
void Dead_PacMan(){//Condiciones para resetear a Pacman.
if(((q==(phx1+v))&&(p==(phy1+w)))||((q==(phx2+v))&&(p==(phy2+w)))){
q=27,p=15,i=11,j=24;
gotoxy(q,p),putchar('C');
up-=1;//Restamos una vida.
if((phx1>20&&phx18&&phy120&&phx28&&phy20) force--,Dead_Ghost();
if(force==0) system("color 9f");;
}
void gotoxy( short x, short y ){
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
COORD position = { x, y };
SetConsoleCursorPosition( hStdout, position );
}
Nota*: Solo hacen falta unas modificaciones que por tiempo (xD) no pude implementar como el movimiento autonomo de los fantasmas.
Aquí anexo un archivo .zip que contiene el código en c y el ejecutable.
Popularity: 25%






