|
/*********************************/ /* */ /* */ /* EMULACION DEL JUEGO */ /* \"ARKANOID\" */ /* */ /* -CREADOR POR: */ /* */ /* -DORIAN BUTRON C. */ /* */ /*********************************/
#include<stdio.h> #include<dos.h> #include<conio.h> #include<stdlib.h> #define tcol 50 #define tfil 50 /*Tipo de definicion para crear un registro */ typedef struct registro { char nom[20]; long int puntos; } puntaje; /* Funcion de ordenamieto de registro de mayor a menor segun el puntaje */ void burbuja(puntaje v[],int M) { int i,j; puntaje p[5]; for(i=0;i<M;i++) for(j=M-1;j>=0;j--) { if (v[j].puntos > v[j-1].puntos) { p[0] = v[j]; v[j] = v[j-1]; v[j-1] = p[0]; } } } /* Lee el archivo creado */ int leer(puntaje v[],char arch[]) { int i=0; FILE *fp; fp=fopen (arch,\"rt\"); if(fp==NULL) { printf(\"El archivo %s no existe\",arch); getch(); exit(0); } while(!feof(fp)) { fscanf (fp,\"%s %lin\",&v[i].nom,&v[i].puntos); i++; } fclose (fp); return i; } /* Graba los records en el archivo */ void grabar(puntaje v[],int i,char arch[]) { FILE *fp; fp=fopen (arch,\"a\"); if (fp==NULL) { printf(\"no se pudo abrir %s ...\",arch); getch(); exit(0);} fprintf (fp,\"%s %lin\",v[i].nom,v[i].puntos); fclose (fp); } /* Lee el nombre del usuario para guardarlo */ void registrar_nom(int puntos) { int i; puntaje v[50]; clrscr(); i=leer(v,\"puntaje.txt\"); printf(\"nNombre: \"); scanf(\"%s\",&v[i].nom); fflush(stdin); v[i].puntos=puntos*100; grabar(v,i,\"puntaje.txt\"); } /* Imprime en pantalla los records */ void ver(puntaje v[],int A) { int i; clrscr(); printf(\"TABLA DE PUNTAJEn\"); for(i=0;i<A;i++) printf(\"n(%i) %st%litpts.\",i+1,v[i].nom,v[i].puntos); getch(); } /* Imprime el menu del juego y retorna un caracter */ char menu_juego() { char x; do{ clrscr(); { printf(\"ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\"); printf(\"nº -=[ARKANOID]=- º\"); printf(\"nÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹\"); printf(\"nº º\"); printf(\"nº 1.- Jugar º\"); printf(\"nº 2.- Crear Mundo º\"); printf(\"nº 3.- Ver Records º\"); printf(\"nº 4.- Salir º\"); printf(\"nº º\"); printf(\"nÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹\"); printf(\"nº Elija una opcion[ ] º\"); printf(\"nÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\"); gotoxy(20,11); x=getch(); } } while(x<\'1\'||x>\'4\'); return x; } /* Crea los bordes del mundo, al centro espacios y bloques predeterminados */ void cargar_m1(char m[][tcol],int F,int C,int B) { int i,j; for(i=0;i<C;i++) m[0][i]=\'Ü\'; for(i=1;i<F;i++) m[i][C-1]=\'Þ\'; for(i=0;i<C;i++) m[F-1][i]=\'ß\'; for(i=1;i<F-1;i++) m[i][0]=\'Ý\'; for(i=1;i<F-1;i++) for(j=1;j<C-1;j++) m[i][j]=32; for(i=3;i<B;i++) for(j=3;j<C-3;j++) m[i][j]=1; } /* Crea solo los bordes del mundo y los espacios del centro */ void cargar_m2(char m[][tcol],int F,int C) { int i,j; for(i=0;i<C;i++) m[0][i]=\'Ü\'; for(i=1;i<F;i++) m[i][C-1]=\'Þ\'; for(i=0;i<C;i++) m[F-1][i]=\'ß\'; for(i=1;i<F-1;i++) m[i][0]=\'Ý\'; for(i=1;i<F-1;i++) for(j=1;j<C-1;j++) m[i][j]=32; } /* Controla de que en el relleno no queden bloques y retorna 1 o 0 */ int ganador(char m[][tcol],int F,int C) { int i,j; for(i=1;i<F-1;i++) for(j=1;j<C-3;j++) if(m[i][j]==1) return 0; return 1; } /* Imprime el contenido de toda la matriz */
void mostrar_m(char m[][tcol],int F,int C,long int puntos,int vidas) { int i,j; clrscr(); for(i=0;i<F;i++) { for(j=0;j<C;j++) printf(\"%c\",m[i][j]); printf(\"n\"); } printf(\"n< %i vidas>\",vidas); printf(\"n< %i puntos >\",puntos*100); }
/* Funcion para que el usuario pueda crear su mundo */
void crear_m(char m[][tcol],int F,int C) { int i=1,j=1,salir,puntos=0,vidas=3; char c; m[i][j]=\'_\'; while(1) { mostrar_m(m,F,C,puntos,vidas); if(kbhit()) { c=getch(); if(c==0) c=getch(); switch(c) { case 75: { if(j>1) { if(m[i][j]!=1) m[i][j]=\' \'; j--; if(m[i][j]!=1) m[i][j]=\'_\'; } break; } case 77: { if(j<C-2) { if(m[i][j]!=1) m[i][j]=\' \'; j++; if(m[i][j]!=1) m[i][j]=\'_\'; } break; } case 72: { if(i>1) { if(m[i][j]!=1) m[i][j]=\' \'; i--; if(m[i][j]!=1) m[i][j]=\'_\'; } break; } case 80: { if(i<F-4) { if(m[i][j]!=1) m[i][j]=\' \'; i++; if(m[i][j]!=1) m[i][j]=\'_\'; } break; } case 13: { m[i][j]=1; break; } case 27: salir=0; } } if(salir==0) {if(m[i][j]!=1) m[i][j]=\' \'; break;} } } /* Funcion que le da movimiento a la bola y a la barra */
void palo_bola(char m[][tcol],int F,int C,int nivel) { int li=(C/2)-1,me=(C/2),ld=(C/2)+1,x,y,b=1,salir,puntos=0,g=0,vidas; char c; for(vidas=3;vidas>0;vidas--) { if(g==1) break; if(salir==0) break; b=1; y=F-3; x=me; m[F-2][li]=\'*\'; m[F-2][ld]=\'*\'; m[F-2][me]=\'*\'; m[y][x]=\'ø\'; for(;;) { m[F-2][li]=\'*\'; m[F-2][ld]=\'*\'; m[F-2][me]=\'*\'; g=ganador(m,F,C); mostrar_m(m,F,C,puntos,vidas); if(kbhit()) { c=getch(); if(c==0) c=getch(); switch(c) { case 75: { if(li>1) { m[F-2][ld]=\' \'; li--; ld--; me--; } break; } case 77: { if(ld<C-2) { m[F-2][li]=\' \'; li++; ld++; me++; } break; } case 27: salir=0; } } if(b==1) { if(m[y][x]!=\'*\') m[y][x]=\' \'; y--; if(m[y][x]==1) { puntos++; b=4+random(3); if(nivel>=5) nivel=nivel-5;} m[y][x]=\'ø\'; if(y==1) b=5+random(2); delay(nivel); mostrar_m(m,F,C,puntos,vidas); } if(b==2) { if(m[y][x]!=\'*\') m[y][x]=\' \'; y--; x--; if(m[y][x]==1) { puntos++; b=4+random(3); if(nivel>=5) nivel=nivel-5;} m[y][x]=\'ø\'; if(x==1) b=3; if(y==1) b=5+random(2); delay(nivel); mostrar_m(m,F,C,puntos,vidas); } if(b==3) { if(m[y][x]!=\'*\') m[y][x]=\' \'; y--; x++; if(m[y][x]==1) { puntos++; b=4+random(3); if(nivel>=5) nivel=nivel-5;} m[y][x]=\'ø\'; if(x==C-2) b=2; if(y==1) b=5+random(2); delay(nivel); mostrar_m(m,F,C,puntos,vidas); } if(b==4) { if(m[y][x]!=\'*\') m[y][x]=\' \'; y++; if(m[y][x]==1) { puntos++; b=2+random(2);} m[y][x]=\'ø\'; if(y==F-2&&x==me) b=1; if(y==F-2&&x==li) b=2; if(y==F-2&&x==ld) b=3; delay(nivel); if(y==F-1) {m[y][x]=\'X\'; mostrar_m(m,F,C,puntos,vidas); printf(\"perdiste\"); getch(); break;} mostrar_m(m,F,C,puntos,vidas); } if(b==5) { if(m[y][x]!=\'*\') m[y][x]=\' \'; y++; x--; if(m[y][x]==1) { puntos++; b=2;} m[y][x]=\'ø\'; if(y==F-2&&x==me) b=1; if(y==F-2&&x==li) b=2; if(y==F-2&&x==ld) b=3; if(x==1) b=6; delay(nivel); if(y==F-1) {m[y][x]=\'X\'; mostrar_m(m,F,C,puntos,vidas); printf(\"perdiste\"); getch(); break;} mostrar_m(m,F,C,puntos,vidas); } if(b==6) { if(m[y][x]!=\'*\') m[y][x]=\' \'; y++; x++; if(m[y][x]==1) { puntos++; b=3;} m[y][x]=\'ø\'; if(y==F-2&&x==me) b=1; if(y==F-2&&x==li) b=2; if(y==F-2&&x==ld) b=3; if(x==C-2) b=5; delay(nivel); if(y==F-1) {m[y][x]=\'X\'; mostrar_m(m,F,C,puntos,vidas); printf(\"perdiste\"); getch(); break;} mostrar_m(m,F,C,puntos,vidas); } if(salir==0) break; if(g==1) { printf(\"ganaste\"); if(puntos!=0) registrar_nom(puntos); break;} } } if(vidas==0) registrar_nom(puntos); } /* Tipo de juego 1 para que los bloques se creen solos */ void tipo1(char m[][tcol]) { int F,C,B,nivel; clrscr(); printf(\"tPRESIONE 0 PARA PARA VOLVER AL MENU\"); printf(\"nnTama¤o de filas(10-%i): \",tfil); scanf(\"%i\",&F); fflush(stdin); if(F!=0) { printf(\"nTama¤o de columnas(10-%i): \",tcol); scanf(\"%i\",&C); fflush(stdin); if(C!=0) { do{ printf(\"nNumero de filas de bloques(1-%i): \",F-7); scanf(\"%i\",&B); fflush(stdin); } while(B<0||B>F-7); if(B!=0) {printf(\"nElija el nivel en el que desea comenzar: \"); scanf(\"%i\",&nivel); fflush(stdin);} } } if(F!=0&&C!=0&&B!=0) { cargar_m1(m,F,C,B+3); palo_bola(m,F,C,nivel); } } /* Tipo de juego 2 donde el usuario crea sus bloques */ void tipo2(char m[][tcol]) { int i,F,C,nivel; clrscr(); printf(\"tPRESIONE 0 PARA PARA VOLVER AL MENU\"); printf(\"nTama¤o de filas: \"); scanf(\"%i\",&F); fflush(stdin); if(F!=0) { printf(\"nTama¤o de columnas: \"); scanf(\"%i\",&C); fflush(stdin); if(C!=0) {printf(\"nElija el nivel en el que desea comenzar: \"); scanf(\"%i\",&nivel); fflush(stdin);} } if(F!=0&&C!=0) { cargar_m2(m,F,C); crear_m(m,F,C); palo_bola(m,F,C,nivel); } } FILE *fp; main() { int i; puntaje v[50]; char menu; char m[tfil][tcol]; char arch[]=\"puntaje.txt\"; randomize(); fp=fopen (arch,\"a+\"); if (fp==NULL) { printf(\"No se puede crear %s\",arch); getch(); exit(0); } while(1) { menu=menu_juego(); switch(menu) { case \'1\': { tipo1(m); break; } case \'2\': { tipo2(m); break; } case \'3\': { i=leer(v,arch); burbuja(v,i); ver(v,i); break; } case \'4\': exit(0); } } fclose (fp); } http://www.programacion.com/codigo/73/
|