Arkanoid en C

Este es el juego Arkanoid programado en C. Utiliza solamente modo texto para mostralo en pantalla, y almacenamiento de archivos para los records. Lo pueden compilar con Borland C++ o Turbo C.
				/*********************************/
/* */
/* */
/* 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);
}
Descargar adjuntos
COMPARTE ESTE TUTORIAL

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
TUTORIAL ANTERIOR

SIGUIENTE TUTORIAL