//-------------------------------------------------------------------------
// XIOMY.C - (Borland C++ 3.1)
// Esau Rodriguez Oscanoa
//-------------------------------------------------------------------------
#include <graphics.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <dos.h>
#define L 25 //longitud cuadro (Solo probado para 25)
//Prototipo de funciones
void dib_cuadro(int xs,int ys,int op);
void dib_rectangulo(int xs,int ys,int xi,int yi,int f_s,int f_c,int col);
void dib_circulo(int x,int y,int f_s,int col );
void dib_triangulo(int x,int y,int dire);
void dib_barra(void);
void borr(int xs,int ys,int xi, int yi,int col);
void escena(void);
void mover_cuadro(int dir);
void poner_bombita(void);
void explosion(void);
void dib_mapa(int i);
void poner_dificultad(void);
//Variables globales (Una tecnica peligrosa)
int XA ,YA; //Esquina superior izquierda cuadro actual
int XP ,YP; // " " pasado
int COL_ESC=BLUE; //Color de la escena
int DIR; //Direccion 8:arriba,2:abajo,4:izq,6:der
char MAT[350/L][500/L]; //Matriz donde se guardan las casillas ocupadas
int T=7; //Espaciamiento entre bombitas
int B=0; //2:En el canto; 1:Si y 0:No bombita
int EX=0; //Fin
int TOTAL; //Contador para final
int T_I=15; //Espaciamiento inicial
int RETRASO=25; //
main(void)
{
int controlador,modo,j;
char ch;
controlador=DETECT;
modo=0;
//--------------------------------------------
// cambiar la ruta por la que corresponda...
initgraph(&controlador, &modo,"d:\\stp\\dev\\bc\\bgi");
for(j=0;j<15;j++)
{
clearviewport();
escena();
while ((EX == 0) && (TOTAL > 0))
{
dib_barra();
}
getch();
}
getch();
closegraph();
}
void dib_rectangulo(int xs,int ys,int xi,int yi,int f_s,int f_c,int col)
{
int fig[10];
fig[0]=fig[8]=fig[2]=xs;
fig[1]=fig[9]=fig[7]=ys;
fig[4]=fig[6]=xi;
fig[3]=fig[5]=yi;
setfillstyle(f_s,f_c);
setcolor(col);
fillpoly(5,fig);
}
void dib_mapa(int lv)
{
int i,j;
int hx,hy;
int vx,vy;
hx= lv;
hy= lv/2;
vx= ((350/L)-lv)/2 ;
vy= vx;
dib_rectangulo(100+hx*L,50+hy*L,599-hx*L,49+(hy+1)*L,SOLID_FILL,YELLOW,WHITE);
dib_rectangulo(100+hx*L,400-(hy+1)*L,599-hx*L,399-hy*L,SOLID_FILL,YELLOW,WHITE);
dib_rectangulo(100+vx*L,50+vy*L,99+(vx+1)*L,399-vy*L,SOLID_FILL,YELLOW,WHITE);
dib_rectangulo(600-(vx+1)*L,50+vy*L,599-vx*L,399-vy*L,SOLID_FILL,YELLOW,WHITE);
for (i=hx;i<((500/L)-hx);i++)
{ MAT[hy][i]='1'; MAT[(350/L)-hy-1][i]='1';TOTAL-=2;}
for (j=vy;j<((350/L)-vy);j++)
{ MAT[j][vx]='1'; MAT[j][(500/L)-vx-1]='1';TOTAL-=2;} //All this was empiric
}
void escena()
{
static int color=1;
static int mapa=2;
int i,j;
DIR=6;
XA=XP=350;
YA=YP=250;
EX=0;
T=15;
TOTAL=(500/L)*(350/L);
for(i=0;i<350/L;i++)
for(j=0;j<500/L;j++)
MAT[i][j]='0';
setcolor(color);
COL_ESC=color;
rectangle(70,20,630,430);
rectangle(99,49,601,401);
setfillstyle(SOLID_FILL,color);
floodfill(90,90,color);
settextstyle(SANS_SERIF_FONT,1,7);
outtextxy(0,40,"--XIOMY--");
dib_mapa(mapa);
setcolor(color);
rectangle(98,438,602,452);
color++;mapa++;
if(color>6) color=1;
if(mapa>9) mapa=2;
}
void dib_circulo(int x, int y,int f_s, int col)
{
setfillstyle(f_s,col);
fillellipse(x,y,L/2,L/2);
}
void dib_triangulo(int xs,int ys,int dir)
{
int fig[8];
switch(dir)
{ case 8: fig[0]=fig[6]=xs+2;
fig[1]=fig[7]=fig[3]=ys+L-2;
fig[2]=xs+L-2;
fig[4]=xs+L/2;
fig[5]=ys+2;break;
case 6: fig[0]=fig[6]=fig[4]=xs+2;
fig[1]=fig[7]=ys+2;
fig[2]=xs+L-2;
fig[3]=ys+L/2;
fig[5]=ys+L-2;break;
case 2: fig[0]=fig[6]=xs+2;
fig[1]=fig[7]=fig[3]=ys+2;
fig[2]=xs+L-2;
fig[4]=xs+L/2;
fig[5]=ys+L-2;break;
case 4: fig[0]=fig[6]=fig[2]=xs+L-2;
fig[1]=fig[7]=ys+2;
fig[3]=ys+L-2;
fig[4]=xs+2;
fig[5]=ys+L/2;
}
setfillstyle(SOLID_FILL,WHITE);
fillpoly(4,fig);
}
void dib_cuadro(int xs,int ys,int op)
{
switch (op)
{
case 1:
dib_rectangulo(xs,ys,xs+L-1,ys+L-1,HATCH_FILL,COL_ESC,COL_ESC);break;
case 2:
dib_circulo(xs+L/2,ys+L/2,SOLID_FILL,random(6)+9);break;
case 3:
if( MAT[(YA-50)/L][(XA-100)/L]=='0') TOTAL--;
MAT[(ys-50)/L][(xs-100)/L]='2';
dib_triangulo(xs,ys,DIR);break;
case 4:
dib_circulo(xs+L/2,ys+L/2,SOLID_FILL,WHITE);
}
}
void explosion()
{
int i,x,y;
x=XA+L/2;
y=YA+L/2;
dib_cuadro(XP,YP,1);
dib_circulo(x,y,SOLID_FILL,WHITE);
setcolor(YELLOW);
for(i=0;i<10;i++) circle(x,y,L/2+2*i);
setcolor(BROWN);
for(i=0;i<10;i++) circle(x,y,L*1.3+3*i);
setcolor(DARKGRAY);
for(i=0;i<10;i++) circle(x,y,L*2.5+4*i);
setcolor(MAGENTA);
for(i=0;i<10;i++) circle(x,y,L*4+5*i);
EX=1;
}
void poner_bombita()
{
int i,j;
if (B==1) { dib_cuadro(XP,YP,1);
dib_cuadro(XP,YP,2);
B--;
i=((YP-50)/L)%(350/L);
j=((XP-100)/L)%(500/L);
MAT[i][j]='1'; //Ocupado
}
if (B==2) { dib_cuadro(XA,YA,4);B--;}
}
void mover_cuadro(int dir)
{
int i,j;
static int t=0;
static int p=0;
t++;
if(t==T) {B=1; t=0; p++;}
if( (p==4+6*(7-T)) && (T>1) ) {T--;p=0;}
XP=XA;YP=YA;
switch (dir)
{ case 8: if (YA>50) YA-=L; else {DIR=2; B=2;} break;
case 2: if (YA<400-L) YA+=L; else {DIR=8; B=2;} break;
case 4: if (XA>100) XA-=L; else {DIR=6; B=2;} break;
case 6: if (XA<600-L) XA+=L; else {DIR=4; B=2;} break;
}
i=((YA-50)/L)%(350/L);
j=((XA-100)/L)%(500/L);
if(MAT[i][j]=='1')
{ t=0;
T=T_I;
p=0;
explosion();
}
else
if (B==2)
{dib_cuadro(XA,YA,1);
poner_bombita();
}
else if(B==1)
{poner_bombita();
dib_cuadro(XA,YA,3);
}
else
{dib_cuadro(XP,YP,1);
dib_cuadro(XA,YA,3);
}
}
void dib_barra() //Esta funcion controla el tiempo del programa
{
int n=0,col;
char ch, cad[11],cad2[2];
cad[0]='\0'; //strcpy(cad,"") por alguna razon no funciono
cad2[1]='\0';
dib_rectangulo(100,440,600,451,SOLID_FILL,BLACK,BLACK);
mover_cuadro(DIR);
while(n<10)
{
switch(n)
{ case 0 :
case 1 :
case 2 :col=LIGHTGREEN;break;
case 3 :
case 4 :
case 5 :
case 6 :col=YELLOW;break;
default :col=LIGHTRED;
}
dib_rectangulo(101+50*n,444,149+50*n,447,SOLID_FILL,col,col);
delay (RETRASO);
if (kbhit())
{
cad2[0]=getch();
if(strlen(cad)==10)
{
cad[0]=cad[9];
cad[1]='\0';
}
strcat(cad,cad2);
}
n++;
}
if ((ch = cad[((int)strlen(cad))-1]) != 0)
{
switch (ch)
{
case 'w':
case 'W': DIR=8; break;
case 's':
case 'S': DIR=2; break;
case 'a':
case 'A': DIR=4; break;
case 'd':
case 'D': DIR=6; break;
case 'p':
case 'P': closegraph(); exit(0);
}
}
if(n>10) n=0;
}
|