Bonjour à tous,
Bienvenue dans mon nouveau blog sur le langage de programmation C++. La semaine dernière, nous avons vu ensemble l'encapsulation, l'héritage et le polymorphisme. Pour cette semaine, je veux vraiment faire mon premier petit projet. Pour cela j'ai choisi le jeu du bonhomme pendu.
Ce projet sera réalisé dans la console et non avec une interface graphique.
Organisation de l'environement de travail
Pour commencer, nous allons créer un nouveau projet C++. Personnellement, je vais continuer à utiliser l'IDE CLION, que je trouve excellent. Je vais appeler le projet Pendu.

Fonction pour sélectionner un mot
Pour démarrer notre projet, nous allons coder ensemble notre première fonction. Celle-ci sera appelée listeMot() et elle permettra la sélection d'un mot aléatoire à partir d'une liste. J'ai utilisé pour la première fois un vecteur en C++. Celui-ci m'a permis de placer mes données de ma liste de mots dans la variable mots. En C++, un vecteur peut être comparé à un tableau en Java. Un vecteur a une taille modifiable dynamiquement. Pour l'utiliser dans un projet C++, il vous suffit de mettre les en-têtes suivants au début de votre code : #include <vector>.
Pour ce qui est de la génération du mot aléatoirement, j'ai utilisé la fonction srand(time(0)) de C++. Celle-ci permet de créer une graine pour le générateur de nombres pseudo-aléatoires, en utilisant l'heure actuelle comme base. Ce qui est incroyable, car cela garantit une séquence de nombres pseudo-aléatoires différente à chaque exécution du programme.
Finalement, je retourne la chaîne de caractères correspondant à l'élément choisi aléatoirement dans le vecteur mots.
entêtes utilisées:
#include <vector>
#include <string>
#include <cstdlib>
#include <ctime>
voici le code:
string listeMot() {
vector<string> mots = {"bonjour", "rosemont", "table", "programmation", "maison", "bureau"};
srand(time(0));
return mots[rand() % mots.size()];
}
Fonction pour afficher le mot caché
Ensuite, nous allons maintenant coder la fonction qui nous permettra d'afficher le mot aléatoire sous forme de tirets (-). Cette fonction sera appelée afficherMot() et prendra en paramètre un string qui sera notre mot, ainsi qu'un booléen qui nous permettra de savoir si chaque lettre du mot a été trouvée.
J'ai utilisé une boucle for pour parcourir chaque lettre du mot sélectionné. Si la lettre a été trouvée (lettresTrouvees[i] est true), elle est affichée. Sinon, un tiret bas _ est affiché pour indiquer que la lettre n'a pas encore été trouvée. En résumé, dans le bloc if, j'affiche la lettre si elle a été trouvée et dans le bloc else, j'affiche un tiret bas si la lettre n'a pas été trouvée. Enfin, je fais un saut de ligne pour un meilleur affichage.
voici le code:
void afficherMot(const string& mot, const vector<bool>& lettresTrouvees) {
for (size_t i = 0; i < mot.size(); ++i) {
if (lettresTrouvees[i])
cout << mot[i] << " ";
else
cout << "_ ";
}
cout << endl;
}
Fonction pour afficher le bonhomme pendu
Maintenant, nous allons coder la fonction qui nous permettra d'afficher les parties de notre bonhomme pendu. Cette fonction m'a causé beaucoup de mal, car j'ai pris beaucoup de temps avant de pouvoir arriver à une bonne logique. La logique que j'ai utilisée est d'afficher les différentes parties du corps du pendu en fonction du nombre d'essais restants. Par exemple, j'affiche la tête du pendu si le nombre d'essais restants est inférieur à 6, ou encore le bras gauche si le nombre d'essais restants est inférieur à 5 et le bras droit si le nombre d'essais restants est inférieur à 4, etc.
voici le code:
void afficherPendu(int essaisRestants) {
cout << " _______" << endl;
cout << "| |" << endl;
if (essaisRestants < 6)
cout << "| O" << endl;
else
cout << "|" << endl;
if (essaisRestants < 5)
cout << "| /";
if (essaisRestants < 4)
cout << "|\\";
cout << endl;
if (essaisRestants < 3)
cout << "| |" << endl;
else
cout << "|" << endl;
if (essaisRestants < 2)
cout << "| /";
if (essaisRestants < 1)
cout << " \\";
cout << endl;
cout << "|" << endl;
cout << "|___________" << endl;
}
Le main()
Maintenant, que nous avons toutes nos fonctions nécessaires, on peut passer au main pour lié tout cela ensemble.
voici le code du main() avec commentaire détaillé:
int main() {
// Variable qui contient le nombre d'essaie
const int MAX_ESSAIS = 6;
// Sélection aléatoire d'un mot
string mot = listeMot();
// Initialisation du vecteur de booléens pour suivre les lettres trouvées
vector<bool> lettresTrouvees(mot.size(), false);
// Initialisation du nombre d'essais restants
int essaisRestants = MAX_ESSAIS;
// Affichage du message de bienvenue
cout << "Bienvenue dans le jeu du pendu !" << endl;
// Boucle principale du jeu
while (essaisRestants > 0) {
cout << endl;
// Affichage de l'état actuel du pendu
afficherPendu(essaisRestants);
// Affichage du mot à deviner
cout << "Mot à deviner : ";
afficherMot(mot, lettresTrouvees);
// Vérification si le mot est entièrement découvert
bool motDeviner = true;
for (bool lettreTrouvee : lettresTrouvees) {
if (!lettreTrouvee) {
motDeviner = false;
break;
}
}
if (motDeviner) {
cout << "Félicitations ! Vous avez deviné le mot: " << mot << endl;
break;
}
// Demande à l'utilisateur de deviner une lettre
char guess;
cout << "Devinez une lettre : ";
cin >> guess;
// Vérification si la lettre est dans le mot
bool lettreCorrecte = false;
for (size_t i = 0; i < mot.size(); ++i) {
if (mot[i] == guess) {
lettresTrouvees[i] = true;
lettreCorrecte = true;
}
}
// Si la lettre n'est pas correcte, diminuer le nombre d'essais restants
if (!lettreCorrecte) {
cout << "Désolé, la lettre n'est pas dans le mot." << endl;
--essaisRestants;
}
}
// Si le nombre d'essais restants est 0, afficher le pendu complet
if (essaisRestants == 0) {
cout << endl;
afficherPendu(essaisRestants);
cout << "Game Over, vous avez perdu et le bonhomme a été pendu ! Le mot était : " << mot << endl;
}
return 0;
}
Résultat Final
Début du programme:

Affichage de lettre réussi (j'ai entré O comme lettre):

Affichage des parties du pendu quand on entre une mauvaise lettre (j'ai entré l, i et p comme lettre):

Pendu réussi:

Pendu perdu:

Conclusion
Pour conclure, je vous remercie d'avoir appris et fait notre premier projet avec moi aujourd'hui, mais ce n'est pas terminé. Restez à l'affût sur mes prochaines publications et à très bientôt.
Adham Elatris
Référence
Documentation sur rand() (Consulté le 3 Mars)
Structure des variables (Consulté le 3 Mars)
Exemple de Pendu en C++ (Consulté le 3 Mars)
Exemple pendu OpenClassroom (Consulté le 3 Mars)
Commentaires1
Retour en arrière
Ce fut très intéressant de voir comment ce jeu se coderait en C++ après qu'on l'aie fait en Kotlin. C++ semble bien s'adapter à des applications en CLI avec ses fonctions cin et cout.