Bonjour à tous,

Je suis actuellement un cours de C et je viens de terminer la première partie du TP#2 qui consiste à réaliser un "Jeu du pendu". La première partie de ce TP est une version simplifiée où on choisi un mot fixe à faire deviner au joueur (ici, MARRON). Dans un deuxième temps je devrais ajouter une gestion de dictionnaire, mais ça c’est pour plus tard

Il y a un corrigé dans le cours (que j’ai compris), seulement il n’utilise pas tout à fait la même méthode que j'ai choisi pour résoudre le problème.

De mon coté, j’ai décidé de créer deux chaines de caractères : motSecret (= MARRON) et motSecretCrypte (= ******). Je remplace au fur et à mesure les * par les bons caractères entrés par le joueur. Pour faire cela j’ai utilisé des pointeurs. Comme je débute tout juste la programmation, il se peut que je n'ai pas encore tout a fait compris cet outil et que je l'utilise d’une façon peu orthodoxe ... (dans ce cas, pardonnez moi d'avance ). De plus, j'ai voulu laisser la possibilité au joueur de rejouer une partie si il le souhaite.

Je vous met le code de mon fichier main.c ci-dessous et le lien vers mon repo Github si besoin (https://github.com/Mitsun0bu/TP_PENDU.git) :

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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
 
 
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "headers.h"
 
#define NOMBRE_VIES_INIT 10
 
int main()
{
    char lettreProposee = 0 ;
    char motSecret[] = "MARRON"; // Le mot secret est fixe pour le moment
    char motSecretCrypte[] = "******";
    char* pointeurMotSecret = motSecret;
    char* pointeurMotSecretCrypte = motSecretCrypte;
    int retourMenu = 0;
    int i = 0;
    int compteurVies = NOMBRE_VIES_INIT;
 
    do
    {
        afficherMenu();
 
        // Si on revient au menu après une première partie
        if (retourMenu == 1)
        {
            // On réinitialise le "compteurVies"
            compteurVies = NOMBRE_VIES_INIT;
 
            // On remplace le ième caractère de "motSecretCrypte" par une "*" pour le re-crypter
            for (i = 0; i < 6; i++)
            {   
                motSecretCrypte[i] = '*'; 
            } 
        }
 
        do
        {
            printf("Il vous reste %d vies !\n", compteurVies);
            printf("Quel est le mot secret ? %s", pointeurMotSecretCrypte);
            printf("\nProposez une lettre : ");
            lettreProposee = lireCaractere();
 
            if (strchr(motSecret, lettreProposee) != NULL) // Si "lettreProposée" par le joueur est trouvée dans "motSecret"
            {
                revelationLettre(6, motSecret, lettreProposee, motSecretCrypte, pointeurMotSecret);
            }
 
            else // Autrement, la lettre proposée n'est pas trouvée dans "motSecret" et on perd donc une vie
            {
                compteurVies --;
            }
 
                printf("\n");
 
            } while (compteurVies != 0 && strcmp(motSecretCrypte, motSecret) != 0);
 
            if (compteurVies == 0)
            {
                printf("Vous avez perdu !\n");
            }
 
            else if (strcmp(motSecretCrypte, motSecret) == 0)
            {
                printf("Bravo ! Vous avez trouve le mot secret qui etait : %s !\n", pointeurMotSecretCrypte);
            }
 
            retourMenu = rejouer();
 
    } while (retourMenu == 1);
 
    return 0;
}
 
void afficherMenu()
{
    printf("\n=== JEU DU PENDU ===\n");
    printf("\nBIENVENU DANS LE JEU DU PENDU!\n");
    printf("\nBUT DU JEU:\n");
    printf("\n\tDecouvrir le mot secret\n");
    printf("\nREGLES DU JEU:\n");
    printf("\n\t1) Entrez une lettre a la fois\n");
    printf("\t2) Les accents ne sont pas pris en compte\n");
    printf("\t3) Vous disposez de 10 vies pour decouvrir le mot secret\n");
    printf("\nBONNE CHANCE !!\n\n");
}
 
// PERMET DE RELANCER UNE PARTIE
int rejouer()
{
    int rejouer = 0;
 
    printf("\n--- FIN DE LA PARTIE ---\n");
    printf("\nTapez 1 pour revenir au menu principal\n");
    printf("Tapez 2 pour quitter le jeu\n");
    printf("\nVotre choix: ");
    scanf("%d", &rejouer);
 
    return rejouer;
}
// PERMET DE LIRE LA LETTRE ENTREE PAR LE JOUEUR DANS LA CONSOLE 
char lireCaractere()
{
    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
}
 
// PERMET DE REVELER LA LETTRE PROPOSEE PAR LE JOUEUR SI ELLE EST JUSTE
void revelationLettre(int tailleMots, char mot1[], char lettreAReveler, char mot2[], char *pointeurMot1)
{
    int i = 0;
 
    for (i = 0; i < tailleMots; i++)
    {   
        if (mot1[i] == lettreAReveler) // Si la lettre correspond à la ième lettre du mot secret
        {
            mot2[i] = pointeurMot1[i]; // On copie le ième caractère pointé par "pointeurMot1" à la ième position de "mot2"
        }
    } 
}
Ce code fonctionne correctement lors de la première partie. Malheureusement, lorsque je rejoue une deuxième partie, la première lettre proposée par le joueur est toujours considérée comme fausse même si elle fait partie du mot recherché.. Ensuite la partie continue normalement ! Je ne comprends pas trop pourquoi il y a un problème au premier essai de la deuxième partie seulement Surtout que si j'affiche motSecret, motSecretCrypte et leurs pointeurs respectifs via des printf, ils semblent bien réinitialisés ! (voir affichage console ci-dessous)


--- FIN DE LA PARTIE ---

Tapez 1 pour revenir au menu principal
Tapez 2 pour quitter le jeu

Votre choix: 1

=== JEU DU PENDU ===

BIENVENU DANS LE JEU DU PENDU!

BUT DU JEU:

Decouvrir le mot secret

REGLES DU JEU:

1) Entrez une lettre a la fois
2) Les accents ne sont pas pris en compte
3) Vous disposez de 10 vies pour decouvrir le mot secret

BONNE CHANCE !!

MARRON
MARRON
******
******
Il vous reste 10 vies !
Quel est le mot secret ? ******
Proposez une lettre : a

MARRON
MARRON
******
******
Il vous reste 9 vies !
Quel est le mot secret ? ******
Proposez une lettre :
J’aimerais bien savoir ce qui ne va pas avec ma méthode ! Si quelqu'un pouvait m'aider, ca serait top !

Merci d'avance !