Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
665 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2037336
shivatus
Posté le 20-11-2010 à 14:58:28  profilanswer
 

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" );
       }
}
   
   
   
   

mood
Publicité
Posté le 20-11-2010 à 14:58:28  profilanswer
 

n°2037682
shivatus
Posté le 22-11-2010 à 22:26:04  profilanswer
 

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

n°2037695
h3bus
Troll Inside
Posté le 22-11-2010 à 23:15:35  profilanswer
 

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++
n°2037809
shivatus
Posté le 23-11-2010 à 15:15:41  profilanswer
 

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.

n°2037857
Ydalb
In Crêpes n' Cidre I Trust!
Posté le 23-11-2010 à 16:34:28  profilanswer
 

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
n°2038216
shivatus
Posté le 24-11-2010 à 22:58:08  profilanswer
 

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

n°2038425
ptitchep
Posté le 25-11-2010 à 14:31:30  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
probléme en commande batchprobleme de tri en c. efficacité de l'algorithme..
[C] Parser un arbre représentatif des dossiersProbleme taille de log oracle
problème référencement sur googleProblème sur ma page web
[C#] Php hors ligne ?probleme de SharpSsh avec C#
Problème de "goto" en batch... 
Plus de sujets relatifs à : Débutant, problème master mind en C.


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR