Pendu simple en console

Soyez le premier à donner votre avis sur cette source.

Vue 10 944 fois - Téléchargée 627 fois

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

Ajouter un commentaire Commentaires
Messages postés
402
Date d'inscription
samedi 28 décembre 2002
Statut
Membre
Dernière intervention
21 juillet 2005
1
Salut,
d'un le code n'est pas très beau et de deux tu mélange tout, ce qui n'est pas trop bien, tu utilise d'abord un cout et la lige suivant un printf( ) il n'y pas d'erreur la dedans mais bon faut se décider :) sinon c'est une bonne idée, les quelques options que tu y as rajoutées ne sont pas mal du tout si le code était un peu plus lisible j'aurais p-e eu l'envie de le lire m'enfin c'est pas trop grave :)

Pour ce qui est du nombre de mot dans le fichier Mots.txt tu pourais éviter de chaque fois devoir mettre le nombre de mtos étant dans le fichier à la première ligne, cela en te créant une fonction qui compte le nombre de mots se trouvant dans le fichier. Vu que chaque mots se trouve sur une autre ligne, il n'y as rien de bien compliqué à chaque '\n' tu considère un nouveau mot... ce n'est pas obligatoire mais ça permettrait à l'utilisateur d'alléger le travail et il n'aurais pas besoin de compter le nombre de mots qu'il a :p

enfin encore bonne continuation ;)

Ciao ;)
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
eu... j'ai regarder le code, c'est bourré de faute, de non sens, tu melange tout...

le prend pas mal, mais a ce niveau la mieux vaux voir la verite en face.

tu voulais faire ca en c ou en c++ ?
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
sous g++ ca compile mais j'ai un warning :

warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <sstream> instead of the deprecated header <strstream.h>. To disable this warning use -Wno-deprecated.

a ton avis c'est quoi?

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.