Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème pendu

la 1ère lettre est toujours fausse

Sujet résolu
    29 juin 2006 à 17:08:50

    Bonjour tout le monde !

    J'ai fait le tp du pendu et après plusieurs heures d'acharnements, j'ai décidé d'adapter mon code à celui de Mateo (car le mien était ... incomprehensible ? :D )

    Sauf que j'ai un problème : la première lettre entrée est toujours considérée comme fausse. J'ai beau chercher, comparer mon code avec celui du tp, je ne trouve pas... C'est pourquoi j'aurais besoin de votre précieuse aide.

    Je ne sais pas à quel niveau le problème se situe, je met alors tout mon code :

    main.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int main()
    {
        //DÉCLARATION DES VARIABLES
        char lettre = 0;     //la lettre entre par l'utilisateur
        char mot_secret[100] = {0};     //le mot...
        long *lettres_trouver = NULL;     //le tableau pour le mot
        long nombre_coups_restant = 10;     //nb de coups...
        long i = 0;
        long taille_mot = 0;
        long continuer_partie = 1;

        long choix_menu = fct_menu();
        if (choix_menu == 2)
        {
            nombre_coups_restant = 100;
        }


        //COMMENCE LE JEU
        while (continuer_partie == 1)
        {
            fct_choisir_mot(mot_secret);
            taille_mot = strlen(mot_secret);

            lettres_trouver = malloc(taille_mot * sizeof(long));

            if (lettres_trouver == NULL)
            {
                exit(0);
            }

            for (i = 0 ; i < taille_mot ; i++)
            {
                lettres_trouver[i] = 0;
            }

            while (nombre_coups_restant > 0 && !fct_gagne(lettres_trouver, taille_mot))
            {
                printf ("Il vous reste %ld coups pour jouer. \n", nombre_coups_restant);
                printf ("Le mot secret est ");
                for (i = 0 ; i < taille_mot ; i++)
                {
                    if (lettres_trouver[i] == 1)
                    {
                        printf ("%c", mot_secret[i]);
                    }
                    else
                    {
                        printf ("*");
                    }
                }
                printf ("\n");
                printf ("Proposez une lettre : ");
                lettre = fct_lire_lettre();
                printf ("\n");

                //si la lettre est pas dans le mot
                if (!fct_recherche_lettre(lettre, mot_secret, lettres_trouver))
                {
                    nombre_coups_restant--;
                }
            }

            if (fct_gagne(lettres_trouver, taille_mot))
            {
                printf ("Bravo !!! Vous avez trouvez le mot %s \n\n\n", mot_secret);
            }
            else
            {
                printf ("Vous etes pendu !!! Le mot etait %s \n\n\n", mot_secret);
            }

            free(lettres_trouver);

            printf ("Voulez-vous faire une autre partie ? Entrer 1 pour oui et 0 pour non : ");
            scanf ("%ld", &continuer_partie);
            printf ("\n\n\n");
            if (choix_menu == 1)
            {
                nombre_coups_restant = 10;
            }
        }


        return 0;
    }




    fonctions.c

    #include "fonctions.h"


    long fct_menu()
    {
        long choix = 0;

        printf ("Bienvenue dans le pendu ! \n\n\n");
        printf (" *****  MENU  ***** \n\n");
        printf ("1- Mode Normal \n");
        printf ("2- Mode Aventure \n");
        printf ("3- Voir les records pour le mode aventure \n");
        printf ("4- Quitter \n\n");

        while (choix < 1 || choix > 4)
        {
            printf ("Votre choix : ");
            scanf ("%ld", &choix);
            printf ("\n\n");
        }

        return choix;
    }



    char fct_lire_lettre()
    {
        char caractere = 0;

        caractere = getchar();
        caractere  = toupper(caractere);

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

        return caractere;
    }



    long fct_recherche_lettre(const char lettre, const char *mot_secret, long lettres_trouver[])
    {
        long i = 0;
        long lettre_ok = 0;
        long longueur = strlen(mot_secret);

        for (i = 0 ; i < longueur ; i++)
        {
            if (mot_secret[i] == lettre)
            {
                lettre_ok = 1;
                lettres_trouver[i] = 1;
            }
        }

        return lettre_ok;
    }



    long fct_gagne(const long lettres_trouver[], long taille_mot)
    {
        long i = 0;
        long gagne = 1;

        for (i = 0 ; i < taille_mot ; i++)
        {
            if (lettres_trouver[i] == 0)
            {
                gagne = 0;
            }
        }

        return gagne;
    }




    fonctions.h

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>

    long fct_menu();

    char fct_lire_lettre();

    long fct_recherche_lettre(const char lettre, const char *mot_secret, long lettres_trouver[]);

    long fct_gagne(const long lettres_trouver[], long taille_mot);




    dico.c

    #include "dico.h"


    void fct_choisir_mot(char *mot_secret)
    {
        FILE *fichier = NULL;
        long nombre_mots = 0, numero_mot_choisi = 0, caractere_actuel = 0, i = 0;

        fichier = fopen ("dictionnaire.txt", "r");

        if (fichier == NULL)
        {
            printf ("Erreur !!!");
        }
        else
        {
            //on compte le nombre de mots
            do
            {
                caractere_actuel = fgetc(fichier);
                if (caractere_actuel == '\n')
                {
                    nombre_mots++;
                }
            }while(caractere_actuel != EOF);

            nombre_mots++;

            //on choisi un mot au hasard
            numero_mot_choisi = fct_mot_hasard(nombre_mots);
            printf ("%ld", numero_mot_choisi);


            //on se rend a la bonne ligne
            rewind(fichier);
            while (numero_mot_choisi > 0)
            {
                caractere_actuel = fgetc(fichier);
                if (caractere_actuel == '\n')
                {
                    numero_mot_choisi--;
                }
            }


            //on lit le mot
            fgets(mot_secret, 100, fichier);
            //on enleve le \n et on met \0
            mot_secret[(strlen(mot_secret)-1)] = '\0';

            //et on ferme
            fclose(fichier);
        }
    }



    long fct_mot_hasard(long nombre_mot)
    {
        srand(time(NULL));
        return (rand() % nombre_mot);
    }




    dico.h

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>

    void fct_choisir_mot(char *mot_secret);

    long fct_mot_hasard(long nombre_mot);



    Le mode normal est le pendu normal... Et dans le mode aventure, vous avez 100 chances et vous devez trouvé le plus de mots possibles. Ces deux modes ne sont pas encore tout à fait au point, mais je désirais règler le problème avant.

    Merci d'avance !!
    • Partager sur Facebook
    • Partager sur Twitter
      29 juin 2006 à 20:57:14

      chez moi aucun lettre ne marche, çà peut venir de fct_lire_lettre
      • Partager sur Facebook
      • Partager sur Twitter
        29 juin 2006 à 21:02:57

        Je ne crois pas... elle est identique à celle de mateo et elle fonctionne bien.

        C'est juste pour la première lettre, ensuite tout fonctionne.

        Je viens à l'instant de comparer chacune de mes fonctions à celles de mateo, caractère par caractère et je crois que le problème est dans le main, car ailleurs tout est impecable (au niveau des erreurs hein :p ). La seule chose que j'ai fait, c'est de rajouter un menu avec un autre mode de jeu, je vais me pencher dessus, qui sais, c'est peut-être à cause de cela.

        [edit] C'est à cause de mon menu. Si je l'enlève, ça fonctionne, mais j'aimerais bien le remettre sans bugs !

        [edit2] C'était à cause de scanf :colere2:

        J'ai fais ceci et c'est correct :

        long fct_menu()
        {
            long choix = 0;

            printf ("Bienvenue dans le pendu ! \n\n\n");
            printf (" *****  MENU  ***** \n\n");
            printf ("1- Mode Normal \n");
            printf ("2- Mode Aventure \n");
            printf ("3- Voir les records pour le mode aventure \n");
            printf ("4- Quitter \n\n");

            while (choix < 1 || choix > 4)
            {
                printf ("Votre choix : ");
                scanf ("%ld", &choix);
                printf ("\n\n");
                while (getchar() != '\n');   // J'ai rajouter cette ligne...
            }

            return choix;
        }
        • Partager sur Facebook
        • Partager sur Twitter

        Problème 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