Xiomy


 

Es un juego incompleto (no tiene sonido ni score), lo hice hace tiempo y el objetivo era pintar todo el laberinto sin chocarse con las bombas (los circulos) que van apareciendo ni con los muros de color amarillo. Los controles direccionales son las teclas [A][W][[S][D] y para salir la [P]. Este programa lo hice en Borland C++ 3.1. Tendrás que configurar el directorio de la libreria gráfica BGI de acuerdo a la configuración de tu máquina.

xiomy.c



//-------------------------------------------------------------------------
// 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;
}

Aqui tienes una captura de pantalla de mi estrellándome con una bombita. Tienes que manejar ese triangulito con cuidado porque sino... ;] (Puedes modificar y mejorar el programa tanto como quieras. Yo pienso mejorarlo usando DirectX o Allegro algun dia. Ya veremos.)


 

Puedes encontrar el proyecto aquí: xiomy.zip. Si quieres sólo el ejecutable esta aquí: xiomy_exe.zip. (El archivo EGAVGA.BGI debe estar en la misma carpeta del ejecutable)

 

 

Esaú Rodríguez Oscanoa

 


Diseño y coordinación : Esaú Rodriguez Oscanoa - Lima - Per�

Esta página se ve mejor en Mozilla Firefox a 1024x768


Hosted by www.Geocities.ws

1