Programmer un démineur en C
Hors ligneMidnightweb Le 08/06/2009 à 23:17 Profil de Midnightweb Configuration de Midnightweb

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à

#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 ligneMakx Le 21/06/2009 à 22:54 Profil de Makx Configuration de Makx

dev-libre

     | 1  2  3  4  5  6  7  8  9  10
___|______________________________
1 | 0  M  0  0  M  0  0  0  0  0  
2 | 0  0  0  0  0  M  0  0  0  0  
3 | 0  0  0  0  0  M  0  0  0  0  
4 | 0  0  0  0  0  0  0  0  0  0  
5 | 0  0  0  0  0  0  0  0  0  0  
6 | 0  0  0  0  0  0  0  0  0  0  
7 | 0  0  0  0  M  0  0  0  0  0  
8 | M  M  0  0  0  0  0  0  0  M  
9 | 0  0  0  0  M  0  0  0  0  0  
10 | 0  0  0  M  0  0  0  0  0  0  
Segmentation fault

je regarde au code, ce problème doit venir d'une variable
edit: autre chose, tu devrais éviter les variables globales c'est mal ^^
edit2 : modifie ça aussi, ça ne passe pas sur tous les compilateurs


printf("Vous avez choisi la case (%d,%d).\ Que voulez-vous faire ?\n",i,j);


printf("Vous avez choisi la case (%d,%d).\\ Que voulez-vous faire ?\n",i,j);

laisse moi un peu de temps, je cherche
Hors ligneMidnightweb Le 22/06/2009 à 06:12 Profil de Midnightweb Configuration de Midnightweb

Bonjour,
Merci pour ton intérêt.
Le problème n'a pas été complètement résolu mais le TP a été rendu samedi. désolée
Vous avez résolu votre problème avec VIC ? Faites-le savoir sur les réseaux sociaux !
Vulgarisation-informatique.com
Cours en informatique & tutoriels