Partage
  • Partager sur Facebook
  • Partager sur Twitter

jeu du pendu en C

avis

Sujet résolu
    27 janvier 2020 à 14:59:20

    bonjours, tous le monde j'ai fini le TP sur le pendu et j'aurais voulu avoir des avis sur le programme que j'ai fais svp
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
    #include <time.h>
     
    char lireCaractere();
     
    int main(int argc, char *argv[])
    {
            char       *word[]     = {"MARRON", "BATEAU", "VILLE", "ANIMAUX", "ABEILLE", "ARBRE", "FEUILLE", "AIGUILLE", "ORDINATEUR", "FAUTEUILLE"};
            char       *wordCopy   =     NULL;
            char       *wordFind   =     NULL;
            char       letter      =        0;
            char       *letterFind =     NULL;
            int        h           =        0;
            int        life        =       10;
            int        sizeString  =        0;
            int        replay      =        0;
            int        MAX         =       10;
     
            printf("Welcome, you go are playing  Pendu.\n\n");
            printf("Manual:\n");
            printf("the word a find is in capital letters,\n");
            printf("You have 10 life.");
    
            do
            {       srand(time(NULL));
                    h = (rand() % MAX);
    
                    wordCopy = word[h];
    
                    sizeString = strlen(wordCopy);
    
                    wordFind = malloc(sizeString * sizeof(char));
    
                    for (int i = 0; i < sizeString; i++)
                            wordFind[i] = '*';
    
                    printf("\n\nWord to finded : %s", wordFind);
    
                    do
                    {       
                            printf("\nchoose a letter: ");
                                                                 letter = lireCaractere();
    
                            letterFind = strchr(wordCopy, letter);
    
                            for(int i = 0; i < *wordCopy; i++)
                            {
                                    if (letter == wordCopy[i])
                                    {
                                            wordFind[i] = letter;
                                    }
                            }
                            if (letterFind != NULL)
                            {
                                    printf("%s\n", wordFind);
                            }else
                            {
                                    life --;
                                    printf("\nYou have %d life left.\n", life);
                                    printf("%s\n", wordFind);
                            }
    
                    } while (strcmp(wordFind, wordCopy) != 0 && life > 0);
    
                    if (strcmp(wordFind, wordCopy) == 0)
                    {
                            printf("\nGreat, you have win!!!");
                    }else
                    {
                            printf("\nYou have lose but it's OK. the word is %s.", wordCopy);
                    }
                    printf("\n\nWant you replay (0)yes or (1)no ? ");
                    scanf("%d", &replay);
    
                    life = 10;
    
            }while (replay != 1);
    
            free(wordFind);
    
        return 0;
    }
    
    char lireCaractere()
    {
    char caractere = 0;
    
        caractere = getchar(); 
        caractere = toupper(caractere);
     
        while (getchar() != '\n') ;
    
        return caractere;  
    }
    

    ps: j'ai essayer avec la bibliothèque de que Matheo a fais dans le cours mais quand j'initialise le mot à trouver sa m'affiche d'autre mot que celui qui a bien été choisis

    au lieu de m'afficher par exemple "*****".

    • Partager sur Facebook
    • Partager sur Twitter
      27 janvier 2020 à 15:22:13

      Hello,

      Tu as des soucis à te faire avec wordFind: tu oublies de réserver de la place pour le \0 final, et évidemment d'y mettre ce \0. En soi, ce ne serait pas grave si tu n'utilisais pas des fonctions qui se basent sur ce \0 pour savoir si le string est terminé, telles que strcmp() et printf() (avec un format %s)

      • 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

        27 janvier 2020 à 15:39:29

        Salut tu me parle pour ce code la ? ou si j'utilise la bibliothèque de Matheo ? Parce-que a la ligne 35 c'est ce que je fais non ?
        • Partager sur Facebook
        • Partager sur Twitter
          27 janvier 2020 à 15:51:45

          En C "plop" contient 4 caractère + 1 caractère de fin de chaines.
          (il y a donc 5 caractères en tout)

          C'est grâce à ce fameux caractère que tu n'as pas à passer le nombre de caractères aux fonctions.

          sizeString = strlen(wordCopy); 
          wordFind = malloc(sizeString * sizeof(char));//non
          
          //correction
          sizeString = strlen(wordCopy); 
          wordFind = malloc((sizeString+1) * sizeof(char));
          //Penser à vérifier que le malloc a réussi
          wordFind[sizeString]='\0';//on place ce fameux caractère de fin de chaine



          • Partager sur Facebook
          • Partager sur Twitter
            27 janvier 2020 à 16:15:20

            FloRian41 a écrit:

            .... ou si j'utilise la bibliothèque de Matheo ? ....

            Matheo n'a pas écrit une bibliothèque, mais du code. La nuance est d'importance.

            Et neuneutrinos t'a donné le code de mon explication (et peut-être une explication plus claire pour toi)

            • 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

              27 janvier 2020 à 16:23:03

              d'accord sa marche merci :).

              Mais ce que je comprend maintenant c'est pourquoi quand je le code a Matheo sa ne fonctionne pas sa me donne sa:

              Welcome, you go are playing  Pendu.

              Manual:
              the word a find is in capital letters,
              You have 10 life.

              Word to finded : ******BOAT
              HOUSE
              SPARRINQ
              choose a letter:

              #include <stdio.h>                                                                          
              #include <stdlib.h>                                                                         
              #include <ctype.h>
              #include <string.h>                                                                         
              #include <time.h>                                                                           
              #include "dico.h"                                                                           
               
              char lireCaractere();                                                                       
                        
              int main(int argc, char *argv[])
              {       
                      char       word[100]  =      {0};                                                   
                      char       *wordCopy   =     NULL;                                                  
                      char       *wordFind   =     NULL;
                      char       letter      =        0;                                                  
                      char       *letterFind =     NULL;
                      int        life        =       10;
                      int        sizeString  =        0;                                                  
                      int        replay      =        0;
                          
                      printf("Welcome, you go are playing  Pendu.\n\n");
                      printf("Manual:\n");                                                                
                      printf("the word a find is in capital letters,\n");                                 
                      printf("You have 10 life.");
                      
                      do                                                                                  
                      {       if (!piocherMot(word))                                                      
                                      exit(0);
                              
                              wordCopy = word;
                                                                                                          
                              sizeString = strlen(wordCopy);
                                                                                                          
                              wordFind = malloc((sizeString + 1) * sizeof(char));
                                                                                                          
                              if (wordFind == NULL)                                                       
                                      exit(0);                                                            
                      
                              for (int i = 0; i < sizeString; i++)                                        
                                      wordFind[i] = '*';                                                  
                          
                              printf("\n\nWord to finded : %s", wordFind);                 


              ps: les mot que j'ai mit dans la bibliothèque ne sont pas les mêmes

              -
              Edité par FloRian41 27 janvier 2020 à 16:27:41

              • Partager sur Facebook
              • Partager sur Twitter
                27 janvier 2020 à 16:37:09

                N'aurais-tu pas oublier de set ton caractère de fin de chaine ?
                Car, il est possible qu'en l'oubliant , printf aille trop loin et te lis la suite de ce qu tu as en mémoire :( 

                https://ideone.com/2sGm0Q

                • Partager sur Facebook
                • Partager sur Twitter
                  27 janvier 2020 à 17:22:28

                  oui exactement ligne 35 j'ai rajouté :

                  wordFind[sizeString] = '\0';

                  merci beaucoup pour l'aide :)

                  • Partager sur Facebook
                  • Partager sur Twitter

                  jeu 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