Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Jeu du pendu


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    février 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : février 2020
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Jeu du pendu
    Tout d'abord bonjour à tous.

    Je fais ce topic pour sollicité un peu d'aide sur un programme que j'ai fais récemment. Pour vous mettre dans le contexte je débute en C est dans mon apprentissage je suis amené à écrire un jeu du pendu. Voila donc je me suis pas trop mal débrouillé (enfin j'espère ), mais le soucis c'est qu'a l'exécution le programme ignore complètement la première lettre que je saisis.

    Je m'explique, le programme affiche le mot a découvrir (dans ce cas c'est MARRON) donc M***** est affiché a l'écran, et le programme me demande de proposer une lettre. Si la lettre est bonne alors elle remplace une étoile.
    Exemple si je tape A le mot devient MA****. Seulement, le problème que j'ai est que ma première saisis est complètement ignoré et je n'arrive pas a comprendre pourquoi

    Si une âme charitable peut relire mon code est me trouver l'erreur ça serait d'une grande aide.

    Merci d'avance, Vocograme.

    Le code source :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
     
    int menu();
    char lire_caractere();
     
    int main(int argc, char* argv[])
    {
        int rejouer = 1, tentatives = 0, nombre_lettres = 0, i = 0;
        char lettre = 0;
        char mot_secret[] = "MARRON", mot[] = "MARRON";
     
        nombre_lettres = strlen(mot_secret);        // on récupère la taille du mot secret
     
        for (i = 1; i < nombre_lettres; i++)
        {
            mot[i] = '*';       // On rempli mot de '*'. Le nombre d'étoiles sera le nombre de lettres du mot secret (sauf la premiere)
        }
     
        while (rejouer == 1)        // On reste dans la boucle tant que le joueur saisi 1
        {
            switch (menu())     // Affichage du menu de jeu et choix de la difficultée
            {
            case 1:
                tentatives = 10;        // Défini le nombre de tentatives pour trouver le mot
                break;
            case 2:
                tentatives = 8;
                break;
            case 3:
                tentatives = 6;
                break;
            }
     
            while (strcmp(mot, mot_secret) != 0 && tentatives > 0)        // Tant que le mot n'est pas trouvé et qu'il reste des tentatives
            {
                printf("\nIl vous reste %d coups a jouer", tentatives);
                printf("\nQuel est le mot secret ? %s", mot);
                printf("\nProposez une lettre : ");
                lettre = lire_caractere();
                tentatives--;
     
                for (i = 0; i < nombre_lettres; i++)        // On cherche la lettre de l'utilisateur dans mot_secret
                {
                    if (lettre == mot_secret[i])        // Si la lettre correspond, elle est ajouté dans mot (a la place d'une etoile)
                    {
                        mot[i] = mot_secret[i];
                    }
                }
            }
     
            if (strcmp(mot, mot_secret) == 0)
            {
                printf("\n\nFELICITATIONS !!!!!!\n\nVous avez gagnez, c'etait bien le mot %s", mot);
            }
            else
            {
                printf("\n\nDOMMAGE ......\n\nLe bon mot etait %s", mot_secret);
            }
     
            printf("\n\nVoulez-vous refaire une partie ?\n\n");     // Propose de refaire une partie
            printf("1 - oui\n");
            printf("2 - non\n");
            scanf_s("%d", &rejouer);
        }
        printf("\nMerci d'avoir joue, a bientot !!\n");
     
        return 0;
    }
     
    int menu()
    {
        int choix = 0;
     
        while (choix < 1 || choix>3)        // Retourne le niveau de difficulté choisi
        {
            printf("Bienvenue au jeu du pendu !\n\nVeuillez selectionner le niveau de difficulte :\n");
            printf("1 : FACILE\n");
            printf("2 : DIFFICILE\n");
            printf("3 : IMPOSSIBLE\n");
     
            scanf_s("%d", &choix);
        }
        return choix;
    }
     
    char lire_caractere()
    {
        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à
     
        while (getchar() != '\n');      // On lit les autres caractères mémorisés un à un jusqu'au \n (pour les effacer) 
     
        return caractere;       // On retourne le premier caractère qu'on a lu 
    }

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    7 825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 7 825
    Points : 21 397
    Points
    21 397
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par vocograme Voir le message
    Seulement, le problème que j'ai est que ma première saisis est complètement ignoré et je n'arrive pas a comprendre pourquoi
    Quand tu choisis la difficulté (1 FACILE, 2 DIFFICILE, 3 IMPOSSIBLE), tu tapes 1 + <return>. Le scanf() récupère le "1" et laisse le <return> dans stdin. Ensuite, lorsque tu fais saisir la lettre, ta fonction lire_caractere() récupère le <return> et purge le reste et ta lettre saisie est alors perdue. Un grand classique.

    Je peux te proposer cette façon de saisir les int qui laisse stdin toujours clean. Le principe: je fais saisir une string (donc avec le <return>) puis je regarde si je peux extraire un nombre de la string saisie.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    int saisieInt(char *prompt) {
    	char str[100];
    	int val;
    	while (1) {
    		fputs(prompt, stdout);
    		fflush(stdout);
    		fgets(str, 100, stdin);
    		if (sscanf(str, "%d", &val) == 1) return val;
    		fputs("Saisie incorrecte - Recommencez\n", stdout);
    	}
    }
     
    int menu()
    {
    	int choix = 0;
     
    	while (choix < 1 || choix>3)		// Retourne le niveau de difficulté choisi
    	{
    		printf("Bienvenue au jeu du pendu !\n\nVeuillez selectionner le niveau de difficulte :\n");
    		printf("1 : FACILE\n");
    		printf("2 : DIFFICILE\n");
    		printf("3 : IMPOSSIBLE\n");
     
    		choix=saisieInt("Votre choix :");
    	}
    	return choix;
    }

    Citation Envoyé par vocograme Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (i = 1; i < nombre_lettres; i++)
    {
    	mot[i] = '*';       // On rempli mot de '*'. Le nombre d'étoiles sera le nombre de lettres du mot secret (sauf la premiere)
    }
    => memset(mot + 1, '*', nombre_lettres - 1);
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2019
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Bonjour vocograme,

    J'ai fais un cours où je devais faire un pendu aussi, de ce que je me souviens il n'était pas recommandé de passer par un scanf (et ses déclinaisons) car il n'est pas adapté. Je te conseille de créer ta propre fonction de récupération de character avec getchar()

    J'éspère que ça peut t'aider

  4. #4
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    février 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : février 2020
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Quand tu choisis la difficulté (1 FACILE, 2 DIFFICILE, 3 IMPOSSIBLE), tu tapes 1 + <return>. Le scanf() récupère le "1" et laisse le <return> dans stdin. Ensuite, lorsque tu fais saisir la lettre, ta fonction lire_caractere() récupère le <return> et purge le reste et ta lettre saisie est alors perdue. Un grand classique.

    Je peux te proposer cette façon de saisir les int qui laisse stdin toujours clean. Le principe: je fais saisir une string (donc avec le <return>) puis je regarde si je peux extraire un nombre de la string saisie.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    int saisieInt(char *prompt) {
    	char str[100];
    	int val;
    	while (1) {
    		fputs(prompt, stdout);
    		fflush(stdout);
    		fgets(str, 100, stdin);
    		if (sscanf(str, "%d", &val) == 1) return val;
    		fputs("Saisie incorrecte - Recommencez\n", stdout);
    	}
    }
     
    int menu()
    {
    	int choix = 0;
     
    	while (choix < 1 || choix>3)		// Retourne le niveau de difficulté choisi
    	{
    		printf("Bienvenue au jeu du pendu !\n\nVeuillez selectionner le niveau de difficulte :\n");
    		printf("1 : FACILE\n");
    		printf("2 : DIFFICILE\n");
    		printf("3 : IMPOSSIBLE\n");
     
    		choix=saisieInt("Votre choix :");
    	}
    	return choix;
    }
    Salut,

    Ah bah comme quoi je faisais super gaffe avec la saisie dans mon main que j'ai zappé que je faisais saisir un int dans ma fonction menu(). En tout cas merci de la réponse rapide ça m'a bien aidé !!

    => memset(mot + 1, '*', nombre_lettres - 1);
    Merci de l'astuce je ne connaissais pas cette commande !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Code en bourne shell du jeu Le "PENDU"
    Par piment dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 20/07/2007, 15h17
  2. Jeu Bonhomme pendu
    Par yinyann86 dans le forum Delphi
    Réponses: 11
    Dernier message: 14/11/2006, 18h03
  3. Le jeu du pendu.
    Par giggs dans le forum C
    Réponses: 5
    Dernier message: 31/10/2006, 14h40
  4. jeu du pendu
    Par krachik dans le forum Langage
    Réponses: 5
    Dernier message: 24/10/2006, 13h48
  5. Réponses: 4
    Dernier message: 24/03/2006, 14h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo