bonjour,

je suis débutant et essaie de faire un jeu de pendu a ma façon en C

le programme fonctionne, cependant apres allocation de mémoire pour mon mot caché et son initialisation type ***** (les * seront remplacées par les lettres après leurs découvertes),

lorsque je veux un mot de nb de lettre impaire, le mot cache s'affiche correctement *****, avec le bon nombre d'étoiles, par contre lorsqu'il s'agit d'un nombre paire alors là le mot apparait mais à la fin s'ajoute des caractères non souhaités, ******+des caractères bizarres...
de ce fait, dans ces cas le programme ne s'arrête pas même si l'on a trouvé le bon mot...

si vous avez des suggestions...

je vous remercie

le code est ci dessous :

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
 
/*fonction pour enregistrer le caractère tapé et le mettre en majuscule avant de le retourner au main*/
 
char lireCaractere()
{
    char lettre = 0;
    printf("quelle lettre ? ");
    lettre=getchar();
    lettre=toupper(lettre);
    while (getchar()!='\n');    //vide le buffer
    printf("voici votre lettre = %c\n", lettre); //pour verifier
    return lettre;
}
 
char rechercheLettre (char lettre, int nbLettre, int* nbDeChance, char* motPendu, char* motPenduCache)
{
    int j;
    int k=0;
    for (j=0;j<nbLettre;j++)
    {
        if (motPendu[j]== lettre)
        {
            k++; /*pour connaitre le nb de lettre trouvee appartenant au mot*/
            motPenduCache[j]=lettre; /*remplace le caractere "*" par la lettre trouvee*/
        }
    }
    if (k>0)
    {
        printf("bravo vous avez trouve %d lettre(s)\n", k);
        printf("voici le mot restant %s\n", motPenduCache); /*ecriture type "**E***"   */
    }else
    {
        printf("faux\n");
        (*nbDeChance)--;
        printf("il vous reste %d chance\n", *nbDeChance);
    }
}
 
 
int main (int argc, char* argv[])
{
    int nbLettre=0;
    int nbDeChance=5;
    char lettre=0;
    char* motPendu=0;
    char* motPenduCache=0;
 
    /* choix du nombre de lettre pour le mot */
    printf("nombre de lettre ? ");
    scanf("%d", &nbLettre);
    /*allocation memoire pour les tableaux contenant le mot et sa version cache avec "*" */
    motPendu = malloc ((nbLettre+1) * sizeof(char)); /* (nbLettre + 1) afin de ne pas oublier '\0' */
    motPenduCache = malloc((nbLettre+1) * sizeof(char));
 
    /*choix du mot en respectant le nombre de lettre contenu dans le mot */
 
    do{
    printf("quel mot a deviner en %d lettres ? ", nbLettre);
    scanf("%s", motPendu);
    }while (strlen(motPendu)!=nbLettre);
 
    /* initialisation du mot cache avec a la place des caracteres des "*" */
 
    int i;
    for (i=0; i<nbLettre;i++)
    {
        motPenduCache[i]='*';
    }
    printf("voici le mot a trouve : %s\n", motPenduCache);
 
    /* vidage du buffer */
 
    while (getchar()!='\n');
 
    /* debut du jeu*/
 
    while (nbDeChance>0)
    {
        lettre = lireCaractere();
 
        /* est ce que la lettre appartient au mot cherche */
 
        rechercheLettre(lettre, nbLettre, &nbDeChance, motPendu, motPenduCache);
 
        /* lorsque l'on a trouve toutes les lettres du mot le jeu s'arrete */
 
        if (!(strcmp(motPenduCache, motPendu)))
        {
            printf("BRAVO\n\n\n");
            return;
        }
    }
 
    if (nbDeChance==0)
    {
        printf("desole vous avez perdu\n");
    }
 
    free(motPendu);
    free(motPenduCache);
}