Partage
  • Partager sur Facebook
  • Partager sur Twitter

TP - Le pendu - Language C

    14 février 2019 à 23:16:43

    Bonjour, je suis en train d'essayer de faire marcher mon TP sur le pendu, et tout se passe bien pendant la première partie. Seulement lorsque je choisis de rejouer, la première lettre que je tape est constamment reconnue comme fausse.

    J'ai beau relire mon code, je ne comprends pas pourquoi... Sachant que toutes les variables sont réinitialisées au moment où l'on choisit de rejouer, cela devrait marcher comme lorsque je lance le jeu pour la première fois, mais rien à faire...

    Si quelqu'un savait m'expliquer l'erreur, ça me sauverais :p

    Merci.

    main.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include "Fonctions.h"
    #include "dico.h"
    
    #define RLINE printf("\n");
    #define TAB printf("\t");
    #define SEPARE printf("\n\t-----------------------\n");
    
    #define COUPSR 10
    
    int main()
    {
        int rejouer=0;
    
    do
    {
    
        system("cls");
        rejouer=0;
    
        int i=0;
    
        int coupsRestant=COUPSR;
        char motSecret[100]={0};
        int *lettreTrouvee=NULL;
    
        char lettreEntree=0;
    
        int nombreMotsDico=0;
        int tailleMotPiocher=0;
        int numeroMotPiocher=0;
        int caractereLu=0;
    
        FILE *dico=NULL;
        dico=fopen("dico.txt", "r");
    
    if (!dico)
    printf("\n\nERREUR dico\n\n");
    
    
    do
    {
        caractereLu=fgetc(dico);
    
        if(caractereLu=='\n')
        nombreMotsDico++;
    
    }while(caractereLu != EOF);
    
    
        numeroMotPiocher=nombreAleatoire(nombreMotsDico);
    
    
    rewind(dico);
    
        for(i=0; i<numeroMotPiocher; i++)
        if(!fgets(motSecret, 100, dico))
        printf("\n\nERREUR Mot piocher\n\n");
        motSecret[strlen(motSecret)-1]='\0';
    
    dico=fclose(dico);
    
    tailleMotPiocher=strlen(motSecret);
    lettreTrouvee=malloc(tailleMotPiocher*sizeof(int));
    
        for(i=0; i<tailleMotPiocher; i++)
        lettreTrouvee[i]=0;
    
    printf("%s", motSecret); //Pour les Tests
    
    RLINE
    RLINE
    
        menuTitre();
    
        menuJeu(coupsRestant, motSecret, lettreTrouvee, lettreEntree, i);
    
        menuGagne(lettreTrouvee, motSecret);
        RLINE
        TAB
        printf("Voulez-vous rejouer ? OUI (1) NON (0) : ");
        scanf("%d", &rejouer);
    
    free(lettreTrouvee);
    
        }while(rejouer==1);
    
    
        return 0;
    }
    



    fonction.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include "Fonctions.h"
    
    #define RLINE printf("\n");
    #define TAB printf("\t");
    #define SEPARE printf("\n\t-----------------------\n");
    
    int nombreAleatoire(int nombreMax)
    {
        srand(time(NULL));
        return (rand() % (nombreMax))+1;
    }
    
    void menuTitre()
    {
    RLINE
    TAB
        printf("Bienvenu dans le jeu du Pendu !");
    RLINE
    TAB
        printf("-------------------------------");
    RLINE
    }
    
    void menuJeu(int coupsRestant, char motSecret[], int lettreTrouvee[], char lettreEntree, int i)
    {
        while(coupsRestant!=0 && !partieGagne(lettreTrouvee, motSecret))
        {
    RLINE
    TAB
        printf("Coups restant : %d", coupsRestant);
    RLINE
    TAB
        printf("Mot secret : ");
        for (i=0; motSecret[i]!='\0';i++)
        {
            if(lettreTrouvee[i]==1)
            {
                printf("%c", motSecret[i]);
            }
            else
            {
                printf("*");
            }
    
        }
    RLINE
    TAB
        printf("Entrez une lettre : ");
        lettreEntree=lireLettre();
    
            if (!compareLettre(lettreEntree, motSecret, lettreTrouvee))
            {
                coupsRestant--;
            }
    
    SEPARE
        }
    }
    
    void menuGagne(int lettreTrouvee[], char motSecret[])
    {
        if (partieGagne(lettreTrouvee, motSecret))
    {
    RLINE
    TAB
        printf("Vous avez Gagner !, le mot secret etait bien : %s", motSecret);
    RLINE
    }
    else
    {
    RLINE
    TAB
        printf("Vous avez perdu !, le mot secret etait : %s", motSecret);
    RLINE
    }
    }
    
    char lireLettre()
    {
        char lettre=0;
        lettre=getchar();
        lettre=toupper(lettre);
    
        while(getchar()!='\n');
        return lettre;
    }
    
    int compareLettre(char lettreEntree, char motSecret[], int lettreTrouvee[])
    {
        int i=0;
        int lettreOK=0;
    
        for(i=0; motSecret[i]!='\0';i++)
        {
            if (lettreEntree==motSecret[i])
            {
                lettreTrouvee[i]=1;
                lettreOK=1;
            }
        }
        return lettreOK;
    }
    
    int partieGagne (int lettreTrouvee[], char motSecret[])
    {
        int i=0;
        int gagne=1;
    
        for (i=0; motSecret[i]!='\0';i++)
        {
            if (!lettreTrouvee[i])
            {
                gagne=0;
            }
        }
        return gagne;
    }
    



    fonction.h

    void menuTitre();
    void menuJeu(int coupsRestant, char motSecret[], int lettreTrouvee[], char lettreEntree, int i);
    void menuGagne(int lettreTrouvee[], char motSecret[]);
    char lireLettre();
    int compareLettre(char lettreEntree, char motSecret[], int lettreTrouvee[]);
    int partieGagne (int lettreTrouvee[], char motSecret[]);
    int nombreAleatoire(int nombreMax);



    -
    Edité par Cybevil 14 février 2019 à 23:17:36

    • Partager sur Facebook
    • Partager sur Twitter
      15 février 2019 à 7:19:03

      as tu pensé à vider le buffer d'entré quand tu relance une partie ?
      • Partager sur Facebook
      • Partager sur Twitter

      la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

      Mon GitHub

        15 février 2019 à 20:57:18

        Merciiii, après avoir vidé le buffer à la toute fin, ça fonctionne :)
        • Partager sur Facebook
        • Partager sur Twitter

        TP - Le pendu - Language 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