Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur inquiétante Entrée

Erreur scanf

    24 juin 2017 à 17:32:20

    Bonjour les zéros, 

    J'ai un sérieux problème dans mon code du Pendu.  En fait, comme vous allez le voir, j'ai crée un mode 2 joueurs (*il n'y a pas encore de CASH !), et au moment de taper une lettre pour trouver le mot de l'autre utilisateur, et bah... la première lettre tapée n'est pas comptabilisée, ce qui signifie qu'il faut taper deux fois la même lettre ! et on perd alors un coup également  !

    Pouvez-vous m'en dire plus ?

     Ci-joint le fichier MAIN, 

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include "dico.h"
    
    
    int gagne(int lettreTrouvee[], int tailleMot);
        int rechercherCaractere(char lettre, char motSecret1[], int lettreTrouvee[]);
        char lireCaractere();
        char motMajuscule(char motSecret[]);
    int *erreur = NULL;
    
    int main()
    {
        int refairePartie = 0;
    
    do{
     int nombreDeCoupsAjouer = 10;
     char motSecret[100] = {0};
     char lettre = 0;
    int *lettreTrouvee  = NULL;
    int i = 0;
    int tailleMot = 0;
    int nombreDeCoupsJoues =1;
    int nbJoueurs = 1;
    int erreurJoueurs = 0;
    
    
    if(refairePartie == 0)
    {
    printf("Bienvenue dans le jeu du Pendu !\n");
    printf("\nLe but du jeu est de trouver le mot secret.\nProposez des lettres afin de trouver ce mot.\n\
    Si vous echouer sur une lettre, vous perdez un point.\nIl existe aussi le mode CASH, essayez de \
    trouver directement le mot cache,\n cependant si vous echouez, vous perdez trois points d'un coup.\n");
    printf("------------------------------------------------------------------------------------------------------------------------\n");
    
    }
    do{
    printf("\nVoulez-vous jouer tout seul ou a 2 joueurs ? \nPour jouer a deux, tapez 2, sinon tapez 1.\n");
    scanf("%d", &nbJoueurs);
    printf("\n");
    
    if(nbJoueurs != 1 && nbJoueurs != 2)
    {
        printf("Vous n'avez pas choisi un nombre entre 1 et 2.\n");
       erreurJoueurs = 1;
       erreur = &erreurJoueurs;
    }
    }while(nbJoueurs != 1 && nbJoueurs != 2);
    if(nbJoueurs == 2)
    {
    
    printf("------------------------------------------------------------------------------------------------------------------------\n");
        printf("Joueur 1, eloigner votre compagnon pour qu'il ne voie votre mot secret.\n\n");
        printf("Maintenant, tapez le mot que devra trouver votre complice :");
    scanf("%s", motSecret);
    motMajuscule(motSecret);
        printf("\nAPPUYEZ SUR ENTREE");
       system("cls");
        printf("Vous pouvez desormais faire venir votre complice.\n");
        printf("\nLe but du jeu est de trouver le mot secret.\nProposez des lettres afin de trouver ce mot.\n\
    Si vous echouer sur une lettre, vous perdez un point.\nIl existe aussi le mode CASH, essayez de \
    trouver directement le mot cache,\n cependant si vous echouez, vous perdez trois points d'un coup.\n");
    printf("------------------------------------------------------------------------------------------------------------------------\n");
    printf("\n\n");
    printf("Joueur 2, a vous de jouer !\n");
    tailleMot = strlen(motSecret);
    
    lettreTrouvee = malloc(tailleMot * sizeof(int));
    
    if(lettreTrouvee == NULL)
    {
        printf("ECHEC\n");
        exit(0);
    }
    
    for(i = 0; i < tailleMot; i++)
    {
        lettreTrouvee[i] = 0;
    }
    
    while(nombreDeCoupsAjouer > 0 && !gagne(lettreTrouvee, tailleMot))
    {
    
        printf("\nIl vous reste %d coups a jouer.\n", nombreDeCoupsAjouer);
        printf("Quel est le mot secret ?");
    
        for(i = 0; i < tailleMot; i++)
        {
            if(lettreTrouvee[i])
            {
                printf("%c", motSecret[i]);
            }
            else
                printf("*");
        }
    
        printf("\nProposez une lettre :");
        lettre = lireCaractere();
    
    
        if(!rechercherCaractere(lettre, motSecret, lettreTrouvee))
        {
            nombreDeCoupsAjouer--;
            nombreDeCoupsJoues++;
    
    
            }
    
    }
    
    
    
        if(gagne(lettreTrouvee, tailleMot))
        {
            printf("\nBravo ! Le mot mystere est bien %s.\n", motSecret);
        }
    
        else
        {
            printf("\nPerdu ! Le mot mystere etait %s.\n", motSecret);
        }
    
    
    if(gagne(lettreTrouvee, tailleMot))
    {
        printf("Vous avez gagne en %d coups. Bravo !\n", nombreDeCoupsJoues);
    }
    printf("Si vous voulez refaire une partie, tapez 1, sinon, tapez 0.\n");
    scanf("%d", &refairePartie);
    if(refairePartie > 1)
    {
        printf("Vous n'avez pas tapez un chiffre entre 1 et 0.\n");
    }
    
    
    system("cls");
        free(lettreTrouvee);
    }
    
    //COMMENCEMENT PARTIE MODE SOLO
    if(nbJoueurs == 1)
    {
    
    if(!piocherMot(motSecret))
    {
        printf("ECHEC\n");
        exit(0);
    }
    //
    tailleMot = strlen(motSecret);
    
    lettreTrouvee = malloc(tailleMot * sizeof(int));
    
    if(lettreTrouvee == NULL)
    {
        printf("ECHEC\n");
        exit(0);
    }
    
    for(i = 0; i < tailleMot; i++)
    {
        lettreTrouvee[i] = 0;
    }
    //
    
    //
    while(nombreDeCoupsAjouer > 0 && !gagne(lettreTrouvee, tailleMot))
    {
    
        printf("\nIl vous reste %d coups a jouer.\n", nombreDeCoupsAjouer);
        printf("Quel est le mot secret ?");
    
        for(i = 0; i < tailleMot; i++)
        {
            if(lettreTrouvee[i])
            {
                printf("%c", motSecret[i]);
            }
            else
                printf("*");
        }
    
        printf("\nProposez une lettre :");
        lettre = lireCaractere();
    
    
        if(!rechercherCaractere(lettre, motSecret, lettreTrouvee))
        {
            nombreDeCoupsAjouer--;
            nombreDeCoupsJoues++;
    
    
            }
    
    }
    
    
    
        if(gagne(lettreTrouvee, tailleMot))
        {
            printf("\nBravo ! Le mot mystere est bien %s.\n", motSecret);
        }
    
        else
        {
            printf("\nPerdu ! Le mot mystere etait %s.\n", motSecret);
        }
    
    
    if(gagne(lettreTrouvee, tailleMot))
    {
        printf("Vous avez gagne en %d coups. Bravo !\n", nombreDeCoupsJoues);
    }
    printf("Si vous voulez refaire une partie, tapez 1, sinon, tapez 0.\n");
    scanf("%d", &refairePartie);
    if(refairePartie > 1)
    {
        printf("Vous n'avez pas tapez un chiffre entre 1 et 0.\n");
    }
    
    
    system("cls");
        free(lettreTrouvee);
    }
    
    }while(refairePartie == 1);
    //
    
    if(erreur == 0)
    {
        printf("\nMerci d'avoir joue au Pendu  !\n");
        printf("\n\nUNE PRODUCTION CLEMENT MARIE\n\n\n\n");
    }
    return 0;
    
    }
    
    char lireCaractere()
    {
        char caractere = 0;
    
        caractere = getchar();
        caractere = toupper(caractere);
    
        while(getchar() != '\n');
    
        return caractere;
    }
    
    int rechercherCaractere(char lettre, char motSecret[], int lettreTrouvee[])
    {
       int bonneLettre  = 0;
       int i;
    
       for(i = 0; motSecret[i] != '\0';i++)
       {
           if(lettre == motSecret[i])
           {
               bonneLettre =1;
               lettreTrouvee[i] = 1;
           }
       }
       return bonneLettre;
    }
    
    int gagne(int lettreTrouvee[], int tailleMot)
    {
        int joueurGagne = 1;
        int i;
    
        for(i = 0; i < tailleMot; i++)
        {
            if(lettreTrouvee[i] == 0)
            {
                joueurGagne = 0;
            }
        }
    
        return joueurGagne;
    }
    char motMajuscule(char motSecret[])
     {
    
         int i;
         for(i = 0; motSecret[i] != '\0'; i++)
         {
             motSecret[i] = toupper(motSecret[i]);
         }
    
    
         return *motSecret;
     }
    
    
    • Partager sur Facebook
    • Partager sur Twitter
    Networker
      24 juin 2017 à 18:10:57

      Hello,

      Je n'ai (presque) pas regardé le code, l'indentation (particulièrement du main() ) est à revoir. Mais 6 appels à la fonction gagne() pour un pendu ! Et presque 300 lignes de code ! Voilà qui est énorme. Je pense que tu devrais commencer par revoir ta manière de réaliser le jeu du pendu.

      -
      Edité par edgarjacobs 24 juin 2017 à 18:11:49

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        24 juin 2017 à 18:27:38

        Comment ?

        edgarjacobs a écrit:

        Hello,

        Je n'ai (presque) pas regardé le code, l'indentation (particulièrement du main() ) est à revoir. Mais 6 appels à la fonction gagne() pour un pendu ! Et presque 300 lignes de code ! Voilà qui est énorme. Je pense que tu devrais commencer par revoir ta manière de réaliser le jeu du pendu.

        -
        Edité par edgarjacobs il y a 14 minutes

        Comment ? 

        • Partager sur Facebook
        • Partager sur Twitter
        Networker
          24 juin 2017 à 19:17:32

          • Poser la question: un ou deux joueurs ?
          • Si un joueur, prendre un mot au hasard dans le dictionnaire
          • Si deux joueurs, demander au joueur 2 de donner un mot
          • Boucle (commune au deux modes, le mot mystère étant déjà choisi): demander au joueur 1 une lettre, vérifier, et si le mot rechercher est toujours incomplet, recommencer
          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            24 juin 2017 à 19:18:12

            Tu devrais commencer par utiliser davantage de fonctions, sépares en fichiers, n'utilise pas de variables globales quand tu peux faire autrement, etc...

            Tout cela fait parti de l'organisation qui te permettra d'avoir un code propre et de t'y retrouver. Car là, il faut avouer que c'est dur de te lire.

            -
            Edité par Ra'Jiska 24 juin 2017 à 19:19:16

            • Partager sur Facebook
            • Partager sur Twitter
              24 juin 2017 à 20:58:48

              Merci pour tous vous conseils , ça m'aide beaucoup
              • Partager sur Facebook
              • Partager sur Twitter
              Networker
                24 juin 2017 à 21:14:00

                Ra'Jiska : ne brûlons pas les étapes, la programmation en plusieurs fichiers se voit plus tard, et c'est normal.

                J'ai l'impression que le premier souci est plutôt d'ordre algorithmique, donc que la réponse d'edgarjacobs devrait aider.

                Quant au problème précis, je pense qu'une méthode pour comprendre ce qu'il se passe est de faire afficher le compteur à divers endroits pour voir à quel endroit précis sa valeur n'est pas celle attendue. C'est bien 'nombreDeCoupsJoues' le compteur ? Il est initialisé où ? Ligne 25 il est initialisé à 1. Ne serait-il pas plus logique de l'initialiser à 0 ? (Mais ça dépend comment il est utilisé, et comme je n'ai pas le temps de lire les 300 lignes...) Ce que je dis n'apporte pas d'aide concrète, mais c'est une illustration de la démarche à avoir pour trouver l'erreur : rentrer dans les détails du programme, se demande quelle doit être la valeur de telle variable et vérifier si c'est le cas, etc.

                • Partager sur Facebook
                • Partager sur Twitter
                  24 juin 2017 à 22:51:18

                  robun a écrit:

                  Ra'Jiska : ne brûlons pas les étapes, la programmation en plusieurs fichiers se voit plus tard, et c'est normal.

                  J'ai l'impression que le premier souci est plutôt d'ordre algorithmique, donc que la réponse d'edgarjacobs devrait aider.

                  Quant au problème précis, je pense qu'une méthode pour comprendre ce qu'il se passe est de faire afficher le compteur à divers endroits pour voir à quel endroit précis sa valeur n'est pas celle attendue. C'est bien 'nombreDeCoupsJoues' le compteur ? Il est initialisé où ? Ligne 25 il est initialisé à 1. Ne serait-il pas plus logique de l'initialiser à 0 ? (Mais ça dépend comment il est utilisé, et comme je n'ai pas le temps de lire les 300 lignes...) Ce que je dis n'apporte pas d'aide concrète, mais c'est une illustration de la démarche à avoir pour trouver l'erreur : rentrer dans les détails du programme, se demande quelle doit être la valeur de telle variable et vérifier si c'est le cas, etc.


                  Merci robun pour ta réponse, 

                  Je code la nouvelle version du programme et je vais de nouveau avoir besoin de vous, chers zéros.

                  Je tiens juste à préciser que j'ai initialisé nombreDeCoupsJoués à 1, parce que si on trouvait le mot Secret du premier coup, la console afficherait : 

                  "Vous avez trouvé en 0 coups." Etrange, non ? 

                  En tout cas, merci pour vos remarques très  pertinentes.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Networker
                    24 juin 2017 à 23:30:22

                    ClémentMarie2 a écrit:

                    Je tiens juste à préciser que j'ai initialisé nombreDeCoupsJoués à 1, parce que si on trouvait le mot Secret du premier coup, la console afficherait : 

                    "Vous avez trouvé en 0 coups." Etrange, non ? 

                    En tout cas, merci pour vos remarques très  pertinentes.


                    Tu penses que la console afficherait cela, ou bien tu as essayé et elle affiche cela ?

                    • Partager sur Facebook
                    • Partager sur Twitter
                      25 juin 2017 à 10:53:21

                      robun a écrit:

                      ClémentMarie2 a écrit:

                      Je tiens juste à préciser que j'ai initialisé nombreDeCoupsJoués à 1, parce que si on trouvait le mot Secret du premier coup, la console afficherait : 

                      "Vous avez trouvé en 0 coups." Etrange, non ? 

                      En tout cas, merci pour vos remarques très  pertinentes.


                      Tu penses que la console afficherait cela, ou bien tu as essayé et elle affiche cela ?

                      Elle affiche cela,  mais je tiens à préciser que se sont des coups "ratés" et non pas des coups tout court.

                      Comme je ne sais pas comment dessiner un pendu dans le console (peut-être essaierai-je par la suite ?), les coups ratés représentent 

                      les traits du pendu à la fin.



                      • Partager sur Facebook
                      • Partager sur Twitter
                      Networker
                        25 juin 2017 à 12:37:10

                        Ah OK. Il faut peut-être revoir l'algorithme. Quand tu posteras la nouvelle version, n'oublie pas de faire une identation correcte, ça augmentera les chances que quelqu'un qui a le temps regarde ça de plus près.

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Erreur inquiétante Entrée

                        × 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