Le jeu que nous voulons réaliser consiste à retrouver un mot dont les lettres ont été mélangées. C'est simple en apparence, mais il va nous falloir utiliser des notions que nous avons découvertes dans les chapitres précédents :
- Les variables string
- Les fonctions
- Les structures de contrôle (boucles, conditions...)
N'hésitez pas à relire rapidement ces chapitres pour bien être dans le bain avant de commencer ce TP !
Principe du jeu "Le mot mystère"
Nous voulons réaliser un jeu qui se déroule de la façon suivante :
- Le joueur 1 saisit un mot au clavier
- L'ordinateur mélange les lettres du mot
- Le joueur 2 essaie de deviner le mot d'origine à partir des lettres mélangées
Voici un exemple de partie du jeu que nous allons réaliser :
Code : Console | Saisissez un mot
MYSTERE
Quel est ce mot ? MSERETY
RESEMTY
Ce n'est pas le mot !
Quel est ce mot ? MSERETY
MYRESTE
Ce n'est pas le mot !
Quel est ce mot ? MSERETY
MYSTERE
Bravo ! |
- Dans cette partie, le joueur 1 choisit "MYSTERE" comme mot à deviner.
- L'ordinateur mélange les lettres et demande au joueur 2 de retrouver le mot qui se cache derrière "MSERETY".
- Le joueur 2 essaie de trouver le mot. Ici, il y parvient au bout de 3 essais :
- RESEMTY : on lui dit que ce n'est pas ça
- MYRESTE : là non plus
- MYSTERE : là on lui dit bravo car il a trouvé, et le programme s'arrête.

Bien sûr, le joueur 2 peut actuellement facilement lire le mot saisi par le joueur 1. Nous verrons à la fin du TP comment nous pouvons améliorer ça.
Quelques conseils pour bien démarrer
Quand on lâche un débutant dans la nature la première fois, avec comme seule instruction "Allez, code-moi ça", il est en général assez désemparé.
"Par quoi dois-je commencer ?",
"Qu'est-ce que je dois faire, qu'est-ce que je dois utiliser ?". Bref, il ne sait pas du tout s'y prendre, et c'est bien normal vu qu'il n'a jamais fait ça.
Mais moi, je n'ai pas envie que vous vous perdiez ! Je vais donc vous donner une série de conseils pour que vous soyez le mieux préparés possible. Bien entendu, ce sont juste des conseils, vous en faites ce que vous voulez.
Repérez les étapes du programme
Je vous ai décrit les 3 étapes du programme un peu plus tôt :
- Saisie du mot à deviner
- Mélange des lettres
- Boucle qui se répète tant que le mot mystère n'a pas été trouvé
Ces étapes sont en fait assez indépendantes. Plutôt que d'essayer de réaliser tout le programme d'un coup, pourquoi vous n'essayez pas de faire chaque étape indépendamment des autres ?
- L'étape 1 est très simple : l'utilisateur doit saisir un mot qu'on va stocker en mémoire (dans une string, car c'est le type adapté). Si vous connaissez cout et cin, vous ne mettrez pas plus de quelques minutes à écrire le code correspondant.
- L'étape 2 est la plus complexe : vous avez une string qui contient un mot comme MYSTERE et vous voulez aléatoirement mélanger les lettres pour obtenir quelque chose comme MSERETY. Comment faire ? Je vais vous aider un peu pour ça car vous devez utiliser certaines choses que nous n'avons pas vues.
- L'étape 3 est de difficulté moyenne : vous devez créer une boucle qui demande de saisir un mot et qui le compare au mot mystère. La boucle s'arrête dès que le mot saisi est identique au mot mystère.
Créez un canevas de code avec les étapes
Comme vous le savez, tous les programmes contiennent une fonction main(). Ecrivez dès maintenant des commentaires pour séparer les principales étapes du programme. Ca devrait donner quelque chose comme ça :
Code : C++ | int main()
{
// 1 : On demande à saisir un mot
// 2 : On mélange les lettres du mot
// 3 : On demande à l'utilisateur quel est le mot mystère
return 0;
}
|
A vous de réaliser les étapes ! Pour y aller en difficulté croissante, je vous conseille de faire d'abord l'étape 1, puis l'étape 3 et enfin l'étape 2.
Lorsque vous aurez réalisé les étapes 1 et 3, le programme vous demandera un mot et vous devrez le ressaisir. Ce ne sera pas très amusant mais comme ça vous pourrez valider que vous avez réussi les premières étapes ! N'hésitez donc pas à y aller pas à pas !
Ci-dessous un aperçu du programme "intermédiaire" avec seulement les étapes 1 et 3 réalisées :
Code : Console | Saisissez un mot
MYSTERE
Quel est ce mot ?
RESEMTY
Ce n'est pas le mot !
Quel est ce mot ?
MYRESTE
Ce n'est pas le mot !
Quel est ce mot ?
MYSTERE
Bravo ! |
Comme vous le voyez, le programme ne propose pas encore le mot avec les lettres mélangées, mais si vous arrivez déjà à faire ça vous avez fait 50% du travail !
Un peu d'aide pour mélanger les lettres
L'étape de mélange des lettres est la plus "difficile" (si je puis dire !) de ce TP. Je vous donne quelques informations et conseils pour réaliser cette fameuse étape n°2.
Tirer un nombre au hasard
Pour que les lettres soient aléatoirement mélangées, vous allez devoir tirer un nombre au hasard. Nous n'avons pas appris à le faire auparavant, il faut donc que je vous explique comment ça fonctionne.
- Vous devez inclure ctime et cstdlib au début de votre code source pour obtenir les fonctionnalités de nombres aléatoires.
- Vous devez appeler la fonction srand(time(0)); une seule fois au début de votre programme (au début du main) pour initialiser la génération des nombres aléatoires.
- Et enfin, pour générer un nombre compris entre 0 et 4 (par exemple), vous écrirez : nbAleatoire = rand() % 5; (on écrit 5 pour avoir un nombre entre 0 et 4, oui oui
).
Un exemple qui génère un nombre entre 0 et 4 :
Code : C++ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | #include <iostream>
#include <ctime> // Obligatoire
#include <cstdlib> // Obligatoire
using namespace std;
int main()
{
int nbAleatoire(0);
srand(time(0));
nbAleatoire = rand() % 5;
return 0;
}
|
Tirer une lettre au hasard
Tirer un nombre au hasard c'est bien, mais pour ce programme j'ai besoin de tirer une lettre au hasard pour mélanger les lettres !
Imaginons que vous ayez une string appelée motMystere qui contient le mot mystère. Vous avez appris que les string pouvaient être considérées comme des tableaux, souvenez-vous ! Ainsi, motMystere[0] correspond à la première lettre, motMystere[1] à la deuxième lettre, etc.
Il suffit de générer un nombre aléatoire entre 0 et le nombre de lettres du mot (qui nous est donné par motMystere.size()) pour tirer une lettre au hasard ! Une petite idée de code pour récupérer une lettre au hasard :
Code : C++ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | #include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{
string motMystere("MYSTERE");
srand(time(0));
int position = rand() % motMystere.size();
cout << "Lettre au hasard :" << motMystere[position];
return 0;
}
|
Retirer une lettre d'une string
Pour éviter de tirer 2 fois la même lettre d'un mot, je vous conseille de retirer au fur et à mesure les lettres qui ont été piochées. Pour ce faire, on va faire appel à erase() sur le mot mystère comme ceci :
Code : C++ | motMystere.erase(4, 1); // Retire la lettre n°5
|
Il y a 2 paramètres :
- Le numéro de la lettre à retirer du mot (ici 4, ce qui correspond à la 5ème lettre car on commence à compter à partir de 0).
- Le nombre de lettres à retirer (ici 1).
Créez des fonctions !
Ce n'est pas une obligation, mais plutôt que de tout mettre dans le main(), vous pourriez créer des fonctions qui ont des rôles spécifiques. Par exemple, l'étape 2 qui génère un mot dont les lettres ont été mélangées mériterait d'être faite dans une fonction.
Ainsi, on pourrait appeler la fonction comme ceci dans le main() :
Code : C++ | motMelange = melangerLettres(motMystere);
|
On lui envoie le motMystere, elle nous retourne un motMelange.
Bien entendu, toute la difficulté consiste ensuite à coder cette fonction melangerLettres. Allez au boulot !
