Serpent

Contenu du snippet

C'est mon premier programme avec allegro donc il est assez simple, c'est un petit serpent ou on peut choisir la vitesse du jeu et choisir parmi deux labyrinthe.

Source / Exemple :


/*Essai de Jeu de serpent avec Allegro en double buffering
v0.6
By Thrall005                             */

#include <allegro.h>
#include <stdlib.h>  //Pour la fonction hasard (rand() )

void intro();
void deplacement();
void dessinelab();
void testlab();
void creationpomme();
void testqueue();

BITMAP* buffer;
BITMAP* labyrinthe;
int x_pomme;
int y_pomme;
int positionx[100]={400,395,390,385,380,375,370,365,360,355,350,345,340,335,330,325,320,315,310,305,300,295,290,285,280,275,270,265,260,255,250,245};
int positiony[100]={300,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300};
int dx=5;  //Pour savoir dans quel sens se deplacer
int dy=0;  //
int i;
int j;
int v=60;
int creation=0;  //pour savoir si il faut creer une pomme ou pas
int apaspomme=1;  //Pour savoir si une pomme existe deja
int score=0;
int longueur=30;  //longueur du serpent
int stop=0;
int labx[10];        //coordonnées en x du labyrinthe
int labx2[10];      //
int laby[10];        //coordonnées en y du labyrinthe
int laby2[10];      // 
int longueurlab;   //Pour savoir le nombre de cas a tester pour 
                         //lesquelles le serpent risque de toucher
                        //le labyrinthe

void intro()
{
 while(!key[KEY_ENTER])
 {
  textprintf(buffer, font,150,150, makecol(100, 255, 100), "Veuiller choisir le labyrinthe ");
  textprintf(buffer, font,250,170, makecol(100, 255, 100), "pas de labyrinthe :  A");
  textprintf(buffer, font,250,190, makecol(100, 255, 100), "Labyrinthe 1 : Z ");
  textprintf(buffer, font,250,210, makecol(100, 255, 100), "Labyrinthe 2 : E ");
  textprintf(buffer, font,150,300, makecol(100, 255, 100), "veuiller choisir la vitesse");
  textprintf(buffer, font,250,320, makecol(100, 255, 100), "lente : q");
  textprintf(buffer, font,250,340, makecol(100, 255, 100), "moyenne : s");
  textprintf(buffer, font,250,360, makecol(100, 255, 100), "rapide : d");
  textprintf(buffer, font,300,400, makecol(0,0,255), "taper entrer pour commencer");
  if(i==1) {textprintf(buffer, font,530,170, makecol(255, 0,0), "X");}
  if(i==2) {textprintf(buffer, font,530,190, makecol(255, 0,0), "X");}
  if(i==3) {textprintf(buffer, font,530,210, makecol(255, 0,0), "X");}
  if(j==1) {textprintf(buffer, font,490,320, makecol(255, 0,0), "X");}
  if(j==2) {textprintf(buffer, font,490,340, makecol(255, 0,0), "X");}
  if(j==3) {textprintf(buffer, font,490,360, makecol(255, 0,0), "X");}
  
  
  blit(buffer,screen,0,0,0,0,SCREEN_W,SCREEN_H);
  rest(100);
  if(key[KEY_Q]) 
  {
   longueurlab=0;    //pour qu'il ny ait pas de labyrinthe
   i=1;
  }
  if(key[KEY_W])  
  {
   longueurlab=4;
   labx[0]=0;   labx[1]=0;   labx[2]=795; labx[3]=0;
   laby[0]=0;   laby[1]=0;   laby[2]=0;   laby[3]=595;   
   labx2[0]=800;labx2[1]=5; labx2[2]=800;labx2[3]=800; 
   laby2[0]=5; laby2[1]=600;laby2[2]=600;laby2[3]=600;
   i=2;
  }
  if(key[KEY_E])
  {
   longueurlab=10;
   labx[0]=0; labx[1]=0; labx[2]=0;  labx[3]=0;  labx[4]=700;labx[5]=787;labx[6]=787;labx[7]=700; labx[8]=250; labx[9]=250;    //coordonnées en x du labyrinthe
   laby[0]=0; laby[1]=0; laby[2]=500;laby[3]=587;laby[4]=0;  laby[5]=0;  laby[6]=500;laby[7]=587; laby[8]=200; laby[9]=375;  //coordonnées en y du labyrinthe
   labx2[0]=100;labx2[1]=13; labx2[2]=13; labx2[3]=100; labx2[4]=800;labx2[5]=800; labx2[6]=800;labx2[7]=800; labx2[8]=500; labx2[9]=500;
   laby2[0]=13; laby2[1]=100;laby2[2]=600;laby2[3]=600; laby2[4]=13; laby2[5]=100; laby2[6]=600;laby2[7]=600; laby2[8]=225; laby2[9]=400;
   i=3;
  }
  if(key[KEY_A])  {v=55; j=1; }
  if(key[KEY_S])  {v=35; j=2; }
  if(key[KEY_D])  {v=20; j=3; }
  clear_bitmap(buffer);
 } 
} END_OF_FUNCTION(intro);

void creationpomme()
{
 x_pomme=rand()%780+5;  //Pour tirer un nombre entre 5 et 785
 y_pomme=rand()%580+5;  //Pour tirer un nombre entre 5 et 585 
 for(i=0;i<longueurlab;i++)
 {
  while((labx[i]-2<=x_pomme)&&(x_pomme<=labx2[i]+2)&&(laby[i]-2<=y_pomme)&&(y_pomme<=laby2[i]+2))
  {
    x_pomme=rand()%780+5;  //Pour tirer un nombre entre 5 et 785
    y_pomme=rand()%580+5;  //Pour tirer un nombre entre 5 et 585 
  }
 }
 apaspomme=0;
} END_OF_FUNCTION(creationpomme); 
 

void testqueue()
{
 for(i=0;i<longueur;i++)     // test pour voir si le serpent touche sa queue
 {
  for(j=0;j<i;j++)  //test qui évite d'avoir i=j auquel cas il y aurait forcement 1
  {
   if ((positionx[i]==positionx[j]) &&(positiony[i]==positiony[j]))
   {
    stop=1;
   }
  }
  for(j=i+1;j<longueur;j++)
  {
   if ((positionx[i]==positionx[j]) &&(positiony[i]==positiony[j]))
   {
    stop=1;
   }
  }
 }  
} END_OF_FUNCTION(testqueue); 

void dessinelab()   //dessinne le labyrinthe
{
 for(i=0;i<longueurlab;i++)
 {
  rectfill(labyrinthe, labx[i],laby[i],labx2[i],laby2[i], makecol(0,0,255));
 }
} END_OF_FUNCTION(dessinelab);  

void testlab()
{
 for(i=0;i<longueurlab;i++)
 {
  if ((labx[i]-3<=positionx[0])&&(positionx[0]<=labx2[i]+3)&&(laby[i]-3<=positiony[0])&&(positiony[0]<=laby2[i]+3))
  {
   stop=1;
  }
 }
}  END_OF_FUNCTION(testlab);   

void deplacement()
{
 for(i=longueur;i>0;i--)
 {  
  positionx[i]=positionx[i-1];
  positiony[i]=positiony[i-1];
 } 
 positionx[0]=positionx[0]+dx;
 positiony[0]=positiony[0]+dy;
   
 for(i=0;i<longueur;i++)
 {
  rectfill(buffer,positionx[i],positiony[i],positionx[i]+8,positiony[i]+8,makecol(255,255,255));
 }  
 textprintf_centre(buffer, font, 40, 5, makecol(100, 255, 100), "score: %d ",score);
   
 if (positionx[0]+5>796) {positionx[0]=5;}  //Si le serpent touche un bord
 if (positiony[0]>596)   {positiony[0]=5;}
 if (positionx[0]<4)     {positionx[0]=796;}
 if (positiony[0]<-3)    {positiony[0]=596;}
} END_OF_FUNCTION(deplacement);

void main()
{
 allegro_init();    // Initialisation d'Allegro
 set_gfx_mode(GFX_AUTODETECT,800,600,0,0);
 install_keyboard();
 if (set_gfx_mode(GFX_AUTODETECT, 800, 600, 0, 0) != 0) 
 {
  set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);  
  allegro_message("Impossible d'initialiser le mode vidéo !\n%s\n", allegro_error);
 }
 buffer = create_bitmap(SCREEN_W, SCREEN_H);
 labyrinthe=create_bitmap(SCREEN_W, SCREEN_H);
 clear_bitmap(labyrinthe);
 clear_bitmap(buffer);
 intro(); 
 clear_bitmap(buffer);
 dessinelab();               //dessine le labyrinthe dans le buffer labyrinthe
 while(stop==0)           // Debut de la veritable boucle principal
 { 
  clear_bitmap(buffer);
  blit(labyrinthe,buffer, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
  if((positionx[0]-7<x_pomme)&&(x_pomme<positionx[0]+10)&&(positiony[0]-7<y_pomme)&&(y_pomme<positiony[0]+10)&&(apaspomme==0)) /* On mange la pomme*/
  {
   score++;
   longueur++;      
   apaspomme=1;
  } 
  if (((creation%30)==0)&&(apaspomme==1))      //On creer une pomme
  {
   creationpomme();
  }
  if (apaspomme==0)       //si il doit y avoir une pomme on en dessine une
  {
   circlefill(buffer,x_pomme,y_pomme,5,makecol(255,0,0));
  }  
  testqueue();    // pour savoir si le serpent touche sa queue ou pas    
  testlab();      // Pour savoir si le serpent touche le labyrnthe  
  deplacement();  //comme son nom l'indique 
 
  blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
  rest(v);
  if(key[KEY_ESC])   {stop=1;}
  if(key[KEY_UP])    {dy=-5; dx=0;}  //Si une touche est appuyée
  if(key[KEY_DOWN])  {dy=5; dx=0;}   //
  if(key[KEY_LEFT])  {dx=-5; dy=0;}  // 
  if(key[KEY_RIGHT]) {dx=5; dy=0;}   // 
  creation++;
 }   
 textprintf_centre(buffer, font, SCREEN_W / 2, SCREEN_H / 2, makecol(100, 255, 100), "Vous avez perdu ");
 textprintf_centre(buffer, font, SCREEN_W/2, (SCREEN_H/2)+10,makecol(0,255,0),"Voici votre score %d",score);
  
 blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
 rest(2000);
 destroy_bitmap(buffer);
 destroy_bitmap(labyrinthe);
 allegro_exit();
 
} END_OF_MAIN();

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.