Débutant, problème master mind en C.

Débutant, problème master mind en C. - C - Programmation

Marsh Posté le 20-11-2010 à 14:58:28    

Bonjour
 
Étudiant en licence de biologie, je dois créer le code du jeu master mind, mais voilà je suis bloqué. J'ai fait des recherches sur internet, mais je n'arrive désespérément pas à voir ce qui cloche....  :pt1cable:  
 
Mon problème est que le programme ne lit que 4 caractères sur 5 entré par le joueur 1, et que le 5em caractère ce trouve expulsé à la combinaison suivante. Même chose avec le joueur 2.
Si quelqu'un peut m'aider à comprendre.. :??:  
Merci d'avance.
 
(Je suis sous windows 7 et j'utilise Dev-C++.)
 
Voici mon code:
 
#include <stdio.h>
 
// --------------variables------------
   char C1[5], C2[5];
   
// -----------Introduction aux principes du jeux--------
 
void principes_jeu()
{
  printf("\n" );
  printf("***********************************\n" );
  printf("*                                 *\n" );
  printf("*           Mastermind            *\n" );
  printf("*                                 *\n" );
  printf("***********************************\n" );
  printf("\n" );
  printf(" Vous allez jouez au Mastermind.\n" );
  printf("\nCe jeu consiste à decouvrir une combinaison faite de cinques couleurs\n(rouge, jaune, vert, bleu)\n" );
  printf("\n" );
  printf("Cette combinaison à ete prealablement entre par votre adversaire.\n" );
  printf("vous aurez 5 tentatives pour découvrir cette combinaison de couleur,\npour entre une couleur dans le programmme vous prendrez la \npremiere lettre de la couleur que vous voulez, ex: rouge -> r\n" );
  printf(" B= bonne couleur au mauvais endroit, X= ne ce trouve pas dans la combinaison,N= bonne endroit et bonne couleur.\n" );
  printf("\n" );  
}
 
// -----------processus de saisie---------
   // Joueur 1
void saisie_combi1(int j)
{ j==1;
    scanf("%c %c %c %c %c",&C1[0],&C1[1],&C1[2],&C1[3],&C1[4]);
}
   // Joueur 2
void saisie_combi2 (int j)
{ j==2;
  printf("Joueur 2 entrez une combinaison et tentez de decouvrir la combinaison du joueur 1.\n" );
    scanf("%c %c %c %c %c",&C2[0],&C2[1],&C2[2],&C2[3],&C2[4]);
}
 
 
//-------processus d'affichage des combinaisons---------    
void afficher_combi (int J)
{
 int i;
 if (J==1)
 {
  for (i=0; i<5; i++)
  {
   printf ("%c ",C1[i]);
   printf ("\n" );
  }
 }
 else
  if (J==2)
  {
   for (i=0; i<5; i++)
   {
    printf ("%c ",C2[i]);
    printf ("\n" );
   }
  }
}
 
//--------------processus de comparaison des combinaisons entre joueur 1 et joueur 2---------------    
int compare ()
{
 int i,j,cases=0;
 for (i=0; i<5; i++)
 {
  if (C1[i]==C2[i])
   {  
     printf ("N" ),cases ++;
                 }
  else
      {
      j=1;
      while ( (C2[i]!=C1[(i+j)%5]) && (j<5) )
                           {
      j=j+1;
                           }  
           if (j<5)
         {
         printf ("B" );
         }
           else
         {
         printf ("X" );
         }
               
                   }
          }
 return cases;
}
   
   
// ------------corp du programme-----------
int main ()  
{  
     principes_jeu();
 
    int nb_essais=0; /* le nombre d'essai est à zéro */
  printf("Joueur 1 entre votre combinaison de couleur, avec un espace entre chaques lettres désignant une couleur.\nexemple : r b j r v\n" );
  printf("\n" );
  saisie_combi1 (1);
 
  system ("cls" ); /* Le joueur 1 à saisi la combinaison que le joueur 2 doit découvrir, puis le programme cache cette combinaison au joueur 2.*/
  do
 {
  printf ("\njoueur 2,essai numero:%d\n", nb_essais);
  saisie_combi2 (2);
  afficher_combi (2);
  nb_essais ++;        // le joueur tente de découvrir la combinaison en entrant une combinaison, puis l'essai est ajouté.  
 }
 
 while ( (nb_essais<10) && (compare ()!=5) ); // boucle de calcul du nombre d'essai restant et de la comparaion des combinaisons.
       if (nb_essais<10)
       {
       printf("vous avez gagne !!\n" );
       }
}
   
   
   
   

Reply

Marsh Posté le 20-11-2010 à 14:58:28   

Reply

Marsh Posté le 22-11-2010 à 22:26:04    

Up!!
Personnes peut m'aider ?? :??:

Reply

Marsh Posté le 22-11-2010 à 23:15:35    

J'aime pas scanf :o
 
Change la façon dont tu récupère tes entrées (une boucle avec un getc/printf par exemple) comme ça tu aura la maîtrise sur ce qu'il se passe...


---------------
sheep++
Reply

Marsh Posté le 23-11-2010 à 15:15:41    

Tout d'abord merci d'avoir pris le temps de me répondre.
 
Quelque chose comme ça semble mieux ?
 
void saisie_combi(int j)
{
 int i;
 for (i=0; i<5; i++)
 {
  if (j==1)
  {
   scanf ("%c ", &C1[i]);
  }
 else  
  if (j==2)
  {
   scanf ("%c ", &C2[i]);
  }
    }
}
 
Je ne connais pas la fonction getc/printf, nos cours d'informatique ne sont pas allés jusque là, mais je vais essayé de chercher sur internet.

Reply

Marsh Posté le 23-11-2010 à 16:34:28    

J'ai pas essayé ton code, mais je t'en file un que j'ai fait il y a quelques temps :D (C'est pour jouer tout seul).

 

Les fonctions sont quasi les mêmes, tu devrais pouvoir t'y retrouver :

 
Code :
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <sys/types.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6. #define MAX 3
  7. #define MAX_COUPS 5
  8. typedef int TAB[MAX];
  9. TAB A, B, C;
  10. int gagne;
  11. void saisie_tab(TAB *);
  12. void creer_tableau_aleatoire(TAB *);
  13. void compare_tab(TAB *, TAB, TAB);
  14. int appartient(TAB, int);
  15. void affiche_tab(TAB);
  16. int main()
  17. {
  18. gagne = 1;
  19. creer_tableau_aleatoire(B);
  20. int nb_coups = 1;
  21. do
  22. {
  23.  printf("Essai N°%d/%d\n", nb_coups, MAX_COUPS);
  24.  saisie_tab(&A);
  25.  compare_tab(&C, A, B);
  26.  affiche_tab(&C);
  27.  nb_coups++;
  28. } while (gagne == 0 && nb_coups <= MAX_COUPS);
  29. if (gagne == 1)
  30.  printf("Enfin! Pas trop tôt !! (%d/%d)\n", nb_coups, MAX_COUPS);
  31. else
  32.  printf("Trop tard, vous avez dépassé les %d tentatives autorisées\n", MAX_COUPS);
  33. return EXIT_SUCCESS;
  34. }
  35. // SOUS PROGRAMMES
  36. void creer_tableau_aleatoire(TAB *x)
  37. {
  38. int i = 0, random;
  39. while (i < MAX)
  40. {
  41.  random = rand()%10;
  42.  (*x)[i] = random;
  43.  i++;
  44. }
  45. }
  46. void saisie_tab(TAB *x)
  47. {
  48. int tmp, i=0;
  49. while (i != MAX)
  50. {
  51.  printf("Saisir le numéro %d : ", i+1);
  52.  scanf("%d",&tmp);
  53.  if (tmp > 0 && tmp < 10)
  54.  {
  55.   (*x)[i] = tmp;
  56.   i++;
  57.  }
  58. }
  59. }
  60. void compare_tab(TAB *r, TAB x, TAB y)
  61. {
  62. int i = 0;
  63. gagne = 1;
  64. while (i < MAX)
  65. {
  66.  if (x[i] != y[i])
  67.  {
  68.   if (appartient(B, x[i]) == 0)
  69.    (*r)[i] = -1 * x[i];
  70.   else
  71.    (*r)[i] = 0;
  72.   gagne = 0;
  73.  }
  74.  else
  75.   (*r)[i] = 1;
  76.  i++;
  77. }
  78. }
  79. int appartient(TAB x, int val)
  80. {
  81. int i;
  82. for (i=0; i<MAX; i++)
  83. {
  84.  if (x[i] == val)
  85.   return 0;
  86. }
  87. return 1;
  88. }
  89. void affiche_tab(TAB x)
  90. {
  91. int i;
  92. for (i=0; i<MAX; i++)
  93. {
  94.  printf("%d ", x[i]);
  95. }
  96. printf("\n" );
  97. }


Message édité par Ydalb le 23-11-2010 à 16:35:27

---------------
:o
Reply

Marsh Posté le 24-11-2010 à 22:58:08    

Slt Ydalb  
Merci d'avoir posté ton code je vais regarder si je trouve dedans une solution à mon problème.

Reply

Marsh Posté le 25-11-2010 à 14:31:30    

Salut,
 
Utiliser scanf n'est pas une bonne solution.
La fonction fgets te permet de récupérer une chaîne de caractère en donnant la taille maximale (en comptant le caractère nul de fin il me semble).
Donc tu pourrais avoir quelque chose du genre
 
fgets (tonTableau, 6, stdin); //size = 6 pour le caractère nul. Le tableau doit aussi faire 6 cases.
 
En une instruction tu as rempli ton tableau et de façon propre.
Par contre tu devrais vérifier si les couleurs sont valides, des fois que l'utilisateur tape z.
 
Cette ligne:
j==2;  
ne fait rien du tout.
 
Je ne pense pas que les variables globales soient indispensables pour un programme de master mind ;)
 
Je n'ai pas eu le courage de tout lire par contre. Si tu pouvais éditer ton message en mettant des balises code ça serait pratique.


---------------
deluser --remove-home ptitchep
Reply

Sujets relatifs:

Leave a Replay

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