Título: Ayuda con juego en C++
Publicado por: SonicBlader en 15 Mayo 2012, 21:31 pm
tengo el siguiente codigo para un juego #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.
Título: Re: Ayuda con juego en C++
Publicado por: bemone en 19 Mayo 2012, 20:44 pm
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]);
Esto lo podes achicar a un solo procedimiento pasando parametros!!!
|