Mastermind programme C

Fermé
Thocra - 15 mars 2012 à 19:03
 Thocra - 15 mars 2012 à 21:24
Bonjour,

Je suis étudiant en seconde années de SPI et je viens de faire un programme du jeu MASTERMIND pour mes cours. Le programme marche seulement 1 chose ne fonctionne pas et je n'arrive pas a trouver quoi...
Voici mon programme: Merci d'avance pour votre aide :)


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

typedef int Code [4];
Code code_secret;
Code proposition;


/*Instruction des regles du jeu*/
int menu()
{  printf("                     ********************\n");
   printf("                     *                  *\n");
   printf("                     *    Mastermind    *\n");
   printf("                     *                  *\n");
   printf("                     ********************\n");
   printf("\n");
   printf("Entrer des valeurs comprise entre 1 et 6 afin d'obtenir le code\n");
   printf("mastermind. Chaques chiffres doivent etre precedes d'un espace.\n");
   printf("================================================================");
   printf("\n1 = Noir  2 = Bleu  3 = Vert  4 = Blanc  5 = Rouge  6 = Jaune\n");
   printf("================================================================\n\n\n");
   }

/*Choix de la combinaison par l'utilisateur*/    
void choix()
{  int k;
   for(k=0;k<4;k++)
   {  scanf("%d",&proposition[k]);
   }
    }

/*Verification des couleurs bien placées*/ 
int verif_N(int N)
{   int i;
    for(i=0;i<4;i++)
    {
    if(code_secret[i]==proposition[i])
    N++;
    }
    return N;
}

/*Verification des couleurs mal placées*/    
int verif_B(int B)
{   int i,k;
    for(k=0;k<4;k++)
    {
    for(i=0;i<4;i++)
    {    if(code_secret[i]==proposition[k])
             {   if(i!=k)
                  B++;
                    }
               }
    } 
    return B;   
}

/*Commencement du programme*/    
main()
{   
int i,j,k,B,N,Jeu;
int w,x,y,z;

/*Afficher le menu*/
menu();   

/*Choix de la combinaison par l'ordinateur*/
    srand(time( NULL ));
  int a=1;
  int b=6;
  for(i=0;i<4;i++)
  {
  code_secret[i]=rand()%b+a;
  }

/*Empeche le code aleatoire de posseder deux couleurs identiques*/
i=0;
while(code_secret[i+2]==code_secret[i+3])
  code_secret[i+2]=rand()%b+a;

while(code_secret[i+1]==code_secret[i+3]||code_secret[i+1]==code_secret[i+2])
  code_secret[i+1]=rand()%b+a;
  
while(code_secret[i]==code_secret[i+3]||code_secret[i]==code_secret[i+2]||code_secret[i]==code_secret[i+1])
  code_secret[i]=rand()%b+a;  
 
  
  
  

/*Boucle afin d'avoir seulement 10 essaies*/           
for(Jeu=0;Jeu<10;Jeu++)
{
                 
/*Choix des valeurs par l'utilisateur*/  
 printf("Entrer des valeurs:");
 choix();
 
/*Verification du code utilisateur par rapport au code mastermind*/
       N = verif_N(N);
       
       B = verif_B(B);   
                   



if(N==4)
 printf("====> GAGNE <====");
else
 printf("Juste=%d  Mal places=%d\n",N,B);
 }

system("pause");
return 0;
}





2 réponses

mamiemando Messages postés 33372 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 novembre 2024 7 802
15 mars 2012 à 20:57
Plusieurs conseils au préalable :

- attention à l'indentation : normalement quand on ouvre une accolade, on passe à la ligne. Certains passent à la ligne avant d'ouvrir une accolade, d'autres pas. Note que si ton environnement de développement est digne de ce nom, il devrait t'aider à indenter.

// Indentation 1
if(x == 1) {
  printf("%d\n", x);
}

// Indentation 2
if(x == 1)
{
  printf("%d\n", x);
}


- attention aux notations : normalement seuls les constantes définies par #define sont écrites en majuscules. Normalement on note les variables comme ceci : ma_variable ou maVariable. Idem pour les fonctions : maFonction ou ma_fonction

void ma_fonction(int ma_variable1, int ma_variable2) {
  int ma_variable3;
  //...
}


- pour les types (structures) en général on les notes aussi en minuscules par exemple ma_structure. Personnellement je les postfixes "_t" : ma_structure_t. Sous windows les types sont parfois notés tout en majuscules (personnellement je trouve ça moche). Une notation inspirée des langages objets consiste à les faire commencer par une majucule, par exemple MaStructure.

- n'utilise jamais system(...) : c'est mal, car ça dépend du système sur lequel tu lances ton programme. Si écrire system("pause") a du sens sous windows, ce n'est pas le cas sous tous les autres systèmes (linux, mac etc...). Tu peux utiliser par exemple "getchar();" à la place

- attention au type de retour du main, que tu as oublié d'indiquer et qui est sensé être un int (0 si le programme s'est bien terminé, un code d'erreur sinon).

int main(){
  //...
  return 0;
}


- pour compiler, active (et résous) tous les warnings.

- quand tu manipules un entier je t'invite à expliciter quand il s'agit d'un unsigned.

- dans la fonction menu, tu n'as pas de raison d'appeler x fois printf, tu peux écrire directement :

printf(
  "ma ligne 1\n"
  "ma ligne 2\n"
  "ma ligne 3\n"
  //...
);


- je t'invite à donner des noms de variables parlant, une seule lettre généralement, c'est lisible sur le coup, mais rapidement ça devient le bazar :-)

- dans le mastermind, rien n'interdit deux fois la même couleur dans le code il me semble ;-)

- au niveau de choix(), tu devrais contrôler avec scanf si tu es parvenu ou non à lire un entier.

- évites les variables globales c'est une très mauvaise habitude de programmation !

- lors de l'appel de verifN et verifB tu passes en paramètre un entier non initialisé. En plus (cf cours sur le C), tu passes une recopie (qui ne sert à rien). Ainsi ces deux fonctions devraient plutôt ressembler à ceci :

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

typedef enum _couleur_t{
    NOIR, BLANC, ROUGE, VERT, JAUNE, BLEU
} couleur_t;

unsigned compter_bien_places(
    const couleur_t *code,
    const couleur_t *proposition,
    size_t taille // 4
) {
    unsigned i, num_ok = 0;
    for(i = 0; i < taille; i++) {
        if(code[i] == proposition[i]) num_ok++;
    }
    return num_ok;
}

int main(){
    const size_t taille = 4;
    couleur_t code[taille];
    couleur_t proposition[taille];
    code[0] = NOIR;
    code[1] = BLANC;
    code[2] = ROUGE;
    code[3] = BLEU;
    proposition[0] = NOIR;
    proposition[1] = VERT;
    proposition[2] = ROUGE;
    proposition[3] = BLEU;
    printf("%d\n", compter_bien_places(code, proposition, taille));
    return 0;
}


Bonne chance
3