03 — Jeu de devinette
Niveau requis : 2 (while, conditions) / Difficulté : 2/5 / Durée estimée : 1–2 h
Objectif
L'ordinateur tire un nombre secret entre 1 et 100. L'utilisateur propose des nombres ; à chaque essai le programme répond « trop grand » ou « trop petit », jusqu'à la bonne réponse. À la victoire, le programme affiche le nombre d'essais utilisés.
J'ai choisi un nombre entre 1 et 100.
Ta proposition : 50
Trop grand !
Ta proposition : 25
Trop petit !
Ta proposition : 37
Gagne en 3 essais !
C'est le projet classique du while — et le premier programme où le déroulement dépend entièrement de l'utilisateur.
Notions utilisées
- Boucle
whileet condition de sortie — niveau 2 if/elif/else— niveau 2- Compteur (
attempts += 1) — niveaux 1–2 input()+int()— niveau 1random.randint()— modulerandom, présenté dans la leçon sur les boucles (⏩ les imports en détail : niveau 5)
Cahier des charges
- Fichier
guess_game.py. - Le nombre secret est tiré avec
random.randint(1, 100)— bornes incluses. - Le jeu boucle jusqu'à la bonne réponse : impossible de « perdre » dans la version de base.
- Chaque essai incrémente un compteur ; le message de victoire affiche le total exact (le premier essai compte pour 1, pas 0).
- Les réponses sont exactement « Trop grand ! », « Trop petit ! » ou le message de victoire — pas d'autre cas possible.
- Une proposition hors bornes (0, 150) reçoit un message spécifique et compte quand même comme un essai (règle assumée : on annonce les bornes, à l'utilisateur de lire).
Étapes de construction
- Écris un programme SANS random ni boucle :
secret = 42, une seule proposition, réponse « trop grand / trop petit / gagné ». Lance-le trois fois pour tester les trois branches. - Remplace
secret = 42parrandom.randint(1, 100). Ajoute temporairement unprint(secret)de triche pour pouvoir tester. Lance plusieurs fois : le nombre change. - Enveloppe la proposition dans un
whilequi tourne tant que la réponse n'est pas trouvée. Vérifie que le jeu redemande après chaque essai raté et s'arrête à la victoire. - Ajoute le compteur d'essais : initialisé à 0 avant la boucle, incrémenté à chaque proposition. Affiche-le dans le message de victoire. Vérifie qu'une victoire au premier coup affiche bien « 1 essai ».
- Ajoute le cas hors bornes (< 1 ou > 100) avec son message dédié. Teste avec 0 et 150.
- Retire le
print(secret)de triche, joue une vraie partie de bout en bout. C'est fini quand tu gagnes sans tricher.
Extensions possibles
- Limiter à 10 essais : défaite si dépassement, avec révélation du secret (attention à la condition de sortie double : trouvé OU essais épuisés).
- Proposer de rejouer à la fin (boucle externe autour du jeu).
- Inverser les rôles : TU choisis le nombre, l'ordinateur devine par dichotomie. Excellent exercice de logique — nettement plus difficile.
- Afficher un historique des propositions à chaque tour (avant-goût des listes, niveau 3).
Erreurs fréquentes sur ce projet
- Boucle infinie : l'
input()est resté HORS duwhile, donc la même proposition est comparée en boucle. Symptôme : l'écran se remplit de « Trop grand ! ». Sortie de secours :Ctrl+C— et c'est une leçon en soi. - Compteur incrémenté au mauvais endroit : dans une seule branche du
if, ou après le test de victoire. Résultat : total faux de 1. Teste toujours la victoire au premier coup. int(input(...))oublié :'50' < 42lèveTypeError: '<' not supported between instances of 'str' and 'int'. Lis le message : il te dit exactement quoi.- Confondre
=et==dans la condition :while guess = secretest uneSyntaxError— Python te protège, mais il faut comprendre pourquoi. random.randint(1, 100): contrairement à beaucoup de fonctions, les DEUX bornes sont incluses. Ne pas « corriger » enrandint(1, 101).
Critères de réussite
- Une partie complète se joue sans erreur et se termine.
- Le nombre d'essais affiché est exact (vérifié sur une victoire au 1er coup).
- Une proposition hors bornes affiche le message dédié et compte comme essai.
- Le programme ne boucle jamais à l'infini.
- Je peux expliquer la condition du
whileet pourquoi elle finit par devenir fausse.
Commit conseillé
git add projects/mini-projects/03-jeu-devinette/
git commit -m "project: add guessing game"
Puis entrée de journal + git push.