Le Mastermind Numerique

Fermé
jeandchanel Messages postés 135 Date d'inscription vendredi 10 juin 2016 Statut Membre Dernière intervention 31 mai 2017 - Modifié par jeandchanel le 30/09/2016 à 10:40
 Utilisateur anonyme - 6 oct. 2016 à 15:38
Bonjour,
je viens de terminer de coder le "Mastermind Numerique" et je publie ici le code complet pour recevoir des critiques constructives, des corrections en cas d'erreurs et des conseils de la part de vous les expert en C, merci d'avance.

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

#include "jeu.h"




void viderBuffer();
int lire(char* chaine, int longueurChaine);
long lireLong();
void debutPartie();
long demanderModeJeu(long modeJeu);
Niveau demanderNiveauJeu(long choixNiveau);
void nombreAleatoire(char *combinaison, Niveau niveauJeu);
void combiAleatoire(char *combinaison, int nbChiffre);
bool rejouerPartie();


int main()
{
   int nbCoupsRestants = 0, nbCoups = 0, nbChiffre = 0, compteurCoups = 0;
   int chiffresBP = 0, chiffresMP = 0, i, j, k;
   char combinaison[TAILLE_MAX], combijeu[TAILLE_MAX], jeu[TAILLE_MAX];
   long modeJeu = 0, choixNiveau = 0;
   Niveau niveauJeu;
   bool gagne = 0;
   time_t t;
   srand((unsigned) time(&t));
   
   debutPartie();
   
 do
 {
   modeJeu = demanderModeJeu(modeJeu);
   printf("\n\nBienvenu au mode %s !", modeJeu == SOLO ? "Solo" : "Multi");
   
   niveauJeu = demanderNiveauJeu(choixNiveau);
   printf("\n\nBienvenu au niveau %s !", niveauJeu.nomNiveau);
   
  if(modeJeu == SOLO)
  {
      nbCoupsRestants = niveauJeu.coupsMax; 
      printf("\n\nLa combinaison a trouver comporte %d chiffres", niveauJeu.nbChiffre);
      
      nombreAleatoire(combinaison, niveauJeu);
      
    for(i = 0; i < niveauJeu.coupsMax && gagne == 0 ; i++) 
    {
       printf("\n\nAttention, il vous reste %d coups", nbCoupsRestants);
       do
       {
         printf("\n\nEssai N°%d : ", i+1);
         lire(jeu, TAILLE_MAX);
         if(strlen(jeu) != niveauJeu.nbChiffre)
         printf("\nEntrez %d chiffres s'il vous plait !", niveauJeu.nbChiffre);
       }while(strlen(jeu) != niveauJeu.nbChiffre);
       
       nbCoupsRestants--; 
  
       if(!strncmp(jeu, combinaison, niveauJeu.nbChiffre)) 
          gagne = 1;
  
       else
       {
          strcpy(combijeu, combinaison);
          chiffresBP = 0; 
          chiffresMP = 0;
     
          for(j = 0; j < niveauJeu.nbChiffre; j++)
          {
              if(jeu[j] == combijeu[j])
              {
              chiffresBP++;
              jeu[j] = 'B';
              combijeu[j] = 'b';
              }
          }

          for(j = 0; j < niveauJeu.nbChiffre; j++)
          {
              for(k = 0; k < niveauJeu.nbChiffre; k++)
       
              if(j != k && jeu[j] == combijeu[k])
              {
                 jeu[j]='M';
                 combijeu[k]='m'; 
                 chiffresMP++;
              }
          }
              printf("\n\nChiffre(s) bien place(s) : %d \n\nChiffre(s) mal place(s) : %d ", chiffresBP, chiffresMP);
       }
    
   }
   
  }else 
  {
     do
     {
       printf("\n\nEn combien de coups jouez vous ? : ");
       nbCoups = lireLong();
       if(nbCoups > 16)
       printf("\nCoups Max = 16 !");
     }while(nbCoups > 16);
   
     do
     {
       printf("\n\nAvec combien de chiffres ? : ");
       nbChiffre = lireLong();
       if(nbCoups > 6)
       printf("\nChiffre Max = 6 !");
     }while(nbChiffre > 6);
   
       combiAleatoire(combinaison, nbChiffre);

       for(i = 0; i < nbCoups && gagne == 0 ; i++) 
       {
           printf("\n\nAttention, il vous reste %d coups", nbCoups);
           nbCoups--;
           do
           {
              printf("\n\nEssai N°%d : ", i+1);
              lire(jeu, TAILLE_MAX);
              if(strlen(jeu) != nbChiffre)
              printf("\nEntrez %d chiffres s'il vous plait !", nbChiffre);
           }while(strlen(jeu) != nbChiffre);
           
            
            compteurCoups++;
            nbCoupsRestants = compteurCoups;
            
           if(!strncmp(jeu, combinaison, nbChiffre)) 
             gagne = 1;
  
           else
           {
             strcpy(combijeu, combinaison);
             chiffresBP = 0; 
             chiffresMP = 0;
     
          for(j = 0; j < nbChiffre; j++)
          {
              if(jeu[j] == combijeu[j])
              {
              chiffresBP++;
              jeu[j] = 'B';
              combijeu[j] = 'b';
              }
          }

          for(j = 0; j < nbChiffre; j++)
          {
              for(k = 0; k < nbChiffre; k++)
       
              if(j != k && jeu[j] == combijeu[k])
              {
                 jeu[j]='M';
                 combijeu[k]='m'; 
                 chiffresMP++;
              }
          }
              printf("\nChiffre(s) bien place(s) : %d \nChiffre(s) mal place(s) : %d ", chiffresBP, chiffresMP);
       }
    
   }
  }
   
   if(!gagne || nbCoupsRestants == 0 )
   { 
      printf("\n\nPerdu, la bonne combinaison etait : %s !", 
      modeJeu == SOLO ? combinaison : combinaison);
      printf("\n\n\n\nPartie terminee ! ");
      
   }else
   { 
      printf ("\n\nBravo, vous avez trouve la bonne combinaison en %d coups !", 
      modeJeu == SOLO ? (niveauJeu.coupsMax - nbCoupsRestants) : compteurCoups); 
      printf("\n\n\n\nPartie terminee ! ");   
   }
   
 }while(rejouerPartie());
   
     return EXIT_SUCCESS;
   
}






Voici d'ailleurs le déroulement d'une partie en mode Solo :


MODE DE JEU
Bien vouloir choisir un mode de jeu !
1. Mode Solo
2. Mode Multi
Votre choix ? : 1


Bienvenu au mode Solo !

NIVEAU DE JEU
Bien vouloir choisir un niveau de jeu !
1. Facile
2. Moyen
3. Difficile
Votre choix ? : 1


Bienvenu au niveau Facile !

La combinaison a trouver comporte 4 chiffres

Attention, il vous reste 15 coups

Essai N°1 : 1234


Chiffre(s) bien place(s) : 0

Chiffre(s) mal place(s) : 2

Attention, il vous reste 14 coups

Essai N°2 :

A voir également:

2 réponses

Pierre1310 Messages postés 8564 Date d'inscription lundi 21 décembre 2015 Statut Membre Dernière intervention 21 juillet 2020 649
30 sept. 2016 à 10:31
Salut,

Ta fonction debutPartie on ne la voit pas, tu l'as déclarée dans un autre fichier non?

Déclarer des variables globales est très déconseillé, c'est étonnant que votre prof ne vous l'ai pas dis.

Je trouve ça dommage que tu ais fais tout un bloc "moche", ce n'est pas facile/agréable à lire, tu aurais du utiliser des prototypes, c'est mieux pour toi et pour ton lecteur.
0
jeandchanel Messages postés 135 Date d'inscription vendredi 10 juin 2016 Statut Membre Dernière intervention 31 mai 2017
1 oct. 2016 à 08:36
Bonjour,

Ta fonction debutPartie on ne la voit pas, tu l'as déclarée dans un autre fichier non?
Il s'agit de la compilation séparée ! la fonction debutPartie() se trouve dans le fichier jeu.c
0
jeandchanel Messages postés 135 Date d'inscription vendredi 10 juin 2016 Statut Membre Dernière intervention 31 mai 2017
3 oct. 2016 à 16:19
Bonjour,
J'ai un soucis avec mon IDE (Cloud9, IDE en ligne !) . Je ne sais pas si c'est moi ou c'est l'IDE qui déconne? Enfin bon, voici le problème, je voudrais faire la compilation séparée et j'ai donc créer 02 fichiers pour mon jeu a savoir jeu.c (qui contient toutes les fonctions a utiliser dans mon jeu) et jeu.h (qui contient tous les prototypes des fonctions créer dans jeu.c) ensuite j'ai inclus le fichier jeu.h dans les fichiers jeu.c et main.c (qui s'appelle mastermind.c) voici d'ailleurs les 03 fichiers :

//fichier jeu.h en entier pour le jeu " Mastermind Numerique "

#ifndef DEF_JEU
#define DEF_JEU

#define SOLO 1
#define MULTI 2

typedef struct Niveau Niveau;
struct Niveau
{
    char nomNiveau[100];
    int coupsMax;
    int nbChiffre;
};

Niveau niveaux[] =            
{                             
    {"Facile", 15, 4},
    {"Moyen", 12, 5},
    {"Difficile", 10, 6}
};

extern void viderBuffer();
extern int lire(char* chaine, int longueurChaine);
extern long lireLong();
extern void debutPartie();
extern long demanderModeJeu(long modeJeu);
extern Niveau demanderNiveauJeu(long choixNiveau);
extern void nombreAleatoire(char *combinaison, Niveau niveauJeu);
extern void combiAleatoire(char *combinaison, int nbChiffre);
extern bool rejouerPartie();

#endif

//Un extrait du fichier jeu.c pour le jeu " Mastermind Numerique "

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

#include "jeu.h"

void viderBuffer()
{
    int c = 0;
    while(c != '\n' && c != EOF)
    {
        c = getchar();
    }
}


//Un extrait du fichier mastermind.c

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

#include "jeu.h"

#define TAILLE_MAX 25

void viderBuffer();




...Mais a ma grande surprise voici la reponse de mon IDE (Cloud9) :

Running "/home/ubuntu/workspace/Le_Mastermind2/mastermind.c"
/tmp/ccCkUGpF.o: In function `main':
mastermind.c:(.text+0x90): undefined reference to `debutPartie'
mastermind.c:(.text+0x9f): undefined reference to `demanderModeJeu'
mastermind.c:(.text+0xe7): undefined reference to `demanderNiveauJeu'
mastermind.c:(.text+0x259): undefined reference to `nombreAleatoire'
mastermind.c:(.text+0x2ad): undefined reference to `lire'
mastermind.c:(.text+0x4bd): undefined reference to `lireLong'
mastermind.c:(.text+0x4fd): undefined reference to `lireLong'
mastermind.c:(.text+0x53b): undefined reference to `combiAleatoire'
mastermind.c:(.text+0x596): undefined reference to `lire'
mastermind.c:(.text+0x831): undefined reference to `rejouerPartie'
collect2: error: ld returned 1 exit status


Process exited with code: 1

Espérant avoir posé clairement le problème, j’attends impatiemment vos réponses, merci d'avance a vous les experts du langage C.
0
Pierre1310 Messages postés 8564 Date d'inscription lundi 21 décembre 2015 Statut Membre Dernière intervention 21 juillet 2020 649
3 oct. 2016 à 16:28
Il faut les déclarer en public les prototypes il me semble.
0
jeandchanel Messages postés 135 Date d'inscription vendredi 10 juin 2016 Statut Membre Dernière intervention 31 mai 2017 > Pierre1310 Messages postés 8564 Date d'inscription lundi 21 décembre 2015 Statut Membre Dernière intervention 21 juillet 2020
3 oct. 2016 à 16:49
comment ca ? un exemple s'il vous plait !
0
Pierre1310 Messages postés 8564 Date d'inscription lundi 21 décembre 2015 Statut Membre Dernière intervention 21 juillet 2020 649
3 oct. 2016 à 21:48
public void viderBuffer();
0
jeandchanel Messages postés 135 Date d'inscription vendredi 10 juin 2016 Statut Membre Dernière intervention 31 mai 2017 > Pierre1310 Messages postés 8564 Date d'inscription lundi 21 décembre 2015 Statut Membre Dernière intervention 21 juillet 2020
4 oct. 2016 à 08:45
Ok, j'essaie et je vous rend compte !
0
jeandchanel Messages postés 135 Date d'inscription vendredi 10 juin 2016 Statut Membre Dernière intervention 31 mai 2017 > Pierre1310 Messages postés 8564 Date d'inscription lundi 21 décembre 2015 Statut Membre Dernière intervention 21 juillet 2020
4 oct. 2016 à 10:47
@Pierre1310
Ca ne marche pas !
0