Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jeu du pendu: Affichage d'étoiles

Sujet résolu
    18 février 2017 à 0:03:37

    Bonjour,

    Je débute en C j'essaie de faire le TP du jeu du pendu mais j'ai quelques problèmes.

    Mon code n'ai pas fini pour l'instant je veux juste demander au joueur d'écrire une lettre et de lui dire si  elle se trouve dans le mot secret ou pas, sauf qu'on m'affiche toujours que la lettre ne se trouve pas dans le mot.

    Merci d'avance pour votre aide!!

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    
    char lireLettre();
    char chercheLettre(char lettreEntre, char motSecret[]);
    
    int main()
    {   char lettreEntre=0;
        char motSecret[]= "AQUARIUM";
        
        printf("Bienvenue au pendu !!\n\n");
        printf("Vous devez deviner le mot secret: ********\n");
        printf("Proposez une lettre:");
        
        lettreEntre=lireLettre();
        chercheLettre(lettreEntre, motSecret);
    
        return 0;
    }
    
    char lireLettre()
    {
       char lettreEntre=0;
       lettreEntre = getchar();
       lettreEntre = toupper(lettreEntre);
       while (getchar()!='\n');
       return lettreEntre;
    }
    
    char chercheLettre(char lettreEntre, char motSecret[])
    {   int i=0, bonneLettre=0;
        
        for (i=0; motSecret[i]!='\0'; i++);
        {
        if (lettreEntre==motSecret[i])
        {
        bonneLettre=1;
        printf("\nOuiii la lettre %c se trouve dans le mot Secret\n", lettreEntre);
        }
        else
        {
        printf("\nEhh non la lettre %c ne se trouve pas dans le mot Secret\n", lettreEntre);
        }
        }
        return bonneLettre;
    }
    

    -
    Edité par Lynnia 19 février 2017 à 1:09:29

    • Partager sur Facebook
    • Partager sur Twitter
      18 février 2017 à 0:13:05

      Yop,

      tu as un point virgule en trop ligne 35.

      • Partager sur Facebook
      • Partager sur Twitter
        18 février 2017 à 0:25:23

        Vu que tu as inclus <string.h> autant utiliser toutes les fonctions à dispositions ta fonction chercheLettre() peut être remplacer par ça ( en suivant ton model ) :

        void 
        isin(char who, char * of) {
            if(strchr(of, who))
            	puts("Blabla elle y est...");
            else
            	puts("Blabla non elle n'y est pas...");
        } // En une ligne avec une condition ternaire.
        
        ...
        
        isin(lettreEntre, motSecret); // Appel
        

        -
        Edité par ASW_ 18 février 2017 à 0:33:18

        • Partager sur Facebook
        • Partager sur Twitter
          18 février 2017 à 0:35:06

          Merciii beaucoup du coup j'ai modifié mon code, mais j'ai un nouveau problème:

          Quand j'entre une lettre on me dit si elle se trouve dans le mot ou pas  et on me l'affiche par exemple pour le mot AQUARIUM si j'entre A on me met A**A**** jusque là ça va mais au tour suivant si j'entre Q la lettre A s'efface et on m'affiche *Q******

          Je pense que c'est parce que la variable lettrePresente[i] s'actualise a chaque boucle ?? svp comment réparer ça

          #include <stdio.h>
          #include <stdlib.h>
          #include <ctype.h>
          
          char lireLettre();
          int chercheLettre(char lettreEntre, char motSecret[], int lettrePresente[]);
          int gagner(int lettrePresente[]);
          
          int main()
          {   int i=0, bonneLettre=0, lettrePresente[8]={0}, bravo, coupsRestants=10;
              char lettreEntre=0;
              char motSecret[]= "AQUARIUM";
          
              printf("Bienvenue au pendu !!\n\n");
              printf("Vous devez deviner le mot secret: ********\n");
          
              bravo=gagner(lettrePresente);
              while (bravo!=0 &&coupsRestants>0)
              {
                  printf("\n\nProposez une lettre:");
                  lettreEntre=lireLettre();
                  bonneLettre=chercheLettre(lettreEntre, motSecret, lettrePresente);
                  if (bonneLettre==1)
                  {
                      printf("\nOuiii la lettre %c se trouve dans le mot Secret:", lettreEntre);
                  }
                  else
                  {
                      printf("\nEhh non la lettre %c ne se trouve pas dans le mot Secret: ", lettreEntre);
                      coupsRestants--;
                  }
          
                   for (i=0; i<8; i++)
                   {
                      if (lettrePresente[i]==1)
                      {
                           printf("%c", motSecret[i]);
                      }
                      else
                      {
                           printf("*");
                      }
                   }
              }
          
              bravo=gagner(lettrePresente);
              if (bravo==0 && coupsRestants>0)
              {
                  printf("\n\nFelicitatiions c'etait bien %s !!! \nVous etes sauvé  \n", motSecret);
              }
              if (coupsRestants==0)
              {
                  printf("\n\nAhahahaha perduu vous allez etre pendu !! \n\n");
              }
          
              return 0;
          }
          
          char lireLettre()
          {
             char lettreEntre=0;
             lettreEntre = getchar();
             lettreEntre = toupper(lettreEntre);
             while (getchar()!='\n');
             return lettreEntre;
          }
          
          int chercheLettre(char lettreEntre, char motSecret[],int lettrePresente[])
          {   int i=0, bonneLettre=0;
              for (i=0; motSecret[i]!='\0'; i++)
              {
                  if (lettreEntre==motSecret[i])
                  {
                      bonneLettre=1;
                      lettrePresente[i]=1;
                  }
                  else
                  {
                      lettrePresente[i]=0;
                  }
              }
              return bonneLettre;
          }
          
          int gagner(int lettrePresente[])
          {    int bravo=0, i=0;
               for(i=0; i<8;i++)
              {
                   if (lettrePresente[i]==0)
                   {
                      bravo=1;
                   }
              }
              return bravo;
          }
          



          -
          Edité par Lynnia 18 février 2017 à 16:39:06

          • Partager sur Facebook
          • Partager sur Twitter
            19 février 2017 à 1:08:14

            quelqu'un aurait une solution a me proposer ? :(

            -
            Edité par Lynnia 19 février 2017 à 1:42:47

            • Partager sur Facebook
            • Partager sur Twitter
              19 février 2017 à 10:47:12

              Tu te compliques un peu trop la tâche, une façon de faire :

              #include <stdio.h>
              #include <string.h>
              #include <stdlib.h>
              
              void
              qux(char * str, char * rts, char l) {
              	char * r, * diff = str;
              	while((r = strchr(str, l)) != NULL) {
              		rts[r - diff] = *r;
              		str = r + 1;
              	}
              }
              
              int
              main(int argc, char ** argv) {
              	char foo[] = "********";
              	char bar[] = "AQUARIUM";
              
              	puts(foo);
              
              	for(int i = 1; i < argc; i++)
              		qux(bar, foo, *argv[i]);
              
              	puts(foo);
                  return (EXIT_SUCCESS);
              }

              Un exemple d'exécution du programme :

              $ ./a A U I M
              ********
              A*UA*IUM
              $
              • Partager sur Facebook
              • Partager sur Twitter
                19 février 2017 à 13:54:16

                Salut,

                Bien vu le code, je suis sûr que c'est vachement clair pour un débutant qui en est au pendu. Surtout sans le moindre commentaire.

                Plutôt que de travailler avec une chaine de char et une chaine de "mémo", il sera plus simple de travailler directement sur 2 chaînes de char et d'actualiser directement le mot à trouver :

                char aDeviner[20]  = "aquarium",
                     motJoueur[20] = "********";
                
                ....
                
                //et la fonction :
                
                char controlLettre(const char* myst, char* play, char lettre)
                {
                   char isInMyst = 0; //si oui ou non on trouve lettre
                   int wordLength = strlen(myst); //longueur du mot
                
                   for(int i=0; i< wordLength; i++)
                   {
                      if(lettre == myst[i]) //si lettre dans mystere
                      {
                          play[i] = lettre; //on remplace '*' par lettre
                          isInMyst = 1;     //on a trouvé lettre
                      }
                    }
                
                    return isInMyst;
                }
                
                //Puis dans ton code :
                
                if (controlLettre(aDeviner, motJoueur, lettre);
                  printf("Tu as trouvé le %c !!\n", lettre);
                else
                  printf("Désolé, %c n'est pas dans le mot mystere.\n", lettre);
                
                puts(motJoueur);
                
                etc...
                

                Bonne continuation.

                -
                Edité par drx 19 février 2017 à 14:00:40

                • Partager sur Facebook
                • Partager sur Twitter

                Bonhomme !! | Jeu de plateforme : Prototype.

                  19 février 2017 à 14:37:06

                  ASW_ a écrit:

                  Tu te compliques un peu trop la tâche, une façon de faire :

                  Merci mais je viens de débuter y'a environ de 2 semaines donc j'arrive pas a comprendre ton code :/

                  drx a écrit:

                  Plutôt que de travailler avec une chaine de char et une chaine de "mémo", il sera plus simple de travailler directement sur 2 chaînes de char et d'actualiser directement le mot à trouver :

                  Merciii   mais cette façon peut marcher même avec le mode 2 joueurs et le dico ? parce que je compte l'améliorer après 

                  -
                  Edité par Lynnia 19 février 2017 à 14:38:25

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 février 2017 à 14:50:35

                    Salut,

                    Oui, cela devrait fonctionner quelque soit le mot mystère. Il y a cependant une chose que la fonction ne contrôle pas pour être plus robuste : Il faudrait vérifier que les 2 mots ont bien la même taille.

                    Avec l'habitude, tu apprendras à faire des fonctions génériques. Cela signifie qu'elles doivent faire le boulot quoiqu'il arrive.

                    Par exemple, faire :

                    char controlLettre(const char myst[9], char play[9], char lettre)

                    N'est pas générique, ça ne fonctionne qu'avec les mots de 8 lettres max...

                    Après, je ne l'ai pas testée, il y a peut-être une faute ici ou là (syntaxe ou autre), mais c'est l'idée.

                    Bonne continuation.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Bonhomme !! | Jeu de plateforme : Prototype.

                      19 février 2017 à 14:59:36

                      Ok merci mais en fait j'aimerai bien comprendre pourquoi la variable lettrePresente dans mon code s'actualise à chaque fois parce que je pense que si elle ne s'actualisait pas mon code pourrait marcher non ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 février 2017 à 16:24:38

                        C'est dù à ce bout de code :

                        else // Ligne 77.
                        {
                            lettrePresente[i]=0;
                        }

                        Tu dois le supprimer pour fixer le problème, il ne sert à rien.

                        Tu as un autre problème, quand l'utilisateur a trouvé toutes les lettres du mot caché, le programme continue à lui demander de lui proposer une lettre.

                        Pour fixer ce problème l'expression ligne 17 et ligne 46 :

                        bravo=gagner(lettrePresente);

                        Doivent être supprimées et une seule expression doit être mise en dernière instruction de la boucle :

                        while (bravo!=0 &&coupsRestants>0)

                        Lors de la déclaration de bravo, la variable doit être initialisée à 1.

                        -
                        Edité par ASW_ 19 février 2017 à 16:37:51

                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 février 2017 à 17:08:06

                          ASW_ a écrit:

                          C'est dù à ce bout de code :

                          else // Ligne 77.
                          {
                              lettrePresente[i]=0;
                          }

                          Tu dois le supprimer pour fixer le problème, il ne sert à rien.

                          Ouiiii c'était ça MERCI BEAUCOUP tout est réglé maintenant :D
                          (Hors sujet: ça t'as pris combien de temps pour apprendre le langage C ?)

                          -
                          Edité par Lynnia 19 février 2017 à 17:10:27

                          • Partager sur Facebook
                          • Partager sur Twitter
                            19 février 2017 à 17:20:34

                            Pour assimiler le langage pas longtemps ( Instructions, Types, Opérat... ), mais pour tous ce qui en découle autour ( Thread, Gestion avancée de la mémoire, Tris, recherches et structuration des données, Entrées-sorties, Flux de données, Descrip... ) c'est loin d'être acquis.

                            -
                            Edité par ASW_ 19 février 2017 à 17:28:51

                            • Partager sur Facebook
                            • Partager sur Twitter
                              19 février 2017 à 18:17:27

                              Lynnia a écrit:

                              (Hors sujet: ça t'as pris combien de temps pour apprendre le langage C ?)

                              -
                              Edité par Lynnia il y a environ 1 heure

                              Au final, on n'arrête jamais d'apprendre le C. Déjà parce que tous les 10 ans environ il y a une mise à jour de la norme (la prochaine à l'horizon 2022 ... peut-être). Le langage n'est pas «fondamentalement» remanié depuis C99 et ne semble ni devoir ni en chemin de l'être (quoique je m'avance ^_^).

                              Mais C n'est qu'un langage, et il y a tout ce qu'il y a autour

                              • les compilateurs (abus de langages), certains ont des particularités parfois utiles dans certaines circonstances
                              • la bibliothèque standard, idem, il en existe plusieurs versions avec des particularités
                              • la plateforme, celle de développement et celle d'exécution (on ne fera pas les mêmes choses sous windows et mac de la même manière)
                              • les outils dédiés : debuger, mem profiler, sanitizer, beautifier, couverture de code, prouveurs, ...
                              • la conception/modélisation, étape importante souvent négligée
                              • l'algorithmique, la culture G du développement, souvent négligée aussi
                              • ...

                              donc non, on ne finit jamais d'apprendre :)

                              • Partager sur Facebook
                              • Partager sur Twitter
                              First solve the problem. Then, write the code. ~ John Johnson

                              Jeu du pendu: Affichage d'étoiles

                              × 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