Demineur

Description

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

Codes Sources

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.