Salut
Voila c'est mon premier vrai programme , c'est un jeu de démineur avec afichage graphique ( j'utilise allegro ).
J'aimerais vos avis et remarques pour pouvoir l'améliorer.
Voila Merci.
Source / Exemple :
#include<allegro.h> //librairie Allegro
#include<time.h> //librairie de temps
//macro d'erreur
#define erreur(msg){\
set_gfx_mode(GFX_TEXT,0,0,0,0);\
allegro_message(msg"%s",allegro_error);\
return(-1);\
}
const int MAX=100;
//-------------------------------------------------------------------------------
//| Fonction de gestion du clic gauche |
//-------------------------------------------------------------------------------
//Fonction récursive !!
void clicgauche(int tab[MAX][MAX],int bomb[MAX][MAX],int case_x,int case_y,int taille,bool & jeu,bool & joue,bool fait[MAX][MAX])
{
int i,j,compteur;
compteur=0;
fait[case_x][case_y]=true;
if(bomb[case_x][case_y]==1)
jeu=true;
else
for(i=case_x-1;i<=case_x+1;i++)
for(j=case_y-1;j<=case_y+1;j++)
if(bomb[i][j]==1) compteur++;
tab[case_x][case_y]=compteur;
if(compteur==0){
for(i=case_x-1;i<=case_x+1;i++)
for(j=case_y-1;j<=case_y+1;j++)
if(!fait[i][j] && tab[i][j]==-10 && bomb[i][j]!=1 && i>=0 && j>=0 && i<taille && j<taille)
clicgauche(tab,bomb,i,j,taille,jeu,joue,fait);
}
joue=false;
}
//-------------------------------------------------------------------------------
//| Initialisation des variables |
//-------------------------------------------------------------------------------
void Init(int tab[MAX][MAX],int bomb[MAX][MAX],bool fait[MAX][MAX],int taille,int bombes)
{
int i,j,case_x,case_y;
//initialisation de la graine
srand(time(NULL));
for(i=0;i<taille;i++)
for(j=0;j<taille;j++)
{
tab[i][j]=-10;
bomb[i][j]=0;
fait[i][j]=false;
}
for(i=0;i<bombes;i++)
{
do{
case_x=(int)((int)taille * rand()/RAND_MAX);
case_y=(int)((int)taille * rand()/RAND_MAX);
}while(bomb[case_x][case_y]==1);
bomb[case_x][case_y]=1;
}
}
//-------------------------------------------------------------------------------
//| gestion de la fin du jeu |
//-------------------------------------------------------------------------------
void end(int tab[MAX][MAX],int bomb[MAX][MAX],bool & jeu,bool & gagne,int taille,int bombes)
{
int i,j,compteur;
bool erreur=false;
compteur=0;
//compte les drapeaux aux bon endroits et détecte s'il y en a de mal placé
for(i=0;i<taille;i++){
for(j=0;j<taille;j++){
if(tab[i][j]==10 && bomb[i][j]==1)
compteur++;
else if (tab[i][j]==10)
erreur=true;}}
//si le joueur a gagné fini le jeu et renvoi gagne
if (compteur==bombes && !erreur)
{
jeu=true;
gagne=true;
}
}
int main()
{
//variables de jeu
int tab[MAX][MAX];
int bomb[MAX][MAX];
bool fait[MAX][MAX];
int taille=20;
int i,j;
int case_x,case_y,bombes=0;
bool jeu=false,joue=false,gagne=false,newgame=true,droit;
//variables allegro
BITMAP* case0;
BITMAP* case1;
BITMAP* case2;
BITMAP* case3;
BITMAP* case4;
BITMAP* case5;
BITMAP* case6;
BITMAP* case7;
BITMAP* case8;
BITMAP* casemort;
BITMAP* caseflag;
BITMAP* casefini;
//initialisation de allegro
allegro_init();
install_keyboard();
install_mouse();
//mode video
allegro_message("Bienvenue sur le demineur de cuchot");
set_color_depth(16);
if(set_gfx_mode(GFX_AUTODETECT_WINDOWED,17*taille,17*taille+20,0,0)!=0)
erreur("impossible de lancer le mode graphique");
show_mouse(screen);
//bitmaps
case0=load_bitmap("case.bmp",NULL);
case1=load_bitmap("case1.bmp",NULL);
case2=load_bitmap("case2.bmp",NULL);
case3=load_bitmap("case3.bmp",NULL);
case4=load_bitmap("case4.bmp",NULL);
case4=load_bitmap("case5.bmp",NULL);
case4=load_bitmap("case6.bmp",NULL);
case4=load_bitmap("case7.bmp",NULL);
case4=load_bitmap("case8.bmp",NULL);
casemort=load_bitmap("casemort.bmp",NULL);
caseflag=load_bitmap("caseflag.bmp",NULL);
casefini=load_bitmap("casefini.bmp",NULL);
if(!case0||!case1||!case2||!case3||!case4||!casemort||!caseflag||!casefini)
erreur("impossible de charger un bitmap");
//questions au joueur
textprintf(screen,font,0,10,makecol(255,255,255), "choisissez un niveau difficulte :");
textprintf(screen,font,0,25,makecol(255,255,255), "*********************************");
textprintf(screen,font,0,40,makecol(0,255,0), " -1.Facile");
textprintf(screen,font,0,55,makecol(255,128,0), " -2.moyen");
textprintf(screen,font,0,70,makecol(255,0,0), " -3.Difficile");
textprintf(screen,font,0,100,makecol(255,255,255),"- Durant le jeu :");
textprintf(screen,font,0,125,makecol(255,255,255)," Touche 'n' : nouveau jeu");
textprintf(screen,font,0,150,makecol(255,255,255)," Touche 'Echap': abandon");
textprintf(screen,font,0,200,makecol(255,255,255),"BONNE PARTIE !!");
do {
i=readkey();
switch(i>>8)
{
case KEY_1_PAD:taille=12;bombes=10;
break;
case KEY_2_PAD:taille=16;bombes=40;
break;
case KEY_3_PAD:taille=24;bombes=99;
break;
}
}
while (bombes==0);
if(set_gfx_mode(GFX_AUTODETECT_WINDOWED,17*taille,17*taille+20,0,0)!=0)
erreur("impossible de lancer le mode graphique");
show_mouse(screen);
clear_bitmap(screen);
//boucle de jeu
while(!jeu)
{
if(newgame==true){
Init(tab,bomb,fait,taille,bombes);
newgame=false;
}
for(i=0;i<taille;i++)
for(j=0;j<taille;j++)
{
if(tab[i][j]==0)
draw_sprite(screen,casefini,17*i,SCREEN_H-20-17*j);
if(tab[i][j]==1)
draw_sprite(screen,case1,17*i,SCREEN_H-20-17*j);
if(tab[i][j]==2)
draw_sprite(screen,case2,17*i,SCREEN_H-20-17*j);
if(tab[i][j]==3)
draw_sprite(screen,case3,17*i,SCREEN_H-20-17*j);
if(tab[i][j]==4)
draw_sprite(screen,case4,17*i,SCREEN_H-20-17*j);
if(tab[i][j]==5)
draw_sprite(screen,case5,17*i,SCREEN_H-20-17*j);
if(tab[i][j]==6)
draw_sprite(screen,case6,17*i,SCREEN_H-20-17*j);
if(tab[i][j]==7)
draw_sprite(screen,case7,17*i,SCREEN_H-20-17*j);
if(tab[i][j]==8)
draw_sprite(screen,case8,17*i,SCREEN_H-20-17*j);
if(tab[i][j]==-1)
draw_sprite(screen,casemort,17*i,SCREEN_H-20-17*j);
if(tab[i][j]==10)
draw_sprite(screen,caseflag,17*i,SCREEN_H-20-17*j);
if(tab[i][j]==-10)
draw_sprite(screen,case0,17*i,SCREEN_H-20-17*j);
}
if(mouse_b & 1 && mouse_x>0 && mouse_x<SCREEN_W && mouse_y>20 && mouse_y<SCREEN_H)
{
case_x=mouse_x/17;
case_y=(SCREEN_H-mouse_y-4)/17;
joue=true;droit=false;
}
if(mouse_b & 2 && mouse_x>0 && mouse_x<SCREEN_W && mouse_y>20 && mouse_y<SCREEN_H)
{
case_x=mouse_x/17;
case_y=(SCREEN_H-mouse_y-4)/17;
joue=true;droit=true;
}
if(key[KEY_ESC])
jeu=true;
if(key[KEY_N])
newgame=true;
//recherche de la bonne action suivant le clic souris
//clic gauche
if(joue&&!droit&&tab[case_x][case_y]!=10)
{
clicgauche(tab,bomb,case_x,case_y,taille,jeu,joue,fait);
for(i=0;i<taille;i++)
for(j=0;j<taille;j++)
fait[i][j]=false;
}
//clic droit
if(joue&&droit&&(tab[case_x][case_y]==10||tab[case_x][case_y]==-10))
{
if(tab[case_x][case_y]==-10) {
tab[case_x][case_y]=10;mouse_b=0;}
else if(tab[case_x][case_y]==10) {
tab[case_x][case_y]=-10;mouse_b=0;}
joue=false;
}
//fin du jeu
end(tab,bomb,jeu,gagne,taille,bombes);
}
set_gfx_mode(GFX_TEXT,0,0,0,0);
if(!gagne)
allegro_message("Vous avez perdu !!");
else allegro_message("Vous avez reussi , YOU WIN !!");
return(0);
}
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.