Partage
  • Partager sur Facebook
  • Partager sur Twitter

Programme du pendu en c

Language C sur vs code

    25 avril 2023 à 15:44:19

    Bonsoir ou bonjour a tous,

    J'ai récemment essayé de faire un pendu en C voici le main.c, dico.c et .h et le fichier dico.txt ou l'on met les mots a trouvé.

    le problème est que quand je rentre une lettre (bonne) elle ne change rien comme voulu.
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    #include <time.h>
    #include "dico.h"
     
    int main () {
       char mot_secret [100] = {0};
       int *lettreTrouvee = NULL;
       int nombre_mot = 0;
       int mot_choisi = 0;
       char maLettre = 0;
       int compteur = 10;
       int i;
       int taille_mot_secret = 0;
       char caractere = 0;
       FILE *fichier = NULL;
       srand (time (NULL));
       fichier = fopen ("dico.txt", "r");
       if (fichier != NULL) {
          printf ("Bienvenue dans le Pendu !\n\n");
          nombre_mot = nombre_mot_fichier (fichier); // stocke le nombre de mots contenus dans le fichier 
          rewind (fichier);
          mot_choisi = piocher_mot (nombre_mot); // stocke un numero (mot) se trouvant dans le fichier 
          rewind (fichier);
          while (mot_choisi > 0) {
             caractere = fgetc (fichier);
             if (caractere == '\n') {
                mot_choisi--;       // On se place devant le mot choisi 
             }
          }
          fgets (mot_secret, 100, fichier);
          mot_secret[strlen(mot_secret) - 1] = '\0';
          taille_mot_secret = strlen (mot_secret);
          lettreTrouvee = malloc (taille_mot_secret * sizeof (int));
          if (lettreTrouvee == NULL) {
             printf ("Erreur d'allocation memoire\n");
             exit (0);
          }
          for (i = 0; i < taille_mot_secret; i++) {
             lettreTrouvee[i] = 0; 
          }
          while (compteur > 0 && gagne (lettreTrouvee, taille_mot_secret) == 0) {
             printf ("\nIl vous reste %d coup(s) a jouer", compteur);
             printf ("\nQuel est le mot secret ?\n");
             for (i = 0; i < taille_mot_secret; i++) {
                if (lettreTrouvee[i] == 1) {
                   printf ("%c", mot_secret[i]);
                   printf("%d",lettreTrouvee[i]);
                }
                else {
                   printf ("*");
                }
             }
             printf ("\nProposez une lettre:");
             maLettre = lireCaractere ();
             if (rechercher (maLettre, mot_secret, lettreTrouvee) == 0) {
                compteur--; 
             }
          }
          if (gagne (lettreTrouvee, taille_mot_secret) == 1) {
             printf ("\n\nGagner ! Le mot cache etait bien %s !\n\n", mot_secret);
          }
          else {
             printf ("\n\nPerdu ! le mot secret etait %s\n\n", mot_secret);
          }
       }
       else {
          printf ("Erreur, le dictionnaire n'a pas pu etre charge !\n");
       }
       free (lettreTrouvee);
       fclose (fichier);
       return 0;
    }

    ci dessus le main.c

    ci dessous le dico.c

    #include"dico.h"
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    
     
    int piocher_mot (int nombre_mot) {
       int mot_aleatoire = 0;
       mot_aleatoire = rand() % nombre_mot; /* generation du nombre aleatoire */
       return mot_aleatoire;
    }
     
    int nombre_mot_fichier (FILE *fichier) {
       int nombre_mot = 0;
       char caractere_actuel = 0;
       while (caractere_actuel != EOF) {
          caractere_actuel = fgetc (fichier); /* parcours du fichier caractere par caractere */
          if (caractere_actuel == '\n') {
             nombre_mot++;
          }
       }
       return nombre_mot;
    }
     
    char lireCaractere (void) {
       char caractere = 0;
       caractere = getchar ();
       while (getchar () != '\n') {
          ;
       }
       while (caractere < 'A') {
          printf ("Entrez une lettre!\n");
          caractere = getchar ();
       }
       caractere = toupper (caractere);
       return caractere;
    }
     
    int rechercher (char lettre, char motSecret[], int lettreTrouvee[]) {
       int i;
       int bonneLettre = 0;
       for (i = 0; motSecret[i] != '\0'; i++)
       {
          if (lettre == motSecret[i]) {
             printf("on est dedans\n");
             bonneLettre = 1;
             lettreTrouvee[i] = 1;  /* si bonne lettre, on met '1' a l'indice i du tableau */
          }
       }
       return bonneLettre;
    }
     
    int gagne (int lettreTrouvee[], int taille_mot_secret) {
       int i;
       int gagne = 1;
       for (i = 0; i < taille_mot_secret; i++) {
          if (lettreTrouvee[i] == 0) {
             gagne = 0;
          }
       }
       return gagne;
    }

    puis le dico.h

    #ifndef DICO_H_INCLUDED
    #define DICO_H_INCLUDED
    #include "dico.c" 
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
     
     /* pioche le numero d'un mot dans le fichier */
    int piocher_mot (int nombre_mot);
     
    /* lecture et calcul du nombre de mots dans le fichier */
    int nombre_mot_fichier (FILE *fichier);
     
    /* lecture du caractere (entree) */
    char lireCaractere (void);
     
    /* cherche l'entree dans le motSecret */
    int rechercher (char lettre, char motSecret[], int lettreTrouvee[]);
     
    /* parcours un tableau de booléens */
    int gagne (int lettreTrouvee[], int taille_mot_secret);
     
    #endif /* DICO_H_INCLUDED */

    et enfin le dico.txt

    tomate
    fruit
    comcombre
    legume
    aubergine
    peche
    poire
    cerise


    Pouvez vous m'aider a trouver les erreurs et si possible a les corriger avec moi svp.

    Je pense que le problème vient notamment de la fonction recherche et de la variable lettreTrouvee qui ne se met pas a 1 je pense.

    Merci beaucoup de votre aide

    -
    Edité par RubenDucrocq 25 avril 2023 à 15:45:39

    • Partager sur Facebook
    • Partager sur Twitter
      25 avril 2023 à 17:02:26

      Tu as fait des fonctions c'est bien, mais le code est quand même assez brouillon et difficile a suivre. Par exemple ta fonction piocher_mot aurait du s'occuper de toute cette partie et retourner directement le mot à chercher, ça aurait sorti toute cette partie de la fonction main.

      Pour te débloqué : tu convertis les lettres saisie en Majuscule et tu les compare avec les lettres du mot qui elles sont en Minuscule.

      (Tu aurais du le faire sans le dictionnaire et tester jusqu’à que ça fonctionne. Ensuite faire le dictionnaire et le tester à part. Puis inclure le dictionnaire quand les deux fonctionne à part). 

      • Partager sur Facebook
      • Partager sur Twitter
      ...
        25 avril 2023 à 20:23:54

        Un conseil : ajoute des 'printf' et fait afficher les variables importantes, celles que tu soupçonnes de ne pas être correctes. Par exemple avant le test « lettre == motSecret[i] », j'afficherais ces deux variables.
        • Partager sur Facebook
        • Partager sur Twitter
          26 avril 2023 à 3:16:10

          robun a écrit:

          Un conseil : ajoute des 'printf' et fait afficher les variables importantes, celles que tu soupçonnes de ne pas être correctes. Par exemple avant le test « lettre == motSecret[i] », j'afficherais ces deux variables.

          Bonsoir, tout d'abord merci pour cette réponse. Alors pour commencer oui j'ai déjà mis pas mal de printf pour voir se qui n'allait pas justement je suis plutôt débrouillard d'habitude c'est pour ça que je suis venu demander de l'aide. Concernant mon problème, je l'ai partiellement régler. Alors oui je sais que sur deux os différents il peut y avoir certaines différences  mais j'ai régler mon problème sur linux la solution était simple, un petite erreur dans le dico.c dans la fonction lireCaractere ou j'avais mis toupper se qui ne correspondait pas et j'ai aussi, par le terminal, donner accès à mes fichiers à toutes les autorisations. (ls -l puis chmod -v 777 fichier.type) Maintenant le problème est que je suis sur Windows hors de mon lieu d'études et que j'ai le même problème soit Permission denied. Si jamais vous pouvez m'aider pour clore se topic merci beaucoup.

          -
          Edité par RubenDucrocq 26 avril 2023 à 3:17:17

          • Partager sur Facebook
          • Partager sur Twitter
            26 avril 2023 à 3:23:08

            Le tableau lettreTrouvee est un tableau d'entiers. Je pense que ce serait plus simple pour plus d'une raison que ce soit un tableau de char comme le mot secret:
            + plus simple pour l'affichage (printf avec format %s).
            + plus facile pour valider si on a trouvé le mot secret (utilisation de strcmp).
            Au départ il vaudrait autant d'astérisques que le nombre de caractères dans le mot secret.
            Quand on compare une lettre avec motSecret[i] et que c'est pareil, on met lettreTrouvee[i] à cette lettre.

            Par exemple:
                soustraire = 1;
                for(int i = 0; i < taille_mot_secret; i++) {
                    if(lettre == motSecret[i]) {
                        lettreTrouvee[i] = lettre;
                        soustraire = 0;     // Je ne soustraierai rien car j'ai trouvé une lettre.
                    }
                }
                compteur -= soustraire;     // On soustrait seulement si on a rien trouvé.

            edit:

            Quand as-tu le  permission denied?

            Est-ce au début de l'exécution ou lors de la lecture du fichier?

            Sais-tu quel est ton anti-virus?

            -
            Edité par PierrotLeFou 26 avril 2023 à 3:54:47

            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

            Programme du pendu en c

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown