Skip to content

Instantly share code, notes, and snippets.

@lovasoa
Created March 18, 2012 23:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lovasoa/2084089 to your computer and use it in GitHub Desktop.
Save lovasoa/2084089 to your computer and use it in GitHub Desktop.
Masterpendu

Masterpendu

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.

/*
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);
}
/*
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
#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