Projet amelioration jeu du Pendu

Résolu/Fermé
jeandchanel Messages postés 135 Date d'inscription vendredi 10 juin 2016 Statut Membre Dernière intervention 31 mai 2017 - 29 juin 2016 à 11:18
jeandchanel Messages postés 135 Date d'inscription vendredi 10 juin 2016 Statut Membre Dernière intervention 31 mai 2017 - 6 août 2016 à 09:28
Bonjour,
je suis entrain d’améliorer le jeu du pendu (choix entre deux modes, choix d'un niveau parmi trois, rejouer une autre partie? etc...). le mode solo fonctionne a merveille mais j'ai un soucis avec le mode multi : lorsque le mot secret est saisis, il se passe deux choses, 1-si le mot secret est inférieur ou égal a 4, le système choisit un mot de passe dans le dictionnaire de mot 'dico.txt' alors qu'il devrait plutôt prendre en compte le mot saisis au clavier, 2- si le mot secret est supérieur a 4 alors la c'est la cata! le jeu s’arrête immédiatement.
voici d'ailleurs le code du jeu :


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

#define SOLO 1
#define MULTI 2

#define TAILLE_MAX 100


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

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

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

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

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

int choixMotSecretAleatoire(NiveauJeu niveauJeu)
{
    srand(time(NULL));
    return (rand() % niveauJeu.nombreMot);
}

int demanderMotSecret(NiveauJeu niveauJeu)
{
  int nombreMot;
  char motSecret[TAILLE_MAX];
  printf("\n");
 
     printf("Entrez le mot secret : ");
     scanf("%s", &motSecret[TAILLE_MAX]);
  
  printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
  
  return motSecret[TAILLE_MAX];
}

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

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

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

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

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


int tireMotAleatoire(char motSecret[])
{
     int caractereLu = 0, nombreMot = 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 == '\n')
        nombreMot++;
        
      }while(caracterelu != EOF);
     
     int numMotSecret = nombreAleatoire(nombreMot);
      
      rewind(dico);
      
      while(numMotSecret > 0)
      {
          caractereLu = fgetc(dico);
          if(caractereLu == '\n')
          numMotSecret--;
      }
      
      fgets(motSecret, 100, dico);
      motSecret[strlen(motSecret) - 1] = '\0';
   
       fclose(dico);
    }
   
    return 1;
}



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 == '\n')
        nombreMot++;
        
      }while(caracterelu != EOF);
      
    }
    
    return nombreMot;
}


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

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

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


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


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


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




int main(int argc, char* argv[])
{
    char motSecret[100] = {0};
    int i = 0, choice = 0, caractereLu = 0, numMotSecret = 0, tailleMot = 0;
    char lettreSaisie = 0;
    int* lettreTrouvee = NULL;
   
    printf("\n");  
    debutPartie();
    
 do
 { 
    
    
    int modeJeu = demanderModeJeu(modeJeu);
    printf("Bienvenu au mode %s !\n", modeJeu == SOLO ? "Solo" : "Multi");
   
    NiveauJeu niveauJeu = demanderNiveauJeu();
    printf("Bienvenu au niveau %s !\n", niveauJeu.nomNiveau);
    
    int nbCoupsRestants = niveauJeu.coupMax;
    
    int nombreMystere = modeJeu == SOLO ? choixMotSecretAleatoire(niveauJeu) : demanderMotSecret(niveauJeu);
   
    if(! tireMotAleatoire(motSecret))
    exit(0);
   
    tailleMot = strlen(motSecret);
    lettreTrouvee = malloc(tailleMot * sizeof(int));
   
 if(lettreTrouvee == NULL)
 {
    printf("Impossibe d'ouvrir le fichier dico.txt !\n");
    exit(0);
 }
 
    for(i = 0; i < tailleMot; i++)
    lettreTrouvee[i] = 0;
  
  do
  {
    printf("\n\nIl vous reste %d coups a jouer ! ", nbCoupsRestants);
  
    printf("\nQuel est le mot secret ? ");
    
    lettreTrouvee[i] = afficherLettre(lettreTrouvee, motSecret, tailleMot);
    
    printf("\nProposez une lettre ");
    lettreSaisie = lireCaractere();
    
    if(!rechercherLettre(lettreSaisie, motSecret, lettreTrouvee))
    {
      nbCoupsRestants--;
      printf("Cette lettre ne figure pas dans le mot secret \n");
    }
    
  }while(nbCoupsRestants > 0 && !gagnerJeu(lettreTrouvee, tailleMot));
 
  if(gagnerJeu(lettreTrouvee, tailleMot))
    {
       printf("\n\n");
       printf("GAGNE, le mot secret etait bien %s !!!\n\n", motSecret);
       printf("Partie terminee !\n\n");
    }else
    { 
       printf("\n\n");
       printf("PERDU, le mot secret etait %s !!!\n\n", motSecret);
       printf("Partie terminee !\n\n");
    }
    
 }while(rejouerPartie(choice));
    printf("\n\n\n");
    printf("Partie terminee !!!\n");
 
       return 0;
    
}





A voir également:

1 réponse

paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
30 juin 2016 à 17:01
Je crois que tu ne comprends pas très bien ce que signifie
motSecret[TAILLE_MAX]
.
- Dans une déclaration ou un paramètre de fonction (par exemple:
char motSecret[TAILLE_MAX];
), cela signifie "Allouer automatiquement un tableau de TAILLE_MAX éléments de type char (seulement dans l'exemple, pour le type char) appelé motSecret". Si c'est un paramètre de fonction, le tableau n'est pas alloué et seule son adresse est passée.
- Dans une expression (par exemple
return motSecret[TAILLE_MAX];
), cela signifie "Donner la valeur se trouvant à la TAILLE_MAXème case du tableau (ou plutôt la (TAILLE_MAX+1)ème case du tableau, car il ne faut pas oublier que la première case a l'index 0)."

Évidemment je simplifie, pour le compilateur la signification est un peu plus complexe, mais pour un humain ça revient exactement à ça ^^

Que dois-tu faire donc ? Une fonction qui ne retourne rien (donc de type
void
), et qui prend en paramètre un pointeur sur la chaîne de caractères dans laquelle elle met le mot.

De plus, ta fonction actuelle prend un paramètre "niveaujeu" qui n'est pas utilisé. Ça ne pose pas de problème de fonctionnement, mais ce n'est pas propre et certains compilateurs te donneront un Warning "unused parameter". Autre chose encore, ta fonction déclare une variable "nombreMot" qui elle non plus n'est pas utilisée...

void demanderMotSecret(char* mot)
{
  printf("\n"
         "Entrez le mot secret : ");
  fgets(mot, TAILLE_MAX, stdin); // Évite les buffer overflow, contrairement à scanf ;-)
  
  printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
}
0
jeandchanel Messages postés 135 Date d'inscription vendredi 10 juin 2016 Statut Membre Dernière intervention 31 mai 2017
22 juil. 2016 à 10:28
bonjour Paly2,
merci pour tes conseilles, j'ai fait cette correction mais cela n'a pas résolu le problème.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
22 juil. 2016 à 17:32
Salut paly2,

Dans une déclaration ou un paramètre de fonction (par exemple:
char motSecret[TAILLE_MAX];
), cela signifie "Allouer automatiquement un tableau

Oui dans une déclaration mais pas dans un paramètre de fonction. Dans le paramètre de fonction, cela est remplacé par un pointeur.
0
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
24 juil. 2016 à 14:02
Oui, je l'ai précisé juste après:
Si c'est un paramètre de fonction, le tableau n'est pas alloué et seule son adresse est passée.
0
jeandchanel Messages postés 135 Date d'inscription vendredi 10 juin 2016 Statut Membre Dernière intervention 31 mai 2017 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
25 juil. 2016 à 08:32
Bonjour et merci pour votre reponse,
j'ai fait toutes ces corrections mais je ne suis pas satisfait.
s'il vous plait, executez le jeu et observez le mode Multi, il ne fonctionne pas correctement !!!
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840 > paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018
25 juil. 2016 à 11:22
Très juste :-)
0