Aller au menu - Aller au contenu

TP : réalisation d'un Pendu

Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page Précédente  1  2  3  ...  7  8  9  10  11  Suivante
Pseudo Commentaire
Page Précédente  1  2  3  ...  7  8  9  10  11  Suivante
Hors ligne Dagon__ # Posté le 17/08/2011 à 23:05:27
Avatar

Ville : Rigny-ussé
Pays : France métropolitaine

Voici mon propre code du pendu qui contient en plus un mode d'ajout de mots ainsi qu'un dessin du type qui se fait pendre petit à petit (je sais, je suis un grand malade ! :p ).
Je l'ai réalisé au départ sans la solution de M@teo donc le code diffère pas mal.

Les fichiers c:

main.c: Secret (cliquez pour afficher)
Code : C
 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
#ifndef DEF_MAIN
#define DEF_MAIN
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "Jeu.h"
#include "Dico.h"
#include <time.h>
#endif



int main()
{
    srand(time(NULL));
    char motCache[100], motMystere[100]="";
    char compteur = 10, caractere = 0, reussi = 0;
    char *pointeurSurReussi = &reussi;
    int choix = 0, quitter = 0;

    while(!quitter)

{
    printf("\t                 Bienvenue dans le jeu du pendu !\n\n");
    printf ("\t\t\t\t  ---MENU---\n\n");
    printf("\t1. Jouer !\n\n\t2. Ajouter mot\n\n\t3. Quitter le jeu\n\n");

    scanf("%d",&choix);



    switch (choix)

    case (1):
    {

    printf("\tA vous de trouver le mot mystere en moins de %d erreurs !",compteur);

    compteur =10;
    recevoirMot(motMystere);
    obtenirMotCache (motMystere, motCache);

while (strcmp(motMystere, motCache) != 0 && compteur != 0)
{
    reussi = 0;
    modHardcore(compteur);
    printf("\n\n\n\nIl vous reste %d essais avant une mort certaine !\t%s\t\t\n",compteur,motCache);
    printf("\n\nProposez une lettre\t");
    caractere = recupereLettre();
    changeLettre(motMystere, motCache, caractere, pointeurSurReussi);
    if (reussi == 0)
    {
        compteur --;
    }
}
modHardcore(compteur);

if (strcmp(motMystere, motCache) == 0)
{
        printf("\n\nBien joue ! Le mot recherche etait bien %s.\n\n",motMystere);
}
else
{
        printf("\n\nVous etes mort, mort et remort ! Le mot etait %s.\n\n",motMystere);
}
break;

case (2):

printf("\nEcrivez le mot a ajouter au dictionnaire du jeu.\n\nAttention ! Veuillez ecrire le mot souhaite en majuscules.\t");
ecrireMot();
printf("\n\nVotre mot a ete entre en memoire avec succes !\n\n\n\n\n\n");
break;

case (3):

quitter=1;
break;

default:
printf ("\nChoix non disponible\n\n");
break;
    }
}
return 0;

}


Jeu.c: Secret (cliquez pour afficher)
Code : C
  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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>


char recupereLettre ()
{
    char caractere = 0;
    caractere = getchar();
    caractere = toupper(caractere);
    while (getchar() != '\n');

    return caractere;

}

void obtenirMotCache (char motMystere[],char motCache[])
{
    int i = 0;
    strcpy (motCache, motMystere);
    for (i=0; motCache[i] != '\0'; i++)
    {
        motCache[i] = '*';
    }
}


void changeLettre (char motMystere[], char motCache[], char caractere, char *reussi)
{
    int i = 0;
    for (i=0; motMystere[i] != '\0'; i++)
    {
        if (motMystere[i] == caractere)
        {
            motCache[i] = motMystere[i];
            *reussi = 1;
        }
    }
}

void modHardcore (int compteur)
{
    switch(compteur)
    {
        case(0):
        printf("\n \t\t\t\t __________________ \n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|      ______      |\n");
        printf("\t\t\t\t|     | /   |      |\n");
        printf("\t\t\t\t|     |/    0      |\n");
        printf("\t\t\t\t|     |    _|_     |\n");
        printf("\t\t\t\t|     |     |      |\n");
        printf("\t\t\t\t|     |    | |     |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|__________________|\n");
        break;

        case(1):
        printf("\n \t\t\t\t __________________ \n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|      ______      |\n");
        printf("\t\t\t\t|     | /   |      |\n");
        printf("\t\t\t\t|     |/    0      |\n");
        printf("\t\t\t\t|     |    _|_     |\n");
        printf("\t\t\t\t|     |     |      |\n");
        printf("\t\t\t\t|     |    |       |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|__________________|\n");
        break;

        case(2):
        printf("\n \t\t\t\t __________________ \n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|      ______      |\n");
        printf("\t\t\t\t|     | /   |      |\n");
        printf("\t\t\t\t|     |/    0      |\n");
        printf("\t\t\t\t|     |    _|_     |\n");
        printf("\t\t\t\t|     |     |      |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|__________________|\n");
        break;

        case(3):
        printf("\n \t\t\t\t __________________ \n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|      ______      |\n");
        printf("\t\t\t\t|     | /   |      |\n");
        printf("\t\t\t\t|     |/    0      |\n");
        printf("\t\t\t\t|     |    _|      |\n");
        printf("\t\t\t\t|     |     |      |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|__________________|\n");
        break;

        case(4):
        printf("\n \t\t\t\t __________________ \n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|      ______      |\n");
        printf("\t\t\t\t|     | /   |      |\n");
        printf("\t\t\t\t|     |/    0      |\n");
        printf("\t\t\t\t|     |     |      |\n");
        printf("\t\t\t\t|     |     |      |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|__________________|\n");
        break;

        case(5):
        printf("\n \t\t\t\t __________________ \n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|      ______      |\n");
        printf("\t\t\t\t|     | /   |      |\n");
        printf("\t\t\t\t|     |/    0      |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|__________________|\n");
        break;

        case(6):
        printf("\n \t\t\t\t __________________ \n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|      ______      |\n");
        printf("\t\t\t\t|     | /   |      |\n");
        printf("\t\t\t\t|     |/           |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|__________________|\n");
        break;

        case(7):
        printf("\n \t\t\t\t __________________ \n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|      ______      |\n");
        printf("\t\t\t\t|     | /          |\n");
        printf("\t\t\t\t|     |/           |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|__________________|\n");
        break;

        case(8):
        printf("\n \t\t\t\t __________________ \n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|      ______      |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|__________________|\n");
        break;

        case(9):
        printf("\n \t\t\t\t __________________ \n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|     |            |\n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|__________________|\n");
        break;

        case(10):
        printf("\n \t\t\t\t __________________ \n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|                  |\n");
        printf("\t\t\t\t|__________________|\n");
        break;

        default:
        printf("Erreur a la fonction modHardcore");
        break;

    }

}


Dico.c: Secret (cliquez pour afficher)
Code : C
 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
#ifndef DEF_DICO
#define DEF_DICO
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "Fonctions.h"
#include "Dico.h"
#include <time.h>
#endif


int motHasard()
{
    int nombreMots = 0;
    FILE *dico = NULL;
    dico = fopen ("Dico.txt","r");
    if (dico != NULL)
    {
        int caractereActuel = 0;
        while (caractereActuel != EOF)
        {
            caractereActuel = fgetc(dico);
            if (caractereActuel == '\n')
            {
                nombreMots ++;
            }
        }
        nombreMots = (rand() % nombreMots)+1;
        rewind(dico);
        fclose(dico);

        return nombreMots;
     }

    else
    {
        printf("Erreur a l'ouverture du fichier Dico.txt");
    }
}


void recevoirMot(char motMystere[])
{
    int numeroMot = motHasard();
    char monMot[100] = "";
    int i=0;
    FILE *dico = fopen("dico.txt","r");
    if (dico != NULL)
    {

        for (i=0; i != numeroMot; i++)
        {
            fgets(monMot,100,dico);

        }
        monMot[strlen(monMot)-1]='\0';
        fclose(dico);
        strcpy(motMystere, monMot);
        }
    else
    {
        printf("Erreur a l'ouverture du fichier dico.txt");
    }
}

void ecrireMot ()
{
    char motEntre[100] = "";
    FILE *dico = NULL;
    dico = fopen("dico.txt","r+");
    if (dico == NULL)
    {
        printf("Erreur a l'ouverture de dico.txt");
        return 0;
    }
    fseek(dico,0,SEEK_END);
    scanf("%s",motEntre);
    fputs(motEntre,dico);
    fputc('\n',dico);
    fclose(dico);
}



Les headers :

Jeu.h: Secret (cliquez pour afficher)
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#ifndef FONCTIONS_H_INCLUDED
#define FONCTIONS_H_INCLUDED

char recupereLettre ();
char obtenirMotCache (char motMystere[], char motCache[]);
void changeLettre (char motMystere[], char motCache[], char caractere, char *reussi);
void modHardcore (int compteur);


#endif // FONCTIONS_H_INCLUDED


Dico.h: Secret (cliquez pour afficher)
Code : C
1
2
3
4
5
6
7
8
#ifndef DICO_H_INCLUDED
#define DICO_H_INCLUDED

int motHasard();
void recevoirMot(char motMystere[]);
void ecrireMot ();

#endif // DICO_H_INCLUDED


Voilà !
Hors ligne Dagon__ # Posté le 17/08/2011 à 23:14:35
Avatar

Ville : Rigny-ussé
Pays : France métropolitaine

Nweke:
J'ai testé ton code en créant moi-même le prototype de la fonction et les variables test et il ne devrait pas y avoir d'erreur (sauf une petite, que tu verras sur mon code). Essaie de vérifier ton prototype (as tu bien mis le point virgule ?).

Pour que tu puisse comparer, voiçi mon code basé sur le tiens, et qui fonctionne:


Secret (cliquez pour afficher)
Code : C
 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
#include <stdio.h>
#include <stdlib.h>

int gagne (int lettreValidee[]);

int main()

{
    int test=4;
    int lettreValidee[6]={1,1,0,1,1,1};
    test = gagne(lettreValidee);
    printf("%d",test);

}

int gagne(int lettreValidee[]) // Ligne 79
{
    int i = 0;
    int booleen = 1;

    for(i = 0 ; i < 6 ; i++)
    {
        if(lettreValidee[i] == 0)
        {
            booleen = 0; //Petite erreur de ta part, il faut renvoyer un 0 sinon quel intérêt ?
        }
    }

    return booleen;
}


Voilà, je ne peux pour l'instant pas t'aider plus.
Hors ligne Nweke # Posté le 19/08/2011 à 13:58:26
Avatar

Après avoir posté, j'ai moi aussi remarqué que j'avais fait une erreur dans le code (la valeur de booléen qui ne changeait pas...)

J'ai essayé ton code dans un nouveau projet, là ça marche, mais une fois que je copie/colle la fonction dans mon projet "Pendu", il me met "Error - Conflicting types", donc l'erreur vient du main, j'ai même essayer avec la fonction de M@teo21, mais c'est pareil, y'a une erreur.

Mon prototype est conforme, je ne vois absolument pas pourquoi ça ne marche pas. Donc j'ai tout recommencé.... ^^
Hors ligne tetramir # Posté le 24/08/2011 à 14:49:30

C'est vraiment pas simple!
Hors ligne easyvico # Posté le 26/08/2011 à 23:06:28
Avatar

Quels autres genre de jeux en console peut-ont faire à ce stade?? Vous avez une idée?? Vos propositions sont les bienvenus, parceque là je sèche...merci
Hors ligne w0onka # Posté le 28/08/2011 à 17:55:48
Avatar

=======================================================================
== À "EASYVICO": Essaie un jeu de blackjack ou un carnet d'adresse...==
=======================================================================

J'ai fait une amélioration de la fonction lireCaractere qui empeche au joueur d'entrer des caracteres différents de l'aphabet.

Code : C
 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
char lire()
{
    int kasher = 0;
    char alpha[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char caractere = 0;
    do
    {
        caractere = 0;
        char *chaine = NULL;
        caractere = getchar();
        caractere = toupper(caractere);
        while (getchar() != '\n') ;

        chaine = strchr(alpha, caractere);

        if (chaine != NULL)
        {
            kasher = 1;
        }
        else
        {
            printf("\n\nCaractere invalide!!!  ");
            kasher = 0;
        }

    }
    while (kasher != 1);


    return caractere;
}



EDIT: MMh apparament mon code donne à chaque premiere lettre entrée un "caractere invalide"
Quelqun auait une idéee pourquoi?

(A)
 
Hors ligne Cigalois # Posté le 30/08/2011 à 11:44:31
Alea Jacta Est
Avatar

J'ai peut être une solution w0onka, en effet sur mon code, il m'est arrivé la même chose. ^^
La première lettre tapée est toujours invalide même si elle est bonne en réalité. o_O
Pour ma part l'erreur venait du choix du mode de jeu au début: j'utilisais un scanf. :-°
Or en tapant mon choix (1 ou 2), je rentrais aussi la touche "Entrée" pour valider mon choix. :lol:
Donc celui ci se mettait dans le buffer et au moment de taper ma lettre à rentrer pour trouver le mot,
il y avait donc le \n de l'entrée en premier faisant échouer chaque fois (Il n'y a jamais de \n dans le mot) :p
Par la suite la fonction de lecture vide le buffer et donc cela marche au bout de la deuxième fois. :D
Et à chaque fois cela boucle donc plus de problème avec ce buffer.
Donc pour résoudre mon problème j'ai remplacé scanf par une fonction de lecture de mon attirail. :)
(voir Saisie Sécurisée en annexe)
Dans celle ci le \n est supprimé donc plus de problème (fais ainsi avec tout tes scanf, c'est une vrai plaie! :p


La mémoire, c'est comme une valise. On met toujours dedans des choses qui ne servent à rien.
 
Hors ligne Vragh # Posté le 21/09/2011 à 01:09:04

Ville : Nîmes
Pays : France métropolitaine

Bonjour, j'ai mon code qui marche, mais j'ai un soucis, lorsque je me trompe, les coups restants ne diminuent pas. Voici la fonction qui s'en occupe :Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
int lettreTrouvee(char lettre,char caractereTrouve[],char motSecret[],int coupsRestants)
{
    int i = 0, coupPerdu = 0;
    for (i = 0; motSecret[i] != '\0'; i++ )
    {
        if (motSecret [i] == lettre)
        {
            caractereTrouve [i] = 1;
            coupPerdu = 1;
        }
    }
    if (coupPerdu = 0)
    coupsRestants --;
}


Merci d'avance pour vos explications, j'avoue ne pas voir d'où ça pourrait venir :(
Hors ligne vorpal # Posté le 28/10/2011 à 04:08:50

Vragh J'ai pas trop compris ta fonction

J'ai imprécision que tu n'appelle même pas ta fonction

a tu dans ton code source la commande pour appeler la fonction?
Il doit être écrit a peu près de cette façon.
Pour envoyer le pointeur d'un tableau vers une fonction.
Voici un petit schéma
nom de la fonction (Nom du tableau,la taille du tableau);

Exp:
lettreTrouvee (MotDuDictionnaire,7);

après pour récupérer le résultat de la fonction pour sa ont utilise la commande return qui devrait être placer a la fin d'une fonction

Mais rien ne t'empêche de faire une condition et de mettre un return dans chaque condition.

Le problème ont peu envoyer et récupérer qu’une seul information a une fonction
Du coup ont peu pas récupérer le tableau de caractère avec la variable de coup restant.
Hors ligne hastaris # Posté le 09/12/2011 à 14:25:29
Avatar

BONJOUR :)
J'ai un probleme , je ne peut pas prendre 2 charachtére de suite : le premier marche mais pas le second , et quand l'utilisateur rentre , pour commencer , 1 , 2 , 3 , ca marche mais sinon , ca plante : quelqun peut-il m'aider s'il vous plait :euh:

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "main.h"
#define mot 1000
int main(int argc, char *argv[])
{


char lettre1 ;
char lettre2 ;
char lettre3 ;
char lettre4 ;
char lettre5 ;
char lettre6 ;
char lettre7 ;
char lettre8 ;
char lettre9 ;
char lettre10 ;
char lettre11 ;
char lettre12 ;
char lettre13 ;
char lettre14 ;
char lettre15 ;
char lettre16 ;
struct JEUduPENDU JEUduPENDU ;
FILE* fichier = NULL;
const int nombreVIE = 10 ;
int nouveauMOT , compteur=0 , jeuVOCABULAIRE , vide ;
nouveauMOT = 2 ;
char motPARdefinition[7] = "marron";



presentation(vide);
do
{
scanf("%d" , &jeuVOCABULAIRE );// on rentre si il veut jouer ou rentrez des mot ou quiter

if(jeuVOCABULAIRE==1)//si il rentre du vocabulaire
{
do
{
compteur++;
printf("mot:");
scanf("%s" , JEUduPENDU.motNOUVEAU );
fichier = fopen("testbibi.txt", "a");
fprintf( fichier , "%s" , JEUduPENDU.motNOUVEAU );
fprintf( fichier , "\n" );
fclose(fichier);
}while( nouveauMOT!=1 );
}
else if(jeuVOCABULAIRE==2)//si il veut jouer
{

printf("\nLETTRE:\t-:");
scanf("%c", &lettre1);
lettre1=lireCaractere();
printf("\nlettre = %c" , lettre1 );
printf("\nLETTRE:\t-:");
scanf("%c", &lettre2);
lettre2=lireCaractere();
printf("\nlettre = %c" , lettre2 );



}

else if(jeuVOCABULAIRE==3)// si il veut quiter
{

}

}while(jeuVOCABULAIRE!=1 && jeuVOCABULAIRE!=2 && jeuVOCABULAIRE!=3);

return 0;
}

void presentation (int afficher)
{
printf("\n\n\t\t\tJEU DE PENDU\n\nVous ne pourrez mettre d'accent , et tout les mot seront en minuscule\nVoullez-vous rentrer du vocabulaire(1) ou plutot jouer(2) ou alors quitter(3)?\n---:");
}


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à

// On lit les autres caractères mémorisés un à un jusqu'à l'\n (pour les effacer)
while (getchar() != '\n')
{

}
return caractere; // On retourne le premier caractère qu'on a lu

}





///////////////////////////////////
MAIN.h




#define mot 1000

//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//

FILE* fopen(const char* nomDuFichier, const char* modeOuverture);
int fclose(FILE* pointeurSurFichier);
int fputc(int caractere, FILE* pointeurSurFichier);
int fputs(const char* chaine, FILE* pointeurSurFichier);
int fgetc(FILE* pointeurDeFichier);
int fgetc(FILE* pointeurDeFichier);
char* fgets(char* chaine, int nombreDeCaracteresALire, FILE* pointeurSurFichier);
long ftell(FILE* pointeurSurFichier);
int fseek(FILE* pointeurSurFichier, long deplacement, int origine);
void rewind(FILE* pointeurSurFichier);
void rewind(FILE* pointeurSurFichier);
int rename(const char* ancienNom, const char* nouveauNom);
int remove(const char* fichierASupprimer);
void* malloc(size_t nombreOctetsNecessaires);
void free(void* pointeur);
size_t strlen(const char* chaine);//calcule la longeur de la chaine
char* strcpy(char* copieDeLaChaine, const char* chaineACopier);//copi une chaine dans une autre
char* strcat(char* chaine1, const char* chaine2);//ajoute une chaine a la suite d'une autre
int strcmp(const char* chaine1, const char* chaine2);//compare 2 chaine : renvoie 0 si les 2 chaine sont identique
char* strchr(const char* chaine, int caractereARechercher);//recherche un charactere dans une chaine
char* strpbrk(const char* chaine, const char* lettresARechercher);// recherche un des charactere de la premiere chaine dans la 2dn chaine
char* strstr(const char* chaine, const char* chaineARechercher);// recherche une chaine dans une autre


//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//

void presentation (int afficher);
char lireCaractere();

//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//

struct JEUduPENDU
{
char motNOUVEAU[mot] ;
};



Qui ne tente rien n'a rien :p
 
Hors ligne onepiece69 # Posté le 13/12/2011 à 00:24:43

Avis : Mitigé

Voila je voudrais avoir un avis sur mon code pour le TP du pendu pour que je puisse m'ameliorer pour les prochaines fois ;)
Il y a quelque bug defois l'affichage du mot affiche n'importe quoi comme des dizaine de "*" ou de lettres ! Notamment avec "ANTICONSTITUTIONNELLEMENT" si vous savez d'ou cela viens merci :)

Le code :
headers.h
Secret (cliquez pour afficher)
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#ifndef HEADERS_H
#define HEADERS_H

#define TAILLE_MAX 1000

int menu();
char lireCaractere();
int perdu();
int main();
int partie();
int gagne(const char *motMystere, const char *etoile);
int lire();
int parametre();
int search(const char chaine[], char lettre, char etoile[]);
void dictionnaire();
#endif

menu.c
Secret (cliquez pour afficher)
Code : C
 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
#include "headers.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <ctype.h>

int menu ()
{
    printf("==================================JEU DU PENDU==================================\n\n\n");
    printf("1.Jouer\n2.Mode d'emploi\n3.Sortir\nQue voulez vous faire ? ");

    int choix;
    char read[TAILLE_MAX];
    FILE* fichier = NULL;
    choix = lire();

 switch (choix)
    {
        case 1:
        break;
        case 2:
        fichier = fopen("mode d'emploi.txt", "r"); //le mode d'emploi explique les règles, c'est plus pour pratiquer les fichiers qu'autre chose ^^
        if (fichier != NULL)
        {
        while (fgets(read, TAILLE_MAX, fichier))
        {
            printf("%s",read);
        }
        printf("\n\n\n");
        menu();
        }
        else
        exit(0);
        break;
        case 3:
        exit(0);
        break;
        default :
        menu();
        break;
 }
 return 0;
}

int lire() //fonction maison pour lire le choix car scanf est decidement beaucoup moins pratique que je le pensais !
{
    int nombre=0;

    scanf("%d",&nombre);
    while (getchar() != '\n');

    return nombre;
}

int parametre() //on choisi le mode de difficulte avant chaque partie
{

    int option=0;
    printf("\n===NOMBRE DE COUPS===\n\n1.Facile : 15\n2.Moyen : 10\n3.Difficile : 5\n\nQuel mode de difficulte voulez vous ? ");
    option = lire();
    switch (option)
        {
        case 1:
        return 15;
        break;
        case 2:
        return 10;
        break;
        case 3:
        return 5;
        break;
        default :
        parametre();
        break;
        }
}

main.c
Secret (cliquez pour afficher)
Code : C
  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
#include "headers.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <ctype.h>

int main()
{
    menu();
    partie();
    return 0;
}

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à

    // On lit les autres caractères mémorisés un à un jusqu'à l'\n (pour les effacer)
    while (getchar() != '\n') ;

    return caractere; // On retourne le premier caractère qu'on a lu

}

int perdu(char *motmystere)
{
    int replay=0;
printf("\n\nDesole vous avez ete pendu ! Le mot mystere etait : %s\n\nVoulez vous reessayer ? 0=NON 1=OUI : ", motmystere);
        scanf("%d", &replay);
        if(replay == 1)
        {
            main();
        }
        else
        {
        exit(0);
        }

    return 0;
}

int partie()
{
    char comparaison[26]="", motMystere[26]= "",maLettre;
    dictionnaire(motMystere);
    int longueurMot = strlen(motMystere), nbEssai=parametre(), i,j;

    for (j=0;j<longueurMot;j++) //on initialise la comparaison avec des etoiles pour qu'elles soient remplaces par les lettres
    {
        comparaison[j] = '*';
    }

    printf("\nC'est un mot de %d lettres !", longueurMot);

    while(nbEssai > 0)
        {
        printf("\n\nIl vous reste %d coups !", nbEssai);
        printf("\nProposer une lettre ! ");
        maLettre = lireCaractere();
        printf("Quel est le mot mystere ? : ");

            if (strchr(motMystere, maLettre) != NULL)
            {
                for(i=0;i<longueurMot;i++)
                {
                    if (motMystere[i] == maLettre)
                    {
                    comparaison[i] = motMystere[i];
                    printf("%s",comparaison);       // a chaque fin de boucle on verifie s'il n'a pas gagner
                    gagne(motMystere, comparaison);
                    }
                }
            }
            else
            {
                printf("%s",comparaison); //on affiche les lettres precedement trouver meme si la letre entree ne sy trouve pas
                nbEssai --;
            }
        }
    if (nbEssai == 0)
    {
        perdu(motMystere);
    }

    return 0;
}

int gagne(const char *motMystere,const char *comparaison)
{
    int replay;
    if (strcmp(motMystere, comparaison) == 0)
    {
    printf("\n\nBravo vous avez trouve le mot mystere : %s\n\nVoulez vous rejouer ? 0=NON 1=OUI : ", motMystere);
    scanf("%d", &replay);
        if(replay == 1)
        {
            main();
        }
        else
        {
        exit(0);
        }
    }

    return 0;
}

dictionnaire.c
Secret (cliquez pour afficher)
Code : C
 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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <ctype.h>
#include "headers.h"

void dictionnaire(char motmystere[])
{
    srand(time(NULL));
    int mot=0,MIN=1,MAX=0;
    char chaine[TAILLE_MAX]="", motchoisi[26] = "";
    FILE *dictionnaire = NULL;
    dictionnaire = fopen("dictionnaire.txt", "r");

    if (dictionnaire != NULL)
    {
        while(fgets(chaine,TAILLE_MAX,dictionnaire) != NULL)
        {
            MAX++; // a chaque fois qu'il y a une \n on incremente le nombre de mot du dico
        }

        mot = (rand() % (MAX - MIN + 1)) + MIN;
        rewind(dictionnaire);

        while(mot > 0) //j'avoue avoir regarder sur matheo mais ce n'est pas faute de m'etre casser la tete pendant quelque heures par jour
        {
            char caractereActuel;
            caractereActuel = fgetc(dictionnaire);
            if (caractereActuel == '\n')
            {
                mot--;
            }
        }

        fgets(motchoisi,26,dictionnaire);
        motchoisi[strlen(motchoisi) - 1] = '\0';

        strcpy(motmystere,motchoisi);
        fclose(dictionnaire);
    }
    else
    {
        exit (0);
    }
}
Hors ligne Dave1840438 # Posté le 24/12/2011 à 02:37:39

Bonjour tout le monde, j'ai un peu de misère avec mon pendu :colere2: Il plante à la ligne free() !
Si quelqu'un pourrait m'aider ça serait très apprécié. Merci


Code : Main.c
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
#ifndef Inclure_Tout
#define Inclure_Tout
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <time.h>
#endif

char* stockMot(int compteur, int *nombreLettres, char *motMystere, char *copieChaine, FILE *fichier);
int generemot(int *nombreLettres, FILE* fichier);
void viderBuffer();
void recupererCaractere(char *caractere);
void devoilerLettres(char caractere, char motMystere[], char copieChaine[], int *vies);





int main(int argc, char *argv[])
{
        char *motMystere = NULL, *copieChaine = NULL, *pointeur = NULL; 
        int coupsRestants = 10, nombreLettres = 0, i = 0;
        char caractere = 0;
        FILE *fichier = NULL;
        

        srand(time(NULL));
        fichier = fopen("mots.txt","r");


        i = generemot(&nombreLettres, fichier);

        motMystere = malloc((nombreLettres + 1) * (sizeof(char)));
        copieChaine = malloc((nombreLettres + 1) * (sizeof(char)));
        
        if (motMystere != NULL && copieChaine != NULL)
        {

        strcpy(motMystere, (stockMot(i, &nombreLettres, motMystere, copieChaine, fichier)));

        pointeur = strchr(motMystere, '\n');
        *pointeur = '\0';

        strcpy(copieChaine, motMystere);

        for (i = 0 ; i < strlen(motMystere); i++)
        {
                motMystere[i] = '*';
        }

 
        printf("Bienvenue dans le pendu!\n\n");
        
        while (strchr(motMystere, '*') != NULL && coupsRestants > 0) // boucle de la partie
        {
        printf("\nPlus que %d coups avant d'etre pendu!\n", coupsRestants);
        printf("Quel est le mot secret? %s\n", motMystere);
        printf("Proposer une lettre:");
        recupererCaractere(&caractere);
        devoilerLettres(caractere, motMystere, copieChaine, &coupsRestants);

        }

        if (coupsRestants == 0) { printf("\n\nVous avez ete pendu! ^^\n Le mot mystere etait: %s\n", copieChaine);} // Pendu, fin de partie.
        else { printf("Bravo! Le mot mystere etait bien : %s\n", motMystere); } // Partie reussie!


        free(copieChaine);
        free(motMystere);
        return 0;
        
        }

        return 0;

}

void viderBuffer()
{
        
        while (getchar() != '\n');
}

void recupererCaractere(char* caractere)
{
        scanf("%c", caractere);
        viderBuffer();
        *caractere = toupper(*caractere);
        
}

void devoilerLettres(char caractere, char motMystere[], char copieChaine[], int *vies)
{
        int i = 0;
        for ( i = 0 ; i < strlen(copieChaine) ; i++)
        {
                if (caractere == copieChaine[i]) { motMystere[i] = copieChaine[i]; }
        }

        if (strchr(copieChaine, caractere) == NULL) { *vies = (*vies - 1); } 

}
                




Code : Mots Mysteres.c
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
#ifndef INCLURE_BIBLIO
#define INLCURE_BIBLIO
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#define TAILLE_MAX 25
#endif

int generemot(int *nombreLettres, FILE* fichier)
{
        int i = 0, random = 0, j = 0;
        char chaine[TAILLE_MAX];
        
        
        if (fichier != NULL)
        {
        while (fgets(chaine, TAILLE_MAX, fichier)) { i++;}
        random = ((rand() % i) + 1 );

        rewind(fichier);
        
        for (j = 0 ; j < random ; j++)
        { 
                fgets(chaine, TAILLE_MAX, fichier);
        }

        nombreLettres = strlen(chaine) + 1;

        

        

        return random;


        }

        else { printf("Erreur dans l'ouverture du ficher"); exit(0); }



}

char* stockMot(int compteur, int *nombreLettres, char *motMystere, char *copieChaine, FILE *fichier)
{
        int j = 0;
        char chaine[TAILLE_MAX];
        

        
        if (fichier != NULL)
        {

                rewind(fichier);
                for ( j = 0 ; j < compteur ; j++)
        {
                fgets(chaine, TAILLE_MAX, fichier);
        }

                
                fclose(fichier);

                

        return chaine;
        }

        else { printf("pffff"); exit(0); }

}
Hors ligne Crétinrium # Posté le 29/12/2011 à 16:40:29
return 0;
Avatar

Avis : Très bon

Bonjour,

je suis sur le tutoriel sur le langage C de M@teo21 et je bloque sur le TP du pendu.
Quand je compile et j'exécute mon code source j'ai beau entrer les bonnes lettres aucun effet.
Voici mon code
:

main.c
Code : C
 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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>




int main(int argc, char *argv[])
{
    char motSecret[]="FROMAGE", lettreEntre, tableau[7];
    int i=0, longueurMot=7, compteur=10, vrai=0, lettreTrouve=0, nombre=0, j=0;

    printf("Bienvenue dans le jeu du pendu, le but du jeu est de trouver le secret\n");
    printf(", et tout ca en moins de 10 coups!\n");

    do
    {
        for(i=0;i!=longueurMot;i++)
        {
            tableau[i]='*';
           printf("%c", tableau[i]);
        }
        printf("Il vous reste %d coups à jouer.", compteur);
        printf("Tapez une lettre.\n");

        lettreEntre=lireCaractere();
        vrai=rechercheCaractere(motSecret, lettreEntre, longueurMot);
        if(vrai==0)
        {

            nombre=place(motSecret, longueurMot, lettreEntre);
            remplacer(tableau, nombre, longueurMot, lettreEntre);

            lettreTrouve++;
        }
        else
        {
            compteur--;
        }

    } while (lettreTrouve!=longueurMot && compteur!=0);

    if(lettreTrouve==longueurMot)
    {
        printf("\nBravo vous avez trouve!\n");
    }

    else
    {
        printf("\nVous avez perdu! Dommage.");
    }

    return 0;
}


fonction.c

Code : C
 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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "fonction.h"

void remplacer(char tableau[], int nombre, int longueur, char caractere)
{
    int j=0;

    for(j=1;j!=longueur;j++)
            {
                if(j=nombre)
                {
                    printf("%c", caractere);
                }
                printf("%c", tableau[j]);
            }
}

int place(const char*chaine, int longueur, int caractere)
{
    char caractereActuel;
    int compteur=1;

    do
    {
        caractereActuel=chaine;

        compteur++;
    } while(caractereActuel!=caractere);
    return compteur;
}

int rechercheCaractere(const char*chaine, int caractereARechercher, int longueur)
{
    int i=0, u=0;
    char caractereActuel;

    for(i=0;i!=longueur;i++)
    {
        caractereActuel=chaine[i];
    }
    if (caractereActuel==caractereARechercher)
    {
        u=0;
    }
    else
    {
        u=1;
    }
    return u;
}

char lireCaractere()
{
    char caractere=0;

    caractere=getchar();
    caractere=toupper(caractere);

    while (getchar()!='\n');

    return caractere;
}


fonction.h

Code : C
1
2
3
4
5
6
7
8
9
#ifndef ICLU
#define ICLU
char lireCaractere();
int rechercheCaractere(const char*chaine, int caractereARechercher, int longueur);
int place(const char*chaine, int longueur, int caractere);
void remplacer(char tableau[], int nombre, int longueur, char caractere);


#endif


Merci d'avance. :)
Hors ligne torpix # Posté le 20/01/2012 à 13:25:02

Tres bon tuto , assez impressionant
Hors ligne torpix # Posté le 20/01/2012 à 15:33:09

Bonjour a tous , voila j'ai un probleme. Tout marche bien , sauf que lorsque l'utilisateur choisi de refaire une partie , la boucle redemarre me demande une lettre , mais ensuite m'affiche quelque soit la lettre que j'ai perdu et donc qu'il ne me reste que 9 vies (au depart c'est 10)
il me redemande alors une lettre et la tout se passe a nouveau bien. Des idées?
voila la commande pour y voir plus clair:

http://pro.photomania.com/photoview3.a [...] 4.png&album=1

Code : Main.c
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
int Rejouer = 1;
while (Rejouer != 0)
{
char mot[] = "MARRON";
char lettre;
int vies = 10, p = 0;
char comparateur[] = "******";
while (vies > 1)
{
printf("rentrez une lettre:\n");
lettre = lireCaractere();
printf("%c\n", lettre);
comparaisoncaractere(mot,comparateur,lettre, 6, &vies);//appel de la fonction comparaison + gestions de vies
affichagemot(comparateur,mot, 6);//on affiche le mot mystere en fonction des lettres trouvées
gestionsdevies(&p, &vies, mot, comparateur);
}
gestionresultats(p);
Rejouer = gestionbouclejeu(Rejouer);
}
return 0;
}

Code : fonctions.c
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
char initialisation(char comparateur[], int tailletableau)
{
int i = 0;
for(i = 0; i < tailletableau; i++)
{
    comparateur[i] = "*";
}
return comparateur;
}
char lireCaractere()
{
    char caractere = 0;

    caractere = getchar();
    caractere = toupper(caractere);
    while (getchar() != '\n') ;

    return caractere;
}
int comparaisoncaractere(char mot[],char comparateur[],int Lettre[],int Tailletableau, int *vies)
{
int i = 0;
int k = 0;
while (i < Tailletableau)
{
    if (Lettre == mot[i])
    {
        comparateur[i] = Lettre;
        k = 1;
    }
i = i + 1;
}
printf("\n");
if (k == 1)
{
        printf("il vous reste %d vies\n", *vies);
}
else
{
        *vies = *vies - 1;
        printf("il vous reste %d vies\n", *vies);
}
return vies;
}
void affichagemot(char comparateur[], char mot[], int tailletableau)
{
int t = 0;
for (t = 0; t < tailletableau; t++)
{
   if (comparateur[t] != "*")
   {
   }
   else
   {
        comparateur[t] = mot[t];
   }
}
printf ("Mot mystere = %s\n", comparateur);
}
int gestionsdevies(int *p, int *vies, char mot[], char comparateur[])
{
    if (strcmp(mot, comparateur) == 0)
    {
        *p = 1;
        *vies = 0;
    }
    else
    {
    }
    return vies;
    return p;
}
void gestionresultats(int vies)
{
if (vies == 1)
{
    printf("vous avez gagne felicitation!\n");
}
else
{
    printf("vous n'avez pas trouve le mot!\n");
}
}
int gestionbouclejeu(int rejouer)
{
    int k = 0;
    while (k != 1)
    {
    printf("voulez vous rejouer?\n");
    printf("oui = 1, non = 0\n");
    scanf("%d", &rejouer);
    switch (rejouer)
    {
    case 1:
    printf("vous rejouez une nouvelle partie\n");
    k = 1;
    break;
    case 0:
    printf("A bientot sur le pendu!\n");
    k = 1;
    break;
    default:
    printf("mauvais choix ressayez!\n");
    k = 0;
    break;
    }
    }
return rejouer;
}

Code : prototypes.h
1
2
3
4
5
6
7
char lireCaractere();
int comparaisoncaractere(char mot[],char comparateur[],int Lettre[],int Tailletableau, int *vies);
void affichagemot(char comparateur[], char mot[], int tailletableau);
void gestionresultats(int vies);
int gestionbouclejeu(int rejouer);
char initialisation(char comparateur[], int tailletableau);
int gestionsdevies(int *p, int *vies, char mot[], char comparateur[]);
Hors ligne forsanta # Posté le 24/01/2012 à 23:01:56
Avatar

Bonsoir les Zeros petit ou grand

Voila j'ai améliorer le jeux suivant mes idées
a un moment je fais une boucle et dans celle ci se trouve l’instruction

Code : C
1
malettre = lireCaractere();


le problème est le suivant: la première fois que j'appelle cette fonction elle est retourner NULL les autres fois elle marche parfaitement cad elle me retourne la lettre tapée.

pourquoi ?? don't Know

si certain on une idée je suis preneurs !!!
merci d'avance
Forsanta;
Hors ligne ok20 # Posté le 25/01/2012 à 20:35:18
:)
Avatar

Salut ! :)
Moi j'ai un probleme incomprehensible: Mon while de jeu s'exécute mais la deuxieme fois il saute le scanf puis la 3eme il le "revois" mais c'est comme si propose était toujours faux :euh: :
Code : C
 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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int vies = 10, bon = 0, i = 1;
    char propose = 0;
    char motMystere[] = "SAPERLIPOPETTE";
    char motTrouve[] = "**************";
    printf("***Bienvenue dans le pendu***\n");
    while (vies != 0 && strcmp(motMystere, motTrouve ) != 0)
    {
        printf("Quelle est le mot mystere  ? \n %s  \n Il te reste %d vie(s)  \n ",motTrouve ,vies);
        scanf("%c", &propose);
        while (motMystere[i] != '\0')
        {
            if (motMystere[i] == propose)
            {
                motTrouve[i] = propose;
                bon = 1;
            }
            i++;
        }
        if (bon)
        {
            printf("Bien joue !!!\n");
        }
        else if (bon == 0)
        {
            vies--;
            printf("L'Echafaud se monte !\n");
        }
        bon = 0;
    }
    if (vies == 0)
    {
        printf("Tu a ete pendu *-*\n");
    }
    else if ( strcmp (motTrouve, motMystere) == 0 )
    {
        printf("Tu a trouvé le bon mot ");
    }
    return 0;
}

Voila si quelqu'un peut m'expliquer cette étrange bug ^^

Heureux Geeko-toxico-noob :p
who can't live without music :D
 
Hors ligne Tinecro # Posté le 04/02/2012 à 23:13:44

Salut à tous !
Je laisse ce commentaire parce que j'ai un problème : j'ai un 'segmentation fault' (qui retourne 139 ou 0x8B) qui coupe mon programme dès le début (ou du moins les premières instructions, rien ne s'affiche avant ce message d'erreur). Apparement (d'après ce que j'ai vu sur internet) ce serait dû à une tentative d'accès à une partie de la mémoire non allouée, alors que mon programme commence par des printf sans variable en argument :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#include "main.h"

int main(int argc, char* argv[])
{
    printf("launched"); //A des fins de localisation de bug
    init(); // Début de la partie ; initialisation
    printf("Initialized"); // A des fins de localisation de bug
    jeu(MOTSECRET); // Lancement de la procédure de jeu
    return 0;
}


et le init en question (qui a marché, mais plus maintenant) :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include "init.h"

void init() // Initialisation initiale
{
    printf("Welcome to the Starr Carnaval! /n");
    printf("Pret pour une partie de pendu ?/n");
    printf("Test/n"); // Aussi à des fins de localisation de bug
}

void motinit(char mot[]) // Initialisation du mot du joueur par "___________"
{
    int i = 0;
    char charactuel = 0; // Enlever et remplacer dans le while par mot[i]
    while (charactuel != '\n')
    {
        mot[i] = '_';
        i++;
        charactuel = mot[i];
    }

}


dans le main.h, il y a un ligne qui définit le MOTSECRET :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#ifndef MAIN_H_INCLUDED
#define MAIN_H_INCLUDED


#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>


#include "altf.h"
#include "init.h"
#include "jeu.h"


#define MOTSECRET "AZERTY"



#endif // MAIN_H_INCLUDED


et il y a bien le prototype de init dans le init.h :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#ifndef INIT_H_INCLUDED
#define INIT_H_INCLUDED

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

void init(); // Initialisation initiale
void motinit(char mot[]); // Initialisation du mot du joueur par "___________"

#endif // INIT_H_INCLUDED


OS : XUbuntu 11.10
Console : Terminal
IDE : Code::Blocks 10.05
Compilateur : GNU GCC Compiler

Si quelqu'un aurait une idée d'où pourrait venir le problème, je suis ouvert à toute proposition : disons que c'est frustrant de ne pouvoir essayer, débugger et rendre opérationnel ce programme sur lequel j'ai passé quand même pas mal de temps au final.

Quoiqu'il en soit, merci beaucoup pour ce tutorial, vraiment explicite et agréable :)
Hors ligne Loucyo # Posté le 08/02/2012 à 00:11:50
L'unique Diofon
Avatar

Avis : Très bon

Ville : Thiberville
Pays : France métropolitaine

Je vais me peeennnddrre ! Mais j'y arriverai ( à comprendre ^^ ), je n'abandonne jamais :lol:

"Toujours persévérer car rien n'est impossible."
 
Hors ligne Ghost_anon # Posté le 23/02/2012 à 13:16:00
Avatar

Avis : Très bon

bon, bilan de compétence ,médiocre :D (je parle pour moi ^^ )

j'ai vraiment galéré , même si je me suis inspiré du code de MAT, j'avoue que c'est plutôt la logique qui me manque.

en plus, j'avais oublié la fonction toupper(), que j'ai refait avant de m'apercevoir qu'elle existait ( :p )

non, franchement sans la soluce de MAT, j'aurais pas réussi!

j'ai donc pris ce TP comme une grosse grosse révision!
car même en connaissant ,tel ou tel truc qui fait tel ou tel machin, c'est quand même cette logique qui manque :(

quoiqu'il en soit, merci MAT

EDIT: ah je me suis dis que ça pouvait intéressé mais bon, c'était pas sorcier non plus!!

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
int MINUenMAJU (char *lettre)
   {

      char minu[26] = "abcdefghijklmnopqrstuvwxyz";
      char maju[26] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
      int i = 0;
      char finDeBoucle = minu + i;

      do
       {
          finDeBoucle = minu[i];
          i++;

       }while (finDeBoucle != lettre);

      i--;

      return maju[i];

   }
Hors ligne Biboxyde # Posté le 01/03/2012 à 19:32:53

Avis : Très bon

Comme toujours, super TP. Merci infiniment M@teo ;)

*Mode hors-sujet ON*
Aujourd'hui je tenais à vous présenter un jeu de ma création: j'ai nommé Arachne's Cavern (quel nom original ^^).
Bon, OK, aucun rapport avec ce TP, mais comme c'est un peu la frontière entre la console et la SDL, j'ai pensé que ça pouvait être le bon endroit.
J'aimerais avoir des idées d'améliorations ou des rapports de bugg, ou bien des conseils des programmeurs expérimentés.
Les informations et les règles sont dans le programme.

Comme je n'allais pas vous mettre les 2000 lignes de code ici, j'ai donc mis le dossier en téléchargement.

Lien de téléchargement (MediaFire) : http://www.mediafire.com/?og5l18bad25grxt

Voila en espérant que ça vous plaise :)

*Mode hors-sujet OFF*
Hors ligne Nostalgie1 # Posté le 07/03/2012 à 12:15:17

Merci mon prof pour nous servir à comprendre la programmation.
Hors ligne anonyme # Posté le 16/03/2012 à 08:06:31

Bonjour,
Je me suis moi aussi prêté au jeu :)

Code : C
  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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/************************************************************************/
/* bibliothèque */
#include <stdio.h>
#include <stdlib.h>

/************************************************************************/
/* define */

#define MOT_SECRET "ESHRIA"
#define NBR_DE_COUP 10

#define BIENVENUE "Bienvenue dans le Pendu !\n\n"
#define CP_POSSIBLE "\n\nIl vous reste %d coups à jouer\n"
#define LTR_TROUVE "Quel est le mot secret ? %s\n"
#define PROPOSITION_JOUEUR "Proposez une lettre : "
#define BRAVO "Félicition, vous avez trouvé le mot caché: %s"
#define PERDU "LOSSSSEEEERRRR\nLe mot à trouvé été: %s"

/************************************************************************/
/* prototype */

void fBravo (char t[]);
void fPerdu (char t[]);
void fWin (int *c, int N, char tT[], char tS[]);
void fCleanBuffer (void);
void fConsigne (int coupsRestant, char lettreTrouve[]);
int fCompt (char t[]);
void fCrypt (int N, char t[]);
void fConvLettre (char *l);
int fVerif (char *l, int N, char tt[], char t[]);

/************************************************************************/
/* main */

int main (int argc, const char *argv[]) {
	
	char motS[] = MOT_SECRET;
	
	char motT[] = MOT_SECRET;
	int N = (int)fCompt(motT);
	fCrypt(N, motT);
	
	int coups = NBR_DE_COUP;
	
	char lettre = 0;
	do {
		fConsigne(coups, motT);
			
		scanf("%1c", &lettre);
			
		fConvLettre(&lettre);
		if (fVerif(&lettre, N, motT, motS) != 1) { coups--; }

		fCleanBuffer();
		
		fWin(&coups, N, motT, motS);

	} while (coups > 0);
	
	if (coups == -1) {
		fBravo(motS);
	}
	else {
		fPerdu(motS);
	}

	return 0;
}

/************************************************************************/
/* fonction */

void fPerdu (char t[]) {
	/* le joueur à perdu */
	printf(PERDU, t);
}

void fBravo (char t[]) {
	/* la partie est gagnée */
	printf(BRAVO, t);
}

void fWin (int *c, int N, char tT[], char tS[]) {
	/* vérifie si le mot à été trouvé */
	int x = *c;
	for (int i = 0; i < N; i++) {
		if (tT[i] == '*') {
			*c = x;
			break;
		}
		else { *c = -1; }
	}
}

void fCleanBuffer (void) {
	/* vide le buffer clavier */
	int ch;
	do {
		ch = getchar();
	} while (ch != '\n' && ch != EOF);
}

int fVerif (char *l, int N, char tt[], char ts[]) {
	/* vérifie si la lettre est présente dans le tableau */
	int juste = 0;
	for (int i = 0; i < N; i++) {
		if (*l == ts[i]) {
			tt[i] = ts[i];
			juste = 1;
		}
	}
	return juste;
}

void fConsigne (int coupsRestant, char lettreTrouve[]) {
	/* Affiche l'avancement du jeu au joueur */
	printf(BIENVENUE);
	
	printf(CP_POSSIBLE, coupsRestant);
	printf(LTR_TROUVE, lettreTrouve);
	printf(PROPOSITION_JOUEUR);	
}

int fCompt (char t[]) {
	/* compte le nombre d'élément d'un tableau */
	int x = 0;
	for (int i = 0; t[i] != '\0'; i++) {
		x++;
	}	
	return x;
}

void fCrypt (int N, char t[]) {
	/* remplace les éléments d'un tableau par '*' */
	for (int i = 0; i < N; i++) {
		t[i] = '*';
	}
}

void fConvLettre (char *l) {
	/* converti les minuscules en majuscule */
	if (*l == 'a') { *l = 'A'; }
	if (*l == 'b') { *l = 'B'; }
	if (*l == 'c') { *l = 'C'; }
	if (*l == 'd') { *l = 'D'; }
	if (*l == 'e') { *l = 'E'; }
	if (*l == 'f') { *l = 'F'; }
	if (*l == 'g') { *l = 'G'; }
	if (*l == 'h') { *l = 'H'; }
	if (*l == 'i') { *l = 'I'; }
	if (*l == 'j') { *l = 'J'; }
	if (*l == 'k') { *l = 'K'; }
	if (*l == 'l') { *l = 'L'; }
	if (*l == 'm') { *l = 'M'; }
	if (*l == 'n') { *l = 'N'; }
	if (*l == 'o') { *l = 'O'; }
	if (*l == 'p') { *l = 'P'; }
	if (*l == 'q') { *l = 'Q'; }
	if (*l == 'r') { *l = 'R'; }
	if (*l == 's') { *l = 'S'; }
	if (*l == 't') { *l = 'T'; }
	if (*l == 'u') { *l = 'U'; }
	if (*l == 'v') { *l = 'V'; }
	if (*l == 'w') { *l = 'W'; }
	if (*l == 'x') { *l = 'X'; }
	if (*l == 'y') { *l = 'Y'; }
	if (*l == 'z') { *l = 'Z'; }
}


Je précise pour la partie conversion de minuscule en majuscule que je ne voulais pas utiliser une fonction d'une librairie
Hors ligne ju22 # Posté le 27/03/2012 à 15:05:35

Avis : Très bon

Hello tout le monde !
Vraiment super ce tuto !
Malheureusement je n'arrive pas à finir mon programme : lorsque la premiere lettre du mot a été trouvée le programme s'arrête et je n'arrive pas à comprendre pourquoi.(pour plus de simplicité j'ai choisi directement le mot à trouver en attendant que ça fonctionne)
Voici mon programme :

Code : C
  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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
</code>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#include <string.h>
#include "fonctions.h"
#include "fonctions.c"
#include "fonction2.c"
#include "fonction3.c"
#include "dico.c"
#include "dico.h"

int main()
{
    char caractere;
    int rejouer =1;
    int menu = 0;
    char prenom[20];
    char motMystere[50];
    int *reponseProp= NULL;
   int longueurChaine =0;
    int i=0;
    int coupsRestants = 10;
    int BonneLettre =1;
    int joueurGagne =0;


 piocherMot(&motMystere);
 motMystere[0]='S';
 motMystere[1]='A';
 motMystere[2]='L';
 motMystere[3]='U';
 motMystere[4]='T';
 motMystere[5]='\0';

longueurChaine = strlen(motMystere);
reponseProp=malloc(longueurChaine * sizeof(int));

if (reponseProp==NULL)
{
    exit(0);
}


    do
    {
        coupsRestants=10;
        printf("Bonjour ! Comment vous appelez-vous ?");
        lire(prenom, 20);
        printf("Bienvenue dans le jeu du pendu, %s\n\n", prenom);


do
{


            printf("Que souhaitez-vous faire ?\n1-demarrer une partie\n2-lire la regle du jeu\n\n");
            scanf("%d", &menu);
            viderBuffer();
            if(menu == 2)
            {
                printf("Le principe du jeu est simple : vous devez trouver le mot mystere en un minimum de coups. Vous proposerez une lettre par tour. \nSi celle-ci fait partie du mot elle sera afiichee a son emplacement, si la lettre est presente plusieurs fois dans le mot, elle sera ecrite autant de fois.\nSi elle n'est pas presente une erreur sera comptee; vous avez droit a 10 erreurs.\n\n");
            }
            else if (menu == 1)
            {

                printf("C'est parti !!!\n\n");
            }

}while (menu!=1);



printf("Le mot mystere est compose de %d lettres\n", longueurChaine);
do
{
    printf("Vous avez encore droit a %d erreurs\n\n", coupsRestants);

for (i=0;i<longueurChaine;i++)
{
    if (reponseProp[i]==1)
    {
        printf("%c", motMystere[i]);
    }
    else
    {
        printf("*");
    }

}



printf("\n\nVeuillez proposer une lettre, svp\n");
caractere =lireCaractere();
printf("Vous avez propose la lettre : %c\n\n", caractere);
BonneLettre= verificationDUneLettre(caractere, motMystere, reponseProp);

        if (BonneLettre==0)// Si ce n'était PAS la bonne lettre
        {
            printf("Cette lettre ne fait pas partie du mot\n\n");
            coupsRestants--; // On enlève un coup au joueur
        }

else
{
    printf("Votre lettre fait partie du mot\n\n");

    }

joueurGagne = gagne(*reponseProp, longueurChaine);



} while (joueurGagne!=1 && coupsRestants > 0);

 if (coupsRestants==0)
{
    printf("Dommage ! Vous avez perdu !\n");
    printf("Le mot secret etait : %s\n\n", motMystere);
}

else if (joueurGagne==1)
    {
        printf("Bravo ! Vous avez trouve le mot mystere\n");
        printf("La reponse etait bien : %s\n\n", motMystere);
    }



    printf("Voulez vous rejouer ? Oui : tapez 1, non tapez 0\n");
    scanf ("%d", &rejouer);
    } while (rejouer != 0);
    free(reponseProp);

    return 0;

}

<code type="c"><code type="c">
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#include <string.h>

int gagne(int *reponseProp[], int longueurChaine)
{
    int i = 0;
    int joueurGagne = 0;


    do
    {

        if (*reponseProp[i] == 0)
        {

            joueurGagne = 0;
        }
        else if (*reponseProp[i]==1)
        {

            joueurGagne =1;
        }

            i++;
    } while (i<longueurChaine && joueurGagne!=0);


    return joueurGagne;
}


<code type="c">

Je ne mets pazs le reste du programme. Alors, si vous pouvez, help me, please !!!
Hors ligne Riverdayz # Posté le 29/03/2012 à 14:16:16

Salut!
j'ai un peu de mal avec les TP, non pas sur la compréhension, mais plutôt sur la façon de construire le code.
Avec une "grosse" aide du corriger je me suis vite aperçu. que je partais dans des solution complètement inadaptée, et donc je m'en suis inspirer pour essayer de continuer.
Mais voilà là je bloque sur le mode 2 joueur le départ à un joueur fonctionne parfaitement seulement a deux joueur les lettre correspondant au mot mystère ne veulent pas s'afficher.
donc un petite aide serais la bienvenue. :D
Merci d'avance.


Mon dico.h

Code : C
1
2
3
4
5
6
7
8
#ifndef DEF_DICO
#define DEF_DICO


int piocherMot(char *motPioche);
int nombreAleatoire(int nombreMax);

#endif



Mon dico.c

Code : C
 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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#include "dico.h"


int piocherMot(char *motPioche)
{
    FILE* dico = NULL;
    int nombreMots = 0, numMotChoisi = 0;
    int caractereLu = 0;
    dico = fopen("dico.txt", "r");


    if (dico == NULL)
    {
        printf("\nImpossible de charger le dictionnaire de mots");
        return 0;

    }


    do
    {
        caractereLu = fgetc(dico);
        if (caractereLu == '\n')
            nombreMots++;
    } while(caractereLu != EOF);

    numMotChoisi = nombreAleatoire(nombreMots);


    rewind(dico);
    while (numMotChoisi > 0)
    {
        caractereLu = fgetc(dico);
        if (caractereLu == '\n')
            numMotChoisi--;
    }


    fgets(motPioche, 100, dico);


    motPioche[strlen(motPioche) - 1] = '\0';
    fclose(dico);

    return 1;
}


int nombreAleatoire(int nombreMax)
{
    srand(time(NULL));
    return (rand() % nombreMax);
}



Mon main.c

Code : C
  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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#include "dico.h"
#include"dico.c"

int gagne(int lettreTrouvee[], long tailleMot);
int rechercheLettre(char lettre, char motSecret[], int lettreTrouvee[]);
char lireCaractere();

int main(int argc, char* argv[])
{
    char lettre = 0;
    char motSecret[100]= {0};
    int *lettreTrouvee = NULL, mode = 0;
    long coupsRestants = 10;
    long i = 0;
    long tailleMot = 0;

    printf("Bienvenue dans le Pendu !\n\n");
    printf("Veuillez selectionner votre mode de jeu\n\n");
    printf("1-solo, 2-multi: ");
    scanf("%d", &mode);

    if (mode==1)
    {

    if (!piocherMot(motSecret))
        exit(0);

    tailleMot = strlen(motSecret);

    lettreTrouvee = malloc(tailleMot * sizeof(int));
    if (lettreTrouvee == NULL)
        exit(0);

    for (i = 0 ; i < tailleMot ; i++)
        lettreTrouvee[i] = 0;


    while (coupsRestants > 0 && !gagne(lettreTrouvee, tailleMot))
    {
        printf("\n\nIl vous reste %ld coups a jouer", coupsRestants);
        printf("\nQuel 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 (!rechercheLettre(lettre, motSecret, lettreTrouvee))
        {
            coupsRestants--;
        }
    }


    if (gagne(lettreTrouvee, tailleMot))
        printf("\n\nGagne ! Le mot secret etait bien : %s", motSecret);
    else
        printf("\n\nPerdu ! Le mot secret etait : %s", motSecret);

    free(lettreTrouvee);

    }

    else if (mode==2)
    {
        printf("Le joueur 1 propose un mot mystere: ");

        scanf("%s", motSecret);

        tailleMot = strlen(motSecret);

        lettreTrouvee = malloc(tailleMot * sizeof(int)); // On alloue dynamiquement le tableau lettreTrouvee (dont on ne connaissait pas la taille au départ)

        if (lettreTrouvee == NULL)
        exit(0);

        for (i = 0 ; i < tailleMot ; i++)
        lettreTrouvee[i] = 0;


        while (coupsRestants > 0 && !gagne(lettreTrouvee, tailleMot))
        {
        printf("\n\nIl reste au joueur 2 %ld coups a jouer", coupsRestants);
        printf("\nQuel est le mot secret ? ");

        /* On affiche le mot secret en masquant les lettres non trouvées
        Exemple : *A**ON */
        for (i = 0 ; i < tailleMot ; i++)
        {
            if (lettreTrouvee[i]) // Si on a trouvé la lettre n°i
                printf("%c", motSecret[i]); // On l'affiche
            else
                printf("*"); // Sinon, on affiche une étoile pour les lettres non trouvées
        }

        printf("\nProposez une lettre : ");
        lettre = lireCaractere();

        // Si ce n'était PAS la bonne lettre
        if (!rechercheLettre(lettre, motSecret, lettreTrouvee))
        {
            coupsRestants--; // On enlève un coup au joueur
        }

        }

        if (gagne(lettreTrouvee, tailleMot))
        printf("\n\nGagne ! Le mot secret etait bien : %s", motSecret);
        else
        printf("\n\nPerdu ! Le mot secret etait : %s", motSecret);

        free(lettreTrouvee);
    }
    else
    {
        printf("Saisie incorrect Veuillez saisir un autre mode");
    }

    return 0;
}


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à

    // On lit les autres caractères mémorisés un à un jusqu'à l'\n
    while (getchar() != '\n') ;

    return caractere; // On retourne le premier caractère qu'on a lu
}


int gagne(int lettreTrouvee[], long tailleMot)
{
    long i = 0;
    int joueurGagne = 1;

    for (i = 0 ; i < tailleMot ; i++)
    {
        if (lettreTrouvee[i] == 0)
            joueurGagne = 0;
    }

    return joueurGagne;
}

int rechercheLettre(char lettre, char motSecret[], int lettreTrouvee[])
{
    long i = 0;
    int bonneLettre = 0;

    // On parcourt motSecret pour vérifier si la lettre proposée y est
    for (i = 0 ; motSecret[i] != '\0' ; i++)
    {
        if (lettre == motSecret[i]) // Si la lettre y est
        {
            bonneLettre = 1; // On mémorise que c'était une bonne lettre
            lettreTrouvee[i] = 1; // On met à 1 le case du tableau de booléens correspondant à la lettre actuelle
        }
    }

    return bonneLettre;
}
Hors ligne Chooter_RemiXx # Posté le 04/04/2012 à 18:42:50

Biboxyde, ton jeu est SUPER !

Je débute en programmation mais jamais j'aurais eu une telle idée !
Vraiment bravo !

Et merci M@teo pour ce TP mais surtout pour tout ces cours !
Hors ligne Anonyte # Posté le 15/04/2012 à 20:50:15

voila un premier essaie où je me suis rendu compte que je confondais tableaux et pointeurs. :o
J'ai l'impression que ma fonction "test" fait un peu n'importe quoi où bien des trucs inutiles. :euh:
Malgré le fait que le code marche, j'ai la vague impression que c'est un bateau avec pleins de trous qui navigue encore juste parce que l'équipage vidait l'eau à bords à coup de sot d'eau et bouchait les trous avec des planches de bois :-°

Code : C - main.c
 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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "header.h"

int main(int argc, char *argv[])
{
    printf("\nBienvenue dans le Pendu !\n");

    char motSecret[] = "MARRON";
    char motCache[] = {"******"};
    int coup = 10;
    int* pointeurSurCoup = NULL;
    char essai = "";

    do
    {
        printf("\nIl vous reste %d coups a jouer.", coup);
        printf("\nQuel est le mot secret ? ");
        affiche(motCache,strlen(motCache));
        printf("\nProposez une lettre : ");
        essai = lireCaractere();
        test(essai, motSecret, motCache);
        coup -= test(essai, motSecret, motCache);

    } while(coup != 0 && strcmp(motSecret, motCache) != 0);

    if (coup == 0)
    {
        printf("\nVous avez perdu !\n");
    }
    if (strcmp(motSecret, motCache) == 0)
    {
        printf("\nGagne ! Le mot secret etait bien : %s\n", motCache);
    }

    return 0;
}

void affiche(char tableau[], int tailleTableau)
{
    int i = 0;
    for(i = 0 ; i < tailleTableau ; i++)
    {
       printf("%c", tableau[i]);
    }
}

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à

    // On lit les autres caractères mémorisés un à un jusqu'à l'\n (pour les effacer)
    while (getchar() != '\n') ;

    return caractere; // On retourne le premier caractère qu'on a lu
}

int test(char essai, char motSecret[], char motCache[])
{
    int i = 0;
    int r = 1;
    for (i = 0 ; i < strlen(motCache) ; i++)
    {
        if(motSecret[i] == essai)
        {
            motCache[i] = essai;
            r = 0;
        }
    }
    return r;
}
Hors ligne zéro_pointé_95 # Posté le 16/04/2012 à 23:34:12

Avis : Très bon

Bonjour,

petite astuce pour la conversion de minuscules en majuscules.
Il ne faut pas oublier qu'un type char c'est du numérique et qu'une table d'association entre les valeurs numériques et le caractère existe (ASCII).
Vous pouvez facilement faire un petit programme qui affiche les caratères de cette table et leur valeur numérique.
Et vous devriez vous rendre compte que pour passer d'une majucule à une minuscule ou inversement, une seule petite addition ou soustraction est nécessaire !
Hors ligne erwanb412 # Posté le 22/04/2012 à 16:01:08

Excellent tp !

ceci dit , j'ai un pb avec un code source qui n'a rien avoir avec le tp.
j'ai une erreur à la declaration des fonctions, essayez le code source pour voir de quelle erreure je parle. Merci d'avance ;)

Code : C
 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
#include <stdio.h>
#include <stdlib.h>
void voitureON(tab tableau[], int taille);

void attribueval(tab tableau[], int taille);


int main()
{
    int i = 0;
    typedef struct tab tab;
    struct tab
    {
      int voiture;
    };
    tab tableau[10];
    voitureON(tableau, 10);
    attribueval(tableau, 10);
    for(i = 0; i < 10; i++)
    {
    printf(" %d vitesse %d", tableau[i], tableau[i].voiture);
    }
}

void voitureON(tab tableau[], int taille)
{
int i = 0;
for (i = 0; i < taille; i++)
{
int MAX = 1, MIN = 0;
int nombreA;
srand(time(NULL));
nombreA = (rand() % (MAX - MIN + 1)) + MIN;
tableau[i] = nombreA;
}
}

void attribueval(tab tableau[], int taille)
{
int MAX, MIN;
int i = 0, nombreA;
scanf("%d", &MAX);
scanf("%d", &MIN);

for (i = 0; i < taille; i++)
{
if (tableau[i] != 0)
{
srand(time(NULL));
nombreA = (rand() % (MAX - MIN + 1)) + MIN;

*tableau[i].voiture ->nombreA;
}
}
}
Hors ligne zéro_pointé_95 # Posté le 23/04/2012 à 19:22:51

Avis : Très bon

bonjour Erwanb412,

je n'ai pas essayé ton code mais a priori tu utilises comme paramètre de tes fonctions une structure tab qui n'est pas encore définie à ce niveau puisque c'est fait dans le main. Il faudrait que tu définisse ta structure avant les prototypes de fonctions.
Pour accéder à cette section
Connectez-vous !
connexion_rpx