Swisslinux.org

− Le carrefour GNU/Linux en Suisse −

 

Langue

 

Le Forum

Vous n'êtes pas identifié.

#1 08 Jun 2009 23:31:35

midnightweb
Affranchi(e)
 
Date d'inscription: 08 Jun 2009
Messages: 2

Programmer un démineur en C

Bonsoir,

Pas moyen de sortir de ce bug !
Quand il n'y a pas de mines autour, j'ai des '0' à l'infini !
Le souci est sans doute dans la fonction 'Jouer'
Pouvez vous m'aider ? Je déprime là  sad

Code:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

char JEU[10][10];//grille de jeu 
int i,j;//i les lignes, j les colonnes
char MINES[10][10];//la grille avec les mines
int N;//Nombre de mines autour
int NbMines;//le nombre de mines choisi par le joueur
int choix;//le choix effectué par le joueur pour découvrir ou placer un drapeau


//////////////////////////////
// FONCTION INITIALISATION ///
//////////////////////////////
void Init()
{
     for(i=0;i<10;i++)
       {
           for(j=0;j<10;j++)
           {
                            JEU[i][j]='-';//' 'implique case cachée
                            MINES[i][j]='0';                            
           }           
       }
}

///////////////////////////////
// FONCTION PLACER LES MINES //
///////////////////////////////
void PlaceMines()
{
       int CompteMines;//compteur de mines
       for (CompteMines=0;CompteMines<NbMines;CompteMines++)
       {  
           i=rand()%10;//on choisit la ligne de manière aléatoire
           j=rand()%10;//on choisit la colonne de manière aléatoire
           if(MINES[i][j]=='0')//On vérifie que la case est libre
           {
                                    MINES[i][j]='M';//on place un M pour indiquer qu'il y a une mine
           }
           
           else
           {
               NbMines++;//Sinon, il y a déjà un M et il faut faire un tour de plus
           }
       }
}

////////////////////////////////////////
// FONCTION AFFICHER LA GRILLE DE JEU //
////////////////////////////////////////
void AfficheJeu()
{
     printf("\n\n");
     printf("   | 1  2  3  4  5  6  7  8  9  10\n");
     printf("___|______________________________\n");
     for(i=0;i<10;i++)
           {
                      if(i<9)
                      printf(" %d | ",i+1);
                      else
                      printf("%d | ",i+1);
               for(j=0;j<10;j++)
               {                
                                printf("%c  ",JEU[i][j]);
               }
               printf("\n");
           }
}

/////////////////////////////////////////////
// FONCTION CALCULER LE NB DE MINES AUTOUR //
/////////////////////////////////////////////
int NbMinesAutour()
{
    N=0;
         if(MINES[i][j]=='M')
         {
                        printf("Vous avez perdu !!!\n\n");
                        
                        printf("   | 1  2  3  4  5  6  7  8  9  10\n");
                        printf("___|______________________________\n");
                        for(i=0;i<10;i++)
                                         {
                                              if(i<9)
                                              printf(" %d | ",i+1);
                                              else
                                              printf("%d | ",i+1);
                                              for(j=0;j<10;j++)                
                                              printf("%c  ",MINES[i][j]);
                                              printf("\n");
                                         }                       
                        
         }
                        else
                        {
                            if (i==0)
                            {
                                     if (j==0)
                                     {
                                              if(MINES[i][j+1]=='M')
                                              N++;
                                              if(MINES[i+1][j]=='M')
                                              N++;
                                              if(MINES[i+1][j+1]=='M')
                                              N++;                       
                                     }
                                     else
                                     {
                                         if(j==10)
                                         { 
                                                  if(MINES[i][j-1]=='M')
                                                  N++;
                                                  if(MINES[i+1][j-1]=='M')
                                                  N++;
                                                  if(MINES[i+1][j]='M')
                                                  N++; 
                                         }
                                         else
                                         {
                                             
                                             if(MINES[i][j-1]=='M')
                                             N++;
                                             if(MINES[i][j+1]=='M')
                                             N++;
                                             if(MINES[i+1][j-1]=='M')
                                             N++;
                                             if(MINES[i+1][j]=='M')
                                             N++;
                                             if(MINES[i+1][j+1]=='M')
                                             N++;
                                         }
                                     }
                            }
                            else
                            {
                                if (i==10)
                                {
                                     if (j==0)
                                     {
                                              if(MINES[i-1][j]=='M')
                                              N++;
                                              if(MINES[i-1][j+1]=='M')
                                              N++;
                                              if(MINES[i][j+1]=='M')
                                              N++;                       
                                     }
                                     else
                                     {
                                         if(j==10)
                                         { 
                                                  if(MINES[i-1][j-1]=='M')
                                                  N++;
                                                  if(MINES[i-1][j]=='M')
                                                  N++;
                                                  if(MINES[i][j-1]=='M')
                                                  N++; 
                                         }
                                         else
                                         {
                                             if(MINES[i-1][j-1]=='M')
                                             N++;
                                             if(MINES[i-1][j]=='M')
                                             N++;
                                             if(MINES[i-1][j+1]=='M')
                                             N++;
                                             if(MINES[i][j-1]=='M')
                                             N++;
                                             if(MINES[i][j+1]=='M')
                                             N++;
                                         }
                                     }
                                }
                                else
                                {
                                    if(MINES[i-1][j-1]=='M')
                                    N++;
                                    if(MINES[i-1][j]=='M')
                                    N++;
                                    if(MINES[i-1][j+1]=='M')
                                    N++;
                                    if(MINES[i][j-1]=='M')
                                    N++;
                                    if(MINES[i][j+1]=='M')
                                    N++;
                                    if(MINES[i+1][j-1]=='M')
                                    N++;
                                    if(MINES[i+1][j]=='M')
                                    N++;
                                    if(MINES[i+1][j+1]=='M')
                                    N++;
                                }                            
                            }    
                            return(N);
                       }
                                               
}

//////////////////////////////////////////////////////////
// FONCTION JOUER dévoiler une case ou placer un drapeau//
//////////////////////////////////////////////////////////
void Jouer()
{
     char NbMinesTxt[2]; // nombre de mines aux alentours 
     switch (choix)
           {
                  case 1 : 
                         NbMinesAutour();
                         if (N!=0)//Il y a des mines autour
                         {
                                  printf("%d\n\n",N);
                                  
                                  sprintf(NbMinesTxt,"%d",N);
                                  JEU[i][j]=NbMinesTxt[0];
                         }
                         else//Il n'y a pas de mines autour
                         {
                                  JEU[i][j]='0';
                                  for(i=i-1;i<i+2;i++)
                                  {
                                                      for(j=j-1;j<j+2;j++)
                                                      NbMinesAutour();
                                  }
                         }                       
                       break;
                  case 2 : JEU[i][j]='D';
                       break;
           }
     }
     
///////////////////////////////////////////////////////////////
// FONCTION CHOISIR On demande au joueur de choisir une case //
///////////////////////////////////////////////////////////////
void Choisir()
{
     printf("\n\nVeuillez entrer la case choisie (numero de ligne [espace] numero de colonne):\t"); 
     scanf("%d %d",&i,&j);
     printf("Vous avez choisi la case (%d,%d).\ Que voulez-vous faire ?\n",i,j);
     i=i-1;
     j=j-1;
     printf("\t1. Decouvrir une case\n");
     printf("\t2. Placer un drapeau");
     do
     {
                  printf("\t\tVotre choix : ");
                  scanf("%d",&choix);
     }
     while (choix<0 || choix>2);
}
////////////////////////////////////////////////////////////////////////////////
int main()
{ 
       int c;//compteur
       srand(time(NULL));       
       
       //Afficher le début du jeu
       printf(" ________________________________\n");
       printf("|                                |\n");
       printf("|        Jeu du demineur         |\n");
       printf("|________________________________|\n\n");
       
       Init();

       do
       {
                  printf("\nCombien de mines voulez-vous ?\n\n");
                  scanf("%d",&NbMines);
       }
       while(NbMines>=30);
       printf("D'accord, vous avez choisi de jouer avec %d mines\n\n",NbMines);       
       PlaceMines();
       printf("Voici la grille des mines pour controle:\n");
       for(i=0;i<10;i++)
       {
           printf("\t\t\t");
           for(j=0;j<10;j++)
           {
                            printf("%c  ",MINES[i][j]);
           }
           printf("\n");
       }
       
       printf("\n\nVoici votre grille : A vous de jouer !\n\n");
       AfficheJeu();
       
       for(c=0;c<(100-NbMines);c++)
       {
           Choisir();
           Jouer();
           AfficheJeu();          
       }
       printf("\n\n\t\tBravo vous avez gagné !");
       
       system("pause");
       return 0;
}

Hors ligne

 

#2 09 Jun 2009 07:09:33

jean@adimp.ch
Illuminé(e)
Lieu: Marly
Date d'inscription: 10 Mar 2005
Messages: 1228
Site web

Re: Programmer un démineur en C

Salut,
Est-ce que tu connais code::blocks ( http://www.codeblocks.org/downloads/5 ). Il permet de débuger les programmes en fixant des points d'arrêt. C'est très pratique.

Meilleures salutations.


--------------------------------------------------------
Jean Tinguely Awais
Ma vie sur twitter : http://www.twitter.com/tservi

Hors ligne

 

#3 09 Jun 2009 19:19:36

[GO]Skywalker13
Modérateur
Lieu: Choëx (VS)
Date d'inscription: 05 Oct 2004
Messages: 896
Site web

Re: Programmer un démineur en C

Salut,
J'ai parcouru en vitesse.. y a deux trois choses qui sont un peu limite mais passons..

Code:

void Jouer()
<snip>
                                  for(i=i-1;i<i+2;i++)
                                  {
                                                      for(j=j-1;j<j+2;j++)

Je te laisse méditer sur tes boucles FOR..  surtout sur la condition pour les quitter..


Mathieu SCHROETER
log.schroetersa.ch

Hors ligne

 

#4 09 Jun 2009 21:29:15

midnightweb
Affranchi(e)
 
Date d'inscription: 08 Jun 2009
Messages: 2

Re: Programmer un démineur en C

Et oui, erreur de jeunesse lol

J'ai pas mal corrigé et simplifier
C'est pas encore au point mais ça va venir
Je le sens hmm

Hors ligne

 

Pied de page des forums

Powered by FluxBB