Pendu

Résolu/Fermé
Xifly Messages postés 44 Date d'inscription vendredi 3 janvier 2014 Statut Membre Dernière intervention 8 décembre 2017 - Modifié par Xifly le 23/01/2014 à 15:53
Xifly Messages postés 44 Date d'inscription vendredi 3 janvier 2014 Statut Membre Dernière intervention 8 décembre 2017 - 24 janv. 2014 à 18:12
Bonjour,

Voici mon programme :
celui-ci fonctionne avec un fichier nommé dictionnaire.txt contenant différents mots avec un retour à la ligne entre chacun et fini par un dernier retour à la ligne (et une ligne vide donc).
Le problème, un tableau lettres_utilisees de 26 cases rempli de '-' et dans lequel viennent s'ajouter dans l'ordre alphabétique les lettres déjà entrées par l'utilisateur mais je ne sais pour quelle raison, le mot à trouver s'ajoute à la fin de celle ci.
Merci d'avance pour votre aide !

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#define TAILLE_MAX 1000


char flettre (char lettre)
{
    int ascii = 0;
    lettre = toupper(lettre); //mise en majuscule
    while(getchar() != '\n'); //permet de comptabiliser uniquement la première lettre entrée
    ascii = lettre;


        while ( (ascii < 65) || (ascii > 90) )
        {
            printf("\nVotre caract\212re n'est pas valide.\nVous devez entrer une lettre.\nLes accents ne sont pas pris en compte.\n\nVeuillez saisir une nouvelle lettre : ");
            lettre = getchar(); //mémorise la lettre tapée
            lettre = toupper(lettre); //mise en majuscule
            while(getchar() != '\n'); //permet de comptabiliser uniquement la première lettre entrée
            ascii = lettre;
        }

return (lettre);
}



int main(void)
{
    //Initialisation
    int i = 0;
    int j = 0;
    char lettre;
    int coupsRestants = 10;
    int bonneLettre = 0;
    int ascii = 0;
    FILE* fichier = NULL;
    char motAtrouver[TAILLE_MAX] = "";
    fichier = fopen("dictionnaire.txt", "r");
    int nombre_mots = 0;
    int caractereActuel = 0;
    char lettre_utilisees[26];


        //Initialiser la graine aléatoire:
        srand (time (NULL));

        //Initialisation de lettre_utilises
        for (j=0 ; j < 26; j++)
        {
            lettre_utilisees[j]= '-';
        }
        lettre_utilisees[26] = '\0';


        if (fichier != NULL)
        {
            do
            {
                caractereActuel = fgetc(fichier);
                if (caractereActuel == '\n')
                {
                    nombre_mots = nombre_mots + 1; //on comptabilise le nombre de mots dans le dictionnaire
                }
            } while (caractereActuel != EOF);

            fseek(fichier, 0, SEEK_SET); //On remet le pointeur au début du fichier

            int nombre_aleatoire = rand() % nombre_mots; //On choisi un nombre aléatoire compris entre 0 et le nombre de mots

            while(nombre_aleatoire >= 0 && fgets(motAtrouver, TAILLE_MAX, fichier) != NULL)
                {
                  nombre_aleatoire--;
                }
            fgets(motAtrouver, TAILLE_MAX, fichier); //on va chercher le mot aléatoire
            motAtrouver[strlen(motAtrouver) - 1] = '\0'; //on supprime le retour à la ligne et on ferme la chaine

            fclose(fichier); //on referme le dictionnaire
        }

        else
        {
            printf("Impossible d'ouvrir le dictionnaire");
        }

        //initialisation
        char lettresTrouvees[strlen(motAtrouver) + 1];
        int resteAtrouver = strlen(motAtrouver);

        //Initialisation de lettresTrouvees
        for (i=0 ; i < strlen(motAtrouver); i++)
        {
            lettresTrouvees[i]= '*';
        }
        lettresTrouvees[strlen(motAtrouver)] = '\0';

        while ( (coupsRestants > 0) && (resteAtrouver > 0) )
        {
            system("cls");

            switch(coupsRestants)
            {
            case 1 :
                printf("___________________\n");
                printf("|                 |\n");
                printf("|    __________   |\n");
                printf("|    | /     |    |\n");
                printf("|    |/      8    |\n");
                printf("|    |     (O.o)  |\n");
                printf("|    |     /( )\\  |\n");
                printf("|    |      /     |\n");
                printf("| ___|___         |\n");
                printf("|_________________|\n");
                break;
            case 2 :
                printf("___________________\n");
                printf("|                 |\n");
                printf("|    __________   |\n");
                printf("|    | /     |    |\n");
                printf("|    |/      8    |\n");
                printf("|    |     (O.o)  |\n");
                printf("|    |     /( )\\  |\n");
                printf("|    |            |\n");
                printf("| ___|___         |\n");
                printf("|_________________|\n");
                break;
            case 3 :
                printf("___________________\n");
                printf("|                 |\n");
                printf("|    __________   |\n");
                printf("|    | /     |    |\n");
                printf("|    |/      8    |\n");
                printf("|    |     (O.o)  |\n");
                printf("|    |     /( )   |\n");
                printf("|    |            |\n");
                printf("| ___|___         |\n");
                printf("|_________________|\n");
                break;
            case 4 :
                printf("___________________\n");
                printf("|                 |\n");
                printf("|    __________   |\n");
                printf("|    | /     |    |\n");
                printf("|    |/      8    |\n");
                printf("|    |     (O.o)  |\n");
                printf("|    |      ( )   |\n");
                printf("|    |            |\n");
                printf("| ___|___         |\n");
                printf("|_________________|\n");
                break;
            case 5 :
                printf("___________________\n");
                printf("|                 |\n");
                printf("|    __________   |\n");
                printf("|    | /     |    |\n");
                printf("|    |/      8    |\n");
                printf("|    |     (O.o)  |\n");
                printf("|    |            |\n");
                printf("|    |            |\n");
                printf("| ___|___         |\n");
                printf("|_________________|\n");
                break;
            case 6:
                printf("___________________\n");
                printf("|                 |\n");
                printf("|    __________   |\n");
                printf("|    | /     |    |\n");
                printf("|    |/      8    |\n");
                printf("|    |            |\n");
                printf("|    |            |\n");
                printf("|    |            |\n");
                printf("| ___|___         |\n");
                printf("|_________________|\n");
                break;
            case 7:
                printf("___________________\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|    |            |\n");
                printf("|    |            |\n");
                printf("|    |            |\n");
                printf("|    |            |\n");
                printf("|    |            |\n");
                printf("| ___|___         |\n");
                printf("|_________________|\n");
                break;
            case 8:
                printf("___________________\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("| ___ ___         |\n");
                printf("|_________________|\n");
                break;
            case 9:
                printf("___________________\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|_________________|\n");
                break;
            case 10:
                printf("___________________\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|_________________|\n");
                break;
            }

            printf("\nVoici le mot a trouver : %s \n\n", lettresTrouvees);
            printf("Il vous reste %d chance(s)\n\n", coupsRestants);
            printf("lettre utilisées : %s\n", lettre_utilisees);
            printf("\n\nQuelle lettre choississez-vous ? ");
            lettre = getchar(); //mémorise la lettre tapée
            lettre = flettre(lettre);
            ascii = lettre;

            for (i=0 ; i < strlen(motAtrouver); i++)
            {
                if (lettre == motAtrouver[i])
                {
                    lettresTrouvees[i] = motAtrouver[i];

                    bonneLettre = bonneLettre + 1; //permet de savoir si le joueur a trouvé au moins une lettre à cette manche
                    resteAtrouver = resteAtrouver - 1;//permet de comptabiliser le nombre de lettre qu'il lui reste à trouver
                }
            }

            lettre_utilisees[ascii-65] = lettre;
            lettre_utilisees[26] = '\0';

            if (bonneLettre == 0)
            {
                coupsRestants = coupsRestants - 1;
            }
            bonneLettre = 0; //on remet le compteur a zéro pour chaque manche

            if (resteAtrouver == 0)
            {
                printf("\nVous avez gagn\202 ! :D \n");
            }
        }

        if (coupsRestants ==0)
        {
            system("cls");

            printf("___________________\n");
            printf("|                 |\n");
            printf("|    __________   |\n");
            printf("|    | /     |    |\n");
            printf("|    |/      8    |\n");
            printf("|    |     (O.o)  |\n");
            printf("|    |     /( )\\  |\n");
            printf("|    |      / \\   |\n");
            printf("| ___|___         |\n");
            printf("|_________________|\n\n");

            printf("Vous avez perdu, le mot \205 trouver \202t\202 %s \n",motAtrouver);

        }


return 0;
}


3 réponses

Xifly Messages postés 44 Date d'inscription vendredi 3 janvier 2014 Statut Membre Dernière intervention 8 décembre 2017
23 janv. 2014 à 16:14
pourtant j'ai fais un petit programme de test et ça marche très bien :

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

int main(void)
{
    char lettre_utilisees[26];
    int i = 0;
    char lettre;
    int ascii;

    //Initialisation de lettre_utilises
    for (i=0 ; i < 26; i++)
    {
        lettre_utilisees[i]= '-';
    }
    lettre_utilisees[26] = '\0';

    printf("lettre utilisées : %s\n", lettre_utilisees);

    printf("Entrez une lettre :");
    lettre = getchar(); //mémorise la lettre tapée
    lettre = toupper(lettre); //mise en majuscule
    while(getchar() != '\n'); //permet de comptabiliser uniquement la première lettre entrée
    printf("lettre tapée : %c\n", lettre);
    ascii = lettre;
    printf("ascii : %d\n", ascii);
    lettre_utilisees[ascii-65] = lettre;
    lettre_utilisees[26] = '\0';

    printf("lettre utilisées : %s\n", lettre_utilisees);
}
0
Utilisateur anonyme
24 janv. 2014 à 02:31
Peux-tu mettre le résultat lors de l'exécution du programme?
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
24 janv. 2014 à 12:00
Salut Xifly,

C'est dû au fait que tu n'alloues pas le bon espace pour lettre_utilisees, qui, pour contenir l'alphabet doit être
char lettre_utilisees[27];
et non pas
char lettre_utilisees[26];
, car il manquerait un espace pour le caractère
'\0'
devant terminer la chaîne.

J'ai testé ton code, et il y a des tests amusants à faire.

Par exemple, si la bonne réponse est "QUATRE" et que tu tapes la réponse "A" cinq fois, tu gagnes sans avoir trouvé les lettres restantes :-)


Dal
0
Xifly Messages postés 44 Date d'inscription vendredi 3 janvier 2014 Statut Membre Dernière intervention 8 décembre 2017
Modifié par Xifly le 24/01/2014 à 16:49
Merci pour ta réponse
En effet en mettant 27, les lettres entrées se rentre bien dans mon tableau, à leur place. Mais je ne sais pour quelle raison, la variable
motAtrouver
devient une variable vide ... je peux donc rentré autant de lettre que je veux je perd au bout de 10 lettres sans rien pouvoir trouver ...
Sinon l'histoire du "a" 5 fois est réglée ;)
0
Xifly Messages postés 44 Date d'inscription vendredi 3 janvier 2014 Statut Membre Dernière intervention 8 décembre 2017
24 janv. 2014 à 17:14
Tout marche, merci pour tout ! :D
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>

#define TAILLE_MAX 1000


char flettre (char lettre)
{
    int ascii = 0;
    lettre = toupper(lettre); //mise en majuscule
    while(getchar() != '\n'); //permet de comptabiliser uniquement la première lettre entrée
    ascii = lettre;


        while ( (ascii < 65) || (ascii > 90) )
        {
            printf("\nVotre caract\212re n'est pas valide.\nVous devez entrer une lettre.\nLes accents ne sont pas pris en compte.\n\nVeuillez saisir une nouvelle lettre : ");
            lettre = getchar(); //mémorise la lettre tapée
            lettre = toupper(lettre); //mise en majuscule
            while(getchar() != '\n'); //permet de comptabiliser uniquement la première lettre entrée
            ascii = lettre;
        }

return (lettre);
}

void fmotAtrouver(FILE* fichier, char * motAtrouver)
{
    int caractereActuel = 0;
    int nombre_mots = 0;
    char *p;

    do
    {
        caractereActuel = fgetc(fichier);
        if (caractereActuel == '\n')
        {
            nombre_mots = nombre_mots + 1; //on comptabilise le nombre de mots dans le dictionnaire
        }
    } while (caractereActuel != EOF);

    if (nombre_mots < 1)
    {
        printf("Le dictionnaire ne contient aucun mot,ou un seul mot sans retour à la ligne. Nous ne pouvons pas jouer\n");
        exit(EXIT_FAILURE);
    }

    rewind(fichier); //On remet le pointeur au début du fichier

    int nombre_aleatoire = rand() % nombre_mots; //On choisi un nombre aléatoire compris entre 0 et nombre_mots - 1

    while(nombre_aleatoire >= 0 && fgets(motAtrouver, TAILLE_MAX, fichier) != NULL)
    {
        nombre_aleatoire--;
    }

    fgets(motAtrouver, TAILLE_MAX, fichier); //on va chercher le mot aléatoire
    motAtrouver[strlen(motAtrouver) - 1] = '\0'; //on supprime le retour à la ligne et on ferme la chaine


    //if ((p = strchr(motAtrouver,'\n')) != NULL) *p='\0';  //on supprime le retour à la ligne et on ferme la chaine
}

void fdessin(int coupsRestants)
{
            switch(coupsRestants)
            {
            case 1 :
                printf("___________________\n");
                printf("|                 |\n");
                printf("|    __________   |\n");
                printf("|    | /     |    |\n");
                printf("|    |/      8    |\n");
                printf("|    |     (O.o)  |\n");
                printf("|    |     /( )\\  |\n");
                printf("|    |      /     |\n");
                printf("| ___|___         |\n");
                printf("|_________________|\n");
                break;
            case 2 :
                printf("___________________\n");
                printf("|                 |\n");
                printf("|    __________   |\n");
                printf("|    | /     |    |\n");
                printf("|    |/      8    |\n");
                printf("|    |     (O.o)  |\n");
                printf("|    |     /( )\\  |\n");
                printf("|    |            |\n");
                printf("| ___|___         |\n");
                printf("|_________________|\n");
                break;
            case 3 :
                printf("___________________\n");
                printf("|                 |\n");
                printf("|    __________   |\n");
                printf("|    | /     |    |\n");
                printf("|    |/      8    |\n");
                printf("|    |     (O.o)  |\n");
                printf("|    |     /( )   |\n");
                printf("|    |            |\n");
                printf("| ___|___         |\n");
                printf("|_________________|\n");
                break;
            case 4 :
                printf("___________________\n");
                printf("|                 |\n");
                printf("|    __________   |\n");
                printf("|    | /     |    |\n");
                printf("|    |/      8    |\n");
                printf("|    |     (O.o)  |\n");
                printf("|    |      ( )   |\n");
                printf("|    |            |\n");
                printf("| ___|___         |\n");
                printf("|_________________|\n");
                break;
            case 5 :
                printf("___________________\n");
                printf("|                 |\n");
                printf("|    __________   |\n");
                printf("|    | /     |    |\n");
                printf("|    |/      8    |\n");
                printf("|    |     (O.o)  |\n");
                printf("|    |            |\n");
                printf("|    |            |\n");
                printf("| ___|___         |\n");
                printf("|_________________|\n");
                break;
            case 6:
                printf("___________________\n");
                printf("|                 |\n");
                printf("|    __________   |\n");
                printf("|    | /     |    |\n");
                printf("|    |/      8    |\n");
                printf("|    |            |\n");
                printf("|    |            |\n");
                printf("|    |            |\n");
                printf("| ___|___         |\n");
                printf("|_________________|\n");
                break;
            case 7:
                printf("___________________\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|    |            |\n");
                printf("|    |            |\n");
                printf("|    |            |\n");
                printf("|    |            |\n");
                printf("|    |            |\n");
                printf("| ___|___         |\n");
                printf("|_________________|\n");
                break;
            case 8:
                printf("___________________\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("| ___ ___         |\n");
                printf("|_________________|\n");
                break;
            case 9:
                printf("___________________\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|_________________|\n");
                break;
            case 10:
                printf("___________________\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|                 |\n");
                printf("|_________________|\n");
                break;
            }
}

void faffichage(char * lettresTrouvees, int coupsRestants, int resteAtrouver, char * lettre_utilisees)
{
    int i = 0;
    printf("\nVoici le mot a trouver : %s \n\n", lettresTrouvees);
    printf("Il vous reste %d chance(s)\n\n", coupsRestants);
    printf("Il vous reste %d lettres à trouver.\n\n", resteAtrouver);
    printf("Vous avez déjà utilisé les lettres suivantes : ");
    for (i=0; i < 27; i++)
    {
        if (lettre_utilisees[i] != '-')
        {
            printf("%c", lettre_utilisees[i]);
        }
    }
    printf("\n\nQuelle lettre choississez-vous ? ");
}

void fgagne(int resteAtrouver, char * lettresTrouvees, int coupsRestants)
{
    if (resteAtrouver == 0)
    {
        system("cls");
        fdessin(coupsRestants);
        printf("\nVoici le mot a trouver : %s \n\n", lettresTrouvees);
        printf("Il vous restait encore %d chance(s)\n\n", coupsRestants);
        printf("\nBravo, Vous avez gagn\202 ! :D \n");
    }
}

void fperdu(int coupsRestants, char * motAtrouver)
{
    if (coupsRestants ==0)
    {
        system("cls");

        printf("___________________\n");
        printf("|                 |\n");
        printf("|    __________   |\n");
        printf("|    | /     |    |\n");
        printf("|    |/      8    |\n");
        printf("|    |     (O.o)  |\n");
        printf("|    |     /( )\\  |\n");
        printf("|    |      / \\   |\n");
        printf("| ___|___         |\n");
        printf("|_________________|\n\n");

        printf("Vous avez perdu, le mot \205 trouver \202t\202 %s. \n",motAtrouver);

    }
}

void finitialisation(char * lettre_utilisees)
{
    int j = 0;
    for (j = 0 ; j < 26; j++)
    {
        lettre_utilisees[j]= '-';
    }
    lettre_utilisees[26] = '\0';
}

void flettre_utilisees(char * lettre_utilisees, char lettre)
{
    int ascii = 0;
    ascii = lettre;
    lettre_utilisees[ascii-65] = lettre;
    lettre_utilisees[26] = '\0';

}


int main(void)
{
    //Initialisation
    int i = 0;
    char lettre;
    int ascii = 0;
    int coupsRestants = 10;
    int bonneLettre = 0;
    FILE* fichier = NULL;
    char motAtrouver[TAILLE_MAX] = "";
    fichier = fopen("dictionnaire.txt", "r");
    char lettre_utilisees[27];

    //Initialiser la graine aléatoire:
    srand (time (NULL));

    finitialisation(lettre_utilisees);


    if (fichier != NULL)
    {
        fmotAtrouver(fichier, motAtrouver);
        fclose(fichier); //on referme le dictionnaire
    }
    else
    {
        printf("Impossible d'ouvrir le dictionnaire");
        return EXIT_FAILURE;
    }

    //initialisation
    char lettresTrouvees[strlen(motAtrouver) + 1];
    int resteAtrouver = strlen(motAtrouver);

    //Initialisation de lettresTrouvees
    for (i=0 ; i < strlen(motAtrouver); i++)
    {
        lettresTrouvees[i]= '*';
    }
    lettresTrouvees[strlen(motAtrouver)] = '\0';


    while ( (coupsRestants > 0) && (resteAtrouver > 0) )
    {
        system("cls");
        fdessin(coupsRestants);
        faffichage(lettresTrouvees, coupsRestants, resteAtrouver, lettre_utilisees);
        lettre = getchar(); //mémorise la lettre tapée
        lettre = flettre(lettre);

        for (i=0 ; i < strlen(motAtrouver); i++)
        {
            if (lettre == motAtrouver[i] && lettresTrouvees[i]!=motAtrouver[i])
            {
                lettresTrouvees[i] = motAtrouver[i];

                bonneLettre = bonneLettre + 1; //permet de savoir si le joueur a trouvé au moins une lettre à cette manche
                resteAtrouver = resteAtrouver - 1;//permet de comptabiliser le nombre de lettre qu'il lui reste à trouver
            }
        }

        flettre_utilisees(lettre_utilisees, lettre);

        if (bonneLettre == 0)
        {
            coupsRestants = coupsRestants - 1;
        }
        bonneLettre = 0; //on remet le compteur a zéro pour chaque manche

        fgagne(resteAtrouver, lettresTrouvees, coupsRestants);
    }

    fperdu(coupsRestants, motAtrouver);

return 0;
}
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 24/01/2014 à 17:28
Cool, bravo Xifly :-)

Apprendre à programmer, c'est aussi apprendre à déboguer :-)

Bonne continuation !
0
Xifly Messages postés 44 Date d'inscription vendredi 3 janvier 2014 Statut Membre Dernière intervention 8 décembre 2017
24 janv. 2014 à 18:12
Merci beaucoup :)
0