Le jeu de masterpendu est un mélange de mastermind et de pendu. L'ordinateur choisit un mot, et vous devez le deviner. A chaque proposition, l'ordinateur donne le nombre de lettres bien placées, et le nombre de lettres correctes, mais mal placées. Le mot choisi par l'ordinateur est forcément un mot correct en français, mais l'utilisateur peut lui soumettre n'importe quelle combinaison de lettres qu'il estime utile pour sa réflexion.
Created
March 18, 2012 23:02
-
-
Save lovasoa/2084089 to your computer and use it in GitHub Desktop.
Masterpendu
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Jeu du pendu | |
Par M@teo21, pour le Site du Zér0 | |
www.siteduzero.com | |
dico.c | |
------ | |
Ces fonctions piochent au hasard un mot dans un fichier dictionnaire | |
pour le jeu du pendu | |
*/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <time.h> | |
#include <string.h> | |
#include "dico.h" | |
int piocherMot(char *motPioche) | |
{ | |
FILE* dico = NULL; // Le pointeur de fichier qui va contenir notre fichier | |
int nombreMots = 0, numMotChoisi = 0, i = 0; | |
int caractereLu = 0; | |
const char nomdico[] = "dico.txt"; | |
dico = fopen(nomdico, "r"); // On ouvre le dictionnaire en lecture seule | |
// On vérifie si on a réussi à ouvrir le dictionnaire | |
if (dico == NULL) // Si on n'a PAS réussi à ouvrir le fichier | |
{ | |
printf("Impossible de charger le dictionnaire de mots '%s'.\n", nomdico); | |
return 0; // On retourne 0 pour indiquer que la fonction a échoué | |
// A la lecture du return, la fonction s'arrête immédiatement. | |
} | |
// On compte le nombre de mots dans le fichier (il suffit de compter les | |
// entrées \n | |
do | |
{ | |
caractereLu = fgetc(dico); | |
if (caractereLu == '\n') | |
nombreMots++; | |
} while(caractereLu != EOF); | |
numMotChoisi = nombreAleatoire(nombreMots); // On pioche un mot au hasard | |
// On recommence à lire le fichier depuis le début. On s'arrête lorsqu'on est arrivés au bon mot | |
rewind(dico); | |
while (numMotChoisi > 0) | |
{ | |
caractereLu = fgetc(dico); | |
if (caractereLu == '\n') | |
numMotChoisi--; | |
} | |
/* Le curseur du fichier est positionné au bon endroit. | |
On n'a plus qu'à faire un fgets qui lira la ligne */ | |
fgets(motPioche, 100, dico); | |
// On vire l'\n à la fin | |
motPioche[strlen(motPioche) - 1] = '\0'; | |
fclose(dico); | |
return 1; // Tout s'est bien passé, on retourne 1 | |
} | |
int nombreAleatoire(int nombreMax) | |
{ | |
srand(time(NULL)); | |
return (rand() % nombreMax); | |
} | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Jeu du pendu | |
Par M@teo21, pour le Site du Zér0 | |
www.siteduzero.com | |
dico.h | |
------ | |
Contient les prototypes des fonctions de dico.c | |
*/ | |
#ifndef DEF_DICO | |
#define DEF_DICO | |
int piocherMot(char *motPioche); | |
int nombreAleatoire(int nombreMax); | |
#endif |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <string.h> | |
#include <ctype.h> | |
#include <stdlib.h> | |
#include "dico.h" | |
#define min(a,b) ( (a<b) ? a : b ) | |
#define MAX_LEN 100 | |
int main (int argc, char **argv) { | |
char reponse[MAX_LEN] = {'\0'}; | |
char mot[MAX_LEN] = "voiture"; | |
char lettres_trouvees[MAX_LEN]; | |
while (1) { | |
if (!piocherMot(mot)){ | |
printf ("ERREUR : Impossible de piocher un mot dans le dictionnaire!\n"); | |
exit(0); | |
} | |
printf("Le mot secret a %d lettres.\n", (int)strlen(mot)); | |
do { | |
printf ("> "); | |
char error = 0; | |
fgets(reponse, min (sizeof(reponse), strlen(mot)+1), stdin); | |
if (reponse[strlen(reponse)-1] == '\n') error = 1; | |
else if (getc(stdin)!='\n') { | |
error = 1; | |
while(getc(stdin)!='\n');//Empty the buffer | |
} | |
if (error==1) printf("Le mot que vous avez entré ne fait pas %d lettres.\n", (int)strlen(mot)); | |
else { | |
//On met le mot en minuscules | |
for (int i = strlen(reponse) -1; i>=0; i--) { | |
if (isalpha(reponse[i])){ | |
reponse[i] = tolower(reponse[i]); | |
} else { | |
error = 2; | |
printf("Le mot que vous avez saisi contient un caractère incorrect : '%c'.\n", reponse[i]); | |
break; | |
} | |
} | |
} | |
if (error) continue; | |
memset(lettres_trouvees, 0, MAX_LEN); | |
int lettres_trouvees_i = 0; | |
int compteur_bon=0; | |
int compteur_mal_place=0; | |
for (int i = strlen(reponse) -1; i>=0; i--) { | |
if (mot[i]==reponse[i]){ | |
compteur_bon++; | |
lettres_trouvees[lettres_trouvees_i] = reponse[i]; | |
lettres_trouvees_i++; | |
} | |
} | |
for (int i = strlen(reponse) -1; i>=0; i--) { | |
if (strchr(mot, reponse[i]) != NULL && | |
strchr(lettres_trouvees, reponse[i]) == NULL){ | |
compteur_mal_place++; | |
lettres_trouvees[lettres_trouvees_i] = reponse[i]; | |
lettres_trouvees_i++; | |
} | |
} | |
printf("Lettres bien placées: %d\n", compteur_bon); | |
printf("Lettres mal placées: %d\n", compteur_mal_place); | |
} while (strcmp(mot, reponse) != 0); | |
printf("Bravo! Le mot mystère était bien '%s'.\n", mot); | |
printf("On recommence!\n\n"); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment