Le demineur

Le demineur - C - Programmation

Marsh Posté le 27-02-2006 à 11:39:46    

Bonjour,
 
J'ai programmé un démineur mais lorsque je vais dans le mode "Personnaliser" que je rentre par exemple 5 lignes, 5 colonnes pour les dimensions et ensuite 25 mines le programme plante mais je ne comprends pas d'ou cela peut provenir ?
Ainsi si quelqu'un pouvait m'aider pour cela ?
 
Merci
 

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<windows.h>
  4. #include<time.h>
  5. typedef int GRILLE[50][50];
  6. typedef char GRILLEJEU[50][50];
  7. void Affiche(GRILLEJEU &, int, int);
  8. void Init(GRILLE &, GRILLEJEU &, int , int);
  9. void Mine(GRILLE &, int , int, int);
  10. void Position(GRILLE &, int, int);
  11. char Jeu(GRILLEJEU &, GRILLE &, int, int);
  12. char Convert(GRILLE &, int, int);
  13. void main()
  14. {
  15. GRILLE grille;
  16. GRILLEJEU grillejeu;
  17. bool test;
  18. int testint;
  19. int nbl, nbc, nbmine;
  20. int choix, choix2;
  21. char choix3;
  22. do
  23. {
  24.  do
  25.  {
  26.   test = true;
  27.   system("cls" );
  28.   printf("\n                                LE DEMINEUR\n" );
  29.   printf("                                -----------\n\n" );
  30.   printf("                              **** MENU ****\n\n\n" );
  31.   printf("                                 1.Jouer\n" );
  32.   printf("                                 2.Personnaliser\n\n" );
  33.   fflush(stdin);
  34.   printf("                              Choix : " );
  35.   testint = scanf("%d", &choix);
  36.   if(choix != 1 && choix != 2)
  37.   {
  38.    printf("\n                             CHOIX INVALIDE\n" );
  39.    test = false;
  40.    Sleep(2000);
  41.   }
  42.  }while(testint == 0 || test == false);
  43.  if(choix == 1)
  44.  {
  45.   do
  46.   {
  47.    test = true;
  48.    system("cls" );
  49.    printf("\n                                LE DEMINEUR\n" );
  50.    printf("                                -----------\n\n" );
  51.    printf("\n        **** NIVEAU ****\n\n" );
  52.    printf("    1.Debutant\n" );
  53.    printf("    2.Intermediaire\n" );
  54.    printf("    3.Expert\n\n" );
  55.    fflush(stdin);
  56.    printf("    Choix : " );
  57.    testint = scanf("%d", &choix2);
  58.    if(choix2 == 1)
  59.    {
  60.     nbl = 8;
  61.     nbc = 8;
  62.     nbmine = 10;
  63.    }
  64.    else
  65.    {
  66.     if(choix2 == 2)
  67.     {
  68.      nbl = 16;
  69.      nbc = 16;
  70.      nbmine = 40;
  71.     }
  72.     else
  73.     {
  74.      if(choix2 == 3)
  75.      {
  76.       nbl = 16;
  77.       nbc = 25;
  78.       nbmine = 99;
  79.      }
  80.      else
  81.      {
  82.       printf("\n                              CHOIX INVALIDE\n" );
  83.       test = false;
  84.       Sleep(1000);
  85.      }
  86.     }
  87.    }
  88.   }while(testint == 0 || test == false);
  89.  }
  90.  else
  91.  {
  92.   do
  93.   {
  94.    test = true;
  95.    system("cls" );
  96.    printf("\n\n                CHOISISSEZ LES DIMENSIONS DE LA GRILLE : \n" );
  97.    printf("                ---------------------------------------\n\n" );
  98.    printf(" * Entrez le nombre de lignes : " );
  99.    fflush(stdin);
  100.    testint = scanf("%d", &nbl);
  101.    if(testint == 0 || nbl > 16 || nbl < 2)
  102.    {
  103.     printf("\n                             CHOIX INVALIDE\n" );
  104.     test = false;
  105.     Sleep(1000);
  106.    }
  107.   }while(testint == 0 || test == false);
  108.   printf("\n" );
  109.   do
  110.   {
  111.                 test = true;
  112.    printf(" * Entrez le nombre de colonnes : " );
  113.    fflush(stdin);
  114.    scanf("%d", &nbc);
  115.    if(testint == 0 || nbc > 25 || nbc < 2)
  116.    {
  117.     printf("\n                               CHOIX INVALIDE\n" );
  118.     test = false;
  119.     Sleep(1000);
  120.    }
  121.   }while(testint == 0 || test == false);
  122.   do
  123.   {
  124.    test = true;
  125.    system("cls" );
  126.    printf("\n\n                        CHOISISSEZ LE NOMBRE DE MINES : \n" );
  127.    printf("                        ------------------------------\n\n" );
  128.    printf(" * Entrez le nombre de mines : " );
  129.    fflush(stdin);
  130.    testint = scanf("%d", &nbmine);
  131.    if(nbmine > (nbl*nbc))
  132.    {
  133.     printf("\n       POUR CETTE PARTIE LE NOMBRE DE MINE DOIT ETRE INFERIEUR A %d\n", (nbl*nbc));
  134.     Sleep(2000);
  135.     test = false;
  136.    }
  137.    else
  138.    {
  139.     if(testint == 0)
  140.     {
  141.      printf("\n                              CHOIX INVALIDE\n" );
  142.      Sleep(2000);
  143.     }
  144.    }
  145.   }while(testint == 0 || test == false);
  146.  }
  147.  Init(grille, grillejeu, nbl, nbc);
  148.  Mine(grille, nbl, nbc, nbmine);
  149.  Position(grille, nbl, nbc);
  150.  choix3 = Jeu(grillejeu, grille, nbl, nbc);
  151. }while(choix3 == 'o');
  152. system("cls" );
  153. printf("\n\n                   DIMGAMES ENTERTAINEMENT VOUS A PRESENTER \n\n" );
  154. printf("                                LE DEMINEUR\n\n" );
  155. Sleep(3000);
  156. system("cls" );
  157. printf("\n\n                             MERCI D AVOIR JOUER\n\n" );
  158. printf("                                 AU REVOIR\n\n" );
  159. }
  160. void Init(GRILLE &grille, GRILLEJEU &grillejeu, int nbl, int nbc)
  161. {
  162. int i, j;
  163.  
  164. for(i=1;i<=nbl;i++)
  165. {
  166.  for(j=1;j<=nbc;j++)
  167.  {
  168.   grille[i][j] = 0;
  169.  }
  170. }
  171. for(i=1;i<=nbl;i++)
  172. {
  173.  for(j=1;j<=nbc;j++)
  174.  {
  175.   grillejeu[i][j] = '*';
  176.  }
  177. }
  178. }
  179. void Mine(GRILLE &grille, int nbl, int nbc, int nbmine)
  180. {
  181. int i, j;
  182. srand( (unsigned)time( NULL ) );
  183. while(nbmine > 0)
  184. {
  185.  i = rand()%nbl;
  186.  j = rand()%nbc;
  187.  if (grille[i][j] == 0 && i > 0 && j > 0)
  188.  {
  189.   grille[i][j] = 9;
  190.   nbmine--;
  191.  }
  192. }
  193. }
  194. void Position(GRILLE &grille, int nbl, int nbc)
  195. {
  196. int i, j, k, l;
  197.     int comptmine; /* Compteur de mine */
  198.  
  199.     for(i=1;i<=nbl;i++)
  200. {
  201.  for(j=1;j<=nbc;j++)
  202.  {
  203.   if(grille[i][j]==0)       
  204.   {
  205.    comptmine = 0; /* Initialise le compteur de mine */
  206.    /* Scanne les cases entourant la mine */
  207.    for (k=i-1;k<i+2;k++)
  208.    {
  209.     for (l=j-1; l<j+2;l++)
  210.     {
  211.                        if(grille[k][l]== 9)   
  212.                         {
  213.         /* Incrémente le compteur de mine */
  214.       comptmine = comptmine+1;
  215.                         }
  216.                      }
  217.     /* La case recoit la valeur du compteur de mine */
  218.     grille[i][j] = comptmine;
  219.    }
  220.   }
  221.  }
  222. }
  223. }
  224. char Jeu(GRILLEJEU &grillejeu, GRILLE &grille, int nbl, int nbc)
  225. {
  226. bool explose;
  227. int i, j;
  228. char choix3;
  229. system("cls" );
  230. do
  231. {
  232.  printf("\n                                LE DEMINEUR\n" );
  233.  printf("                                -----------\n\n" );
  234.  Affiche(grillejeu, nbl, nbc);
  235.  printf("\n * Entrez la ligne : " );
  236.  fflush(stdin);
  237.  scanf("%d", &i);
  238.  printf("\n * Entrez la colonne : " );
  239.  fflush(stdin);
  240.  scanf("%d", &j);
  241.  if(grille[i][j] == 0)
  242.  {
  243.   grillejeu[i][j] = '.';
  244.  }
  245.  else
  246.  {
  247.   if(grille[i][j] != 9)
  248.   {
  249.    grille[i][j] = Convert(grille, i, j);
  250.    grillejeu[i][j] = grille[i][j];
  251.   }
  252.   else
  253.   {
  254.    grillejeu[i][j] = 'B';
  255.    explose = true;
  256.    system("cls" );
  257.    printf("\n                                LE DEMINEUR\n" );
  258.    printf("                                -----------\n\n" );
  259.    Affiche(grillejeu, nbl, nbc);
  260.    Sleep(2000);
  261.   }
  262.  }
  263.  system("cls" );
  264. }while(explose != true);
  265. do
  266. {
  267.  system("cls" );
  268.  if(explose == true)
  269.  {
  270.   printf("\n\n\n                             VOUS AVEZ PERDU !!!!\n\n" );
  271.  }
  272.  else
  273.  {
  274.   printf("\n\n\n                            VOUS AVEZ GAGNE !!!!\n\n" );
  275.  }
  276.  printf("Voulez - vous recommencer une partie ?(o/n) : " );
  277.  fflush(stdin);
  278.  scanf("%c", &choix3);
  279.  if(choix3 != 'o' && choix3 != 'n')
  280.  {
  281.   printf("\n                                 CHOIX INVALIDE\n" );
  282.   Sleep(2000);
  283.  }
  284. }while(choix3 != 'o' && choix3 != 'n');
  285. return(choix3);
  286. }
  287. char Convert(GRILLE &grille, int i, int j)
  288. {
  289. switch(grille[i][j])
  290. {
  291.  case 0 :
  292.   return(48);
  293.   break;
  294.  case 1 :
  295.   return(49);
  296.   break;
  297.  case 2 :
  298.   return(50);
  299.   break;
  300.  case 3 :
  301.   return(51);
  302.   break;
  303.  case 4 :
  304.   return(52);
  305.   break;
  306.  case 5 :
  307.   return(53);
  308.   break;
  309.  case 6 :
  310.   return(54);
  311.   break;
  312.  case 7 :
  313.   return(55);
  314.   break;
  315.  case 8 :
  316.   return(56);
  317.   break;
  318.  case 9 :
  319.   return(57);
  320.   break;
  321.  default :
  322.   return (-1);
  323. }
  324. }
  325. void Affiche(GRILLEJEU &grillejeu, int nbl, int nbc)
  326. {
  327. int i, j;
  328. if(nbl <= 9 && nbc <= 9)
  329. {
  330.  printf("   %d  ", 1);
  331.  for(j=2;j<=nbc;j++)
  332.  {
  333.   printf("%d  ", j);
  334.  }
  335.  printf("\n\n" );
  336.  for(i=1;i<=nbl;i++)
  337.  {
  338.   printf("%d  ", i);
  339.   for(j=1;j<=nbc;j++)
  340.   {
  341.    printf("%c  ", grillejeu[i][j]);
  342.   }
  343.   printf("\n" );
  344.  }
  345. }
  346. else
  347. {
  348.  printf("   %d  ", 1);
  349.  for(j=2;j<=9;j++)
  350.  {
  351.   printf("%d  ", j);
  352.  }
  353.  for(j=10;j<=nbc;j++)
  354.  {
  355.   printf("%d ", j);
  356.  }
  357.  printf("\n\n" );
  358.  for(i=1;i<=9;i++)
  359.  {
  360.   printf("%d  ", i);
  361.   for(j=1;j<=nbc;j++)
  362.   {
  363.    printf("%c  ", grillejeu[i][j]);
  364.   }
  365.   printf("\n" );
  366.  }
  367.  for(i=10;i<=nbl;i++)
  368.  {
  369.   printf("%d ", i);
  370.   for(j=1;j<=nbc;j++)
  371.   {
  372.    printf("%c  ", grillejeu[i][j]);
  373.   }
  374.   printf("\n" );
  375.  }
  376. }
  377. }


 
 
 
 
 
 
 

Reply

Marsh Posté le 27-02-2006 à 11:39:46   

Reply

Marsh Posté le 27-02-2006 à 12:01:41    

Salut,
Mauvaise gestion des tableaux,
Mauvaise gestion d'indicage des tableaux dans la fonction Mine(...)() entre autres). (le modulo notemment renvoie un nombre 0 <= n < nb)

Reply

Marsh Posté le 27-02-2006 à 12:46:49    

MAD_DIM a écrit :


Code :
  1. if(choix2 == 1)
  2.    {
  3.     nbl = 8;
  4.     nbc = 8;
  5.     nbmine = 10;
  6.    }
  7.    else
  8.    {
  9.     if(choix2 == 2)
  10.     {
  11.      nbl = 16;
  12.      nbc = 16;
  13.      nbmine = 40;
  14.     }
  15.     else
  16.     {
  17.      if(choix2 == 3)
  18.      {
  19.       nbl = 16;
  20.       nbc = 25;
  21.       nbmine = 99;
  22.      }
  23.      else
  24.      {
  25.       printf("\n                              CHOIX INVALIDE\n" );
  26.       test = false;
  27.       Sleep(1000);
  28.      }
  29.     }
  30.    }



un switch/case est quand-même plus indiqué. Sinon, je connais la fonction "sleep()" mais pas "Sleep()". T'es sûr que ça compile ton truc ???
 

MAD_DIM a écrit :


Code :
  1. void Init(GRILLE &grille, GRILLEJEU &grillejeu, int nbl, int nbc)
  2. {
  3. int i, j;
  4.  
  5. for(i=1;i<=nbl;i++)
  6. {
  7.  for(j=1;j<=nbc;j++)
  8.  {
  9.   grille[i][j] = 0;
  10.  }
  11. }
  12. for(i=1;i<=nbl;i++)
  13. {
  14.  for(j=1;j<=nbc;j++)
  15.  {
  16.   grillejeu[i][j] = '*';
  17.  }
  18. }
  19. }



Un tableau "tab[n]" commence à 0 (et pas 1) ; et s'arrête à "n - 1" (et pas "n" ) !!!
 
Sinon, pour le reste, il y a trop de commentaires...


Message édité par Sve@r le 27-02-2006 à 15:54:26

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 27-02-2006 à 13:52:08    

MAD_DIM a écrit :

J'ai programmé un démineur mais lorsque je vais dans le mode "Personnaliser" que je rentre par exemple 5 lignes, 5 colonnes pour les dimensions et ensuite 25 mines le programme plante mais je ne comprends pas d'ou cela peut provenir ?
Ainsi si quelqu'un pouvait m'aider pour cela ?

Code :
  1. #include<stdio.h>
  2. <...>
  3. void Init(GRILLE &grille, GRILLEJEU &grillejeu, int nbl, int nbc)



Pas du C... (et du mauvais C++...)
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-02-2006 à 17:43:03    

Pourquoi n'est ce pas du C. Typedef fait partie du C mais pour avoir plus facile je fait passer un tableau.

Reply

Marsh Posté le 27-02-2006 à 17:48:06    

strike again boy [:dawa]
 
le probleme c'est pas le typedef [:pingouino]

Reply

Marsh Posté le 27-02-2006 à 17:48:08    

Demande à ton compilo de travailler en C, et pas en C++, tu verras...
 
void Init(GRILLE &grille, GRILLEJEU &grillejeu, int nbl, int nbc)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed