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();
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.