Pendu simple en console

Description

C'est le jeu du Pendu (hangman). Il va chercher les mots dans un fichier .txt qui est dans le .zip. Il affiche un petit graphique dans la console. Il est basé sur un autre jeu de pendu disponible sur ce site. Ce jeu a été modifié dans le cadre du cours de "Correction de programmes". Il y a eu beaucoup de modifications apportées, notemment une réécriture presque complète du code, l'ajout de dessins, l'ajout de statistiques, le support des majuscule/minuscules, affiche le mot avec est " _ ", affiche l'alphabet et enlève les lettres lorsqu'elle ont été essayées et encore plus.

Source / Exemple :


/************************************************	

  • Fichier : main.cpp *
  • Projet : Jeu de Pendu (C++ Win32 Console) *
  • *
  • Auteurs : Simon Ouellet et Nicolas Bergeron *
  • Date de création : 9 Avril 2004 *
  • Dernière modification : 16 Mai 2004 *
                                                                                                • /
// Notes : Ce programme est basé sur le jeu de pendu // tiré du site codesources.com mais a fortement été // modifié par les auteurs // Source : http://www.cppfrance.com/article.aspx?ID=1189 #include <iostream.h> #include <stdio.h> //getchar() #include <stdlib.h> //srand() #include <time.h> //time() #include <cctype> //toupper() #include <iomanip.h> //setprecision() #include <cstring> //strncpy() #define kMOTS_LONG_MAX 100 //longueur maximal d'un mot //Prototypes des méthodes void commencerJeu(); int selectionnerMot(char*); //retourne le nb de char du mot void afficherPendu(int); void afficherStatistiques(); int ObtenirNombreAlleatoire(int,int); //Variables globales int nbErreur=0, nbPartie=0, nbPartieGagnante=0, longueurMot=0, lettresATrouver=0; char motTravail[kMOTS_LONG_MAX]; char motATrouver[kMOTS_LONG_MAX]; char lettresAEssayer[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //Programme Principal int main() { cout << "Bienvenue dans le jeu du Pendu!\n\n"; char choixMenu; do { commencerJeu(); printf("Voulez-vous continuer a jouer? (O: Oui, N: Non) ");//Affichage sans buffer choixMenu = getchar(); getchar(); } while(choixMenu=='O' || toupper(choixMenu)=='O'); afficherStatistiques(); return 0; } //Jeu en lui meme void commencerJeu() { //Affectation des variables à des valeurs de départ srand(time(NULL)); //Pour que le randon soit effectif longueurMot = selectionnerMot(motATrouver); lettresATrouver = longueurMot; for(int cpt=0; cpt<(longueurMot*2); cpt=cpt+2) { motTravail[cpt] = '_'; motTravail[cpt+1] = ' '; } strncpy(lettresAEssayer,"ABCDEFGHIJKLMNOPQRSTUVWXYZ",26); nbErreur = 0; bool partieTerminee=false; char lettreAEssayer; int nbTour=1; //Boucle du jeu do { cout << "\n\nRound #" << nbTour << endl; afficherPendu(nbErreur); cout << "Mot a chercher : " << motTravail << endl << endl; cout << "Lettres a essayer : " << lettresAEssayer <<endl; cout << "Vous avez presentement " << nbErreur << " erreur(s) (" << 5-nbErreur << " restante(s)." << endl; cout << "Il vous reste " << lettresATrouver << " lettre(s) a trouver sur un total de " << longueurMot << ".\n" << endl; printf("Veuillez entrer la prochaine lettre : "); //Affichage sans buffer lettreAEssayer = getchar(); getchar(); //Vérifier si la lettre a déjà été essayée bool lettreDejaEssayee=true; for(int cpt=0;cpt<=25;cpt++) { if(lettresAEssayer[cpt] == toupper(lettreAEssayer)) lettreDejaEssayee=false; } //Ne pas compter si la lettre a déjà été saisie if(!lettreDejaEssayee) { bool lettreEstTrouvee=false; //Vérifier chaque lettre for(int cpt=0;cpt<longueurMot;cpt++) { //Regarder si la lettre est celle du mot if(toupper(motATrouver[cpt]) == toupper(lettreAEssayer)) { lettreEstTrouvee=true; motTravail[cpt*2] = motATrouver[cpt]; lettresATrouver--; } } //Ajouter un point de pendu si elle n'est pas trouvée if(!lettreEstTrouvee) nbErreur++; //Enlever cette lettre des lettres à essayer for(int cpt2=0; cpt2<=25;cpt2++) { if(lettresAEssayer[cpt2] == (char)toupper(lettreAEssayer)) lettresAEssayer[cpt2] = '_'; } //Vérifier si la partie est terminée (perdue) if(nbErreur==6) { partieTerminee=true; cout << "\n** Desole, vous n'avez pas reussi a trouver le mot!" << endl; cout << "** La reponse etait : " << motATrouver << "." << endl; } //Vérifier si la partie est terminée (gagnée) if(lettresATrouver==0) { partieTerminee=true; cout << "\n** Felicitations, vous avez reussi a trouve le mot!" << endl; cout << "** La reponse etait : " << motATrouver << "." << endl; nbPartieGagnante++; } nbTour++; } else cout << "Vous avez deja essaye cette lettre!." << endl; } while(!partieTerminee); nbPartie++; } //Méthode qui affiche le graphique selon le nombre d'erreur(s) void afficherPendu(int nbErreur) { switch(nbErreur) { case 0: cout << endl; cout << " |--| " << endl; cout << " | " << endl; cout << " | " << endl; cout << " | " << endl; cout << " | " << endl; cout << " | " << endl; cout << " ------ " << endl; cout << endl; break; case 1: cout << endl; cout << " |--| " << endl; cout << " O | " << endl; cout << " | " << endl; cout << " | " << endl; cout << " | " << endl; cout << " | " << endl; cout << " ------ " << endl; cout << endl; break; case 2: cout << endl; cout << " |--| " << endl; cout << " O | " << endl; cout << " /| | " << endl; cout << " | " << endl; cout << " | " << endl; cout << " | " << endl; cout << " ------ " << endl; cout << endl; break; case 3: cout << endl; cout << " |--| " << endl; cout << " O | " << endl; cout << " /|\\ | " << endl; cout << " | " << endl; cout << " | " << endl; cout << " | " << endl; cout << " ------ " << endl; cout << endl; break; case 4: cout << endl; cout << " |--| " << endl; cout << " O | " << endl; cout << " /|\\ | " << endl; cout << " - | " << endl; cout << " / | " << endl; cout << " | " << endl; cout << " ------ " << endl; cout << endl; break; case 5: cout << endl; cout << " |--| " << endl; cout << " O | " << endl; cout << " /|\\ | " << endl; cout << " - | " << endl; cout << " / \\ | " << endl; cout << " | " << endl; cout << " ------ " << endl; cout << endl; break; } } //Méthode aidante à trouver le mot dans le fichier, elle retourne //un nombre alléatoire entre le nombre de mots et 1 int ObtenirNombreAlleatoire(int NombreDepart, int NombreFin) { int n = NombreFin - NombreDepart + 1; return ( rand()%n + NombreDepart); } //Méthode qui va sélectionner un mot dans le fichier, l'insérer dans //"motATrouver", et inserer autant de lettres dans "motTravail" int selectionnerMot(char*wstr) { int count = 0, which, i; FILE *fp; fp = fopen("Mots.txt", "r"); //ici vous pouvez remplacer mon fichier Mots.txt par le votre //n'oubliez pas de mettre un mot par ligne //et de mettre le total de mots sur la premiere ligne(cf Mots.txt) if (fp == NULL){ /*En cas d'erreur */ printf("Impossible d'ouvrir le fichier, exit ObtenirMotDuFichier\n"); return 0; } fscanf(fp, "%d", &count); /*Obtenir le nombre de mots*/ fgetc(fp); /* eliminer le charactere 'return' */ //Determiner le mot a choisir which = ObtenirNombreAlleatoire(1, count); for(i = 1; i <= which; ++i) { //Lire les mots jusqu'a obtention du mot voulu fgets(wstr, kMOTS_LONG_MAX, fp); /*aller au prochain resultat ou -1 pour arreter */ } fclose(fp); i = strlen(wstr); wstr[i-1] = '\0'; return i-1; } //Méthode qui affiche les informations sur les partie jouées void afficherStatistiques() { cout << "\n\nNombre de partie jouees : " << nbPartie << endl; cout << "Nombre de victoires : " << nbPartieGagnante << endl; cout << "Nombre de defaites : " << nbPartie-nbPartieGagnante << endl; double moyenne = ((double)nbPartieGagnante/nbPartie)*100; cout << "Pourcentage de victoires : : " << setprecision(4) << moyenne << "%" << endl; }

Conclusion :


Ce programme fonctionne #1 sur Visual C++ 6.0 Service Pack 6 et Windows XP Pro, je ne l'ai pas testé sur une autre plateforme/compileur. Merci de donner vos commentaires si vous en avez.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.