Jeu de Pendu -> C++

Par aelatris, 3 mars, 2024
pendu

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.

Image retirée.

 

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:
Image retirée.

 

Affichage de lettre réussi  (j'ai entré O comme lettre):
Image retirée.

 

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

 

Pendu réussi:
Image retirée.

 

Pendu perdu:
Image retirée.

 

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)

Étiquettes

Commentaires1

abaudouinvegas

il y a 11 mois 1 semaine

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.