viernes, 17 de enero de 2014

Mi propio "Pong"

He encontrado un código de hace varios años, estaba aburrido en clase y en las 3 horas que tenía, no andaba nada concentrado, me descargué una librería de gráficos para C ya que era muy costoso hacerlo totalmente desde 0 y en esas horas pues me propuse hacer un pong, realmente es muy básico pero funcional...

paso a poner el código que si bien no tiene comentarios tampoco es tan extenso como para no entenderlo, usé la librería gráfica allegro, espero que ayude a quien quiera hacer su propio videojuego en C o incluso a quien quiera jugar unas partidas, lo hice de un solo jugador contra una inteligencia artificial bastante básica aunque quien sabe, puede que algún día lo mejore...

#include <allegro.h>

int jugador(int y);
int ia(int ia_y,int bola_y);
int mover_bola_x(int bola_x,int mov_x,int vel_bola[2]);
int mover_bola_y(int bola_y,int mov_y,int vel_bola[2]);
int colision_x(int bola_x,int bola_y,int jug_y,int ia_y,int vel_bola[2],int colision);
int colision_y(int bola_y,int vel_bola[2],int colision);
void aumentar_vel(int vel_bola[2]);
void mostrar(int jug_y,int ia_y,int bola_x,int bola_y);

int main() 
{ 
 int jug_y=240;
 int ia_y=240;
 int bola_x=390;
  int bola_y=240;
 int mov_x=0;
 int mov_y=0;
 int vel_bola[2]; //0 = velocidad bola, 1 = contador bola
 vel_bola[0]=1;
 vel_bola[1]=0;
 
 allegro_init();
 install_keyboard(); 
 set_color_depth(32);
 set_gfx_mode(GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0);
 
 while(!key[KEY_ESC])
 {
  rest(1);//esperar
  mostrar(jug_y,ia_y,bola_x,bola_y);//mostrar en pantalla
     jug_y=jugador(jug_y);//mover jugador
     ia_y=ia(ia_y,bola_y);//mover IA
     mov_x=colision_x(bola_x,bola_y,jug_y,ia_y,vel_bola,mov_x);//colison x
     mov_y=colision_y(bola_y,vel_bola,mov_y);//colision y
  bola_x=mover_bola_x(bola_x,mov_x,vel_bola);//mover pelota(eje y)
  bola_y=mover_bola_y(bola_y,mov_y,vel_bola);//mover pelota(eje x)
     aumentar_vel(vel_bola);
 }
}
END_OF_MAIN();

int jugador(int y)
{
 if(key[KEY_UP])
 {
    if(y>-0)
     {
      y--;
     }
 }
 
  if(key[KEY_DOWN])
 {
    if(y<520)
     {
      y++;
     }
 }
 
 return(y);
}

int ia(int ia_y, int bola_y)
{
  if(ia_y>0 && bola_y < ia_y)
    {
     ia_y--;
 }
 else
 {
  if(ia_y<520 && bola_y > ia_y)
  {
   ia_y++;
  }
 }
 return(ia_y);
}

int mover_bola_x(int bola_x,int mov_x, int vel_bola[2])
{
 switch(mov_x)
 {
  case -2:
   //reiniciar y sumar 1 al jugador
   break;
  case -1:
   //reiniciar y sumar 1 al enemigo
   break;
  case 0://se mueve hacia el jugador
   bola_x=bola_x-vel_bola[0];
   break;
  case 1://se mueve hacia la ia
   bola_x=bola_x+vel_bola[0];
   break;
 }
 return(bola_x);
}

int mover_bola_y(int bola_y,int mov_y, int vel_bola[2])
{
 switch(mov_y)
 {
  case 0://se mueve hacia arriba
   bola_y=bola_y-vel_bola[0];
   break;
  case 1://se mueve hacia abajo
   bola_y=bola_y+vel_bola[0];
   break;
 }
 return(bola_y);
}

int colision_x(int bola_x,int bola_y,int jug_y,int ia_y,int vel_bola[2],int colision)
{
 
 if(bola_x<=vel_bola[0])//si la bola llega a la puerta de jugador
 {
  colision=-1;
 }
 else
 {
  if(bola_x>=799)//si la bola llega a la puerta de ia
  {
   colision=-2;
  }
  else
  {
   if(bola_x<90&&bola_x>70&&bola_y>=jug_y&&bola_y<=(jug_y+80))//si la bola choca con el jugador
   {
    colision=1;
    vel_bola[1]++;
   }
   else
   {
    if(bola_x<740&&bola_x>720&&bola_y>=ia_y&&bola_y<=(ia_y+80))//si la bola choca con la ia
    {
     colision=0;
     vel_bola[1]++;
    }
   }

  }
 }
 return(colision);
}

int colision_y(int bola_y,int vel_bola[2],int colision)
{
 if(bola_y<=vel_bola[0]&&colision==0)
 {
  colision=1;
 }
 else
 {
  if(bola_y>=(600-vel_bola[0])&&colision==1)
  {
   colision=0;
  }
 }
 return(colision);
}

void aumentar_vel(int vel_bola[2])
{
 if(vel_bola[1]>=15)
 {
  vel_bola[0]++;
  vel_bola[1]=0;
 }
}

void mostrar(int jug_y,int ia_y,int bola_x,int bola_y)
{
 clear_to_color( screen, makecol( 0, 0, 0));//borrar
 rect( screen, 70, 0+jug_y, 90, 80+jug_y, makecol( 0, 0, 255));//jugador
 rect( screen, 720, 0+ia_y, 740, 80+ia_y, makecol( 0, 0, 255));//ia
 rect( screen, 0+bola_x, 0+bola_y, 20+bola_x, 20+bola_y, makecol( 0, 0, 255));//pelota
}
Aquí hay un ejemplo de juego sencillo que como bien he dicho tardé tres horas en crear, ya que este es un código bastante corto, mas adelante haré tutoriales de verdad cuando tenga bastante tiempo.

Por último añadir que si alguien parte de este código para hacer un videojuego pues no estaría de más hacérmelo saber al menos.

No hay comentarios:

Publicar un comentario