Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tp du pendu avec un seul mot

    12 juillet 2018 à 17:35:31

    Bonjour,

    Je suis entrain de réaliser, en ce moment, le tp du pendu avec un seul mot et l'option "rejouer".
    La première partie tout se passe bien, mais quand je rejoue, lors du premier coup, rien ne s'affiche. Tout redevient normal à partir du second coup joué. J'ai l'impression que le pointeur que j'ai créé

    char *maLettre = NULL;


    ne fait pas son boulot ou qu'il n 'y a aucune valeur à l'adresse où il pointe.Je précise que je n'ai pas encore regardé la solution proposée par le site.

    Je vous transmets le code:

    prototypes:

    #ifndef LEPENDU_H_INCLUDED
    #define LEPENDU_H_INCLUDED
    
    void initialiserMot(char mot[], int tailleTableau);
    char lireCaractere();
    void transformerMotSecret(char motSecret[], char mot[], char *maLettre, int tailleTableau);
    void initialiserMotSecret(char motSecret[]);
    int choix();
    
    #endif // LEPENDU_H_INCLUDED

    fonctions:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "LePendu.h"
    
    void initialiserMot(char mot[], int tailleTableau)
    {
        int i;
    
        for(i = 0 ; i < tailleTableau ; i++)
        {
            mot[i] = '*';
        }
    }
    
    char lireCaractere()
    {
        char caractere = 0;
    
        caractere = getchar();
        caractere = toupper(caractere);
    
        while(getchar() != '\n');
    
        return caractere;
    }
    
    void transformerMotSecret(char motSecret[], char mot[], char *maLettre, int tailleTableau)
    {
        int i;
    
        for(i = 0 ; i < tailleTableau ; i++)
        {
    
            if(motSecret[i] != *&maLettre && motSecret[i] != mot[i])
            {
                motSecret[i] = '*';
            }
    
        }
    
    }
    
    void initialiserMotSecret(char motSecret[])
    {
        motSecret[0] = 'M';
        motSecret[1] = 'A';
        motSecret[2] = 'R';
        motSecret[3] = 'R';
        motSecret[4] = 'O';
        motSecret[5] = 'N';
        motSecret[6] = '\0';
    
    }
    
    int choix()
    {
        int choix = 0;
    
        while (choix < 1 || choix > 2)
        {
            printf("\n\nRejouer ?\n\n");
            printf("1.Oui\n");
            printf("2.Non\n\n");
            printf("Votre choix ? ");
            scanf("%d", &choix);
        }
    
        return choix;
    }

    main:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "LePendu.h"
    
    int main(int argc, char *argv[])
    {
        char mot[100] = {0};
        char motSecret[] = "MARRON";
        char *maLettre = NULL;
        int nombreCoups = 0;
        int continuerPartie = 1;
    
        printf("Bienvenue dans le Pendu !\n\n");
    
        while(continuerPartie == 1)
        {
            nombreCoups = 10;
    
            initialiserMot(mot, 6);
    
            do
            {
                printf("\n\nIl vous reste %d coups a jouer.\n\nQuel est le mot secret? %s\n", nombreCoups, mot);
                printf("\nProposez une lettre: ");
    
                maLettre = lireCaractere();
    
                transformerMotSecret(motSecret, mot, maLettre, 6);
    
                strcpy(mot, motSecret);
    
                initialiserMotSecret(motSecret);
    
                nombreCoups--;
    
            }while(nombreCoups > 0 && strcmp(mot, motSecret) != 0);
    
            if(strcmp(mot, motSecret) != 0)
            {
                printf("\n\nTu as perdu!\n");
            }
    
            else
            {
                printf("\n\nBravo, tu as gagne!");
            }
    
            continuerPartie = choix();
        }
    
        printf("\n\nA bientot !\n\n");
    
        return 0;
    }


    J'ai eu beaucoup de mal à trouver cette condition:

    if(motSecret[i] != *&maLettre && motSecret[i] != mot[i])

    notamment le & devant maLettre. je croyais que *maLettre suffisait. D'ailleurs je ne sais pas si c'est ok d'écrire comme ça. Je n'ai pas vu cette écriture encore dans le cours. Du coup je ne suis pas sûr du pointeur créé.

    Je me suis rendu compte également que j'étais obligé d'initialiser le motSecret à chaque coup. Et je n'ai pas trouvé d'autres solutions que de l'initialiser manuellement, ce qui ne m'arrange pas si je dois par la suite agrémenter de nouveaux mots.

    void initialiserMotSecret(char motSecret[])
    {
        motSecret[0] = 'M';
        motSecret[1] = 'A';
        motSecret[2] = 'R';
        motSecret[3] = 'R';
        motSecret[4] = 'O';
        motSecret[5] = 'N';
        motSecret[6] = '\0';
    
    }

    Si vous avez des remarques, et si vous pouvez m'aiguiller vers une solution plus viable, je vous en remercie. Pas de solutions toutes faites svp.




    -
    Edité par RomainAueo 12 juillet 2018 à 17:39:20

    • Partager sur Facebook
    • Partager sur Twitter
      12 juillet 2018 à 19:17:06

      Hello,

      Tu fais fausse route dès la déclaration de maLettre ! maLettre n'est pas un pointeur sur une variable de type caractère (char *), c'est juste.... un char (char maLettre).

      Evidemment, certaines choses vont devoir changer dans ton programme. Par exemple, l'initialisation sera maLettre=0 et pas maLettre=NULL

      -
      Edité par edgarjacobs 12 juillet 2018 à 19:17:52

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        12 juillet 2018 à 19:56:27

        Ok, il me semblait bien que c'était inutile de créer un pointeur.

        Mon erreur était de persister que l'initialisation d'un char était obligatoirement

        char fichier[] = {0}

        ou

        char fichier[] = ""

        Du coup effectivement, avec un

        char maLettre = 0;


        ça simplifie les choses. Je me serais moins pris la tête pour trouver ma condition dans la fonction "transformerMotSecret" qui devient maintenant:

        void transformerMotSecret(char motSecret[], char mot[], char maLettre, int tailleTableau)
        {
            int i;
        
            for(i = 0 ; i < tailleTableau ; i++)
            {
        
                if(motSecret[i] != maLettre && motSecret[i] != mot[i])
                {
                    motSecret[i] = '*';
                }
        
            }
        
        }



        En revanche le problème quand on rejoue une partie est toujours là!


        • Partager sur Facebook
        • Partager sur Twitter
          12 juillet 2018 à 22:29:04

          Re,

          L'éternel problème du \n qui est resté dans le buffer clavier.

          Allons-y encore une fois ;)

          Dans choix(), tu fais un scanf("%d",...). Nickel. Mais la touche enter sur laquelle tu appuyes pour valider ton entrée n'est pas considérée par scanf(), pour un format %d, comme un caractère valide. Le nombre qui précède le enter, ok, mais le enter en lui-même est refusé. Mais il n'est pas perdu pour autant, il reste dans le buffer du clavier, prêt à être lu. Et quand tu atteins le getchar() de lireCaractere(), il est lu. La suite, tu l'as comprise.

          Pour éviter ça, il faut vider le buffer clavier après le scanf("%d",....). Plein de code à trouver sur le site, mais vite fait sur le gaz

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

          -
          Edité par edgarjacobs 12 juillet 2018 à 22:31:58

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            12 juillet 2018 à 23:46:18

            Ok, effectivement le cours mentionne à peine ce problème à ce stade. Je te remercie pour l'information. Je vais tester ça.
            • Partager sur Facebook
            • Partager sur Twitter
              19 juillet 2018 à 11:20:37

              le mot secret est toujours le même?
              • Partager sur Facebook
              • Partager sur Twitter

              Tp du pendu avec un seul mot

              × 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