Código:
#include <stdio.h>
#include <graphics.h>
#define tam 25
#define prof tam/2
#define N 15
#define P 10
#define NUMBOTONES 4
#define NORMAL 1
#define PRE 0
typedef struct{
int x,y;
int color;
int existe;
}TCubo;
typedef struct{
int m,r,c;
int color;
}TJugador;
typedef struct{
char nombre[50];
int puntos;
}Registro;
typedef struct{
int w,z,numer;
char texto[100];
int tipo;
int tamax, tamay;
}TBoton;
void portada();
void cubo(int x, int y, int color);
void pintacontenedor(TCubo cont[N][N][N]);
void creacontenedor (int x, int y, TCubo cont[N][N][N]);
void creacontenedor2 (int x, int y, TCubo cont[N][N][N]);
void creacontenedor3 (int x, int y, TCubo cont[N][N][N]);
void creacontenedor4 (int x, int y, TCubo cont[N][N][N]);
void creacontenedor5 (int x, int y, TCubo cont[N][N][N]);
void creacontenedor6 (int x, int y, TCubo cont[N][N][N]);
void creacontenedor7 (int x, int y, TCubo cont[N][N][N]);
void creacontenedor8 (int x, int y, TCubo cont[N][N][N]);
void creacontenedor9 (int x, int y, TCubo cont[N][N][N]);
void creacontenedor10 (int x, int y, TCubo cont[N][N][N]);
void creajugador(int x,int y, TCubo cont[N][N][N]);
void pintaambiente();
void mueve_bala(TCubo cont[N][N][N],int *vida,int *punto);
void puntos(int *vida,int *punto);
void juego(char nombre[]);
void ayuda(char nombre_archivo[],int x1, int y1, int x2, int y2);
void imprime_tiempo(clock_t ini, int x1, int y1, int x2, int y2);
void guarda_registro(char nombre_archivo[],Registro j);
void imprime_registro(char nombre_archivo[],Registro j);
void llenabotones(TBoton b[]);
void dibujaboton(TBoton b);
void dibujabotones(TBoton b[], int n);
int checaboton(TBoton b[], int wm, int zm);
void llenaboton(int numer,int w, int z,char texto[],TBoton *b);
int menu(TBoton Bot[]);
void dispara(TCubo cont[N][N][N]);
int main( )
{
TBoton botones[NUMBOTONES];
const int DELAY=50;
int w,z,bot;
Registro jugador;
initwindow( 1280 , 800 , "Mi mundo" );
portada();
menu(botones);
srand(time(NULL));
do
{
clearmouseclick(WM_LBUTTONDOWN);
while(!ismouseclick(WM_LBUTTONDOWN))
delay(DELAY);
getmouseclick(WM_LBUTTONDOWN,w,z);
bot=checaboton(botones,w,z);
if(bot>=0)
{
botones[bot].tipo=PRE;
dibujaboton(botones[bot]);
delay(100);
botones[bot].tipo=NORMAL;
dibujaboton(botones[bot]);
switch(bot)
{
case 0:cleardevice();
juego("Luis");
break;
case 1:cleardevice();
ayuda("ayuda.txt",5,5,getmaxx()-5,getmaxy()-5);
cleardevice();
break;
case 2:cleardevice();
imprime_registro("registro.dat",jugador);
cleardevice();
break;
}
}
}while(bot!=3);
closegraph();
return( 0 );
}
void portada()
{
int xmed, ymed;
xmed=getmaxx()/2;
ymed=getmaxy()/2;
setcolor(7);
settextstyle(4,0,3);
outtextxy(210,90, "UNIVERSIDAD AUTONOMA DE SAN LUIS POTOSI");
setcolor(2);
settextstyle(2,0,10);
outtextxy(480,120, "COMBAT C");
setcolor(9);
settextstyle(6,0,16);
outtextxy(230,160,"Por Luis Daniel Corona Rico");
setcolor(15);
settextstyle(8,0,10);
setcolor(1);
settextstyle(4,0,4);
outtextxy(280,210,"Estructura de Datos y Algoritmos A");
setcolor(3);
settextstyle(10,0,5);
outtextxy(265,250,"Profesora Silvia Luz Vaca Rivera");
getch();
cleardevice();
}
void cubo(int x, int y, int color)
{
int puntos[14];
setcolor(15);
setfillstyle(1,color);
bar(x,y,x+tam,y+tam);
rectangle(x,y,x+tam,y+tam);
puntos[0]=x;
puntos[1]=y;
puntos[2]=x+tam;
puntos[3]=y;
puntos[4]=x+tam+prof;
puntos[5]=y-3*prof/4;
puntos[6]=x+prof;
puntos[7]=y-3*prof/4;
fillpoly(4,puntos);
puntos[0]=x+tam;
puntos[1]=y;
puntos[2]=x+tam;
puntos[3]=y+tam;
puntos[4]=x+tam+prof;
puntos[5]=y+tam-3*prof/4;
puntos[6]=x+tam+prof;
puntos[7]=y-3*prof/4;
fillpoly(4,puntos);
}
void pintacontenedor(TCubo cont[N][N][N])
{
int i,j,k;
rectangle(cont[0][N-1][0].x+prof,cont[0][N-1][0].y-(3*prof/4),cont[0][0][N-1].x+tam+prof,cont[0][0][N-1].y+tam-(3*prof/4));
line(cont[0][N-1][0].x+prof,cont[0][N-1][0].y-(3*prof/4),cont[N-1][N-1][0].x,cont[N-1][N-1][0].y);
line(cont[0][0][0].x+prof,cont[0][0][0].y+tam-(3*prof/4),cont[N-1][0][0].x,cont[N-1][0][0].y+tam);
for(k=0; k<N; k++)
for(j=0; j<N; j++)
for(i=0; i<N; i++)
{
if(cont[k][j][i].existe==1)
cubo(cont[k][j][i].x,cont[k][j][i].y,cont[k][j][i].color);
}
setcolor(9);
rectangle(cont[N-1][N-1][0].x,cont[N-1][N-1][0].y,cont[N-1][0][N-1].x+tam,cont[N-1][0][N-1].y+tam);
line(cont[0][N-1][N-1].x+tam+prof,cont[0][N-1][N-1].y-(3*prof/4),cont[N-1][N-1][N-1].x+tam,cont[N-1][N-1][N-1].y);
line(cont[0][0][N-1].x+tam+prof,cont[0][0][0].y+tam-(3*prof/4),cont[N-1][0][N-1].x+tam,cont[N-1][0][N-1].y+tam);
}
void pintaambiente()
{
line(100,0,100,670);
line(100,670,1100,670);
line(1100,670,1100,0);
setcolor(2);
settextstyle(4,0,14);
outtextxy(370,700, "Nombre:");
outtextxy(155,700,"Tiempo:");
outtextxy(870,700,"Puntos:");
outtextxy(870,730,"Vidas:");
setcolor(4);
settextstyle(2,0,21),
outtextxy(40,70,"C");
outtextxy(40,140,"O");
outtextxy(40,220,"M");
outtextxy(40,300,"B");
outtextxy(40,380,"A");
outtextxy(40,460,"T");
outtextxy(40,600,"C");
outtextxy(1130,70,"C");
outtextxy(1130,140,"O");
outtextxy(1130,220,"M");
outtextxy(1130,300,"B");
outtextxy(1130,380,"A");
outtextxy(1130,460,"T");
outtextxy(1130,600,"C");
setcolor(2);
}
void creacontenedor (int x, int y, TCubo cont[N][N][N])
{
int i,j,k;
for(k=0;k<N;k++)
for(j=0;j<N;j++)
for(i=0;i<N;i++)
{
cont[k][j][i].x=x+(i*tam)-(k*prof);
cont[k][j][i].y=y-(j*tam)+(k*3*prof/4);
cont[k][j][i].color=2;
if(k==7 && j==4 && i>2 && i<10)
cont[k][j][i].existe=1;
}
}
void creacontenedor2 (int x, int y, TCubo cont[N][N][N])
{
int i,j,k;
for(k=0;k<N;k++)
for(j=0;j<N;j++)
for(i=0;i<N;i++)
{
cont[k][j][i].x=x+(i*tam)-(k*prof);
cont[k][j][i].y=y-(j*tam)+(k*3*prof/4);
cont[k][j][i].color=5;
if(j==7 && k==7 && i>6 && i<13)
cont[k][j][i].existe=1;
}
}
void creacontenedor3 (int x, int y, TCubo cont[N][N][N])
{
int i,j,k;
for(k=0;k<N;k++)
for(j=0;j<N;j++)
for(i=0;i<N;i++)
{
cont[k][j][i].x=x+(i*tam)-(k*prof);
cont[k][j][i].y=y-(j*tam)+(k*3*prof/4);
cont[k][j][i].color=2;
if(k==7 && j==10 && i>4 && i<8)
cont[k][j][i].existe=1;
}
}
void creacontenedor4 (int x, int y, TCubo cont[N][N][N])
{
int i,j,k;
for(k=0;k<N;k++)
for(j=0;j<N;j++)
for(i=0;i<N;i++)
{
cont[k][j][i].x=x+(i*tam)-(k*prof);
cont[k][j][i].y=y-(j*tam)+(k*3*prof/4);
cont[k][j][i].color=2;
if(k==7 && j==13 && i>3 && i<10)
cont[k][j][i].existe=1;
}
}
void creacontenedor5 (int x, int y, TCubo cont[N][N][N])
{
int i,j,k;
for(k=0;k<N;k++)
for(j=0;j<N;j++)
for(i=0;i<N;i++)
{
cont[k][j][i].x=x+(i*tam)-(k*prof);
cont[k][j][i].y=y-(j*tam)+(k*3*prof/4);
cont[k][j][i].color=2;
if(j==14 && k==7 && i>10 && i<N)
cont[k][j][i].existe=1;
}
}
void creacontenedor6 (int x, int y, TCubo cont[N][N][N])
{
int i,j,k;
for(k=0;k<N;k++)
for(j=0;j<N;j++)
for(i=0;i<N;i++)
{
cont[k][j][i].x=x+(i*tam)-(k*prof);
cont[k][j][i].y=y-(j*tam)+(k*3*prof/4);
cont[k][j][i].color=2;
if(j>13 && k==2 && i==2)
cont[k][j][i].existe=1;
}
}
void creacontenedor7 (int x, int y, TCubo cont[N][N][N])
{
int i,j,k;
for(k=0;k<N;k++)
for(j=0;j<N;j++)
for(i=0;i<N;i++)
{
cont[k][j][i].x=x+(i*tam)-(k*prof);
cont[k][j][i].y=y-(j*tam)+(k*3*prof/4);
cont[k][j][i].color=4;
if(j>7 && k==9 && i==2)
cont[k][j][i].existe=1;
}
}
void creacontenedor8 (int x, int y, TCubo cont[N][N][N])
{
int i,j,k;
for(k=0;k<N;k++)
for(j=0;j<N;j++)
for(i=0;i<N;i++)
{
cont[k][j][i].x=x+(i*tam)-(k*prof);
cont[k][j][i].y=y-(j*tam)+(k*3*prof/4);
cont[k][j][i].color=4;
if(j>13 && k==10 && i==2)
cont[k][j][i].existe=1;
}
}
void creacontenedor9 (int x, int y, TCubo cont[N][N][N])
{
int i,j,k;
for(k=0;k<N;k++)
for(j=0;j<N;j++)
for(i=0;i<N;i++)
{
cont[k][j][i].x=x+(i*tam)-(k*prof);
cont[k][j][i].y=y-(j*tam)+(k*3*prof/4);
cont[k][j][i].color=4;
if(j>13 && k==11 && i==2)
cont[k][j][i].existe=1;
}
}
void creacontenedor10 (int x, int y, TCubo cont[N][N][N])
{
int i,j,k;
for(k=0;k<N;k++)
for(j=0;j<N;j++)
for(i=0;i<N;i++)
{
cont[k][j][i].x=x+(i*tam)-(k*prof);
cont[k][j][i].y=y-(j*tam)+(k*3*prof/4);
cont[k][j][i].color=4;
if(j>13 && k==12 && i==2)
cont[k][j][i].existe=1;
}
}
void creajugador(int x,int y, TCubo cont[N][N][N])
{
int i,j,k;
for(k=0;k<N;k++)
for(j=0;j<N;j++)
for(i=0;i<N;i++)
{
cont[k][j][i].x=x+(i*tam)-(k*prof);
cont[k][j][i].y=y-(j*tam)+(k*3*prof/4);
cont[k][j][i].color=rand()%14+1;
if(j==1 && k==1 && i==3)
cont[k][j][i].existe=1;
}
}
void juego(char nombre[])
{
int x=500,y=400;
int tecla;
TCubo contenedor[N][N][N];
TJugador jugador={14,4,7,4};
TJugador maquina={0,0,0,8};
Registro jug;
int vid=3,pun=0;
int p=3, col=3;
int n_pag=0,aux;
int mueve,oj;
clock_t inicio, actual;
setactivepage(0);
pintaambiente();
setactivepage(1);
pintaambiente();
maquina.m=rand()%N;
maquina.c=rand()%N;
maquina.r=N-1;
maquina.color=3;
puntos(&vid,&pun);
// creacontenedor(x,y,contenedor);
// creacontenedor2(x,y,contenedor);
creacontenedor3(x,y,contenedor);
// creacontenedor4(x,y,contenedor);
// creacontenedor5(x,y,contenedor);
setvisualpage(n_pag);
inicio=clock();
strcpy(jug.nombre,nombre);
jug.puntos=0;
do
{
do
{
contenedor[jugador.m][jugador.r][jugador.c].existe=1;
contenedor[jugador.m][jugador.r][jugador.c].color=jugador.color;
contenedor[maquina.m][maquina.r][maquina.c].existe=1; //Enciende maquina
contenedor[maquina.m][maquina.r][maquina.c].color=maquina.color;
n_pag=(n_pag+1)%2;
setactivepage(n_pag);
setfillstyle(0,0);
bar(102,1,1098,669);
pintacontenedor(contenedor);
setcolor(15);
settextstyle(4,0,14);
imprime_tiempo(inicio,242,739,302,691);
setvisualpage(n_pag);
mueve=rand()%2;
mueve=1;
if(mueve==1)
{
mueve_bala(contenedor,&vid,&pun);
puntos(&vid,&pun);
}
mueve=rand()%20;
if(mueve==1)
{
if(pun==100)
{
vid+=1;
pun=0;
}
}
}while(!kbhit());
delay(90);
contenedor[maquina.m][maquina.r][maquina.c].existe=0; //Apaga maquina
contenedor[maquina.m][maquina.r][maquina.c].color=0;
if(kbhit())
{
tecla=getch();
if(tecla==0)
tecla=getch();
contenedor[jugador.m][jugador.r][jugador.c].existe=0; //Apaga jugador
contenedor[jugador.m][jugador.r][jugador.c].color=0;
switch(tecla)
{
case 77: if(jugador.c<N-1 && contenedor[jugador.m][jugador.r][jugador.c+1].existe==0)
jugador.c++;
break;
case 75: if(jugador.c>0 && contenedor[jugador.m][jugador.r][jugador.c-1].existe==0)
jugador.c--;
break;
case 72: if(jugador.r<N-1 && contenedor[jugador.m][jugador.r+1][jugador.c].existe==0)
jugador.r++;
break;
case 80: if(jugador.r>0 && contenedor[jugador.m][jugador.r-1][jugador.c].existe==0)
jugador.r--;
break;
case 's':if(jugador.m<N-1 && contenedor[jugador.m+1][jugador.r][jugador.c].existe==0)
jugador.m++;
break;
case 'w': if(jugador.m>0 && contenedor[jugador.m-1][jugador.r][jugador.c].existe==0)
jugador.m--;
break;
case 'e': dispara(contenedor);
break;
}
}
}while(tecla!=27);
guarda_registro("registro.dat",jug);
}
void ayuda(char nombre_archivo[],int x1, int y1, int x2, int y2)
{
FILE *f;
char texto[100];
int x=100,y=y1+10;
settextstyle(4,0,14);
f=fopen(nombre_archivo,"r");
if(f==NULL)
{
outtextxy(654,230,"Archivo no existente\n");
getch();
}
else
{
cleardevice();
setcolor(15);
rectangle(x1,y1,x2,y2);
while(!feof(f))
{
fgets(texto,100,f);
x=x1+((x2-x1-textwidth(texto))/2);
outtextxy(620,y,texto);
y+=textheight(texto);
if(y>y2-20)
{
outtextxy(400,y,"Presiona una tecla para continuar");
getch();
cleardevice();
setcolor(15);
rectangle(x1,y1,x2,y2);
y=y1+10;
}
}
getch();
fclose(f);
}
}
void imprime_tiempo(clock_t ini, int x1, int y1, int x2, int y2)
{
clock_t actual;
int seg,min,x,y;
char cadena[10];
actual=clock();
setfillstyle(1,0);
bar(x1+1,y1+1,x2-1,y2-1);
seg=(actual-ini)/CLK_TCK;
min=seg/60;
seg=seg%60;
sprintf(cadena,"%d:%d",min,seg);
y=y1+(((y2-y1)-textheight(cadena))/2);
x=x1+(((x2-x1)-textwidth(cadena))/2);
outtextxy(x,y,cadena);
}
void guarda_registro(char nombre_archivo[],Registro j)
{
FILE *f;
Registro records[P], r={"",0};
int i,band=0;
f=fopen(nombre_archivo,"rb+");
if(f==NULL)
{
f=fopen(nombre_archivo,"wb");
records[0]=j;
for(i=1;i<P;i++)
{
records[i]=r;
}
fwrite(records, sizeof(Registro), P, f);
fclose(f);
}
else
{
fread(records, sizeof(Registro), P, f);
for(i=P-1;i>=0 && band==0;i--)
{
if(records[i].puntos<j.puntos)
{
if(i<P-1)
records[i+1]=records[i];
}
else
{
if(i<P-1)
records[i+1]=j;
band=1;
}
}
if(band==0)
records[i+1]=j;
fseek(f,0,SEEK_SET);
fwrite(records, sizeof(Registro), P, f);
fclose(f);
}
}
void imprime_registro(char nombre_archivo[],Registro j)
{
FILE *f;
Registro records[P];
char nombre[70];
int puntos;
int i;
int x=230, y=870;
f=fopen(nombre_archivo,"rb");
fread(records, sizeof(Registro), P, f);
settextstyle(4,0,14);
for(i=P-1;i>=0;i--)
{
y=y-40;
}
fclose(f);
getch();
}
void mueve_bala(TCubo cont[N][N][N],int *vida,int *punto)
{
int k,j,i;
for(k=0;k<N;k++)
{
for(j=0;j<N;j++)
{
for(i=N-1;i>=0;i--)
if(cont[k][j][i].color==1 && cont[k][j][i].existe==1)
{
if(cont[k][j][i].color==1 && cont[k][j][i].existe==1 && cont[k-1][j][i].color==3 && cont[k-1][j][i].existe==1)
{
cont[k][j][i].existe=0;
cont[k-1][j][i].existe=0;
*punto+=50;
}
else
{
if(i<N-1)
{
cont[k-1][j][i].color=1;
cont[k-1][j][i].existe=1;
}
cont[k][j][i].existe=0;
}
}
}
}
}
void puntos(int *vida,int *punto)
{
char vidas[40];
char puntos[40];
settextstyle(4,0,14);
setcolor(WHITE);
sprintf(puntos,"%d",*punto);
outtextxy(950,701,puntos);
sprintf(vidas,"%d",*vida);
outtextxy(950,731,vidas);
}
void dispara(TCubo cont[N][N][N])
{
int k,j,i;
for(k=0;k<N;k++)
for(j=0;j<N;j++)
for(i=0;i<N;i++)
if(cont[k][j][i].color==0 && cont[k][j][i].existe==1)
{
cont[k-1][j][i].color=1;
cont[k-1][j][i].existe=1;
cont[k][j][i].existe=1;
}
}
void llenaboton(int numer,int w, int z,char texto[],TBoton *b)
{
b->numer=numer;
b->w=w;
b->z=z;
strcpy(b->texto, texto);
b->tipo=NORMAL;
b->tamax=2*textwidth(texto);
b->tamay=2*textheight(texto);
}
void llenabotones(TBoton b[])
{
llenaboton(1,500,100,"JUEGO",&b[0]);
llenaboton(2,498,210,"AYUDA",&b[1]);
llenaboton(3,430,340,"RECORDS",&b[2]);
llenaboton(4,525,460,"SALIR",&b[3]);
}
void dibujaboton(TBoton b)
{
int color;
color=b.tipo==NORMAL?LIGHTGRAY:DARKGRAY;
setfillstyle(SOLID_FILL,0);
bar(b.w, b.z, b.w+b.tamax, b.z+b.tamay);
setcolor(color);
line(b.w, b.z, b.w+b.tamax, b.z);
line(b.w, b.z, b.w, b.z+b.tamay);
color=b.tipo==NORMAL?DARKGRAY:LIGHTGRAY;
setcolor(color);
line(b.w, b.z+b.tamay, b.w+b.tamax, b.z+b.tamay);
line(b.w+b.tamax, b.z, b.w+b.tamax, b.z+b.tamay);
setcolor(15);
settextjustify(1,1);
outtextxy(b.w+b.tamax/2, b.z+b.tamay-30, b.texto);
}
void dibujabotones(TBoton b[], int n)
{
int i;
for(i=0;i<n;i++)
dibujaboton(b[i]);
}
int menu(TBoton Bot[])
{
outtextxy(460,50,"MENU PRINCIPAL");
llenabotones(Bot);
dibujabotones(Bot, NUMBOTONES);
}
int checaboton(TBoton b[], int wm, int zm)
{
int i;
int bot=-1,w1,z1,w2,z2;
for(i=0;i<NUMBOTONES && bot==-1;i++)
{
w1=b[i].w;
w2=b[i].w+b[i].tamax;
z1=b[i].z;
z2=b[i].z+b[i].tamay;
if(wm>=w1 && wm<=w2 && zm>=z1 && zm<=z2)
bot=i;
}
return(bot);
}
El problema es que a la hora de correrlo, me salen unos cubos aleatorios que no he escrito en ninguna parte del codigo y restringen mucho el movimiento del jugador, ademas de que el disparo no funciona (la bala debe ir de adelante del jugador hacia donde toque o una pared o al enemigo).
Me prodrian ayudar con algunos consejos o modificaciones del codigo. No es necesario que vuelva a ponerlo todo, solo señalenme las partes donde podria hacer o donde han echo modificaciones para que eso mejore. Se los agradeceria mucho.