Académique Documents
Professionnel Documents
Culture Documents
THEME :
CONCEPTION DU JEU
PENDU
Présentée par:
Promotion 2020-2021
2020
PREAMBULE
Ce document constitué de 38 pages est un travail fournit par un
groupe d’étudiants de la première année licence informatique du
CFI-CIRAS promotion 2020-2021 2021 dans le but de répondre a un
travail pratique sur la conception d’un jeu de pendu remit le 01
Juillet 2020 par Mr OYERE ,responsable du cour de
programmation orienté objet.
objet Il est divise en deux parties; la
première présente la modélisation avec quelque diagrammes
UML(cas d’utilisation, classe),les difficultés rencontrées ainsi la
description de l’implémentation des différentes fonctionnalitees.La
seconde partie est consacrée a l’implémentation du code source en
c++
PRESENTATION DU JEU
La version officielle du < Jeu du Pendu > se joue a plusieurs
personnes. Nous supposerons ici que le jeu se joue a deux.
L'un des joueurs commence par proposer un mot a deviner.
Supposez que l'autre joueurs ne voit pas ce mot. Il n'en connait
au départ que la longueur. Ce deuxième joueur propose ensuite
une lettre. Si cette lettre est présente dans le mot, toutes ses
occurrences sont indiquées.
indiquées Sinon, ce joueur < progresse > sur
le chemin de la pendaison. Au bout d'un certain nombre NMAX
étapes, il a perdu : il est < pendu >.
La partie se termine lorsque chacun des deux joueurs a
propose a l'autre un mot a deviner. Chaque joueur qui parvient
a en pendre un autre gagne un point. Chaque joueur qui trouve
un mot (c.-a-d. propose la dernière lettre a trouver) gagne un
point. A la n de la partie, gagne celui qui est encore en vie et a
le plus de points. Au terme de la pendaison (NMAX-eme
étape), le pendu pourrait ressembler a un petit pendu (ici 3
essais) :
Le jeu du pendu pouvant se jouer a plusieurs joueurs (un qui
propose le mot et les autres essayant a tour de rôle de le
deviner), la solution proposée ne fait pas d'hypothèse
sur le nombre de joueurs.
1
DIAGRAMME DE CAS D’UTILISATION
JeuPendu
Consulter
l’aide Saisir
joueur
<étendre>
<inclus>
Description
du jeu Proposer
mot
<étendre>
<inclus> Machine
Vérifier
Consulter
<inclus> tentative
menu <inclus> Proposer
lettre
<étendre> <inclus>
Rechercher
lettre
Sélectionner
Joueur <étendre>
Mode
Afficher
résultat
Mutijoueurs Arcade
2
DIAGRAMME DE CLASSE
+Joueur
#m_nom
#m_npoint
#m_etape
+getNom
+getPoints 1..* +Pendu
+getEtape
+incrPoint -m_joueurs
+incrEtape -m_tentative
+reset -m_adeviner
+affiche
+proposerMot +estPendu
+proposerLettre +afficher
1 +jouer
#estDansMot
#inclureDansMot
#initAdeviner
#initTentative
#devinerMot
+Humain +Machine
-m_dict
m_dict
+proposerMot +proposerMot
+proposerLettre +proposerLettre
3
DESCRIPTION DE L’IMPLEMENTATION
Le programme a été développé en C++ sur Visual studio 2012.Le
code source se divise essentiellement en deux types de fichiers:
*MotsDico.txt
C’est un dictionnaire de mots saisi au clavier, permettant au joueur
machine de sélectionner un mot a deviner lors d’une partie en mode
arcadre
DIFFCULTEES RENCONTREES
La mise en place d’un diagramme de séquence
La génération automatique des mots a deviner par la machine
La capacité d’effectuer un retour au menu principal a certains
niveau de l’application
Une partie de jeu avec plusieurs joueurs machines
Mis a jour du nombre de tentatives des joueurs
4
5
Algorithmique, Programmation
1)Classe
Classe Joueur
Joueur.h:
#ifndef JPJOUEUR_CLASS
#define JPJOUEUR_CLASS
#include <iostream>
#include <string>
using namespace std;
class Joueur
{
protected:
string m_nom; // nom du joueur
int m_npoints; // # de points cumules
int m_etape; // etape
public:
Joueur(const string& n);
virtual ~Joueur();
const string& getNom() const;;
int getPoints() const;
int getEtape() const;
void incrPoints();
void incrEtape();
void reset();
void affiche();
6
Joueur.cpp:
#include "Joueur.h"
/**Constructeur normal*/
Joueur :: Joueur(const string&
& n): m_nom(n), m_npoints(0),
m_etape(0){
}
/**Destructeur virtuel*/
Joueur :: ~Joueur()
{}
/**Accesseur le nom du joueur*/
const string&& Joueur :: getNom() const
{
return m_nom;
}
/**Accesseur du nombre de points du joueur*/
int Joueur :: getPoints() const
{
return m_npoints;
}
1)Classe Pendu
Pendu.h
#ifndef JPPENDU_CLASS
#define JPPENDU_CLASS
#include <iostream>
#include <cstdlib>
#include <string>
#include <vector>
using namespace std;
#include "Joueur.h"
/**
Represente des parties du jeu du pendu
*/
class JeuPendu
{
private:
<Joueur*> &m_joueurs;
const vector<Joueur*>
string m_adeviner; // mot cache
string m_tentative; // mot tente
8
public:
JeuPendu(const vector<Joueur*>&
<Joueur*>& j);
bool estPendu(int nb);
void afficher(int n);
void afficher();
void jouer();
protected:
bool estDansMot(char c) const;
const
void inclureDansMot(char c);
void initADeviner(unsigned k);
void initTentative();
bool devinerMot(unsigned k);
};
#endif
Pendu.cpp:
#include "Pendu.h"
/**Constructeur normal*/
JeuPendu :: JeuPendu(const
const vector<Joueur*>&
vector j): m_joueurs(j)
{}
bool JeuPendu :: estPendu(int nb){
if(nb==3)
{
return true;
}
else
{
return false;
}
}
9
/**Affiche les resultats d’une partie*/
void JeuPendu :: afficher()
{
cout<<endl<<"La
<<"La partie est finie. Les resultats:"<<endl;
for (unsigned j = 0; j < m_joueurs.size(); ++j)
{
Joueur &joueur = *m_joueurs[j];
cout<<"Joueur "
<<joueur.getNom()
<<" ("<<(j+1)<<") ==> "
<<(!estPendu(joueur.getEtape())
? "EN VIE"
: "PENDU...")
<<" (points: "
<<joueur.getPoints()
<<")"<<endl;
}
cout<<endl;
}
/**
Boucle principale d’une partie
*/
void JeuPendu :: jouer()
{
// Reinitialise les status des joueurs
for (unsigned k = 0; k < m_joueurs.size(); ++k)
{
m_joueurs[k]->reset();
>reset();
}
10
// Fait jouer chacun des joueurs à tour de rôle
for (unsigned k = 0; k < m_joueurs.size(); ++k)
{
// Initialise le mot à deviner par le joueur k
initADeviner(k);
// Initialise la tentative
initTentative();
// Les joueurs autres que k sont sollicites pour
// proposer des lettres
bool b = devinerMot(k);
if (b==false)
{
cout<<"ADeviner
<<"ADeviner etait: "<<m_adeviner<<endl;
"<<m_adeviner<<
}
}
}
3)Classe Humain:
Humain.h:
#ifndef JPHUMAIN_CLASS
#define JPHUMAIN_CLASS
#include <iostream>
#include <string>
using namespace std;
#include "Joueur.h
/**
Represente des joueurs "Humain"
*/
public:
Humain(const string& n);
string proposerMot() const;
char proposerLettre() const;
};
#endif
14
Humain.cpp
#include "Humain.h"
#include "ValidationEntier.h"
#include "ValidationMot.h"
#include "ValidationLettre.h"
//#include "Joueur.h"
/**
Constructeur normal
*/
Humain :: Humain(const string&
& n): super(n)
{}
/**
Propose un mot a faire deviner
*/
string Humain :: proposerMot() const
{
bool validMot=false;
string s;
do
{
cout<<"(Les
<<"(Les autres joueurs ne regardent pas)"<<endl;
pas)"<<
cout<<"Mot propose? ";
cin>>s;
validMot=isName(s);
}while (!validMot);
return s;
}
15
/**
Propose une lettre
*/
char Humain :: proposerLettre() const
{
int nombre=0;
bool validLettre=false;
string name;
char c=' ';
do
{
cin>>name;
validLettre=isCaractere(name);
nombre=name.length();
if(nombre>=2)
{
cout<<"DONNEES
<<"DONNEES SAISIES INCORRECTES,VEUILLER SAISIR
UNE SEULE LETTRE "<<endl;
validLettre=false;
}
}while (!validLettre);
c=name[0];
return c;
}
16
4)Classe Machine:
Machine.h:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
#include <vector>
using namespace std;
#include "Joueur.h"
17
#include "Machine.h"
/*
Propose un mot a faire deviner: Tire un nombre de la
taille du dictionnaire et retourne le mot correspondant
*/
string Machine::proposerMot() const
{
string s = m_dict[ rand() % m_dict.size() ];
cout<<"Mot propose "<<s<<endl endl;
return s;
}
/*
Propose une lettre.
Génère aléatoirement une lettre de l’alphabet.
*/
18
LES FONCTONS:
1)Multijoueur
Permet à au moins deux juoueurs, tous humain de s’affronter
Multijoueur.h
#include <iostream>
using namespace std;
#include <vector>
#include <string>
#include "Joueur.h"
#include "Humain.h"
#include "Pendu.h"
void Multijoueur();
Multijoueur.cpp
#include "Multijoueur.h"
#include "ValidationEntier.h"
#include "ValidationMot.h"
#include "ValidationLettre.h"
void Multijoueur(){
vector<Joueur*>*> listejoueur;
int i=0,n=0,j=0,p=0,conf=0,nombre=0,x=0,vt=0;
string nom,num,name;
bool valid=false;
bool validMot=false;
bool validLettre=false;
char c;
cout<<"---------------------------------------------------------
---------------------------------------------------------<<endl;
cout<<"
<<" <<<<<< MODE MUTIJOUEUR>>>>> "<<endl; "<<
19
while(conf==0)
{
cout<<"---------------------------------------------------------
---------------------------------------------------------<<endl;
do
{
cout<<"entrer
<<"entrer le nombre du joueur"<<endl;
joueur"<<
cin>>num;
valid=isNumber(num);
if(valid)
{
if(stoi(num)==1)
{
cout « "Le nombre de joueurs doit être supérieur a 1" «endl;
valid=false
}
}
}while(!valid);
n=stoi(num);
for(i=0;i<n;i++)
{
do
{
cout<<"Veuillez
<<"Veuillez entrer un nom sans chiffre pour le joueur
"<<j+1<<endl;
cin>>nom;
validMot=isName(nom);
}while (!validMot);
listejoueur.push_back(new Humain(nom));
j++;
}
i=0;
JeuPendu* joueurselect=new JeuPendu (listejoueur);
joueurselect->jouer();
joueurselect->afficher();
cout<<endl;
20
/* Effectue les parties*/
cout<<"Une
<<"Une autre partie (o/n)? ";
do
{
cin>>name;
validLettre=isCaractere(name);
nombre=name.length();
if(nombre>=2)
{
validLettre=false;
}
if(validLettre=1)
{
if((name[0]!='o') && (name[0]!='n'))
{
cout<<"VEUILLER
<<"VEUILLER SAISIR 'o'(oui)/'n'(non) "<<endl;
"<<
validLettre=false;
}
}
}while (!validLettre);
c=name[0];
if (c== 'o')
{
conf=0;
cout<<"****
<<"**** NOUVELLE PARTIE DE JEU ****"<<endl;
****"<<
for(i=0;i<=listejoueur.size();i++){
<=listejoueur.size();i++){
listejoueur.pop_back();
}
i=0;
j=0;
}
if(c=='n')
{
conf++;
cout<<"MERCI
<<"MERCI D'AVOIR JOUER"<<endl;
JOUER"<<
}
}
21
2)Arcadre:
Permet à au moins un joueur humain de joueur contre la machine
Arcadre.h:
#include <iostream>
using namespace std;
//#include "Multijoueur.h"
#include <vector>
#include <string>
#include "Joueur.h"
#include"Humain.h"
#include "Pendu.h"
#include "Machine.h"
//#include "JeucontreMachine.h"
#include "LectureDico.h"
void Arcadre();
Arcadre.cpp
#include "Arcadre.h"
void Arcadre(){
vector<string> listmot;
string nom;
vector<Joueur*> *> listejoueur;
string nomValid,num,name;
bool valid=false;
bool validMot=false;
bool validLettre=false;
char c;
cout<<"---------------------------
---------------------------"<<endl;
cout<<"
<<" MODE ARCADE "<<
"<<endl;
listmot=Lecturedico();
Joueur* PC=new Machine("PC",listmot);
while(conf==0)
{
cout<<"---------------------------
---------------------------"<<endl;
22
do
{
cout<<"entrer
<<"entrer le nombre de joueurs humain"<<endl;
humain"<<
cin>>num;
valid=isNumber(num);
}while(!valid);
for(i=0;i<n;i++)
{
do
{
cout<<"Veuiller
<<"Veuiller entrer un nom sans chiffre pour le joueur "<<j2+1<<endl;
"<<j2+1<<
cin>>nomValid;
validMot=isName(nomValid);
}while (!validMot);
listejoueur.push_back(new Humain(nom));
j2++;
}
i=0;
listejoueur.push_back(PC);
JeuPendu* joueurselect=new JeuPendu (listejoueur);
joueurselect->jouer();
joueurselect->afficher();
cout<<endl;
Description.cpp
#include "Description.h"
#include <iostream>
#include "Aide.h"
#include "ValidationEntier.h"
#include "ValidationMot.h"
#include "ValidationLettre.h"
#include "Multijoueur.h"
using namespace std;
void Description(){
cout<<"-------------------------------------------------------------
-------------------------------------------------------------<<endl;
cout<<"
<<" <<<<<<< DESCRIPTION DU JEU >>>>>>>>>> "<<endl; "<<
cout<<"------------------------------------------------------------------
------------------------------------------------------------------"<<endl;
cout<<"La
<<"La version officielle du <<jeu de pendu>> se joue a plusieurs
personnes. L'un des joueurs "<<endl endl;
24
cout<<"commencent par proposer un mot a deviner. Supposons que l'autre
joueur ne voit pas ce mot."<<endl;
cout<<"Il n'en connait au départ que sa longueur. Le joueur suivant propose
ensuite une lettre. Si "<<endl;
cout<<"cette lettre est présente dans le mot, toutes ses occurrences sont
indiquées. Sinon, ce <<joueur>> "<<endl;
cout<<"progresse sur la voie de la pendaison. Au bout d'un certain nombres
NMAX etapes, il a perdu"<<endl;
cout<<":il est <<pendu>> "<<endl;
cout<<"Au terme de la pendaison(NMAX-eme
pendaison(NMAX etape), le pendu pourrait
ressembler a un petit pendu"<<endl<<endl;
cout<<" __________"<<endl;
cout<<" |/ | "<<endl;
cout<<" | o "<<endl;
cout<<" | -|- "<<endl;
cout<<" | | "<<endl;
cout<<" | / "<<endl;
cout<<" | "<<endl;
cout<<" | "<<endl;
cout<<"_/|\________
________ #e=5"<<endl<<endl;
int val=0,i=0;
string num;
bool valid=false;
do
{
cout<<"ENTRER VOTRE CHOIX PARMI LE MENU CI-DESSUS CI "<<endl;
cin>>num;
valid=isNumber(num);
if(valid==1)
{
if(stoi(num)==3)
{
cout<<"VOUS VOUS TROUVEZ DEJA SUR 'DESCRIPTION DU JEU'
"<<endl;
valid=0;
}
}
}while (!valid);
25
val=stoi(num);
while (i==0){
if((val>=1) && (val<=5))
{
i=1;
switch(val)
{
case 1: Multijoueur();
break;
case 2:cout<<"bonjour"<<endl;
break;
case 4: Aide();
break;
}
}
}
}
4)Aide:
Aide.h:
#include <iostream>
using namespace std;
void Aide();
Aide.cpp:
#include "Aide.h"
#include "Description.h"
#include "ValidationEntier.h"
#include "ValidationMot.h"
#include "ValidationLettre.h"
#include "ValidationEntier.h"
#include "ValidationMot.h"
#include "ValidationLettre.h"
#include "Multijoueur.h"
26
void Aide(){
cout<<"----------------------------------------------
----------------------------------------------"<<endl;
cout<<"
<<" <<<<<<<<< AIDE >>>>>>>>>>> "<<endl; "<<
cout<<"------------------------------------------------------------
------------------------------------------------------------"<<endl;
cout<<"MODE
<<"MODE MUTIJOUEUR"<<endl;
MUTIJOUEUR"<<
cout<<"LE
<<"LE MODE MUTIJOUEUR PERMET A AU MOINS
DEUX JOUEURS TOUS HUMAINS";
cout<<"
<<" DE S'AFFRONTER ENTRE EUX"<<endl; EUX"<<
cout<<"MODE ARCADE"<<endl endl;
cout<<"LE
<<"LE MODE ARCADE PERMET A AU MOINS UN
JOUEURS HUMAIN";
cout<<"
<<" D'AFFRONTER LA
MACHINE(ORDINATEUR)"<<
MACHINE(ORDINATEUR)"<<endl<<endl;
int val=0,i=0;
string num;
bool valid=false;
do
{
cout<<"ENTRER VOTRE CHOIX PARMI LE MENU CI- CI
DESSUS"<<endl;
cin>>num;
valid=isNumber(num);
if(valid==1)
{
if(stoi(num)==4)
{
cout<<"VOUS
<<"VOUS VOUS TROUVEZ DEJA SUR 'AIDE' "<<endl;
"<<
valid=0;
}
}
}while (!valid);
val=stoi(num);
27
while (i==0)
{
if((val>=1) && (val<=5))
{
i=1;
switch(val)
{
case 1: Multijoueur();
break;
case 2:Arcadre()*;
break;
case 3: Description();
}
}
}
}
5)LectureDico:
Permet au joueur machine de sélectionner un mot a partir du fichier
MotsDico.txt (dictionnaire de mots)
LectureDico.h
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
vector<string> Lecturedico();
LectureDico.cpp;
#include "LectureDico.h"
vector<string> Lecturedico()
{
vector<char> mot2;
vector<string> tab;
28
vector<string> mots;
ifstream fichier;
fichier.open("MotsDico.txt");
if (fichier.fail())
{
cerr<<« Erreur, fichier non ouvert"<<endl;
}
char element;
string mo="",p="";
int n=0,i=0;
while(!fichier.eof())
{
fichier>>element;
mot2.push_back(element);
}
for(i=0;i<mot2.size();i++)
{
mo=mo+mot2[i];
}
i=0;
for(i=0;i<mo.size();i++)
{
if(mo[i]!=';')
{
p=p+mo[i];
}
else
{
tab.push_back(p);
p="";
}
}
cout<<"les mots sont: "<<endl;
for(i=0;i<tab.size();i++)
{
cout<<tab[i]<<endl;
}
return tab;
}
29
6)Les validations:
6-1) IsNumber: Pour la saisie des entiers
ValidationEntier.h
ValidationEntier.h:
#include <iostream>
#include <string>
using namespace std;
bool isNumber(string num);
ValidationEntier.cpp:
#include "ValidationEntier.h"
30
ValidationLettre.cpp:
#include "ValidationLettre.h"
ValidatonMot.cpp:
#include "ValidationMot.h«
int main()
{
int val;
int i=0;
string num;
int reelNum;
bool valid=false;
cout<<"
<<" MENU PRINCIPALE DU JEU "<<
"<<endl;
cout<<"<<" ** 1: MULTIJOUEURS ** "<<
"<<endl;
cout <<" ** 2: ARCADE ** "<<
"<<endl;
cout<<"<<" ** 3: DESCRIPTION DU JEU ** "<<
"<<endl;
cout<<"<<" ** 4: AIDE ** "<<endl<<endl;
"<<
cout<<"*************************************************"
<<"*************************************************" <<endl;
<<
do
{
cout<<"ENTRER
<<"ENTRER VOTRE CHOIX"<<endl;
CHOIX"<<
cin>>num;
valid=isNumber(num);
32
if(valid==1)
{
if((stoi(num)<1) || (stoi(num)>4))
i(num)>4))
{
cout<<"VEUILLER
<<"VEUILLER ENTRER UNE VALEUR COMPRISE ENTRE 1 ET
4 SELON VOTRE CHOIX DANS LEMENU CI-DESSUS
CI "<<endl;
valid=0;
}
}
}while (!valid);
val=stoi(num);
switch(val){
case 1: Multijoueur();
break;
case 2: Arcadre();
break;
case 3: Description();
break;
case 4: Aide();
break;
}
return 0;
33
CONCLUSION
Tout au long de ce projet, nous avons été amenés à concevoir et
implémenter une application dans le cadre d’un projet pédagogique sous
Visual studio 2012 en C++ .Conformément
Conformément a ce que nous avons spécifié,
nous sommes parvenu à mettre en œuvre une application console sous le
nom de « JEU PENDU ».
Ce projet a été très bénéfique. Ce travail était l’occasion
d‘appliquer les connaissances acquises durant notre formation au CFI-CIRAS.
En effet, il mêlait ensemble plusieurs disciplines et nous a permis de mettre à
profit les études du semestre précédent et de parfaire nos connaissances
dans des matières déjà étudiées au premier semestre. Les acquis du cours de
programmation orienté objet étant sans cesse sollicités et ce nouveau
développement de projet en C++ nous a encore permis d’aller lus loin dans
les possibilités du langage et d’acquérir de nouvelles connaissances.
Enfin, les fonctionnalités offertes par cette application répond
grandement aux problèmes posés pour le bon fonctionnement de ce jeu.
Toutefois, il existe toujours des améliorations à envisager pour rendre une
application encore plus performante.
performante
34