Partage
  • Partager sur Facebook
  • Partager sur Twitter

exercice réalisation d'un pendu

Sujet résolu
    15 juin 2019 à 1:06:28


    Bonjour à tous

    Je viens actuellement de terminer le pendu et à part le mode deux joueurs qu'il me reste à faire, tout fonctionne.

    Néanmoins, je rencontre un bug dans l'application pas trop gênant mais que je n'arrive pas du tout à résoudre après pas mal de recherches.

    Quand je lance le jeu et qu'il me demande la première lettre à rentrer, le programme ne tient pas compte de cette toute première lettre alors qu'il n'y a aucun problème sur la deuxième, troisième, etc....

    Voici mon code :

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define TAILLEMOT 20
    char lirecaractere();
    
    
    int main()
    
    {
    int nombredecaractere = 0;
    char malettre = 0;
    char motsecretcache[nombredecaractere] ;
    char motsecret[TAILLEMOT] ="";
    char *caracteretrouve = NULL;
    int i =0;
    int nombredecoupsrestant = 10;
    char motlu[TAILLEMOT] ="";
    int nombredemots = 0;
    int motchoisi = 0;
    int j =0;
    int l=0;
    int choixdujoueur=0;
    
      FILE* fichier = NULL;
      fichier = fopen("dictionnaire.txt", "r");
    
      while (fgets(motlu, TAILLEMOT, fichier) != NULL)
    
        {
            nombredemots++;
        }
      rewind(fichier);
     printf ("Bienvenue dans le Pendu !\n");
    
     do
     {
    
    
     printf("ecriver un nombre entre 1 et %d\n", nombredemots);
     scanf("%d", &motchoisi);
     for( l=0; l<motchoisi; l++)
     {
         fgets(motsecret, TAILLEMOT, fichier);
     }
        nombredecaractere =strlen(motsecret);
    
        for (j=0;j<nombredecaractere;j++)
        {
             motsecretcache[j]= '*';
        }
       motsecretcache[nombredecaractere] = '\0';
    
    
    while (strcmp(motsecretcache, motsecret) != 0 && nombredecoupsrestant>0 )
    
    {
    
     printf("il vous reste %d coups a jouer\n", nombredecoupsrestant);
     printf("quel est le mot secret ? %s\n", motsecretcache);
     printf("proposer une lettre :");
     malettre = lirecaractere();
    
     for(i=0 ; i<nombredecaractere; i++ )
    
        {
            if (malettre == motsecret[i])
            {
                motsecretcache[i]= malettre;
    
            }
            else
            {
            }
    
        }
    
        caracteretrouve = strchr(motsecret, malettre);
        if (caracteretrouve != NULL)
    
            {
            }
            else
            {
                nombredecoupsrestant--;
            }
    
    
        }
    
            if (strcmp(motsecretcache, motsecret) == 0)
            {
        printf("gagne ! le mot recherche etait bien %s", motsecret);
             }
    
        else
        {
            printf("vous avez perdu");
        }
            printf("voulez vous rejouer?\ntaper 1 pour oui et 0 pour non\n");
            scanf("%d", &choixdujoueur);
        }while(choixdujoueur==1);
        return 0;
    }
    
    
    
    
    char lirecaractere()
    
    {
        char caractere = 0;
    
        caractere = getchar();
        caractere = toupper(caractere);
    
        while(getchar() != '\n');
        return caractere;
    }


    Merci par avance pour toutes vos réponses

    • Partager sur Facebook
    • Partager sur Twitter
      15 juin 2019 à 11:35:44

      La cause de ton problème, c'est que quand tu saisie le premier caractère de la partie le buffer clavier n'est pas vide.

      (la fonction Lirecaractere vide le buffer clavier après la saisie).

      • Partager sur Facebook
      • Partager sur Twitter
        15 juin 2019 à 13:19:35

        Merci beaucoup pour ta réponse.

        Malheureusement, je viens d'essayer de placer la boucle avant le début de la partie mais du coup, ma variable motsecretcache se retrouve avec un espace juste après la fin du mot :

         for (j=0;j<nombredecaractere;j++)
            {
                 motsecretcache[j]= '*';
            }
           motsecretcache[nombredecaractere] = '\0';
         
        
        while(getchar() != '\n');

        J'avoue que je ne vois pas trop comment m'extirper de ce problème.

        Deuxième question : en toute honnêteté,  que penses tu de mon programme par rapport à ce qui était demandé ?

        Merci encore pour ton aide :-)

        -
        Edité par sevdam 15 juin 2019 à 13:33:42

        • Partager sur Facebook
        • Partager sur Twitter
          15 juin 2019 à 14:14:07

          La solution est de vider le buffer clavier avant la première saisie. pas de déplacer du code au hasard.

          Tu as deux scanf sur des entiers dans ton code qui laisse un '\n' dans le buffer clavier.

          • Partager sur Facebook
          • Partager sur Twitter
            15 juin 2019 à 14:32:33

            J'avoue avoir du mal à saisir.

            La boucle while(getchar() != '\n');

            sert bien à vider le buffer clavier une fois la saisie du caractère faite dans la fonction lirecaractere ?

            Alors pourquoi cela ne fonctionne pas là ou je veux le mettre ?


            -
            Edité par sevdam 15 juin 2019 à 15:19:14

            • Partager sur Facebook
            • Partager sur Twitter
              15 juin 2019 à 15:20:15

              C'est ton scanf ligne 41 qui laisse des caractères dans le buffer clavier, donc tu le vides dans la foulée.

              idem pour le scanf ligne 101

              sevdam a écrit:

              Deuxième question : en toute honnêteté,  que penses tu de mon programme par rapport à ce qui était demandé ?

              Je pense surtout que tu ne le comprends pas entièrement.



              • Partager sur Facebook
              • Partager sur Twitter
                15 juin 2019 à 15:42:26

                sevdam a écrit:

                Deuxième question : en toute honnêteté,  que penses tu de mon programme par rapport à ce qui était demandé ?

                Je pense surtout que tu ne le comprends pas entièrement.

                Merci pour ta franchise mais j'essaye de faire de mon mieux pour comprendre les tenants et les aboutissants de tout ce que je fais. Autant dire qu'étant novice, ce n'est pas une mince affaire ;)

                Je viens d'essayer de mettre les boucles : while(getchar() != '\n');
                afin de vider le buffer après mes deux scanf : même problème, ma variable motsecretcache se retrouve toujours avec un espace juste après la fin du mot. J'ai trouvé une autre fonction rewind(stdin) que j'ai essayée sans succès...

                Ci-joint mon code avec les deux boucles rajoutées :

                #include <stdio.h>
                #include <stdlib.h>
                #include <string.h>
                #define TAILLEMOT 20
                char lirecaractere();
                
                
                int main()
                
                {
                int nombredecaractere = 0;
                char malettre = 0;
                char motsecretcache[nombredecaractere] ;
                char motsecret[TAILLEMOT] ="";
                char *caracteretrouve = NULL;
                int i =0;
                int nombredecoupsrestant = 10;
                char motlu[TAILLEMOT] ="";
                int nombredemots = 0;
                int motchoisi = 0;
                int j =0;
                int l=0;
                int choixdujoueur=0;
                
                  FILE* fichier = NULL;
                  fichier = fopen("dictionnaire.txt", "r");
                
                  while (fgets(motlu, TAILLEMOT, fichier) != NULL)
                
                    {
                        nombredemots++;
                    }
                  rewind(fichier);
                 printf ("Bienvenue dans le Pendu !\n");
                
                 do
                 {
                
                
                 printf("ecriver un nombre entre 1 et %d\n", nombredemots);
                 scanf("%d", &motchoisi);
                 for( l=0; l<motchoisi; l++)
                 {
                     fgets(motsecret, TAILLEMOT, fichier);
                 }
                    while (getchar() != '\n') ;
                    nombredecaractere =strlen(motsecret);
                
                
                    for (j=0;j<nombredecaractere;j++)
                    {
                         motsecretcache[j]= '*';
                    }
                   motsecretcache[nombredecaractere] = '\0';
                
                
                while (strcmp(motsecretcache, motsecret) != 0 && nombredecoupsrestant>0 )
                
                {
                
                 printf("il vous reste %d coups a jouer\n", nombredecoupsrestant);
                 printf("quel est le mot secret ? %s\n", motsecretcache);
                 printf("proposer une lettre :");
                 malettre = lirecaractere();
                
                 for(i=0 ; i<nombredecaractere; i++ )
                
                    {
                        if (malettre == motsecret[i])
                        {
                            motsecretcache[i]= malettre;
                
                        }
                        else
                        {
                        }
                
                    }
                
                    caracteretrouve = strchr(motsecret, malettre);
                    if (caracteretrouve != NULL)
                
                        {
                        }
                        else
                        {
                            nombredecoupsrestant--;
                        }
                
                
                    }
                
                        if (strcmp(motsecretcache, motsecret) == 0)
                        {
                    printf("gagne ! le mot recherche etait bien %s\n", motsecret);
                         }
                
                    else
                    {
                        printf("vous avez perdu\n");
                    }
                        printf("voulez vous rejouer?\ntaper 1 pour oui et 0 pour non\n");
                        scanf("%d", &choixdujoueur);
                    }while(choixdujoueur==1);
                    while (getchar() != '\n') ;
                    return 0;
                }
                
                
                
                
                char lirecaractere()
                
                {
                    char caractere = 0;
                    caractere = getchar();
                    caractere = toupper(caractere);
                
                    while(getchar() != '\n');
                    return caractere;
                }
                



                Merci encore pour ton aide


                -
                Edité par sevdam 15 juin 2019 à 15:46:45

                • Partager sur Facebook
                • Partager sur Twitter
                  15 juin 2019 à 16:08:19

                  C'est parce ce que fgets garde le '/n' dans la chaîne de caractère.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 juin 2019 à 0:35:02

                    C'est là que je n'arrive pas à comprendre.

                    Le fgets garde le /n dans la chaine.

                    Il s'enlève donc dès le premier passage dans la fonction "lirecaractere" au moment ou le bufferclavier est vidé par  while(getchar() != '\n'); .

                    Alors pourquoi cela ne fonctionne pas quand je place : while(getchar() != '\n'); juste après les scanf et même après le fgets

                    J'avoue avoir du mal à comprendre que le fgets pourrait être vidé aussi longtemps après la boucle while

                    Pour résumé, mon programme arrive à vider le buffer après un premier passge mais pas avant ? quel que soit l'endroit ou je place le while  ?


                    -
                    Edité par sevdam 16 juin 2019 à 0:40:52

                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 juin 2019 à 9:09:19

                      La, on n'est plus sur de la saisie clavier, donc rien à voir avec le buffet clavier.

                      C'est  le /n de la ligne qu'il lit dans le fichier qui est mit dans la chaine de caractère. 

                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 juin 2019 à 20:36:42

                        Alors comment faire en sorte que la fonction fgets ne garde pas le /n ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 juin 2019 à 20:42:57

                          Tu ne peux pas l’empêcher de le garder. Il faut donc le supprimer après. Par exemple en le remplaçant par le caractère de fin de chaîne de caractère.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            16 juin 2019 à 20:47:09

                            Ça y est, ça marche !!.

                            Merci pour ton aide

                            • Partager sur Facebook
                            • Partager sur Twitter

                            exercice réalisation d'un pendu

                            × 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