Partage
  • Partager sur Facebook
  • Partager sur Twitter

TP : Pendu

Lettre bonne dite mauvaise

    15 juin 2006 à 0:50:55

    Voila mon problème, mon programme marche parfaitement la première fois puis quand je dis que je veux continuer il me dit ok me propose un autre mot mais la premiere lettre proposé est déterminé fausse automatiquement même si en vrai elle est bonne.

    Bravo le mot était bien YAHOURT
    Voulez vous continuer ? 1 pour oui 0 pour non
    1
    Vous avez 10 coups
    Le mot secret est ? ******
    Entrez une lettre : e
    Vous avez 9 coups
    Le mot secret est ? ******
    Entrez une lettre : e
    Vous avez 9 coups
    Le mot secret est ? ***E*E


    Voila ce que ça fait en console mais seulement à la deuxième partie surement un problème de réinitialisation mais où ? :euh:

    Voici mon code C

    Pour main.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>

    #include "dico.h"

    #define TAILLE_MAX 100


    int main(int argc, char *argv[])
    {
       
        int continuerPartie = 1; //On initialise cette variable à 1 pour rentrer dans la boucle

        while(continuerPartie==1)
            {
               long i = 0, tailleMotSecret = 0, coups = 10, temoinPourCoups = 0;
               char motSecret[TAILLE_MAX] = {0}, motEtoile[TAILLE_MAX] = {0}, maLettre = 0;
               piocherMot(&motSecret);
       
               tailleMotSecret=strlen(motSecret); //On compte le nombre de caractères

               for(i=0; i < tailleMotSecret; i++) //Initialisation de motEtoile
                {
                    motEtoile[i]='*';
                }
       
               while(strcmp(motSecret, motEtoile) !=0 && coups > 0) //Début du jeu
                {
                    printf("Vous avez %ld coups\n", coups);
                    printf("Quel est le mot secret ? %s\n", motEtoile);
                    printf("Entrez  une lettre : ");
                    maLettre = lireCaractere();

                    for(i=0; i<tailleMotSecret; i++) //Comparaison du caractère
                      {
                        if(motSecret[i]==maLettre)
                         {
                           motEtoile[i]=maLettre;
                           temoinPourCoups++;
                         }
                      }

                    if(temoinPourCoups == 0)
                      {
                        coups--;
                      }

                    temoinPourCoups = 0;
                }
            if(coups == 0)
             {
               printf("Dommage le mot secret etait %s\n", motSecret);
             }
            else
             {
               printf("Bravo le mot secret etait bien %s\n", motSecret);
             }

            printf("Voulez vous continuer a jouer ? 1 pour oui 0 pour non\n");
            maLettre = lireCaractere();

           if(maLettre == '0')
            {
            system("PAUSE")
            return 0;
            }
        }
    }


    Pour dico.c
    #include <stdio.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
    #include <ctype.h>

    #include "dico.h"

    #define TAILLE_MAX 100



     int piocherMot(char *motPioche)
     {
      FILE* dico = NULL;
      int caractereLu = 0;
      long nombreDeMots = 0, numeroDuMotChoisi = 0;
     
      dico = fopen("francais.dico","r"); //Ouverture du fichier dictionnaire
     
      if(dico == NULL) //Test de l'ouverture
      {
              printf("erreur d'ouverture du fichier");
      }
     
     
     
      do      //Comptage du nombre de mots
      {
              caractereLu = fgetc(dico);
                  if(caractereLu == '\n')
                  {
                                 nombreDeMots++;
                  }
      }while(caractereLu != EOF);
     
     
      numeroDuMotChoisi = genererNombre(nombreDeMots); /*On stocke le nombre
                                                       générer aléatoirement dans
                                                       numeroDuMotChoisi*/

                                                       
      rewind(dico); // On revient au début du dico
     
     
      while(numeroDuMotChoisi > 0)   //Puis on décrément jusqu'à avoir trouver le bon mot
      {
      caractereLu = fgetc(dico);
       
                  if(caractereLu == '\n')
                  {

                                 numeroDuMotChoisi--;
                                 
                  }                             
       }
     
     fgets(motPioche, TAILLE_MAX, dico); //On stocke le mot dans une variable
     
     motPioche[strlen(motPioche) - 1] = '\0'; //Et on remplace le \n par \0
       fclose(dico); // On ferme le dico
       
       return 1; // On dit que tout c'est bien passé
    }

    long genererNombre(long nombreMax)    //On génère un nombre aléatoirement (cf TP 1)
    {
        srand(time(NULL));
        return (rand() % (nombreMax + 1));
    }

    char lireCaractere() //Fonction pour stocker dans une variable un caractère
    {
        char caractere = 0;

        caractere = getchar(); // On lit le premier caractère
        caractere = toupper(caractere); // On met la lettre en majuscule si elle ne l'est pas déjà

        // On lit les autres caractères mémorisés un à un jusqu'à l'\n
        while (getchar() != '\n') ;

        return caractere; // On retourne le premier caractère qu'on a lu
    }
    }


    Pour dico.h
    #ifndef DEF_DICO
    #define DEF_DICO

    //Prototypes

    /*Pour piocher un mot, il prend en entrée un pointeur sur l'endroit où va être stocké le mot
    et renvoie donc un mot soit un tableau de char*/


    int piocherMot(char *motPioche);


    /*Pour generer un nombre entre 1 et le chiffre pris en entrée, la fonction renvoie logiquement
    le nombre tirée au hasard
    */

    long genererNombre(long max);

    /*Fonction créer par Mateo21 pour lire les caractères*/

    char lireCaractere();


    #endif


    Merci d'avance pour votre aide :)
    • Partager sur Facebook
    • Partager sur Twitter
      15 juin 2006 à 18:20:22

      S'il vous plait aidez moi :)
      • Partager sur Facebook
      • Partager sur Twitter
        15 juin 2006 à 19:04:14

        Citation : chiculotte

        Voila mon problème, mon programme marche parfaitement la première fois puis quand je dis que je veux continuer il me dit ok me propose un autre mot mais la premiere lettre proposé est déterminé fausse automatiquement même si en vrai elle est bonne.

        Bravo le mot était bien YAHOURT
        Voulez vous continuer ? 1 pour oui 0 pour non
        1
        Vous avez 10 coups
        Le mot secret est ? ******
        Entrez une lettre : e
        Vous avez 9 coups
        Le mot secret est ? ******
        Entrez une lettre : e
        Vous avez 9 coups
        Le mot secret est ? ***E*E




        • Manque <ctype.h> pour toupper...
        • srand() doit être excécuté une fois au début du main().
        • Le type de continuerPartie est différent du formateur de scanf().
        • J'ai trouvé ton bug. Comme d'habitude, mauvaise utilisation de scanf(). Il reste un \n dans stdin au moment de la reprise. Je suggère de ne pas utiliser scanf() du tout.


        motEtoile = '*******'
        motSecret = 'DUALITE'
        Vous avez 10 coups
        Quel est le mot secret ? *******
        Entrez une lettre : d
        Vous avez 10 coups
        Quel est le mot secret ? D******
        Entrez une lettre : u
        Vous avez 10 coups
        Quel est le mot secret ? DU*****
        Entrez une lettre : a
        Vous avez 10 coups
        Quel est le mot secret ? DUA****
        Entrez une lettre : l
        Vous avez 10 coups
        Quel est le mot secret ? DUAL***
        Entrez une lettre : i
        Vous avez 10 coups
        Quel est le mot secret ? DUALI**
        Entrez une lettre : t
        Vous avez 10 coups
        Quel est le mot secret ? DUALIT*
        Entrez une lettre : e
        Bravo le mot secret etait bien DUALITE
        Voulez vous continuer a jouer ? 1 pour oui 0 pour non
        1
        motEtoile = '*******'
        motSecret = 'SYRIENS'
        Vous avez 10 coups
        Quel est le mot secret ? *******
        Entrez une lettre : s
        Vous avez 10 coups
        Quel est le mot secret ? S*****S
        Entrez une lettre : y
        Vous avez 10 coups
        Quel est le mot secret ? SY****S
        Entrez une lettre :
        <couic>
        • Partager sur Facebook
        • Partager sur Twitter
        Music only !
          15 juin 2006 à 19:21:40

          Merci à toi le 95ieme a avoir vu mon post et le seul a répondre :D.
          Juste une chose que je ne comprend pas c'est pour le srand() : tu veux que je le mette où ?
          Et pourquoi le réécrire ? car mon programme marche
          • Partager sur Facebook
          • Partager sur Twitter
            15 juin 2006 à 19:22:50

            Au passage

            long genererNombre(long nombreMax)
            {
                srand(time(NULL));
                return (rand() % nombreMax);
            }

            fonctionne mais tu ne poura jamais obtenir le dernier mot. Sa valeur sera enlevée par le modulo ! (Si evidement nombreMax est égal au nombre de mots, ce qui semble être le cas dans ton code ! ;) )
            Tu devrai mettre :

            long genererNombre(long nombreMax)
            {
                srand(time(NULL));
                return (rand() % (nombreMax + 1) );
            }
            • Partager sur Facebook
            • Partager sur Twitter
              15 juin 2006 à 19:29:04

              Merci :)

              Mais si je fais un retour à la ligne après mon dernier mot dans le fichier texte est ce que j'aurais besoin de cette manipulation ?

              (Question posée juste pour bien comprendre la logique :))
              • Partager sur Facebook
              • Partager sur Twitter
                15 juin 2006 à 19:32:07

                Ca depent en fait de la manière dont tu organise ton fichier dico.
                Si en effet tu a '\n' par mot, et que tu compte ce nombre de '\n', alors le resultat est pile le nombre de mot. Dans ce cas, oui tu doit faire : rand() % (nombre_mots + 1)
                • Partager sur Facebook
                • Partager sur Twitter
                  15 juin 2006 à 19:40:33

                  Merci encore une fois :)
                  Mais pour revenir à ce que disais ed : où faut-il que je mette mon srand() dans main ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 juin 2006 à 19:53:25

                    Au passage :

                    while(numeroDuMotChoisi > 0)
                    {
                    caractereLu = fgetc(dico);

                                if(caractereLu == '\n')
                                {
                                               numeroDuMotChoisi--;

                                }                             
                    }

                    fgets(motPioche, TAILLE_MAX, dico);


                    fgets, en plus de faire ce que l'on a l'habitude d'attendre de lui, place le curseru du fichier au debut de la ligne suivante ! ;)

                    while(numeroDuMotChoisi >= 0)
                    {
                        fgets(motPioche, TAILLE_MAX, dico);
                        numeroDuMotChoisi--;
                    }

                    C'est plus lisible, non ? :p

                    A mon avis, si il y a si peu de réponse, c'est parce que ton code est long et tout le monde n'a pas envie de passer son temps sur un code long, qui fait des choses triviales. C'est dommage.
                    On m'a toujours dit que les meilleurs programmeurs sont ceux qui ont un code plus lisible qu'efficace.

                    Un bon exercice serait d'optimiser le code, pas en efficacité, mais en lisibilité. :)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 juin 2006 à 20:49:42

                      J'essaie ça et j'édite mais je pensais que le noms de mes variables étaient claires... Veux tu dire que mon code manque de commentaires ?

                      Edit : quand je met ton code il n'affiche rien dans la console :(
                      Edit 2 : J'ai rajouté des commentaires
                      • Partager sur Facebook
                      • Partager sur Twitter
                        15 juin 2006 à 22:32:03

                        Citation : chiculotte

                        Edit : quand je met ton code il n'affiche rien dans la console :(


                        Tu as du oublier de remettre le curseur virtuel à zéro : rewind( dico );.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          15 juin 2006 à 22:41:38

                          Ben non ou alors on parle pas du même rewind ^^

                                                                             
                            rewind(dico); // On revient au début du dico
                           
                           
                            while(numeroDuMotChoisi > 0)   //Puis on décrément jusqu'à avoir trouver le bon mot
                            {
                            caractereLu = fgetc(dico);
                             
                                        if(caractereLu == '\n')
                                        {
                                               fgets(motPioche, TAILLE_MAX, dico); //On stocke le mot dans une variable
                                                       numeroDuMotChoisi--;
                                                       
                                        }                             
                             }
                           

                           
                           motPioche[strlen(motPioche) - 1] = '\0'; //Et on remplace le \n par \0
                             fclose(dico); // On ferme le dico
                             
                             return 1; // On dit que tout c'est bien passé
                          }
                          • Partager sur Facebook
                          • Partager sur Twitter
                            15 juin 2006 à 22:51:34

                            Ah oui, là c'est sur !!
                            Fait bien attention à ce que tu fait. Est-ce que tu essaie vraiment de savoir ce qui se passe avec ton code ?
                            Là, je n'ai pas l'impression.

                            Regarde bien ce code :
                            rewind(dico); // On revient au début du dico

                            while(numeroDuMotChoisi > 0)   //Puis on décrément jusqu'à avoir trouver le bon mot
                            {
                                caractereLu = fgetc(dico);
                                if(caractereLu == '\n')
                                {
                                    fgets(motPioche, TAILLE_MAX, dico); //On stocke le mot dans une variable
                                    numeroDuMotChoisi--;
                                }                             
                            }
                            motPioche[strlen(motPioche) - 1] = '\0'; //Et on remplace le \n par \0
                            fclose(dico); // On ferme le dico
                               
                            return 1; // On dit que tout c'est bien passé


                            Prend le temps de comprendre ce que tu écrit, et de comprendre ce que ça produit. ;)
                            Essaie de me dire pourquoi rien de s'affiche dans a console avec ton code.

                            PS : je ne t'ai pas donné ça comme lignes de code. Et pour la lisibilité, déjà une indentation correcte y ferait beaucoup. ;)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              15 juin 2006 à 23:03:50

                              Citation : chiculotte

                              Merci à toi le 95ieme a avoir vu mon post et le seul a répondre :D.
                              Juste une chose que je ne comprend pas c'est pour le srand() : tu veux que je le mette où ?


                              Déjà indiqué

                              Citation : -ed-


                              srand() doit être excécuté une fois au début du main().



                              int main ()
                              {
                                 /* variables locales... */

                                 srand(...);

                                 /* suite du code... */


                              Citation : chiculotte


                              Et pourquoi le réécrire ? car mon programme marche


                              Réécrire quoi ?
                              o_Oo_Oo_O Si il marchait, tu n'aurais pas posté, tu n'a pas compris le bug ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Music only !
                                16 juin 2006 à 0:33:56

                                Ben j'ai compris mais je ne vois pas pourquoi tu veux générer un nombre ici alors qu'il est générer dans ma fonction piocherMot. et mon problème venait uniquement du scanf. Mais merci quand même de suivre mon post :)

                                Pour Aszarsha je serais tenté de dire qu'il essaye de stocké du vide car on est juste après un \n et merci pour le conseil au niveau de l'indentation :)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  16 juin 2006 à 0:53:03

                                  Ca depend du code que tu considère ; tu as certainement fait des modifications depuis ton premier post.
                                  Si tu pouvais poster un nouveau message avec ton code (bien indenté :p ) tel qu'il l'est actuellement, ce serais plus simple pour savoir sur quoi se baser. ;)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    16 juin 2006 à 14:47:57

                                    Citation : chiculotte

                                    Ben j'ai compris mais je ne vois pas pourquoi tu veux générer un nombre ici alors qu'il est générer dans ma fonction piocherMot.


                                    o_Oo_Oo_O Je parle de srand(), pas de rand() !

                                    http://man.developpez.com/man3/srand.3.php

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Music only !

                                    TP : 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