FORUM

forum / C et C++ / Le Pendu

Vous n êtes pas connecté

Page :

Le Pendu

Auteurs Messages
Anonyme Posté à 16h46 le 28 Jul 16

Membre inscrit le 09/06/2013
Messages : 0
Localisation :
Bonjour,
J'ai un soucis avec le mode Multi du jeu "Le pendu" que j'ai code en langage C. Des que le joueur rentre le nombre de termes et le mot de passe le jeu s'arrete brutalement !!!

Voici le code complet du jeu :


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

#define SOLO 1
#define MULTI 2



typedef enum Bool Bool;
enum Bool
{
    TRUE, FALSE
};

typedef struct NiveauJeu NiveauJeu;
struct NiveauJeu
{
    char nomNiveau[100];
    int min;
    int nombreMot;
    int coupMax;
};

NiveauJeu niveaux[] =           
{                            
    {"Facile", 0, 20, 15},
    {"Moyen", 0, 20, 10},
    {"Difficile", 0, 20, 7}
};

int demanderModeJeu()
{
    int modeJeu;
    printf("
");
    printf("MODE DE JEU
");
    printf("Bien vouloir choisir un mode de jeu !
");
    printf("1. Mode Solo
2. Mode Multi
");
    do
    {
        printf("Votre choix ? ");
        scanf("%d", &modeJeu);
    }while(modeJeu < 1 || modeJeu > 2);
   
    return modeJeu;
}


NiveauJeu demanderNiveauJeu()
{
    int choixNiveau;
    printf("
");
    printf("NIVEAU DE JEU
");
    printf("Bien vouloir choisir un niveau de jeu !
");
    printf("1. Facile
2. Moyen
3. Difficile
");
    do
    {
      printf("Votre choix ? ");
      scanf("%d", &choixNiveau);
    }while(choixNiveau < 1 || choixNiveau > 3);
   
    return niveaux[choixNiveau - 1];
  
}

int demanderNombre(int nbCoupsRestants)
{
  int nombreSaisi;
  printf("
");
  printf("Attention, il vous reste seuleument %d coups
", nbCoupsRestants);
  printf("Quel est le nombre ? ");
  scanf("%d",&nombreSaisi);
 
  return nombreSaisi;
}


int demanderMotSecret()
{
  int tailleMot = 0, i = 0;
  char *motSecret = NULL;
 
  printf("Nombre de termes ? ");
  scanf("%d", &tailleMot);
 
 motSecret = malloc(tailleMot * sizeof(char));
 if(motSecret == NULL)
 {
     exit(0);
 }
 
     printf("mot secret ? ");
     for(i = 0; i < tailleMot; i++)
     {
        scanf("%s", &motSecret[i]);
     }
 
    return *motSecret;
 }


int nombreAleatoire(int nombreMot)
{
   
    srand(time(NULL));
    return (rand() % nombreMot); //le nombre de mot contenu dans le dictionnaire.
}

void debutPartie()
{
   printf("
");
   printf("**************************************
");
   printf("************LE JEU DU PENDU***********
");
   printf("********Code par Jean Dechanel********
");
   printf("**************************************

");
}

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

int lire(char* chaine, int longueurChaine)
{
     char* positionEntree = NULL;
   
    if(fgets(chaine, longueurChaine, stdin) != NULL)
    {
        positionEntree = strchr(chaine, '
');
       
        if(positionEntree != NULL)
        {
           *positionEntree = '';
        }return 1;
    }else
    {
       viderBuffer();
       return 0;
    }
   
}

long lireLong()
{
    char nombreTexte[100] = {0};
    if(lire(nombreTexte, 100))
    {
        return strtol(nombreTexte, NULL, 10);
    }else
    {
        viderBuffer();
        return 0;
    }
}


int tireMotAleatoire(char motSecret[])
{
     int caractereLu = 0, nombreMot = 0, numMotSecret = 0;
    
     FILE* dico = NULL;
    int caracterelu = 0;
    dico = fopen("/home/ubuntu/workspace/dico.txt", "r");
   
    if(dico == NULL)
    exit(0);
   
    else
    {
      do
      {
        caracterelu = fgetc(dico);
        if(caracterelu == '
')
        nombreMot++;
       
      }while(caracterelu != EOF);
    
      numMotSecret = nombreAleatoire(nombreMot);
     
      rewind(dico);
     
      while(numMotSecret > 0)
      {
          caractereLu = fgetc(dico);
          if(caractereLu == '
')
          numMotSecret--;
      }
     
      fgets(motSecret, 100, dico);
      motSecret[strlen(motSecret) - 1] = '';
  
       fclose(dico);
    }
  
    return EXIT_FAILURE;
}


int afficherMotMasque(char motSecret[], int lettresTrouvees[], int taille)
{
  int i;
  for (i = 0 ; i < taille ; i++)
  {
    if (lettresTrouvees[i])
    printf("%c", motSecret[i]);
    else
    printf("*");
  }
 
  return motSecret[i];
 
}



int compterMot(int nombreMot)
{
    FILE* dico = NULL;
    int caracterelu = 0;
    dico = fopen("/home/ubuntu/workspace/dico.txt", "r");
   
    if(dico == NULL)
    exit(0);
   
    else
    {
      do
      {
        caracterelu = fgetc(dico);
        if(caracterelu == '
')
        nombreMot++;
       
      }while(caracterelu != EOF);
     
    }
   
    return nombreMot;
}


Bool rejouerPartie(long choice)
{
    printf("Voulez-vous rejouer une autre Partie ?
");
    printf("1. Oui
2. Non
");
    do
    {
        printf("Votre choix ? ");
        choice = lireLong();
    }while(choice < 1 || choice > 2);
   
    return choice == 1;
}

int gagnerJeu(int lettresTrouvees[], int tailleMot)
{
  int remplir = 1;
  int i = 0;
  for(i = 0; i < tailleMot; i++)
  {
    if(lettresTrouvees[i] == 0)
    remplir = 0;
   
  }
   
 
  return remplir == 1;
}


int lireCaractere()
{
  char caractere = 0;
  caractere = getchar();
  caractere = toupper(caractere);
  while(getchar() != '
');
 
  return caractere;
}


int rechercherLettre(char lettreSaisie, char motSecret[], int lettresTrouvees[])
{
    int i = 0;
    int bonneLettre = 0;
   for(i = 0; motSecret[i] != ''; i++)
   {
       if(lettreSaisie == motSecret[i])
       {
           bonneLettre = 1;
           lettresTrouvees[i] = 1;
       }
   }
  
   return bonneLettre == 1;
}


void afficherLettre(int lettresTrouvees[], char motSecret[], int tailleMot)
{
    int i = 0;
    for(i = 0; i < tailleMot; i++)
    {
      if(lettresTrouvees[i])
      printf("%c", motSecret[i]);
      else
      printf("*");
    }
   
   
}




int main(int argc, char* argv[])
{
    char motSecret[100] = "";
    int i = 0, choice = 0, caractereLu = 0, numMotSecret = 0, tailleMot = 0, modeJeu = 0;
    int nbCoupsRestants = 0;
    char lettreSaisie = 0;
    int* lettresTrouvees = NULL;
  
    printf("
"); 
    debutPartie();
   
 do
 {
   
    modeJeu = demanderModeJeu();
    printf("Bienvenu au mode %s !
", modeJeu == SOLO   ? "Solo" : "Multi");
  
    NiveauJeu niveauJeu = demanderNiveauJeu();
    printf("Bienvenu au niveau %s !
", niveauJeu.nomNiveau);
   
    nbCoupsRestants = niveauJeu.coupMax;
   
    *motSecret = modeJeu == SOLO ? tireMotAleatoire(motSecret) : demanderMotSecret();
  
    if(! tireMotAleatoire(motSecret))
    exit(0);
  
    tailleMot = strlen(motSecret);
    lettresTrouvees = malloc(tailleMot * sizeof(int));
  
 if(lettresTrouvees == NULL)
 {
    printf("Impossibe d'ouvrir le fichier dico.txt !
");
    exit(0);
 }
 
    for(i = 0; i < tailleMot; i++)
    lettresTrouvees[i] = 0;
 
  do
  {
    printf("

Il vous reste %d coups a jouer ! ", nbCoupsRestants);
 
    printf("
Quel est le mot secret ? ");
   
    afficherLettre(lettresTrouvees, motSecret, tailleMot);
   
    printf("
Proposez une lettre ");
    lettreSaisie = lireCaractere();
   
    if(!rechercherLettre(lettreSaisie, motSecret, lettresTrouvees))
    {
      nbCoupsRestants--;
      printf("Cette lettre ne figure pas dans le mot secret
");
    }
   
  }while(nbCoupsRestants > 0 && !gagnerJeu(lettresTrouvees, tailleMot));
 
  if(gagnerJeu(lettresTrouvees, tailleMot))
    {
       printf("

");
       printf("GAGNE, le mot secret etait bien %s !!!

", motSecret);
       printf("Partie terminee !

");
    }else
    {
       printf("

");
       printf("PERDU, le mot secret etait %s !!!

", motSecret);
       printf("Partie terminee !

");
    }
   
 }while(rejouerPartie(choice));
    printf("


");
    printf("Partie terminee !!!
");
 
       return 0;
   
}

Samomoi

Page :