← Bibliothèque · PRO · Mon premier jeu en Python
0/0 ⬇
Collection « Challenges » · Apprendre à coder en Python · Collégiens · Pro

Mon premier jeu en Python — 4 semaines pour créer « Le mot mystère »

En quatre semaines, tu passes du quiz à ton premier vrai jeu. Tu fais répéter, tu tires au hasard, tu crées tes propres blocs et tu chasses les bugs, jusqu'à présenter « Le mot mystère » à la fête du jeu de ton club.

20 épisodes · 4 semaines1 épisode par jour, du lundi au vendrediNavigateur (Basthon, Capytale) ou Thonny≈ 20 min / épisode
BOOST · 5 JOURSPasser des blocs au texte et créer ton premier quiz.
PRO · 20 JOURSCréer un mini-jeu avec boucles, listes, hasard et tes propres fonctions.
MASTER · 4 MOISMener un projet de jeu complet et l'expliquer aux autres.
Le fil rouge. Inès, 13 ans, en 4e (personnage fictif), a présenté son quiz au club. Dans quatre semaines, le club organise une fête du jeu : elle veut y présenter son propre jeu.
Chaque épisode = un scénario, une notion ou une méthode, ce que disent les sources, des idées reçues, un quiz, ton kit et ton journal. Le vendredi, un bilan et un badge.
Tes données restent chez toi. Ta progression et ton journal sont enregistrés seulement dans ce navigateur. Dans les exercices, utilise un pseudo, jamais ton vrai nom.
Règle d'or. Un code que tu ne comprends pas, tu ne le lances pas.
Ce que tu sais déjàTu traduis un programme en blocs en Python (Boost, épisode 1). Tu lances un programme et tu lis une erreur en 3 questions (Boost, épisode 2). Tu ranges des valeurs dans des variables, tu convertis avec int(input(...)) et tu décides avec if / elif / else (Boost, épisode 3). Tu construis un programme « une question, un test » (Boost, épisode 4). Tu démarres ici sans avoir suivi le Boost ? Le kit de rattrapage est en fin de livre.
ARC 1 · SEMAINE 1

Répéter sans recopier

Cette semaine, tu apprends à faire répéter ton programme et à jouer avec les mots. Vendredi, tu sauras afficher le mot mystère caché sous des tirets.

01
S1 · LUNDI · Comprendre

Répéter sans recopier

Faire répéter des instructions avec for quand on sait combien de fois, avec while tant qu'une condition est vraie.

⏱ 15 min de lecture · 5 min de quiz
[1]Scénario
Inès · Lundi, 12 h 40

Retour au club. Malik a gardé sa question du vendredi : « Ton quiz, tu as recopié cinq fois presque le même bloc. Il n'y a vraiment pas plus court ? » L'animatrice sourit et ouvre Scratch. Elle pose un bloc « répéter 10 fois » et glisse dedans un « dire Bonjour ! ». « Celui-là, tu le connais. Ce matin, on va voir à quoi il ressemble en Python. Et la semaine prochaine, tu ne recopieras plus jamais un bloc. »

[2]Concept

Deux façons de répéter

Une boucle fait répéter un groupe d'instructions. Tu en as déjà utilisé en Scratch. Python en a deux :

1. for : quand tu sais combien de fois.

Code
for i in range(5):
    print("Bonjour !")

Affiche cinq fois Bonjour !. Les lignes décalées de 4 espaces sous le for forment le corps de la boucle : ce qui est répété (comme les pièces glissées dans « répéter »). Chaque passage dans la boucle s'appelle un tour.

Que vaut i ? À chaque tour, i prend la valeur suivante donnée par range :

Code
for i in range(5):
    print(i)

Affiche 0, 1, 2, 3, 4. range(5) commence à 0 et s'arrête avant 5 : il donne bien 5 valeurs, mais la dernière est 4.

ÉcritureValeurs données
range(5)0, 1, 2, 3, 4
range(2, 6)2, 3, 4, 5 (de 2 jusqu'à 6 exclu)
range(0, 10, 2)0, 2, 4, 6, 8 (de 2 en 2)

2. while : tant qu'une condition est vraie.

Code
compte = 3
while compte > 0:
    print(compte)
    compte = compte - 1
print("Partez !")

Affiche 3, 2, 1, puis Partez !. Avant chaque tour, Python vérifie la condition (compte > 0). Dès qu'elle est fausse, il sort de la boucle et passe à la suite. Attention : si rien ne change dans la boucle, la condition reste vraie pour toujours et le programme ne s'arrête plus. C'est une boucle infinie.

Correspondance avec Scratch

En blocsEn Python
répéter 10 foisfor i in range(10):
répéter jusqu'à ce que réponse = ouiwhile reponse != "oui": (la condition s'inverse : « jusqu'à » devient « tant que… n'est pas »)
répéter indéfinimentwhile True: (à éviter pour l'instant)

Exemple de « répéter jusqu'à » :

Code
reponse = ""
while reponse != "oui":
    reponse = input("Tu es prête ? (oui/non) ")
print("C'est parti !")

On tape non, peut-être, puis oui : la question est posée trois fois, puis C'est parti ! s'affiche.

Suivre les variables · une boucle qui additionne
Ce qui s'affiche

[3]Recherche

Ce que disent les sources

  • Programme du cycle 4 (BO du 5 mars 2026) — En 5e, on utilise une boucle simple qui répète un nombre déterminé de fois ; en 3e, une boucle conditionnelle, qui s'arrête selon une condition [1].
  • Tutoriel officiel de Python — for parcourt les éléments d'une séquence dans l'ordre ; avec range, la valeur de fin n'est jamais incluse : range(10) donne 10 valeurs, de 0 à 9. On peut aussi donner un début et un pas [2].
  • Tutoriel officiel de Python — while s'exécute tant que sa condition reste vraie ; toutes les lignes du corps doivent être décalées de la même façon [3].
[4]Mythes
« range(5) va jusqu'à 5. »
il s'arrête juste avant : 0, 1, 2, 3, 4. Cinq valeurs, mais la dernière est 4.
« Une boucle while finit toujours par s'arrêter toute seule. »
seulement si quelque chose dans la boucle fait devenir la condition fausse. Sinon, c'est une boucle infinie.
« Une boucle, ça sert juste à afficher plusieurs fois la même chose. »
elle sert aussi à calculer (additionner des points), à poser des questions jusqu'à la bonne réponse… et bientôt à faire tourner un jeu entier.
[5]Quiz

1. Combien de fois print s'exécute-t-il dans for i in range(4): print("Salut") ?

range(4) donne 0, 1, 2, 3 : quatre tours.

2. Tu veux redemander un mot de passe tant qu'il est faux. Quelle boucle ?

on ne sait pas combien d'essais il faudra : c'est le travail de while. Un if ne poserait la question qu'une fois.

3. Que se passe-t-il ici ? n = 1 puis while n > 0: avec print(n) dans la boucle, et rien d'autre.

n ne change jamais, donc n > 0 reste vrai : c'est une boucle infinie. Python la lance quand même ; à toi de l'arrêter.
[6]Kit

🎒 Ton kit — Épisode 1

10 min

Exercice : prédire les tours. Pour chaque boucle, écris sur papier ce qu'elle affiche. Ensuite seulement, lance-la et compare.

Code à copier
# Boucle A
for i in range(3):
    print("Hip")
print("Hourra !")
Code à copier
# Boucle B
for i in range(2, 6):
    print(i)
Code à copier
# Boucle C
for i in range(0, 10, 2):
    print(i)
Code à copier
# Boucle D
n = 10
while n > 0:
    n = n - 3
    print(n)

Corrigé (sorties réelles) :

  • A → Hip trois fois, puis Hourra ! une fois (la dernière ligne n'est pas décalée : elle n'est pas dans la boucle).
  • B → 2, 3, 4, 5.
  • C → 0, 2, 4, 6, 8.
  • D → 7, 4, 1, -2. Surprise : -2 s'affiche, car Python vérifie la condition avant chaque tour, pas au milieu. Quand n vaut 1, la condition est vraie, on retire 3, on affiche -2, puis la condition devient fausse.

Checklist

  • Je sais quand utiliser for et quand utiliser while.
  • Je sais ce que donne range(5), range(2, 6) et range(0, 10, 2).
  • J'ai prédit puis vérifié les 4 boucles.
Vigilancesi ton programme ne s'arrête plus, c'est probablement une boucle infinie. Arrête-le avec le bouton d'arrêt de ton environnement (souvent un carré ■ ou « Stop »). Puis cherche ce qui devrait changer dans la boucle.
[7]Journal

✍️ Journal de bord

Dans un jeu que tu aimes, qu'est-ce qui se répète « un nombre de fois connu » et qu'est-ce qui se répète « tant que… » ? Donne un exemple de chaque.

[8]Sources
  1. Ministère de l'Éducation nationale, Programme de mathématiques pour le cycle 4, annexe 2, « La pensée informatique », consulté le 28/10/2026.
  2. Python Software Foundation, Tutoriel Python — 4. D'autres outils de contrôle de flux, sections 4.2 « L'instruction for » et 4.3 « La fonction range() », consulté le 28/10/2026.
  3. Python Software Foundation, Tutoriel Python — 3. Introduction informelle à Python, section 3.2 « Premiers pas vers la programmation », consulté le 28/10/2026.
02
S1 · MARDI · Pratiquer

Ton quiz en boucle

Repérer ce qui se répète, choisir la bonne boucle et l'écrire dans tes propres programmes.

⏱ 15 min de pratique · 5 min de quiz
[1]Scénario
Inès · Mardi, 17 h 15

À la maison, Inès ouvre son quiz du Boost. Sa petite sœur a joué une fois, puis a demandé : « Je peux recommencer ? » Inès a dû relancer le programme à la main. Ce soir, elle veut deux choses : que le quiz propose de rejouer, et réviser sa table de 7 sans écrire dix lignes de print.

[2]Méthode

« Repérer la répétition »

Rappel en une phrase : for répète un nombre de fois connu, while répète tant qu'une condition est vraie (voir épisode 1).

  1. Surligne ce qui se répète dans ton idée ou dans ton code recopié.
  2. Compte : sais-tu à l'avance combien de tours ? Oui → for. Non → while.
  3. Écris la boucle : la ligne for …: ou while …:, puis le corps décalé de 4 espaces.
  4. Teste le premier et le dernier tour : ce sont eux qui cachent le plus d'erreurs.

Avec for : la table de 7

Code
for i in range(1, 11):
    print(i, "× 7 =", i * 7)

Affiche de 1 × 7 = 7 à 10 × 7 = 70. Le premier tour vaut 1 et le dernier 10, grâce à range(1, 11).

Avec while : rejouer tant qu'on veut

Code
rejouer = "oui"
while rejouer == "oui":
    reponse = int(input("Combien font 7 × 8 ? "))
    if reponse == 56:
        print("Bonne réponse !")
    else:
        print("Non, c'était 56.")
    rejouer = input("Veux-tu rejouer ? (oui/non) ")
print("À bientôt !")

On tape 56, oui, 54, non :

Ce que tu vois
Combien font 7 × 8 ? 56 Bonne réponse ! Veux-tu rejouer ? (oui/non) oui Combien font 7 × 8 ? 54 Non, c'était 56. Veux-tu rejouer ? (oui/non) non À bientôt !

La ligne rejouer = input(...) est dans la boucle : c'est elle qui permet un jour de sortir. Le if est lui aussi dans la boucle, et son propre corps est décalé de 8 espaces (4 + 4).

[3]Pourquoi ça marche

Une boucle remplace des lignes recopiées par une seule ligne qui répète. Moins de lignes recopiées, c'est moins d'endroits où une faute peut se glisser, et une seule ligne à changer pour tout modifier. Le tutoriel officiel montre d'ailleurs for comme la façon de parcourir des valeurs « dans l'ordre », sans les écrire une par une [1].

À reteniron compte d'abord (connu → for, inconnu → while), on teste ensuite le premier et le dernier tour.
[4]Entraînement

Bon réflexe ou piège ?

J'écris for i in range(10): pour afficher les nombres de 1 à 10.
range(10) donne 0 à 9. Pour 1 à 10, écris range(1, 11).
Dans mon while, je change la variable de la condition à chaque tour.
c'est ce qui permet à la boucle de s'arrêter.
J'oublie de décaler la ligne qui doit être répétée.
elle n'est plus dans la boucle et ne s'exécute qu'une fois, après.
Je teste avec la toute dernière valeur attendue.
c'est souvent là qu'un tour manque ou qu'un tour de trop apparaît.
Mon programme ne s'arrête plus, je ferme tout l'ordinateur.
utilise le bouton d'arrêt de ton environnement, puis cherche ce qui ne change pas dans la boucle.
[5]Quiz

1. Pour afficher les nombres de 1 à 10 avec for, tu écris…

la fin n'est jamais incluse : pour aller jusqu'à 10, on écrit 11.

2. Dans le quiz qui propose de rejouer, quelle ligne permet de sortir de la boucle ?

c'est elle qui change rejouer. Quand on tape autre chose que « oui », la condition devient fausse.

3. Une ligne est décalée de 8 espaces sous un if, lui-même dans un while. Elle s'exécute…

4 espaces pour être dans le while, 4 de plus pour être dans le if.
[6]Kit

🎒 Ton kit — Épisode 2

15 min

Exercice : trois boucles à toi

  1. Écris la table de 7 avec for, puis change-la en table de 9.
  2. Écris un compte à rebours de 10 à 0 avec while, qui finit par Décollage !.
  3. Ajoute « Veux-tu rejouer ? » autour d'une question de ton quiz du Boost.
  4. Teste chaque programme au premier et au dernier tour.

Code à copier (le compte à rebours, à comparer avec le tien) :

Code à copier
n = 10
while n >= 0:
    print(n)
    n = n - 1
print("Décollage !")

Il affiche 10, 9… jusqu'à 0, puis Décollage !. Avec n > 0 au lieu de n >= 0, le 0 n'apparaîtrait pas : c'est exactement le genre d'erreur du dernier tour.

Checklist

  • Ma table de multiplication va bien de 1 à 10.
  • Mon compte à rebours affiche le 0.
  • Mon quiz propose de rejouer et s'arrête quand je réponds « non ».
[7]Journal

✍️ Journal de bord

Quelle boucle as-tu préféré écrire aujourd'hui, et pourquoi ? Si une boucle a refusé de s'arrêter, raconte comment tu l'as réparée.

[8]Sources
  1. Python Software Foundation, Tutoriel Python — 4. D'autres outils de contrôle de flux, 4.2 « L'instruction for », consulté le 28/10/2026.
  2. Python Software Foundation, Tutoriel Python — 3. Introduction informelle à Python, 3.2 (boucle while), consulté le 28/10/2026.
03
S1 · MERCREDI · Comprendre

Jouer avec les mots

Découper, mesurer, transformer du texte, et composer des messages avec les f-strings.

⏱ 15 min de lecture · 5 min de quiz
[1]Scénario
Inès · Mercredi, 14 h

Pendant le Boost, son quiz refusait « rome » écrit sans majuscule. Aujourd'hui, sa petite sœur a tapé « ROME » avec un espace devant : « Non, la réponse était Rome. » Elle a boudé dix minutes. Inès veut un quiz qui comprenne que « Rome », « rome » et « ROME » veulent dire la même chose. Et pour son futur jeu, elle aura besoin de regarder un mot lettre par lettre.

[2]Concept

Jouer avec les mots

Une chaîne de caractères (str, vue au Boost) est une suite de caractères rangés dans l'ordre. On peut les compter, les regarder un par un et fabriquer de nouvelles chaînes.

Mesurer et regarder

Code
mot = "python"
print(len(mot))
print(mot[0])
print(mot[-1])
print("y" in mot)
print("z" in mot)

Affiche 6, p, n, True, False.

  • len(mot) donne le nombre de caractères.
  • mot[0] est le premier caractère (on compte à partir de 0, comme range) ; mot[-1] est le dernier.
  • "y" in mot vaut True si la lettre se trouve dans le mot.

Parcourir les lettres : for marche aussi sur un mot.

Code
for lettre in "chat":
    print(lettre)

Affiche c, h, a, t, une lettre par tour.

Transformer : une méthode s'écrit après la chaîne, avec un point.

MéthodeCe qu'elle donneExemple
.lower()le texte en minuscules"ROME".lower() → "rome"
.upper()le texte en majuscules"rome".upper() → "ROME"
.strip()le texte sans les espaces au début et à la fin" rome ".strip() → "rome"

Piège : une méthode ne modifie pas la chaîne d'origine, elle en fabrique une nouvelle. Il faut la ranger :

Code
ville = "ROME"
ville.lower()
print(ville)
ville = ville.lower()
print(ville)

Affiche ROME, puis rome.

Composer un message : les f-strings. Une f-string commence par f devant les guillemets ; ce qui est entre accolades { } est remplacé par sa valeur.

Code
pseudo = "Inès"
score = 4
print(f"Bravo {pseudo}, tu as {score} sur 5 !")
print(f"Cela fait {score * 20} % de bonnes réponses.")
print("_ " * 5)

Affiche :

Ce que tu vois
Bravo Inès, tu as 4 sur 5 ! Cela fait 80 % de bonnes réponses. _ _ _ _ _

On peut mettre un calcul entre les accolades. Et * répète un texte : "_ " * 5 donne cinq tirets, très utile pour cacher un mot.

Générateur · une f-string
Code obtenu
Ce qui s'afficherait
[3]Recherche

Ce que disent les sources

  • Tutoriel officiel de Python — Le premier caractère d'une chaîne a l'indice 0 ; les indices négatifs comptent depuis la fin (-1 est le dernier caractère) ; len() donne la longueur. Une chaîne ne peut pas être modifiée : on en crée une nouvelle [1].
  • PEP 498 (2015) — Les f-strings sont arrivées avec Python 3.6. Ce sont des chaînes préfixées par f, dont les expressions entre accolades sont calculées au moment où le programme s'exécute [2].
  • Ce livre — Tous ses programmes sont prévus pour Python 3.12 ou plus récent : les f-strings y fonctionnent partout.
[4]Mythes
« Une chaîne, c'est un seul bloc qu'on ne peut pas découper. »
on peut lire chaque caractère (mot[0]), les compter (len) et les parcourir avec for.
« ville.lower() met la variable en minuscules. »
la méthode fabrique une nouvelle chaîne. Il faut écrire ville = ville.lower() pour la garder.
« Dans une f-string, on ne peut mettre que des variables de texte. »
on peut y mettre des nombres et même des calculs, comme {score * 20}.
[5]Quiz

1. mot = "robot". Que vaut mot[1] ?

on compte à partir de 0 : mot[0] est r, mot[1] est o.

2. Après nom = "INES" puis nom.lower(), que contient nom ?

lower() fabrique une nouvelle chaîne sans changer nom. Il fallait écrire nom = nom.lower().

3. Qu'affiche print(f"{3 + 2} points") ?

dans une f-string, ce qui est entre accolades est calculé. Sans le f devant, on aurait vu {3 + 2} points.
[6]Kit

🎒 Ton kit — Épisode 3

15 min

Exercice : le quiz qui comprend tout le monde

  1. Reprends une question de ton quiz.
  2. Après input(...), ajoute .strip().lower() : Python enlève les espaces, puis met en minuscules.
  3. Compare la réponse avec la bonne réponse écrite en minuscules.
  4. Affiche le score avec une f-string.
  5. Teste avec Rome, rome, ␣␣ROME␣ (avec des espaces) et Paris.
Code à copier
score = 0
reponse = input("Quelle est la capitale de l'Italie ? ").strip().lower()
if reponse == "rome":
    print("Bonne réponse !")
    score = score + 1
else:
    print("Non, la réponse était Rome.")
print(f"Ton score : {score} sur 1")

Avec ␣␣ROME␣ ou Rome : Bonne réponse ! puis Ton score : 1 sur 1. Avec Paris : Non, la réponse était Rome. puis Ton score : 0 sur 1.

Checklist

  • Je sais lire une lettre d'un mot avec mot[0] et compter ses lettres avec len.
  • Je sais pourquoi on écrit ville = ville.lower() et pas seulement ville.lower().
  • Mon quiz accepte les majuscules et les espaces, et affiche le score avec une f-string.
Vigilancen'oublie pas le f devant les guillemets. Sans lui, Python affiche les accolades telles quelles, sans erreur : c'est un bug silencieux, plus difficile à repérer qu'un message rouge.
[7]Journal

✍️ Journal de bord

Quelle réponse « presque juste » ton quiz refusait-il avant aujourd'hui ? Comment l'as-tu rendu plus tolérant ?

[8]Sources
  1. Python Software Foundation, Tutoriel Python — 3. Introduction informelle à Python, 3.1.2 « Chaînes de caractères », consulté le 28/10/2026.
  2. Python Software Foundation, PEP 498 – Literal String Interpolation, créée le 1er août 2015, Python-Version 3.6, consulté le 28/10/2026.
04
S1 · JEUDI · Pratiquer

La devinette du nombre

Construire un petit jeu complet avec while, des conditions et des messages en f-string.

⏱ 20 min de pratique · 5 min de quiz
[1]Scénario
Inès · Jeudi, 12 h 40

Avant de se lancer dans le mot mystère, l'animatrice propose un échauffement : « devine mon nombre ». L'ordinateur pense à un nombre, on propose, il répond « plus grand » ou « plus petit », jusqu'à ce qu'on trouve. Pour l'instant, le nombre est écrit dans le programme : le hasard, ce sera la semaine prochaine. Malik veut jouer le premier.

[2]Méthode

« Une question, un test »… dans une boucle

Rappels : la méthode « une question, un test » du Boost (voir Boost, épisode 4) ; while et les f-strings (voir épisodes 1 et 3).

Construis le jeu en 4 étapes, en testant à chaque fois :

  1. Un seul essai : secret = 42, on demande un nombre, on compare, on affiche « Plus grand ! », « Plus petit ! » ou « Bravo ! ». Teste avec 50, 30 et 42.
  2. La boucle : on met la demande dans while essai != secret:. Pour que la condition puisse être testée au premier tour, on donne d'abord à essai une valeur qui ne peut pas être le secret (essai = 0).
  3. Le compteur : nb_essais = 0 avant la boucle, nb_essais = nb_essais + 1 dans la boucle.
  4. Le message final, après la boucle, avec une f-string.
Code
secret = 42
essai = 0
nb_essais = 0
while essai != secret:
    essai = int(input("Ton nombre ? "))
    nb_essais = nb_essais + 1
    if essai < secret:
        print("Plus grand !")
    elif essai > secret:
        print("Plus petit !")
print(f"Bravo ! Trouvé en {nb_essais} essais.")

On tape 50, 30, 42 :

Ce que tu vois
Ton nombre ? 50 Plus petit ! Ton nombre ? 30 Plus grand ! Ton nombre ? 42 Bravo ! Trouvé en 3 essais.

Quand on trouve, ni le if ni le elif ne s'exécute ; la condition du while devient fausse, et le programme passe au message final.

Remets les lignes dans l'ordre · clique les lignes une par une
Ton programme
Lignes à placer
[3]Pourquoi ça marche

Construire une boucle étape par étape évite le piège des 30 lignes écrites d'un coup : chaque nouvelle étape n'ajoute qu'une ou deux lignes, et si quelque chose casse, tu sais où chercher. C'est la même méthode qu'au Boost, appliquée à un jeu. Le programme du cycle 4 demande justement, en fin de collège, d'écrire un programme qui utilise une boucle conditionnelle pour atteindre un objectif [1].

À retenirun jeu de devinette = une boucle while + une comparaison + un compteur. Construis-le dans cet ordre, en testant entre chaque étape.
[4]Entraînement

Bon réflexe ou piège ?

J'écris essai = 0 avant la boucle.
sinon, au premier tour, Python ne connaît pas encore essai et affiche une NameError.
Je mets nb_essais = 0 dans la boucle.
le compteur serait remis à zéro à chaque tour et finirait toujours à 1.
J'écris le message final après la boucle, sans décalage.
il ne s'affiche qu'une fois, quand on a trouvé.
Je teste avec un nombre trop grand, un trop petit et le bon.
chaque branche du if est vérifiée.
J'écris while essai == secret:.
la boucle ne tournerait que si l'on avait déjà trouvé, c'est-à-dire jamais au début.
[5]Quiz

1. Pourquoi écrit-on essai = 0 avant le while ?

la condition utilise essai ; il faut qu'il existe déjà. 0 ne peut pas être le secret, donc on entre bien dans la boucle.

2. On trouve le nombre au 5e essai. Que vaut nb_essais à la fin ?

le compteur augmente de 1 à chaque essai, y compris le dernier.

3. Où placer print(f"Bravo ! Trouvé en {nb_essais} essais.") ?

il ne doit s'afficher qu'une fois, quand la boucle est finie.
[6]Kit

🎒 Ton kit — Épisode 4

20 min

Exercice : ta devinette

  1. Construis la devinette en suivant les 4 étapes, en testant entre chaque étape.
  2. Change le nombre secret et demande à quelqu'un de jouer sans regarder le code.
  3. Bonus : à la fin, affiche un message différent selon le nombre d'essais (if / elif / else, voir Boost, épisode 3), par exemple « Champion ! » en moins de 5 essais.

Code à copier : le programme de la devinette ci-dessus.

Checklist

  • Ma devinette répond « plus grand » et « plus petit » au bon moment.
  • Elle s'arrête quand on trouve et affiche le bon nombre d'essais.
  • Quelqu'un d'autre a joué à mon jeu.
Vigilancesi quelqu'un tape des lettres, int(...) s'arrête avec une ValueError (tu sais la lire depuis le Boost). Pour l'instant, préviens tes joueurs : « tape un nombre ».
[7]Journal

✍️ Journal de bord

En combien d'essais as-tu trouvé, toi ? Existe-t-il une façon de jouer qui trouve toujours vite ? Décris ton astuce.

[8]Sources
  1. Ministère de l'Éducation nationale, Programme de mathématiques pour le cycle 4, annexe 2, « La pensée informatique » (objectifs de 3e), consulté le 28/10/2026.
  2. Python Software Foundation, Tutoriel Python — 3. Introduction informelle à Python, 3.2 (boucle while), consulté le 28/10/2026.
05
S1 · VENDREDI · Pratiquer · Bilan d'arc

Répéter et écrire : le bilan

Ton outil de synthèse, le récapitulatif de la semaine et ton badge.

⏱ 20 min · arbre de décision · carrousel · quiz final
[1]Scénario
Inès · Vendredi, 12 h 40

Malik a joué à la devinette : il a trouvé en 6 essais et a juré qu'il ferait mieux la semaine prochaine, « quand ce sera vraiment au hasard ». En une semaine, Inès a appris à faire répéter son programme, à regarder un mot lettre par lettre et à composer ses messages. Aujourd'hui, elle pose la première pièce de son jeu : afficher le mot mystère caché sous des tirets, et révéler les lettres déjà trouvées.

[2]Outil

« for ou while ? »

Aide à la décision interactive
[3]Carrousel

🎨 Carrousel récapitulatif — Semaine 1

[4]Quiz final

1. Combien de lignes affiche for i in range(2, 7): print(i) ?

2, 3, 4, 5, 6 : cinq valeurs (7 est exclu).

2. Tu veux faire jouer tant que le joueur n'a pas trouvé. Tu écris…

on ne sait pas combien d'essais il faudra : while. Un if ne tournerait qu'une fois.

3. mot = "jeu". Que vaut len(mot) * 2 ?

len(mot) vaut 3 (un nombre), donc 3 × 2 = 6. C'est mot * 2 qui donnerait jeujeu.

4. Que fait reponse = input("? ").strip().lower() ?

les méthodes s'appliquent de gauche à droite, et le résultat est rangé dans reponse.

5. Qu'affiche for i in range(4): print(i * 2) ?

i vaut 0, 1, 2, 3 ; on affiche le double à chaque tour : 0, 2, 4, 6 (sortie vérifiée).
[5]Kit

🎒 Ton kit de fin d'arc

15 min

La première pièce du mot mystère

Synthèse : afficher un mot caché, puis ses lettres trouvées.

Étape 1, le mot entièrement caché : len donne le nombre de lettres, * répète le tiret.

Code
mot = "python"
print("_ " * len(mot))

Affiche _ _ _ _ _ _ (six tirets).

Étape 2, révéler les lettres déjà trouvées : on parcourt le mot avec for, et pour chaque lettre, on regarde si elle fait partie des lettres trouvées (in).

Code
mot = "python"
trouvees = "pyt"
affichage = ""
for lettre in mot:
    if lettre in trouvees:
        affichage = affichage + lettre + " "
    else:
        affichage = affichage + "_ "
print(affichage.strip())

Affiche p y t _ _ _. La variable affichage commence vide ("") et grandit à chaque tour.

Consigne : change le mot et les lettres trouvées, prédis l'affichage, puis vérifie. Garde ce code : c'est la première pièce de ton jeu. Puis exporte ton carnet de bord (bouton dans le menu).

Checklist

  • J'ai exporté mon carnet (bouton dans le menu).
  • Je sais expliquer à quelqu'un quand choisir for et quand choisir while.
  • Mon programme affiche un mot caché avec les lettres trouvées.
[6]Journal

✍️ Journal de bord — bilan

Qu'est-ce qui t'a le plus surprise ou surpris cette semaine : range qui s'arrête avant la fin, les boucles infinies, ou les méthodes qui ne modifient pas la chaîne ? Pourquoi ?

✦ RÉPÉTEUSE · RÉPÉTEUR · SEMAINE 1 ✦

Bravo ! Tu as terminé la semaine 1. Tu sais faire répéter un programme avec for et while, transformer du texte et composer des messages avec les f-strings.

ARC 2 · SEMAINE 2

Le hasard et les listes

Cette semaine, tu ranges plein de valeurs dans une seule boîte et tu laisses le hasard choisir. Vendredi, ton jeu saura se souvenir des lettres déjà proposées.

06
S2 · LUNDI · Comprendre

Ranger plein de choses dans une liste

Créer une liste, lire ses éléments par leur numéro, en ajouter et la parcourir.

⏱ 15 min de lecture · 5 min de quiz
[1]Scénario
Inès · Lundi, 12 h 40

Inès a noté vingt mots pour son jeu : chat, python, robot, lune, pirate… Elle commence à écrire mot1 = "chat", mot2 = "python", mot3 = "robot"… Malik se penche sur l'écran : « Et pour en tirer un au hasard, tu fais comment avec vingt variables ? » Inès s'arrête. En Scratch, elle aurait créé une liste. Python en a aussi.

[2]Concept

Une liste, c'est une boîte à compartiments

Une liste range plusieurs valeurs, dans l'ordre, sous un seul nom. On l'écrit entre crochets, valeurs séparées par des virgules :

Code
mots = ["chat", "python", "robot"]
print(mots[0])
print(mots[-1])
print(len(mots))

Affiche chat, robot, 3.

  • Chaque élément a un numéro, son indice. Le premier est à l'indice 0, comme pour les lettres d'un mot (voir épisode 3). mots[-1] est le dernier.
  • len(mots) donne le nombre d'éléments.

Ajouter, modifier, chercher

Code
mots.append("lune")
print(mots)
print(len(mots))
mots[1] = "pomme"
print(mots)
print("robot" in mots)

Affiche :

Ce que tu vois
['chat', 'python', 'robot', 'lune'] 4 ['chat', 'pomme', 'robot', 'lune'] True
  • .append(valeur) ajoute un élément à la fin : la liste grandit d'une case.
  • mots[1] = "pomme" remplace l'élément d'indice 1. Contrairement à une chaîne, une liste se modifie.
  • "robot" in mots dit si la valeur est dans la liste.

Parcourir : comme pour un mot, for passe sur chaque élément, dans l'ordre.

Code
for mot in mots:
    print(mot.upper())

Affiche CHAT, POMME, ROBOT, LUNE.

Si l'indice n'existe pas, Python s'arrête avec une erreur que tu sais lire (voir Boost, épisode 2) :

Ce que tu vois
print(mots[3]) ~~~~^^^ IndexError: list index out of range

Index out of range = « indice hors des limites » : dans une liste de 3 éléments, les indices vont de 0 à 2.

OpérationEn PythonRésultat sur ["chat", "python", "robot"]
premier élémentmots[0]"chat"
dernier élémentmots[-1]"robot"
nombre d'élémentslen(mots)3
ajouter à la finmots.append("lune")["chat", "python", "robot", "lune"]
est-il dedans ?"robot" in motsTrue

À vérifier toi-même dans Scratch : crée une liste de trois mots, puis utilise le bloc « élément (1) de (liste) ». Quel mot obtiens-tu ? Compare avec mots[1] en Python. Les deux langages ne comptent pas forcément de la même façon : c'est une erreur classique quand on passe de l'un à l'autre.

Suivre les variables · une liste qui grandit
Ce qui s'affiche

[3]Recherche

Ce que disent les sources

  • Tutoriel officiel de Python — Une liste s'écrit entre crochets ; comme les chaînes, elle s'indexe à partir de 0 et accepte les indices négatifs ; contrairement aux chaînes, on peut modifier ses éléments, et append ajoute un élément à la fin [1].
  • Programme du cycle 4 (BO du 5 mars 2026) — La notion de variable est approfondie en 3e ; manipuler plusieurs valeurs rangées ensemble prolonge ce travail [2].
[4]Mythes
« Le premier élément d'une liste, c'est mots[1]. »
en Python, c'est mots[0]. mots[1] est le deuxième.
« Une liste ne contient que des nombres. »
elle peut contenir des mots, des nombres, et même un mélange des deux.
« append remplace la liste par la nouvelle valeur. »
append ajoute à la fin ; tout ce qui était déjà dans la liste reste.
[5]Quiz

1. couleurs = ["rouge", "vert", "bleu"]. Que vaut couleurs[2] ?

indices 0, 1, 2 : l'indice 2 est le troisième élément, "bleu".

2. Après liste = [5] puis liste.append(8), que contient liste ?

append ajoute à la fin sans rien effacer ni additionner.

3. Une liste a 4 éléments. Quel indice provoque une IndexError ?

les indices vont de 0 à 3. -1 est le dernier élément, il existe.
[6]Kit

🎒 Ton kit — Épisode 6

10 min

Exercice : prédire une liste. Écris sur papier ce que va afficher ce programme, puis lance-le.

Code à copier
scores = [12, 7]
scores.append(15)
scores.append(9)
print(scores[0], scores[-1], len(scores))

Corrigé (sortie réelle) : 12 9 4. La liste devient [12, 7, 15, 9] : le premier est 12, le dernier 9, et il y a 4 éléments.

Puis crée ta propre liste de 5 mots pour le mot mystère, affiche le premier, le dernier et leur nombre.

Checklist

  • Je sais que le premier élément d'une liste est à l'indice 0.
  • Je sais ajouter un élément avec append et parcourir une liste avec for.
  • J'ai créé la liste de mots de mon jeu.
Vigilancechoisis des mots sans accent ni majuscule pour ton jeu (« ecole » plutôt que « École ») : sinon, le joueur devra taper exactement le même caractère accentué.
[7]Journal

✍️ Journal de bord

Dans ta vie de tous les jours, cite trois listes que tu utilises (courses, playlist, classement…). Dans laquelle l'ordre compte vraiment ?

[8]Sources
  1. Python Software Foundation, Tutoriel Python — 3. Introduction informelle à Python, 3.1.3 « Listes », consulté le 28/10/2026.
  2. Ministère de l'Éducation nationale, Programme de mathématiques pour le cycle 4, annexe 2, « La pensée informatique », consulté le 28/10/2026.
07
S2 · MARDI · Pratiquer

Le quiz rangé dans des listes

Remplacer des blocs recopiés par une liste et une boucle.

⏱ 15 min de pratique · 5 min de quiz
[1]Scénario
Inès · Mardi, 17 h 30

Le quiz du Boost fait cinquante lignes : cinq fois le même bloc, avec juste la question et la réponse qui changent. Inès veut ajouter cinq questions pour sa petite sœur. Cinquante lignes de plus ? « Non, dit-elle à voix haute. Ce qui change, je le range dans des listes. Ce qui se répète, je le mets dans une boucle. »

[2]Méthode

« Ranger ce qui change, répéter ce qui reste »

Rappels : une liste range plusieurs valeurs (voir épisode 6) ; for répète (voir épisode 1) ; .strip().lower() rend une réponse tolérante (voir épisode 3).

  1. Repère ce qui change d'un bloc à l'autre : ici, la question et la bonne réponse.
  2. Range-le dans des listes, dans le même ordre : questions et reponses. La question d'indice 0 va avec la réponse d'indice 0.
  3. Écris le bloc une seule fois, dans une boucle qui passe sur les indices : for i in range(len(questions)):.
  4. Teste avec toutes les bonnes réponses, puis avec quelques fausses.
Code
questions = [
    "Quelle est la capitale de l'Italie ?",
    "Combien de côtés a un hexagone ?",
    "Combien font 7 × 8 ?",
    "Quelle planète est surnommée la planète rouge ?",
    "Combien de pattes a une araignée ?",
]
reponses = ["rome", "6", "56", "mars", "8"]
score = 0
for i in range(len(questions)):
    reponse = input(questions[i] + " ").strip().lower()
    if reponse == reponses[i]:
        print("Bonne réponse !")
        score = score + 1
    else:
        print(f"Non, la réponse était {reponses[i]}.")
print(f"Ton score : {score} sur {len(questions)}")

Essai réel avec rome, 5, 56, venus, ␣8␣ :

Ce que tu vois
Quelle est la capitale de l'Italie ? rome Bonne réponse ! Combien de côtés a un hexagone ? 5 Non, la réponse était 6. Combien font 7 × 8 ? 56 Bonne réponse ! Quelle planète est surnommée la planète rouge ? venus Non, la réponse était mars. Combien de pattes a une araignée ? 8 Bonne réponse ! Ton score : 3 sur 5

Remarque : les réponses en chiffres sont rangées comme du texte ("6", "56"). On compare donc du texte avec du texte, sans int(...). Une liste peut se couper sur plusieurs lignes entre ses crochets : c'est plus lisible.

[3]Pourquoi ça marche

Le code qui se répète n'est écrit qu'une fois ; les données qui changent sont rangées à part. Pour ajouter une question, on ajoute une ligne dans chaque liste, sans toucher la boucle. Le tutoriel officiel montre d'ailleurs range(len(...)) comme la façon de parcourir les indices d'une séquence [1].

À retenirce qui change → dans des listes ; ce qui se répète → dans une boucle. Et les deux listes vont toujours ensemble, dans le même ordre.
[4]Entraînement

Bon réflexe ou piège ?

J'ajoute une question, mais j'oublie d'ajouter sa réponse.
les listes n'ont plus la même longueur ; au dernier tour, reponses[i] n'existe pas et Python affiche une IndexError.
J'écris range(len(questions)) plutôt que range(5).
si j'ajoute des questions, la boucle s'adapte toute seule.
Je range les bonnes réponses en minuscules.
la réponse du joueur est passée en minuscules avec .lower(), il faut comparer avec des minuscules.
J'intervertis l'ordre de deux réponses.
chaque question serait comparée à la réponse d'une autre.
J'affiche le score avec len(questions) au lieu de 5.
le total reste juste quand le quiz grandit.
[5]Quiz

1. Dans ce quiz, à quoi sert i ?

questions[i] et reponses[i] vont ensemble : le même indice relie la question à sa réponse.

2. Que faut-il faire pour ajouter une 6e question ?

la boucle utilise len(questions), elle s'adapte toute seule.

3. Pourquoi la bonne réponse à « 7 × 8 » est-elle rangée sous la forme "56" ?

la réponse tapée est un texte (vu au Boost). En rangeant "56", on évite la conversion.
[6]Kit

🎒 Ton kit — Épisode 7

15 min

Exercice : ton quiz en dix lignes

  1. Reprends tes questions du Boost et range-les dans une liste questions.
  2. Range les bonnes réponses, en minuscules, dans une liste reponses, dans le même ordre.
  3. Écris la boucle et le message final avec des f-strings.
  4. Ajoute deux questions nouvelles en ne touchant qu'aux listes.
  5. Teste avec toutes les bonnes réponses, puis avec deux erreurs.

Code à copier : le programme ci-dessus.

Checklist

  • Mon quiz tient en une dizaine de lignes, plus les listes.
  • J'ai ajouté deux questions sans toucher la boucle.
  • J'ai testé avec des réponses justes et fausses.
Vigilancevérifie que tes deux listes ont la même longueur. Astuce : print(len(questions), len(reponses)) avant la boucle, le temps de tester.
[7]Journal

✍️ Journal de bord

Combien de lignes ton quiz faisait-il au Boost, et combien maintenant ? Qu'est-ce qui est devenu plus facile à changer ?

[8]Sources
  1. Python Software Foundation, Tutoriel Python — 4. D'autres outils de contrôle de flux, 4.3 « La fonction range() », consulté le 28/10/2026.
08
S2 · MERCREDI · Comprendre

Le hasard et les boîtes à outils de Python

Importer un module, tirer au hasard avec random, calculer avec math et dessiner avec turtle.

⏱ 15 min de lecture · 5 min de quiz
[1]Scénario
Inès · Mercredi, 14 h

Au club, tout le monde connaît le nombre secret de la devinette : 42. Malik l'a trouvé du premier coup et s'est vanté toute la récré. Inès veut que l'ordinateur choisisse un nombre différent à chaque partie, et un mot différent pour son jeu. Elle se demande s'il faut écrire elle-même une fonction de hasard. L'animatrice rit : « Quelqu'un l'a déjà écrite pour toi. Il suffit d'aller la chercher. »

[2]Concept

Les modules, des boîtes à outils déjà écrites

Un module est un ensemble d'outils déjà programmés, fourni avec Python. Pour s'en servir, on l'importe en haut du programme avec import, puis on écrit module.outil(...).

random : le hasard

Code
import random
nombre = random.randint(1, 100)
print(nombre)
mots = ["chat", "python", "robot"]
print(random.choice(mots))

Affiche un nombre entre 1 et 100, puis un des trois mots : le résultat change à chaque lancement.

  • random.randint(1, 100) tire un nombre entier entre 1 et 100, 1 et 100 compris (attention, ce n'est pas comme range).
  • random.choice(mots) tire un élément de la liste.

math : les calculs de maths

Code
import math
print(math.sqrt(16))
print(math.pi)

Affiche 4.0 (la racine carrée de 16) et 3.141592653589793.

turtle : la tortue qui dessine. C'est la tortue du langage Logo, ancêtre de Scratch : elle avance et tourne en traçant un trait.

Code
import turtle
for i in range(4):
    turtle.forward(100)
    turtle.left(90)
turtle.done()

Dessine un carré de 100 pixels de côté : 4 fois, avancer de 100, tourner de 90° à gauche. turtle.done() garde le dessin affiché ; c'est la dernière ligne.

ModulePour quoi faireOutils de cet épisode
randomle hasardrandint(a, b), choice(liste)
mathles calculssqrt(x), pi
turtledessinerforward(d), left(angle), right(angle), done()

Le hasard de l'ordinateur est-il vraiment du hasard ? Pas tout à fait. L'ordinateur suit un calcul très compliqué qui imite le hasard : on parle de nombres pseudo-aléatoires. Pour un jeu, c'est parfait. Pour un mot de passe ou un secret, il faut d'autres outils.

Générateur · un tirage au hasard
Code obtenu

N'oublie pas import random en première ligne.

[3]Recherche

Ce que disent les sources

  • Documentation officielle de random — Le module produit des nombres pseudo-aléatoires. Comme il est entièrement déterministe, il ne doit pas servir pour la sécurité : la documentation renvoie pour cela au module secrets [1].
  • Documentation officielle de random — randint(a, b) renvoie un entier compris entre a et b, les deux bornes incluses ; choice renvoie un élément au hasard d'une séquence non vide [1].
  • Documentation officielle de turtle — Le module reprend les outils de dessin introduits par le langage Logo en 1967, conçus pour apprendre à programmer grâce au retour visuel immédiat [2].
  • Où dessiner ? — Basthon fonctionne dans le navigateur, sans installation ni inscription, et gère turtle [3]. Capytale propose ses activités Python avec Basthon [4]. Sur un ordinateur, turtle a besoin de Tk, que les installateurs de python.org incluent pour Windows et macOS [2].
[4]Mythes
« Le hasard de l'ordinateur est complètement imprévisible. »
c'est un calcul qui imite le hasard (pseudo-aléatoire). Suffisant pour un jeu, pas pour la sécurité.
« random.randint(1, 6) ne peut jamais donner 6, comme range. »
avec randint, les deux bornes sont comprises : 1, 2, 3, 4, 5 ou 6.
« Pour utiliser un module, il faut l'installer et créer un compte. »
random, math et turtle sont fournis avec Python. Une ligne import suffit.
[5]Quiz

1. Quelle ligne simule un dé à six faces ?

randint inclut les deux bornes : 1 à 6. randint(0, 6) pourrait donner 0 ; range(1, 6) ne tire rien au hasard.

2. Tu écris nombre = randint(1, 10) en oubliant random. devant. Que se passe-t-il ?

après import random, l'outil s'appelle random.randint.

3. Pour dessiner un triangle équilatéral avec turtle, de combien de degrés tourner à chaque coin ?

la tortue tourne de l'angle extérieur : 360 ÷ 3 = 120. Pour un carré : 360 ÷ 4 = 90.
[6]Kit

🎒 Ton kit — Épisode 8

15 min

Exercice : trois tirages et deux dessins

  1. Lance trois fois le programme du dé (random.randint(1, 6)) et note les résultats.
  2. Tire un mot au hasard dans ta liste de mots (épisode 6).
  3. Dessine le carré, puis change le programme pour dessiner un triangle.
  4. Bonus : l'étoile à 5 branches.

Code à copier (l'étoile) :

Code à copier
import turtle
for i in range(5):
    turtle.forward(150)
    turtle.right(144)
turtle.done()

Cinq traits de 150 pixels, en tournant de 144° à droite à chaque fois : la tortue revient à son point de départ (tracé vérifié).

Checklist

  • Je sais importer un module et utiliser random.randint et random.choice.
  • Je sais que randint inclut ses deux bornes, contrairement à range.
  • J'ai dessiné un carré et un triangle avec turtle.
Vigilancen'appelle jamais ton fichier random.py ou turtle.py. Sinon, import random chargerait ton propre fichier à la place du vrai module, et plus rien ne marcherait.
[7]Journal

✍️ Journal de bord

Lance 10 fois le dé. As-tu obtenu chaque face au moins une fois ? Est-ce que ça veut dire que le dé est « truqué » ?

[8]Sources
  1. Python Software Foundation, random — Generate pseudo-random numbers, consulté le 28/10/2026.
  2. Python Software Foundation, turtle — Turtle graphics, consulté le 28/10/2026.
  3. R. Casati, À propos de Basthon, consulté le 28/10/2026.
  4. Académie d'Orléans-Tours, L'application Capytale, consulté le 28/10/2026.
09
S2 · JEUDI · Pratiquer

Un mot tiré au hasard

Assembler une liste, le hasard et une boucle : la devinette devient imprévisible, le mot mystère prend forme.

⏱ 20 min de pratique · 5 min de quiz
[1]Scénario
Inès · Jeudi, 12 h 40

Revanche au club : Malik rejoue à la devinette, mais cette fois, le nombre est tiré au hasard. Il ne trouve qu'en 7 essais et réclame une deuxième partie. Pendant ce temps, Inès branche le hasard sur son jeu : l'ordinateur choisit un mot dans sa liste, l'affiche caché, et réagit à une première lettre.

[2]Méthode

« Remplacer le fixe par le hasard »

Rappels : random.randint et random.choice (voir épisode 8) ; la devinette (voir épisode 4) ; le mot caché sous des tirets (voir épisode 5).

  1. Repère la valeur fixe dans ton programme (secret = 42, mot = "python").
  2. Remplace-la par un tirage (random.randint(1, 100), random.choice(mots)), et ajoute import random en première ligne.
  3. Teste plusieurs fois : le résultat doit changer. Pour vérifier un tirage pendant tes tests, affiche-le provisoirement (print(secret)), puis retire cette ligne.

La devinette, version hasard : seules deux lignes changent par rapport à l'épisode 4.

Code
import random
secret = random.randint(1, 100)
essai = 0
nb_essais = 0
while essai != secret:
    essai = int(input("Ton nombre ? "))
    nb_essais = nb_essais + 1
    if essai < secret:
        print("Plus grand !")
    elif essai > secret:
        print("Plus petit !")
print(f"Bravo ! Trouvé en {nb_essais} essais.")

Le mot mystère, version 1

Code
import random
mots = ["chat", "python", "robot", "lune", "pirate"]
mot = random.choice(mots)
print("_ " * len(mot))
lettre = input("Propose une lettre : ").strip().lower()
if lettre in mot:
    print(f"Oui, il y a un {lettre} !")
else:
    print(f"Non, pas de {lettre}.")
affichage = ""
for l in mot:
    if l == lettre:
        affichage = affichage + l + " "
    else:
        affichage = affichage + "_ "
print(affichage.strip())

Essai réel, quand le mot tiré est « robot » et qu'on propose o :

Ce que tu vois
_ _ _ _ _ Propose une lettre : o Oui, il y a un o ! _ o _ o _

La lettre apparaît partout où elle se trouve dans le mot, grâce à la boucle for.

Remets les lignes dans l'ordre · clique les lignes une par une
Ton programme
Lignes à placer
[3]Pourquoi ça marche

On ne change que la valeur de départ : toute la logique du jeu reste la même. C'est pour cela qu'on avait d'abord écrit la devinette avec un nombre fixe : un jeu qui marche avec une valeur connue marchera avec une valeur tirée au hasard. Et pour vérifier un tirage pendant les tests, l'afficher un instant est la façon la plus simple de savoir ce que le programme a choisi.

À retenird'abord un jeu qui marche avec une valeur fixe, ensuite le hasard. Et affiche provisoirement le tirage pour tester.
[4]Entraînement

Bon réflexe ou piège ?

J'affiche le nombre secret pendant mes tests, puis je retire la ligne.
tu peux vérifier les messages « plus grand / plus petit » sans jouer à l'aveugle.
J'oublie de retirer le print(secret) avant la fête du jeu.
tes joueurs verront la réponse !
Je tire le mot au hasard à l'intérieur de la boucle des essais.
le mot changerait à chaque lettre proposée.
J'écris import random tout en haut du programme.
les imports se placent au début, avant d'utiliser le module.
Ma liste de mots est vide.
random.choice ne peut rien tirer et s'arrête avec une erreur.
[5]Quiz

1. Pour que le mot change à chaque partie, mais reste le même pendant la partie, où place-t-on mot = random.choice(mots) ?

on tire une fois au début, puis on joue avec ce mot.

2. Le mot tiré est « pirate » et on propose a. Qu'affiche la ligne des tirets ?

p-i-r-a-t-e : le a est la 4e lettre.

3. Pourquoi avoir écrit d'abord la devinette avec secret = 42 ?

avec une valeur connue, on sait ce que le programme doit répondre.
[6]Kit

🎒 Ton kit — Épisode 9

20 min

Exercice : le hasard dans tes deux jeux

  1. Ajoute le hasard à ta devinette (deux lignes à changer). Teste trois parties.
  2. Écris le mot mystère version 1 avec ta propre liste de mots.
  3. Pendant tes tests, affiche le mot tiré (print(mot)), vérifie l'affichage avec une lettre présente et une lettre absente, puis retire cette ligne.

Code à copier : le mot mystère version 1 ci-dessus.

Checklist

  • Ma devinette tire un nombre différent à chaque partie.
  • Mon mot mystère tire un mot dans ma liste et révèle la lettre proposée.
  • J'ai retiré les lignes qui affichaient la réponse.
[7]Journal

✍️ Journal de bord

Avec le hasard, as-tu trouvé une façon de toujours gagner vite à la devinette ? Explique ta stratégie en une ou deux phrases.

[8]Sources
  1. Python Software Foundation, random — Generate pseudo-random numbers, consulté le 28/10/2026.
10
S2 · VENDREDI · Pratiquer · Bilan d'arc

Le hasard et les listes : le bilan

Ton outil de synthèse, le récapitulatif de la semaine et ton badge.

⏱ 20 min · arbre de décision · carrousel · quiz final
[1]Scénario
Inès · Vendredi, 12 h 40

Sa petite sœur a testé le mot mystère et a trouvé un bug : elle a proposé deux fois la lettre z, et le jeu a compté deux erreurs. « C'est pas juste ! » En deux semaines, Inès sait faire répéter, jouer avec les mots, ranger dans des listes et tirer au hasard. Aujourd'hui, elle donne de la mémoire à son jeu : une liste des lettres déjà proposées.

[2]Outil

« Liste ou variable ? »

Aide à la décision interactive
[3]Carrousel

🎨 Carrousel récapitulatif — Semaine 2

[4]Quiz final

1. notes = [14, 9, 17], puis notes.append(11). Que vaut notes[1] + notes[-1] ?

notes[1] vaut 9 (le 2e élément), notes[-1] vaut 11 (le dernier, ajouté) : 9 + 11 = 20 (sortie vérifiée).

2. Combien d'éléments contient notes après cet append ?

trois éléments au départ, un ajouté : 4.

3. Quel tirage peut donner 10 ?

randint inclut la borne de fin. range(10) s'arrête à 9 et ne tire rien au hasard.

4. Pour un quiz avec deux listes questions et reponses, quelle boucle utiliser ?

on parcourt les indices pour relier chaque question à sa réponse ; len s'adapte au nombre de questions.

5. Pourquoi ne pas appeler ton fichier random.py ?

Python cherche d'abord dans ton dossier ; ton fichier masquerait le module.
[5]Kit

🎒 Ton kit de fin d'arc

15 min

La mémoire du mot mystère

Synthèse : une liste qui commence vide et retient les lettres déjà proposées. Une lettre déjà proposée n'est plus comptée comme une erreur.

Code
mot = "python"
proposees = []
erreurs = 0
while erreurs < 3:
    lettre = input("Propose une lettre : ").strip().lower()
    if lettre in proposees:
        print("Tu as déjà proposé cette lettre !")
    else:
        proposees.append(lettre)
        if lettre in mot:
            print("Bien vu !")
        else:
            erreurs = erreurs + 1
            print(f"Raté ! Erreurs : {erreurs} sur 3")
print(f"Lettres proposées : {proposees}")

Essai réel avec p, z, z, x, w :

Ce que tu vois
Propose une lettre : p Bien vu ! Propose une lettre : z Raté ! Erreurs : 1 sur 3 Propose une lettre : z Tu as déjà proposé cette lettre ! Propose une lettre : x Raté ! Erreurs : 2 sur 3 Propose une lettre : w Raté ! Erreurs : 3 sur 3 Lettres proposées : ['p', 'z', 'x', 'w']

Le deuxième z n'est pas compté. Pour l'instant, la partie ne s'arrête qu'après 3 erreurs : savoir quand le joueur a gagné, ce sera pour ton jeu complet.

Consigne : lance ce programme, puis remplace mot = "python" par un tirage dans ta liste de mots (épisode 9). Exporte ensuite ton carnet de bord.

Checklist

  • J'ai exporté mon carnet (bouton dans le menu).
  • Je sais expliquer quand utiliser une liste plutôt qu'une variable.
  • Mon jeu ne compte plus deux fois la même lettre.
[6]Journal

✍️ Journal de bord — bilan

Ta petite sœur (ou un ami) a-t-elle trouvé d'autres façons de « tricher » avec ton jeu ? Note-les : ce sont tes futurs tests.

✦ MAÎTRESSE · MAÎTRE DU HASARD · SEMAINE 2 ✦

Bravo ! Tu as terminé la semaine 2. Tu sais ranger des valeurs dans des listes, les parcourir, importer un module et tirer au hasard.

ARC 3 · SEMAINE 3

Créer tes propres blocs

Cette semaine, tu inventes tes propres instructions et tu rends ton code lisible par les autres. Vendredi, ton jeu sera rangé en fonctions bien nommées.

11
S3 · LUNDI · Comprendre

Créer tes propres blocs

Définir une fonction avec def, lui donner des paramètres, et lui faire renvoyer un résultat avec return.

⏱ 15 min de lecture · 5 min de quiz
[1]Scénario
Inès · Lundi, 12 h 40

Le code du mot mystère dépasse soixante lignes. Inès cherche où elle affiche le mot caché : elle trouve le même morceau de code à trois endroits, presque identique. Elle en corrige un, oublie les deux autres, et le jeu affiche deux choses différentes. Malik : « En Scratch, tu aurais fait un bloc à toi, non ? » L'animatrice approuve : « Python a la même chose. Ça s'appelle une fonction. »

[2]Concept

Une fonction, c'est un bloc que tu inventes

Tu utilises déjà des fonctions toutes faites : print, input, len, random.choice. Une fonction, c'est un morceau de code qui porte un nom : tu l'écris une fois, et tu l'appelles autant de fois que tu veux.

Définir et appeler

Code
def saluer(pseudo):
    print(f"Salut {pseudo} !")


saluer("Inès")
saluer("Malik")

Affiche Salut Inès !, puis Salut Malik !.

  • def (pour define, définir) commence la définition, suivi du nom de la fonction, des parenthèses et des deux-points.
  • pseudo est un paramètre : une boîte qui reçoit la valeur donnée à l'appel ("Inès", puis "Malik").
  • Le corps est décalé de 4 espaces. Écrire def n'exécute rien : la fonction ne fait quelque chose que quand on l'appelle, avec ses parenthèses.

Renvoyer un résultat avec return

Code
def double(n):
    return n * 2


resultat = double(21)
print(resultat)
print(double(5) + 1)

Affiche 42, puis 11. return renvoie une valeur au programme, qui peut la ranger dans une variable ou s'en servir dans un calcul. Dès que Python rencontre return, il sort de la fonction.

Afficher n'est pas renvoyer

Code
def afficher_double(n):
    print(n * 2)


x = afficher_double(5)
print(x)

Affiche 10, puis None. La fonction affiche 10 à l'écran, mais ne renvoie rien : x reçoit None, la valeur spéciale de Python qui veut dire « rien ».

print(...) dans la fonctionreturn ... dans la fonction
Ce que ça faitmontre une valeur à l'écrandonne une valeur au programme
Peut-on s'en servir ensuite dans un calcul ?nonoui
Exempleafficher_double(5) affiche 10double(5) + 1 vaut 11

Les variables d'une fonction restent dans la fonction. Une variable créée dans une fonction est locale : elle n'existe que pendant l'appel.

Code
def ajouter_point():
    points = 1


ajouter_point()
print(points)

Python s'arrête avec : NameError: name 'points' is not defined. Did you mean: 'print'?. La boîte points a disparu à la fin de l'appel. Remarque : la suggestion de Python (print) est fausse ici. Sa proposition n'est qu'une idée, pas toujours la bonne correction.

Correspondance avec Scratch : dans Scratch, « Créer un bloc » fabrique un bloc « définir » ; ses entrées n'existent qu'à l'intérieur de ce script. En Python, def joue le rôle du bloc « définir », les paramètres celui des entrées.

Machine à fonction · def machine(n): return n * 3 + 1
Choisis une entrée pour voir ce que la machine fait.
[3]Recherche

Ce que disent les sources

  • Tutoriel officiel de Python — def introduit la définition d'une fonction ; le corps commence à la ligne suivante et doit être indenté. return renvoie une valeur ; une fonction qui atteint sa fin sans return renvoie None [1].
  • Tutoriel officiel de Python — L'exécution d'une fonction crée un espace pour ses variables locales : toute variable affectée dans la fonction y est rangée [1].
  • Aide de Scratch — « Créer un bloc » ouvre une fenêtre où l'on peut ajouter des entrées ; ces entrées ne fonctionnent qu'à l'intérieur du script « définir » [2].
[4]Mythes
« print et return, c'est la même chose. »
print montre une valeur à l'écran ; return la donne au programme pour qu'il s'en serve.
« Une fonction s'exécute dès qu'on l'écrit. »
def ne fait que la définir. Elle ne s'exécute qu'à l'appel, avec les parenthèses.
« Une variable créée dans une fonction existe partout dans le programme. »
elle est locale et disparaît à la fin de l'appel.
[5]Quiz

1. Qu'affiche ce programme ? def triple(n): return n * 3 puis print(triple(4))

triple(4) renvoie 12, et print l'affiche.

2. Une fonction contient print(n + 1) mais aucun return. Que vaut x = ma_fonction(2) ?

la fonction affiche 3 à l'écran, mais ne renvoie rien : x vaut None.

3. Tu as écrit def bonjour(): et son corps, mais rien ne s'affiche. Pourquoi ?

définir ne suffit pas, il faut appeler la fonction avec ses parenthèses.
[6]Kit

🎒 Ton kit — Épisode 11

10 min

Exercice : prédire ce que font trois fonctions. Écris d'abord ta réponse sur papier, puis lance chaque programme.

Code à copier
# Fonction A
def carre(n):
    return n * n


print(carre(4))
Code à copier
# Fonction B
def bonjour():
    print("Bonjour")


bonjour()
bonjour()
Code à copier
# Fonction C
def plus_grand(a, b):
    if a > b:
        return a
    return b


print(plus_grand(3, 8))
print(plus_grand(9, 2))

Corrigé (sorties réelles) :

  • A → 16.
  • B → Bonjour deux fois : une par appel. Une fonction peut n'avoir aucun paramètre ; les parenthèses restent obligatoires.
  • C → 8, puis 9. Avec 9 et 2, le premier return s'exécute et Python sort aussitôt : la ligne return b n'est jamais atteinte. Une fonction peut avoir deux paramètres, séparés par une virgule.

Checklist

  • Je sais définir une fonction avec def et l'appeler avec des parenthèses.
  • Je sais expliquer la différence entre afficher (print) et renvoyer (return).
  • J'ai prédit puis vérifié les 3 fonctions.
Vigilancesi tu écris bonjour sans parenthèses, Python ne dit rien… et ne fait rien. C'est un bug silencieux : pas de message rouge, mais pas d'appel non plus.
[7]Journal

✍️ Journal de bord

Quel morceau de ton jeu ou de ton quiz aimerais-tu transformer en fonction ? Quel nom lui donnerais-tu, et que devrait-elle renvoyer ?

[8]Sources
  1. Python Software Foundation, Tutoriel Python — 4. D'autres outils de contrôle de flux, 4.8 « Définir des fonctions », consulté le 28/10/2026.
  2. Scratch Foundation, Make a Block with Inputs, consulté le 28/10/2026.
12
S3 · MARDI · Pratiquer

Découper ton jeu en fonctions

Repérer les tâches d'un programme, en faire des fonctions et tester chacune seule.

⏱ 15 min de pratique · 5 min de quiz
[1]Scénario
Inès · Mardi, 17 h 30

Avant de toucher à son grand jeu, Inès s'entraîne sur la devinette, plus courte. Elle lit son code de haut en bas et se demande : « Qu'est-ce que ce programme fait, en vrai ? » Elle compte trois tâches : tirer un nombre, demander un essai, faire tourner la partie. Trois tâches, trois fonctions.

[2]Méthode

« Une tâche, une fonction »

Rappel en une phrase : def définit une fonction, return renvoie son résultat (voir épisode 11).

  1. Liste les tâches du programme, chacune en quelques mots (« tirer un nombre »).
  2. Donne à chaque fonction un nom qui commence par un verbe : tirer_nombre, demander_essai, jouer.
  3. Écris les fonctions en haut, les unes sous les autres, séparées par deux lignes vides ; l'appel qui lance tout (jouer()) va tout en bas.
  4. Teste chaque fonction seule avant de les assembler.
Code
import random


def tirer_nombre():
    return random.randint(1, 100)


def demander_essai():
    return int(input("Ton nombre ? "))


def jouer():
    secret = tirer_nombre()
    essai = 0
    nb_essais = 0
    while essai != secret:
        essai = demander_essai()
        nb_essais = nb_essais + 1
        if essai < secret:
            print("Plus grand !")
        elif essai > secret:
            print("Plus petit !")
    print(f"Bravo ! Trouvé en {nb_essais} essais.")


jouer()

Le jeu se comporte exactement comme la devinette de l'épisode 9 (vérifié avec les mêmes tirages). Mais chaque tâche porte maintenant un nom.

Tester une fonction seule : avant d'assembler, on vérifie qu'elle fait son travail.

Code
for i in range(5):
    print(tirer_nombre())

Cinq nombres entre 1 et 100 s'affichent : tirer_nombre marche. On supprime ensuite ce test.

[3]Pourquoi ça marche

Un programme découpé en tâches nommées se lit comme une liste d'étapes : jouer raconte la partie, sans le détail du tirage ou de la saisie. Si un bug apparaît dans le tirage, on sait dans quelle fonction chercher. Et une fonction testée seule est une pièce sur laquelle on peut compter. Le tutoriel officiel va dans le même sens : il recommande de séparer les fonctions par des lignes vides et d'écrire une docstring pour chacune, pour que le code reste lisible [1].

À retenirune tâche = une fonction = un nom qui commence par un verbe. On teste chaque fonction seule avant d'assembler.
[4]Entraînement

Bon réflexe ou piège ?

J'écris une seule fonction tout_faire() de 50 lignes.
on a juste déplacé le problème ; découpe en tâches.
J'appelle jouer sans parenthèses.
rien ne se passe, sans message d'erreur.
Je nomme ma fonction demander_essai plutôt que f2.
le nom dit ce qu'elle fait.
Dans demander_essai, j'oublie le return.
la fonction demande bien le nombre, mais renvoie None ; essai ne vaut jamais le secret.
Je teste tirer_nombre() seule, plusieurs fois, avant d'écrire jouer.
chaque pièce est vérifiée avant l'assemblage.
[5]Quiz

1. Quel est le meilleur nom pour une fonction qui demande une lettre au joueur ?

un nom de fonction commence par un verbe et dit ce qu'elle fait.

2. Où écrire l'appel jouer() qui lance le jeu ?

Python lit de haut en bas ; une fonction doit être définie avant d'être appelée.

3. demander_essai contient int(input("Ton nombre ? ")) sans return. Que se passe-t-il ?

sans return, la fonction renvoie None, qui n'est jamais égal au secret.
[6]Kit

🎒 Ton kit — Épisode 12

15 min

Exercice : ta devinette en trois fonctions

  1. Reprends ta devinette (épisode 9).
  2. Écris tirer_nombre() et teste-la seule, cinq fois.
  3. Écris demander_essai() et teste-la seule : elle doit renvoyer le nombre tapé.
  4. Écris jouer() en utilisant les deux premières, puis l'appel jouer() tout en bas.
  5. Bonus : demande « Veux-tu rejouer ? » et appelle jouer() dans une boucle while (voir épisode 2).

Code à copier : la devinette en fonctions ci-dessus.

Checklist

  • Mon programme contient trois fonctions aux noms qui commencent par un verbe.
  • J'ai testé tirer_nombre et demander_essai seules.
  • Ma devinette marche comme avant.
[7]Journal

✍️ Journal de bord

Après le découpage, ton code est-il plus long ou plus court ? Est-il plus facile ou plus difficile à lire ? Pourquoi, d'après toi ?

[8]Sources
  1. Python Software Foundation, Tutoriel Python — 4. D'autres outils de contrôle de flux, 4.8 « Définir des fonctions » et 4.10 « Aparté : le style de codage », consulté le 28/10/2026.
13
S3 · MERCREDI · Comprendre

Un code que les autres peuvent lire

Choisir des noms parlants, écrire des commentaires utiles et une docstring, et suivre quelques règles de la PEP 8.

⏱ 15 min de lecture · 5 min de quiz
[1]Scénario
Inès · Mercredi, 14 h

Malik veut aider Inès à ajouter un mode « deux joueurs ». Il ouvre un de ses vieux fichiers et fronce les sourcils : a, b, c, x2… « C'est quoi, b ? » Inès ne s'en souvient plus elle-même. Ce matin, pourtant, le programme marche. Mais personne, pas même elle, ne peut le modifier sans tout relire ligne par ligne.

[2]Concept

Un code lisible

Un programme est lu bien plus souvent qu'il n'est écrit : par toi dans une semaine, par Malik, par ton professeur. Python a un guide officiel de style, la PEP 8.

Exemple : le même code, illisible puis lisible. Les deux affichent p y t _ _ _.

Code
a = "python"
b = ""
for c in a:
    if c in "pyt":
        b = b + c + " "
    else:
        b = b + "_ "
print(b.strip())
Code
def afficher_mot(mot, trouvees):
    """Renvoie le mot avec un tiret à la place de chaque lettre pas encore trouvée."""
    affichage = ""
    for lettre in mot:
        if lettre in trouvees:
            affichage = affichage + lettre + " "
        else:
            affichage = affichage + "_ "
    return affichage.strip()


print(afficher_mot("python", "pyt"))

1. Des noms parlants. Le nom dit ce que contient la boîte : affichage plutôt que b, lettre plutôt que c. Règle de la PEP 8 : fonctions et variables en minuscules, mots séparés par _ (nb_essais, afficher_mot). Les valeurs qui ne changent jamais, comme la liste des mots du jeu, s'écrivent en MAJUSCULES : MOTS. Évite les noms d'une lettre l, O et I, qu'on confond avec 1 et 0.

2. Une docstring : une phrase entre triples guillemets """…""", juste sous la ligne def, qui dit ce que fait la fonction. Python la garde : help(afficher_mot) l'affiche.

Ce que tu vois
Help on function afficher_mot in module __main__: afficher_mot(mot, trouvees) Renvoie le mot avec un tiret à la place de chaque lettre pas encore trouvée.

3. Des commentaires utiles. Un commentaire (#) explique pourquoi, pas quoi : # 6 erreurs permises, comme au pendu classique est utile ; # on ajoute 1 au-dessus de erreurs = erreurs + 1 répète le code. Et un commentaire faux est pire que pas de commentaire.

4. La mise en page : 4 espaces par niveau de décalage ; deux lignes vides autour de chaque fonction ; les import tout en haut ; une espace autour de = et après chaque virgule (a = f(1, 2)).

RègleÀ éviterÀ préférer
nom de variableb, x2affichage, nb_essais
nom de fonctionf, Fonction1afficher_mot (un verbe, en minuscules)
valeur fixemots = [...] qui ne change jamaisMOTS = [...]
docstringaucune"""Renvoie …""" sous le def
commentaire# on ajoute 1# 6 erreurs permises, comme au pendu
Auto-diagnostic · mon code est-il lisible ?
  • Mes noms disent ce qu'ils contiennent.
  • Mes fonctions ont un nom qui commence par un verbe.
  • Chaque fonction a une docstring.
  • Mes commentaires expliquent pourquoi, pas quoi.
  • 4 espaces par niveau, deux lignes vides entre fonctions.
  • Aucun nom d'une seule lettre (sauf i dans une boucle).
[3]Recherche

Ce que disent les sources

  • PEP 8 (G. van Rossum, B. Warsaw, A. Coghlan) — Le guide part d'une idée : le code est lu bien plus souvent qu'il n'est écrit. Il recommande 4 espaces par niveau, deux lignes vides autour des fonctions, des noms en minuscules avec _ pour les fonctions et les variables, en MAJUSCULES pour les constantes, et d'éviter l, O et I comme noms d'une lettre. Il prévient que des commentaires qui contredisent le code sont pires que pas de commentaires [1].
  • PEP 257 (D. Goodger, G. van Rossum, 2001) — Une docstring est la première instruction d'une fonction, écrite entre triples guillemets ; pour un cas simple, une seule phrase qui dit ce que fait la fonction [2].
  • Tutoriel officiel de Python — Il conseille de suivre la PEP 8 et d'utiliser les docstrings systématiquement [3].
[4]Mythes
« Plus il y a de commentaires, mieux c'est. »
un bon nom remplace souvent un commentaire. Les commentaires servent à expliquer pourquoi, et ils doivent rester vrais.
« Si le code marche, il n'a pas besoin d'être lisible. »
un code illisible est impossible à corriger ou à faire évoluer, même par celle ou celui qui l'a écrit.
« La PEP 8, c'est une loi que Python vérifie. »
c'est un guide de style. Python lance un code mal présenté, mais les humains le lisent moins bien.
[5]Quiz

1. Quel nom respecte la PEP 8 pour une variable qui compte les erreurs ?

minuscules et mots séparés par _. Un nom d'une lettre ne dit pas ce qu'il contient.

2. Où se place la docstring d'une fonction ?

c'est la première instruction de la fonction ; help() peut alors l'afficher.

3. Quel commentaire est le plus utile ?

il explique un choix (pourquoi 6), ce que le code seul ne dit pas.
[6]Kit

🎒 Ton kit — Épisode 13

15 min

Exercice : rendre un code lisible Voici un programme qui marche, mais que personne ne comprend. Il affiche le nombre de voyelles d'un mot.

Code à copier
x = "pirate"
y = 0
for z in x:
    if z in "aeiouy":
        y = y + 1
print(y)
  1. Lance-le : il affiche 3.
  2. Renomme x, y et z avec des noms parlants.
  3. Range le calcul dans une fonction compter_voyelles(mot) qui renvoie le nombre, avec une docstring.
  4. Appelle-la avec deux mots différents et vérifie les résultats.
  5. Coche les 6 critères de l'auto-diagnostic.

Checklist

  • Mes noms disent ce qu'ils contiennent.
  • Ma fonction a une docstring d'une phrase.
  • Mon programme donne toujours le même résultat qu'avant.
Vigilancequand tu renommes une variable, renomme-la partout. Une seule ligne oubliée, et c'est la NameError (voir Boost, épisode 2).
[7]Journal

✍️ Journal de bord

Ouvre un programme que tu as écrit au Boost. Combien de temps te faut-il pour comprendre ce qu'il fait ? Qu'est-ce qui t'aurait aidée ou aidé ?

[8]Sources
  1. G. van Rossum, B. Warsaw, A. Coghlan, PEP 8 – Style Guide for Python Code, consulté le 28/10/2026.
  2. D. Goodger, G. van Rossum, PEP 257 – Docstring Conventions, créée le 29 mai 2001, consulté le 28/10/2026.
  3. Python Software Foundation, Tutoriel Python — 4.10 « Aparté : le style de codage », consulté le 28/10/2026.
14
S3 · JEUDI · Pratiquer

Relire et ranger le code d'Inès

Relire un programme en trois passes et réécrire le mot mystère en fonctions bien nommées.

⏱ 20 min de pratique · 5 min de quiz
[1]Scénario
Inès · Jeudi, 12 h 40

Il reste une semaine avant la fête du jeu. Inès décide de tout ranger : un mot tiré au hasard, l'affichage avec des tirets, la lettre déjà proposée, les erreurs… Tout est là, mais en vrac. Malik propose de relire avec elle. Ensemble, ils passent trois fois sur le code, avec une question différente à chaque passage.

[2]Méthode

« La relecture en 3 passes »

Rappels : une tâche, une fonction (voir épisode 12) ; noms, docstrings et commentaires (voir épisode 13).

  1. Passe 1, les noms : chaque variable et chaque fonction dit-elle ce qu'elle contient ou ce qu'elle fait ?
  2. Passe 2, le découpage : chaque tâche est-elle dans sa propre fonction ? Une fonction fait-elle une seule chose ?
  3. Passe 3, les explications : chaque fonction a-t-elle sa docstring ? Les commentaires disent-ils pourquoi ?

Le mot mystère, version rangée : cinq fonctions et une liste fixe en majuscules.

Code
import random

MOTS = ["chat", "python", "robot", "lune", "pirate"]


def choisir_mot(mots):
    """Tire un mot au hasard dans la liste."""
    return random.choice(mots)


def afficher_mot(mot, proposees):
    """Renvoie le mot avec un tiret à la place de chaque lettre pas encore trouvée."""
    affichage = ""
    for lettre in mot:
        if lettre in proposees:
            affichage = affichage + lettre + " "
        else:
            affichage = affichage + "_ "
    return affichage.strip()


def demander_lettre(proposees):
    """Demande une lettre jusqu'à ce qu'elle soit nouvelle, puis la renvoie."""
    lettre = input("Propose une lettre : ").strip().lower()
    while lettre in proposees:
        print("Tu as déjà proposé cette lettre !")
        lettre = input("Propose une lettre : ").strip().lower()
    return lettre


def mot_trouve(mot, proposees):
    """Renvoie True si toutes les lettres du mot ont été proposées."""
    for lettre in mot:
        if lettre not in proposees:
            return False
    return True


def jouer():
    """Joue une partie du mot mystère, avec 6 erreurs permises."""
    mot = choisir_mot(MOTS)
    proposees = []
    erreurs = 0
    while erreurs < 6:
        print(afficher_mot(mot, proposees))
        lettre = demander_lettre(proposees)
        proposees.append(lettre)
        if lettre in mot:
            print("Bien vu !")
            if mot_trouve(mot, proposees):
                print(f"Gagné ! Le mot était {mot}.")
                return
        else:
            erreurs = erreurs + 1
            print(f"Raté ! Erreurs : {erreurs} sur 6")
    print(f"Perdu ! Le mot était {mot}.")


jouer()

Deux nouveautés à remarquer :

  • not in veut dire « n'est pas dans » : c'est le contraire de in.
  • Dans mot_trouve, dès qu'une lettre manque, return False fait sortir de la fonction ; si la boucle arrive au bout, toutes les lettres sont là : return True. Dans jouer, return sert à terminer la partie dès qu'on a gagné (voir épisode 11).

Essai réel, quand le mot tiré est « robot », avec r, r, z, x, o, b, t :

Ce que tu vois
_ _ _ _ _ Propose une lettre : r Bien vu ! r _ _ _ _ Propose une lettre : r Tu as déjà proposé cette lettre ! Propose une lettre : z Raté ! Erreurs : 1 sur 6 r _ _ _ _ Propose une lettre : x Raté ! Erreurs : 2 sur 6 r _ _ _ _ Propose une lettre : o Bien vu ! r o _ o _ Propose une lettre : b Bien vu ! r o b o _ Propose une lettre : t Bien vu ! Gagné ! Le mot était robot.

Avec six lettres absentes à la suite, la partie se termine par Perdu ! Le mot était robot. (testé aussi).

Remets les lignes dans l'ordre · clique les lignes une par une
Ton programme
Lignes à placer
[3]Pourquoi ça marche

Chaque passe ne cherche qu'une sorte de problème : on en rate moins qu'en voulant tout vérifier à la fois. Et une fonction qui ne fait qu'une chose se lit d'un coup d'œil : jouer se lit presque comme une phrase. C'est l'idée de départ de la PEP 8 : le code est lu bien plus souvent qu'il n'est écrit [1].

À retenirtrois passes, trois questions : les noms, le découpage, les explications.
[4]Entraînement

Bon réflexe ou piège ?

Je relis mon code avec quelqu'un qui ne l'a pas écrit.
un regard neuf voit ce qu'on ne voit plus.
Ma fonction afficher_mot affiche le mot et demande une lettre.
elle fait deux choses ; son nom ment à moitié.
J'écris MOTS en majuscules parce que la liste ne change jamais.
c'est la convention de la PEP 8 pour les valeurs fixes.
Je garde un commentaire qui décrit une ancienne version du code.
un commentaire faux est pire que pas de commentaire.
Après avoir tout rangé, je rejoue une partie gagnée et une partie perdue.
ranger ne doit rien casser.
[5]Quiz

1. Que renvoie mot_trouve("lune", ["l", "u", "n"]) ?

le e n'a pas été proposé : la boucle le trouve et renvoie False.

2. Pourquoi jouer contient-il un return après « Gagné ! » ?

return fait sortir de la fonction, donc de la boucle : le message « Perdu ! » n'est pas affiché.

3. Que veut dire if lettre not in proposees: ?

not in est le contraire de in.
[6]Kit

🎒 Ton kit — Épisode 14

20 min

Exercice : ton jeu, rangé

  1. Relis ton propre mot mystère en 3 passes, avec quelqu'un si possible.
  2. Réécris-le avec les fonctions choisir_mot, afficher_mot, demander_lettre, mot_trouve et jouer, chacune avec sa docstring.
  3. Joue trois parties : une gagnée, une perdue, une où tu proposes deux fois la même lettre.

Code à copier : le mot mystère version rangée ci-dessus.

Checklist

  • Mon jeu tient en cinq fonctions avec docstrings.
  • J'ai fait les trois passes de relecture.
  • J'ai joué une partie gagnée, une perdue et une avec une lettre répétée.
[7]Journal

✍️ Journal de bord

Pendant la relecture, quelle passe t'a fait trouver le plus de problèmes : les noms, le découpage ou les explications ?

[8]Sources
  1. G. van Rossum, B. Warsaw, A. Coghlan, PEP 8 – Style Guide for Python Code, consulté le 28/10/2026.
  2. D. Goodger, G. van Rossum, PEP 257 – Docstring Conventions, consulté le 28/10/2026.
15
S3 · VENDREDI · Pratiquer · Bilan d'arc

Tes propres blocs : le bilan

Ton outil de synthèse, le récapitulatif de la semaine et ton badge.

⏱ 20 min · arbre de décision · carrousel · quiz final
[1]Scénario
Inès · Vendredi, 12 h 40

Malik a ajouté le mode « deux joueurs » en vingt minutes, sans demander d'explication : il a lu les noms des fonctions et leurs docstrings. Inès n'en revient pas. En trois semaines, son jeu est passé d'un bloc recopié à cinq fonctions qui se lisent comme une recette. Aujourd'hui, elle fait la fiche de son jeu : chaque fonction, son rôle, ce qu'elle reçoit et ce qu'elle renvoie.

[2]Outil

« Faut-il une fonction ? »

Aide à la décision interactive
[3]Carrousel

🎨 Carrousel récapitulatif — Semaine 3

[4]Quiz final

Programme de référence (sortie vérifiée : 15, puis 15 None, puis 21) :

Code
def f(x):
    return x + 10


def g(x):
    print(x + 10)


a = f(5)
b = g(5)
print(a, b)
print(f(f(1)))

1. Que vaut a ?

f renvoie 5 + 10.

2. Que vaut b ?

g affiche 15, mais ne renvoie rien.

3. Qu'affiche print(f(f(1))) ?

f(1) vaut 11, puis f(11) vaut 21.

4. Quel nom de fonction respecte la PEP 8 et dit ce qu'elle fait ?

minuscules, _ entre les mots, un verbe.

5. Une variable total est créée dans une fonction. Peut-on l'afficher après l'appel, en dehors de la fonction ?

les variables d'une fonction disparaissent à la fin de l'appel ; return permet de donner leur valeur au programme.
[5]Kit

🎒 Ton kit de fin d'arc

15 min

La fiche fonctions du jeu

Synthèse : remplis la fiche de ton mot mystère (un exemple ci-dessous, pour la version rangée de l'épisode 14).

FonctionCe qu'elle faitCe qu'elle reçoitCe qu'elle renvoie
choisir_mot(mots)tire un mot au hasardla liste des motsun mot
afficher_mot(mot, proposees)prépare l'affichage avec des tiretsle mot, les lettres proposéesun texte comme r o _ o _
demander_lettre(proposees)demande une lettre nouvelleles lettres proposéesla lettre
mot_trouve(mot, proposees)vérifie si tout est trouvéle mot, les lettres proposéesTrue ou False
jouer()fait tourner une partierienrien (affiche le résultat)

Consigne : fais la même fiche pour ton jeu, en vérifiant que chaque docstring dit la même chose que ta fiche. Puis exporte ton carnet de bord.

Checklist

  • J'ai exporté mon carnet (bouton dans le menu).
  • Je sais expliquer la différence entre print et return à quelqu'un d'autre.
  • La fiche fonctions de mon jeu est remplie.
[6]Journal

✍️ Journal de bord — bilan

Si tu devais expliquer à un élève de 6e ce qu'est une fonction, quelle comparaison utiliserais-tu ?

✦ BÂTISSEUSE · BÂTISSEUR DE BLOCS · SEMAINE 3 ✦

Bravo ! Tu as terminé la semaine 3. Tu sais créer tes propres fonctions, leur faire renvoyer un résultat, et écrire un code que les autres peuvent lire.

ARC 4 · SEMAINE 4

Chasser les bugs et finir ton jeu

Dernière semaine avant la fête du jeu : tu apprends à trouver les bugs qui ne disent pas leur nom, tu testes ton jeu comme un vrai joueur, et vendredi, tu le présentes.

16
S4 · LUNDI · Comprendre

Trouver un bug sans paniquer

Chercher avec méthode une erreur qui ne s'affiche pas : reproduire, afficher, isoler, expliquer.

⏱ 15 min de lecture · 5 min de quiz
[1]Scénario
Inès · Lundi, 12 h 40

Malik a essayé la dernière version du mot mystère pendant le week-end. Son message : « Ton jeu est cassé. J'ai proposé des lettres fausses, il n'a jamais compté d'erreur. » Inès relance le jeu : pas de message rouge, pas d'erreur, tout a l'air normal… et pourtant, le compteur reste à 0. Au Boost, les erreurs s'affichaient en rouge. Celle-ci se cache.

[2]Concept

Les bugs silencieux

Tu sais lire une erreur qui s'affiche (voir Boost, épisode 2). Mais beaucoup de bugs ne s'affichent pas : le programme tourne, et donne un mauvais résultat. On les appelle des bugs silencieux. Pour les trouver, on enquête en quatre gestes.

1. Reproduire : trouve une situation précise où le bug apparaît à chaque fois (« avec les lettres z, x et w, le compteur reste à 0 »).

2. Afficher : ajoute des print de contrôle pour voir ce que valent les variables pendant que le programme tourne.

Code
erreurs = 0
for lettre in ["z", "x", "w"]:
    if lettre not in "robot":
        erreurs + 1
    print(f"CONTRÔLE lettre={lettre} erreurs={erreurs}")
print(erreurs)

Affiche :

Ce que tu vois
CONTRÔLE lettre=z erreurs=0 CONTRÔLE lettre=x erreurs=0 CONTRÔLE lettre=w erreurs=0 0

Le contrôle montre que erreurs ne change jamais, même quand la lettre est absente. Le coupable est donc la ligne qui devrait l'augmenter : erreurs + 1 calcule 1, mais ne range rien. Il fallait écrire erreurs = erreurs + 1. Corrigé, le programme affiche 3.

3. Isoler : quand un grand programme cache un bug, recopie la plus petite partie qui le montre encore (ici, 5 lignes au lieu de 60). Moins il y a de code, plus le bug se voit.

4. Expliquer à voix haute : raconte ton programme, ligne par ligne, à quelqu'un… ou à un objet posé sur ton bureau. En disant « ici, j'ajoute 1 à erreurs », tu entends que le code ne le fait pas. Les programmeurs appellent ça la méthode du canard en plastique.

GesteLa question à se poserL'outil
ReproduireDans quelle situation le bug apparaît-il à chaque fois ?une suite d'entrées précise
AfficherQue valent mes variables à cet endroit ?print(f"CONTRÔLE …")
IsolerQuelle est la plus petite partie qui montre le bug ?une copie réduite du code
ExpliquerQue fait vraiment chaque ligne ?le canard (ou un ami)

N'oublie pas de retirer tes print de contrôle quand le bug est corrigé : ils ne sont pas faits pour les joueurs.

[3]Recherche

Ce que disent les sources

  • Tutoriel officiel de Python — Il distingue deux sortes de problèmes qui s'affichent : les erreurs de syntaxe, détectées avant l'exécution, et les exceptions, qui surviennent pendant [1]. Un bug silencieux n'est ni l'un ni l'autre : le code est correct pour Python, mais il ne fait pas ce que tu voulais.
  • La méthode du canard — Le site Rubber Duck Debugging la fait remonter à une histoire racontée dans le livre The Pragmatic Programmer (1999) : expliquer son code ligne par ligne à un canard révèle l'endroit où ce que l'on croit diffère de ce que fait le code [2].
  • Programme du cycle 4 (BO du 5 mars 2026) — En 4e, on modifie un programme fourni pour changer son comportement ; en 3e, on écrit un programme pour atteindre un objectif [3]. Trouver et corriger un bug, c'est exactement cela.
[4]Mythes
« S'il n'y a pas de message rouge, le programme est juste. »
Python ne sait pas ce que tu voulais faire. Un programme peut tourner sans erreur et donner un mauvais résultat.
« Les bons programmeurs ne font pas de bugs. »
tout le monde en fait. Ce qui change avec l'expérience, c'est la méthode pour les trouver.
« Pour trouver un bug, il faut relire tout le programme d'un coup. »
on reproduit, on affiche, on isole. On cherche à un endroit précis.
[5]Quiz

1. Qu'est-ce qu'un bug silencieux ?

rien ne s'affiche en rouge, c'est le résultat qui est faux.

2. Que fait la ligne erreurs + 1 toute seule ?

pour garder le résultat, il faut l'affectation erreurs = erreurs + 1.

3. Tu as trouvé ton bug grâce à des print de contrôle. Que fais-tu ensuite ?

les contrôles servent à toi, pas aux joueurs.
[6]Kit

🎒 Ton kit — Épisode 16

15 min

Exercice : trois bugs silencieux. Chaque programme tourne sans erreur, mais ne fait pas ce que dit son commentaire. Pour chacun : lance-le, ajoute un print de contrôle si besoin, trouve la ligne fautive, corrige.

Code à copier
# Programme A — doit afficher les nombres de 1 à 5
for i in range(1, 5):
    print(i)
Code à copier
# Programme B — doit compter 2 bonnes réponses
score = 0
for reponse in ["oui", "non", "oui"]:
    if reponse == "oui":
        print("Bonne réponse")
score = score + 1
print(f"Score : {score}")
Code à copier
# Programme C — doit calculer la moyenne de trois notes (12)
notes = [12, 15, 9]
moyenne = notes[0] + notes[1] + notes[2] / 3
print(f"Moyenne : {moyenne}")

Corrigé (sorties réelles) :

  • A affiche 1 à 4 : range(1, 5) s'arrête avant 5. Correction : range(1, 6) (voir épisode 1).
  • B affiche Score : 1 : la ligne score = score + 1 n'est pas décalée, elle s'exécute une seule fois, après la boucle. Correction : la décaler sous le if ; le score devient 2.
  • C affiche Moyenne : 30.0 : la division passe avant l'addition (priorités vues au Boost). Correction : (notes[0] + notes[1] + notes[2]) / 3, qui donne Moyenne : 12.0.

Checklist

  • Je sais ce qu'est un bug silencieux.
  • Je sais ajouter un print de contrôle avec une f-string.
  • J'ai trouvé et corrigé les 3 bugs.
Vigilancequand tu corriges, ne change qu'une chose à la fois, puis reteste. Si tu changes trois lignes d'un coup, tu ne sauras pas laquelle a réglé le problème… ni si tu en as créé un nouveau.
[7]Journal

✍️ Journal de bord

Raconte le bug le plus étrange que tu as eu depuis le début du Pro. Comment l'as-tu trouvé ?

[8]Sources
  1. Python Software Foundation, Tutoriel Python — 8. Erreurs et exceptions, consulté le 28/10/2026.
  2. Rubber Duck Debugging, consulté le 28/10/2026.
  3. Ministère de l'Éducation nationale, Programme de mathématiques pour le cycle 4, annexe 2, « La pensée informatique », consulté le 28/10/2026.
17
S4 · MARDI · Pratiquer

La chasse aux bugs du mot mystère

Appliquer la méthode d'enquête à un vrai jeu qui contient quatre bugs cachés.

⏱ 20 min de pratique · 5 min de quiz
[1]Scénario
Inès · Mardi, 17 h 30

Pour s'entraîner, l'animatrice a préparé un défi : une copie du mot mystère dans laquelle elle a caché quatre bugs. Aucun ne fait apparaître de message rouge. Le premier binôme qui les trouve tous gagne le droit de passer en premier à la fête du jeu. Inès et Malik se lancent.

[2]Méthode

« Reproduire, afficher, isoler, corriger, retester »

Rappel en une phrase : un bug silencieux se trouve en reproduisant, en affichant et en isolant (voir épisode 16).

  1. Reproduire : joue avec des entrées précises et note ce qui ne va pas (« avec z, le jeu dit Bien vu ! »).
  2. Afficher : ajoute un print de contrôle dans la fonction concernée.
  3. Isoler : trouve la ligne exacte.
  4. Corriger : une seule ligne à la fois.
  5. Retester : rejoue la même partie pour vérifier.

Le jeu piégé : c'est le mot mystère de l'épisode 14, dans lequel quatre lignes ont été modifiées.

Code à copier (le jeu piégé)

Code à copier
import random

MOTS = ["chat", "python", "robot", "lune", "pirate"]


def choisir_mot(mots):
    """Tire un mot au hasard dans la liste."""
    return random.choice(mots)


def afficher_mot(mot, proposees):
    """Renvoie le mot avec un tiret à la place de chaque lettre pas encore trouvée."""
    affichage = ""
    for lettre in mot:
        if lettre in proposees:
            affichage = affichage + lettre + " "
        else:
            affichage = affichage + "_ "
    return affichage.strip()


def demander_lettre(proposees):
    """Demande une lettre jusqu'à ce qu'elle soit nouvelle, puis la renvoie."""
    lettre = input("Propose une lettre : ").strip()
    while lettre in proposees:
        print("Tu as déjà proposé cette lettre !")
        lettre = input("Propose une lettre : ").strip().lower()
    return lettre


def mot_trouve(mot, proposees):
    """Renvoie True si toutes les lettres du mot ont été proposées."""
    for lettre in mot:
        if lettre not in proposees:
            return False
    return True


def jouer():
    """Joue une partie du mot mystère, avec 6 erreurs permises."""
    mot = choisir_mot(MOTS)
    proposees = []
    erreurs = 0
    while erreurs <= 6:
        print(afficher_mot(mot, proposees))
        lettre = demander_lettre(proposees)
        proposees.append(lettre)
        if lettre not in mot:
            print("Bien vu !")
            if mot_trouve(mot, proposees):
                print(f"Gagné ! Le mot était {mot}.")
                return
        else:
            erreurs + 1
            print(f"Raté ! Erreurs : {erreurs} sur 6")
    print(f"Perdu ! Le mot était {mot}.")


jouer()

Ce que voient les testeurs (essais réels, mot tiré : « robot ») :

  • Avec z, x, w… : le jeu répond « Bien vu ! » à chaque fois, et la partie ne s'arrête jamais.
  • Avec R, o, b, t : R est accueilli par « Bien vu ! » sans être révélé ; les bonnes lettres affichent « Raté ! Erreurs : 0 sur 6 ».

Les quatre bugs (corrigé, à ne lire qu'après avoir cherché) :

  1. Condition inversée dans jouer : if lettre not in mot: au lieu de if lettre in mot:. Les bonnes et les mauvaises lettres sont échangées.
  2. Compteur jamais augmenté : erreurs + 1 au lieu de erreurs = erreurs + 1 (comme lundi). La partie ne peut jamais être perdue.
  3. lower oublié dans la première ligne de demander_lettre : R majuscule n'est jamais égal à r. La deuxième ligne, elle, a bien .lower() : un bug peut se cacher dans une ligne presque identique à une ligne juste.
  4. Un tour de trop : while erreurs <= 6: laisserait 7 erreurs au lieu de 6. On ne le voit qu'une fois les trois autres bugs corrigés : c'est pour cela qu'on reteste après chaque correction.
Suivre les variables · le compteur qui ne compte pas
Ce qui s'affiche

[3]Pourquoi ça marche

Le bug 4 montre pourquoi on corrige une chose à la fois et on reteste à chaque fois : certains bugs en cachent d'autres. Tant que le compteur ne bougeait pas, impossible de voir qu'il comptait un tour de trop. La méthode transforme une chasse au hasard en enquête où chaque étape réduit l'endroit où chercher.

À retenirun bug à la fois ; après chaque correction, la même partie de test.
[4]Entraînement

Bon réflexe ou piège ?

Je note les lettres que j'ai tapées quand le bug est apparu.
c'est ce qui permet de le reproduire.
Je corrige les quatre lignes suspectes d'un coup.
si quelque chose casse, tu ne sais plus laquelle est en cause.
Je compare la ligne suspecte avec une ligne qui marche, juste à côté.
c'est comme ça qu'on trouve le lower oublié.
Le bug a disparu, je ne reteste pas, j'ai confiance.
sans retester, impossible de savoir si la correction marche vraiment.
Je teste avec une majuscule exprès.
un joueur le fera forcément.
[5]Quiz

1. Le jeu répond « Bien vu ! » pour une lettre absente. Quelle ligne regarder en premier ?

la réponse « Bien vu » dépend directement de cette condition.

2. Avec while erreurs <= 6:, combien d'erreurs le joueur peut-il faire avant de perdre ?

la boucle continue tant qu'erreurs vaut 0, 1, … ou 6 : il faut une 7e erreur pour sortir.

3. Pourquoi le 4e bug n'était-il visible qu'à la fin ?

tant que erreurs restait à 0, la condition de la boucle n'était jamais testée pour de vrai.
[6]Kit

🎒 Ton kit — Épisode 17

20 min

Exercice : la chasse

  1. Copie le jeu piégé et lance-le sans regarder le corrigé.
  2. Trouve les quatre bugs avec la méthode en 5 étapes. Note pour chacun : l'entrée qui le montre, la ligne fautive, ta correction.
  3. Après chaque correction, rejoue la même partie de test.

Checklist

  • J'ai trouvé les 4 bugs (en m'aidant du corrigé seulement à la fin).
  • Pour chaque bug, j'ai noté l'entrée qui le montre.
  • Après la dernière correction, mon jeu se comporte comme celui de l'épisode 14.
[7]Journal

✍️ Journal de bord

Lequel des quatre bugs as-tu eu le plus de mal à trouver ? Quelle étape de la méthode t'a aidée ou aidé ?

[8]Sources
  1. Python Software Foundation, Tutoriel Python — 8. Erreurs et exceptions, consulté le 28/10/2026.
18
S4 · MERCREDI · Comprendre

Le débogueur pas à pas

Exécuter un programme ligne par ligne et regarder ses variables changer, avec le débogueur de Thonny.

⏱ 15 min de lecture · 5 min de quiz
[1]Scénario
Inès · Mercredi, 14 h

Hier, Inès a ajouté une dizaine de print de contrôle pour trouver les bugs. Ça a marché, mais elle a dû tous les retirer après. Au club, l'animatrice lui montre un outil qui fait la même chose sans toucher au code : le débogueur. Il exécute le programme au ralenti, ligne par ligne, et montre la valeur de chaque variable à chaque instant. Exactement ce que faisait le widget « Suivre les variables » du livre, mais sur ton propre programme.

[2]Concept

Le débogueur

Un débogueur est un outil qui exécute ton programme pas à pas et te montre ses variables pendant qu'il tourne. Tu n'as rien à ajouter dans ton code.

Dans Thonny (logiciel installé par un adulte, voir Boost, épisode 2) :

ActionRaccourciCe qui se passe
Lancer en mode débogageCtrl + F5 (au lieu de F5)le programme démarre et s'arrête sur la première ligne
Grand pasF6Python exécute la ligne (ou le bloc) en cours et passe à la suivante
Petit pasF7Python avance plus finement : il montre même chaque calcul d'une ligne, morceau par morceau
Voir les variablesmenu View → Variables (vue « Variables »)un tableau affiche chaque variable et sa valeur actuelle

Pas besoin de point d'arrêt : Thonny démarre au début et tu avances à ton rythme. Quand une fonction est appelée et que tu avances à petits pas, Thonny ouvre une fenêtre à part pour cette fonction, avec ses propres variables locales (voir épisode 11).

Exemple à suivre pas à pas

Code
mot = "lune"
affichage = ""
for lettre in mot:
    affichage = affichage + lettre.upper()
print(affichage)

Affiche LUNE. Au pas à pas, la vue « Variables » montre lettre qui vaut "l", "u", "n", "e", et affichage qui devient "L", "LU", "LUN", "LUNE".

Sans Thonny ? Les environnements en ligne n'ont pas tous de débogueur. Tu peux alors utiliser les print de contrôle (épisode 16), ou le widget « Suivre les variables » de ce livre pour t'entraîner à lire un programme pas à pas.

print de contrôleDébogueur
Modifier le code ?oui (et retirer ensuite)non
Voir toutes les variables ?seulement celles qu'on affichetoutes
Disponible partout ?ouiselon l'environnement
[3]Recherche

Ce que disent les sources

  • Site officiel de Thonny — Le débogueur de Thonny est conçu pour les débutants : il ne demande pas de point d'arrêt. On lance le programme pas à pas avec Ctrl+F5 au lieu de F5 ; F6 fait un grand pas, F7 un petit pas. La vue des variables (View → Variables) montre comment le programme les modifie, et en petits pas, Thonny montre l'évaluation de chaque morceau d'expression [1].
  • Version — La page d'accueil de Thonny présente la version 5.0.0 ; la version 5.0.1 a été publiée sur PyPI le 26 octobre 2026 [1][2]. Les raccourcis ci-dessus sont ceux de la page officielle : vérifie-les dans ta version.
[4]Mythes
« Le débogueur corrige les bugs tout seul. »
il te montre ce qui se passe ; c'est toi qui trouves et qui corriges.
« Le débogueur, c'est pour les professionnels. »
celui de Thonny a été pensé pour les débutants : pas de réglage, juste Ctrl+F5 et F6.
« Avec un débogueur, on n'a plus besoin de réfléchir. »
il faut d'abord savoir quoi regarder : quelle variable, à quel tour. C'est la méthode de lundi qui te le dit.
[5]Quiz

1. Dans Thonny, comment lance-t-on un programme en mode pas à pas ?

F5 lance normalement ; Ctrl + F5 lance le débogueur (page officielle de Thonny).

2. Que vaut affichage au 3e tour de la boucle de l'exemple ?

après « l », « u » et « n », affichage vaut "LUN" (vérifié en exécutant le programme).

3. Quel avantage le débogueur a-t-il sur les print de contrôle ?

pas de lignes à ajouter puis à retirer.
[6]Kit

🎒 Ton kit — Épisode 18

15 min

Exercice : suivre une boucle au ralenti

  1. Ouvre Thonny et la vue « Variables ».
  2. Copie l'exemple ci-dessus et lance-le avec Ctrl + F5.
  3. Avance avec F6 et note, à chaque tour, la valeur de lettre et d'affichage.
  4. Recommence avec F7 et observe comment Thonny calcule affichage + lettre.upper() morceau par morceau.
  5. Puis suis une partie de ton mot mystère au pas à pas : que vaut erreurs après ta 2e lettre fausse ?

Sans Thonny : fais l'exercice sur papier, avec un tableau « tour / lettre / affichage », puis vérifie avec un print de contrôle.

Checklist

  • Je sais lancer un programme pas à pas (ou suivre ses variables sur papier).
  • J'ai noté la valeur des variables à chaque tour.
  • J'ai suivi une partie de mon jeu pas à pas.
VigilanceThonny s'installe uniquement depuis son site officiel (thonny.org), par un adulte. N'installe jamais un « débogueur » trouvé sur un autre site.
[7]Journal

✍️ Journal de bord

Qu'as-tu découvert en regardant ton programme au ralenti, que tu n'avais pas remarqué en le lançant normalement ?

[8]Sources
  1. A. Annamaa, Thonny, Python IDE for beginners, consulté le 28/10/2026.
  2. Thonny, page du projet sur PyPI (version 5.0.1 du 26/10/2026), consulté le 28/10/2026. (pypi.org/project/thonny)
19
S4 · JEUDI · Pratiquer

Terminer et tester ton jeu

Écrire un plan de test, jouer comme un joueur qui fait tout de travers, et corriger ce qu'on trouve.

⏱ 20 min de pratique · 5 min de quiz
[1]Scénario
Inès · Jeudi, 12 h 40

Demain, c'est la fête du jeu. Inès a joué des dizaines de parties : tout marche. Malik a une autre idée : « Toi, tu joues bien. Les autres vont taper n'importe quoi. » Il prend le clavier, appuie sur Entrée sans rien écrire… et le jeu répond « Bien vu ! ». Inès blêmit. Il reste une journée pour tester sérieusement.

[2]Méthode

Le plan de test

Rappels : la méthode de chasse aux bugs (voir épisodes 16 et 17) ; le jeu rangé en fonctions (voir épisode 14).

Un plan de test est une liste de parties à jouer, chacune avec ce qu'on tape et ce qu'on attend. On joue chaque partie et on coche : obtenu = attendu ?

N°PartieCe qu'on tapeCe qu'on attend
1Gagner viteles lettres du mot« Gagné ! »
2Perdre6 lettres absentes« Perdu ! » et le mot révélé
3Lettre répétéedeux fois la même« Tu as déjà proposé cette lettre ! », pas d'erreur comptée
4Majuscule et espacesR, puis ␣o␣comptées comme r et o
5Saisie bizarreEntrée sans rien, puis rorefusées : une seule lettre demandée

Ce que la partie 5 révèle : avec la version de l'épisode 14, une saisie vide et ro sont acceptées. Essai réel, mot « robot » :

Ce que tu vois
_ _ _ _ _ Propose une lettre : Bien vu ! _ _ _ _ _ Propose une lettre : ro Bien vu ! _ _ _ _ _

Pourquoi ? Pour Python, le texte vide "" est « dans » tous les mots, et "ro" est bien dans "robot" : "" in "robot" et "ro" in "robot" valent tous les deux True (vérifié).

La correction : une fonction qui vérifie qu'on a tapé une seule lettre, jamais proposée.

Code
def lettre_valide(lettre, proposees):
    """Renvoie True si c'est une seule lettre, jamais proposée ; sinon explique pourquoi."""
    if len(lettre) != 1:
        print("Tape une seule lettre !")
        return False
    if lettre in proposees:
        print("Tu as déjà proposé cette lettre !")
        return False
    return True


def demander_lettre(proposees):
    """Demande une lettre jusqu'à ce qu'elle soit valide, puis la renvoie."""
    lettre = input("Propose une lettre : ").strip().lower()
    while not lettre_valide(lettre, proposees):
        lettre = input("Propose une lettre : ").strip().lower()
    return lettre

not veut dire « le contraire de » : while not lettre_valide(...) se lit « tant que la lettre n'est pas valide ». C'est le même not que dans not in (voir épisode 14).

Mon plan de test · à cocher
  • Partie 1 · Gagner vite : « Gagné ! »
  • Partie 2 · Perdre : « Perdu ! » et le mot révélé
  • Partie 3 · Lettre répétée : message, pas d'erreur comptée
  • Partie 4 · Majuscule et espaces : comptées comme minuscules
  • Partie 5 · Saisie vide ou deux lettres : refusées
[3]Pourquoi ça marche

Celui qui écrit un programme le teste avec les entrées auxquelles il pense ; les joueurs, eux, tapent tout le reste. Un plan de test écrit d'avance oblige à essayer les cas bizarres, pas seulement ceux où tout va bien. Et il se rejoue à l'identique après chaque correction : c'est ce qui a permis de vérifier que lettre_valide ne cassait rien.

À retenirun plan de test = ce qu'on tape + ce qu'on attend. Les cas bizarres d'abord : vide, trop long, majuscules, répétitions.
[4]Entraînement

Bon réflexe ou piège ?

Je ne teste que des parties où je gagne.
les messages de défaite et les cas bizarres ne sont jamais vérifiés.
Je demande à quelqu'un d'autre de jouer sans lui expliquer.
il fera ce que tu n'as pas prévu.
J'écris ce que j'attends avant de jouer la partie.
sinon, on a tendance à trouver normal ce qu'on voit.
Après avoir corrigé la partie 5, je ne rejoue que la partie 5.
rejoue tout le plan, la correction a pu casser autre chose.
Je teste une saisie vide en appuyant juste sur Entrée.
c'est un des premiers cas bizarres qu'un joueur provoque.
[5]Quiz

1. Que vaut "" in "robot" ?

pour Python, le texte vide se trouve dans n'importe quel texte. D'où le bug de la partie 5.

2. Que renvoie lettre_valide("ro", []) ?

len("ro") vaut 2, différent de 1.

3. Dans un plan de test, que note-t-on pour chaque partie ?

on compare ensuite ce qu'on obtient avec ce qu'on attendait.
[6]Kit

🎒 Ton kit — Épisode 19

20 min

Exercice : ton plan de test

  1. Recopie le plan de test des 5 parties, en l'adaptant à tes mots.
  2. Joue chaque partie et coche : obtenu = attendu ?
  3. Ajoute lettre_valide et la nouvelle demander_lettre à ton jeu.
  4. Rejoue tout le plan.
  5. Fais jouer quelqu'un sans rien lui expliquer, et note ce qu'il a tapé.

Checklist

  • Mon plan de test a 5 parties, avec ce que j'attends.
  • Les 5 parties donnent le résultat attendu.
  • Une autre personne a joué à mon jeu.
[7]Journal

✍️ Journal de bord

Qu'a fait la personne qui a testé ton jeu, que tu n'aurais jamais pensé à faire ?

[8]Sources
  1. Python Software Foundation, Tutoriel Python — 3. Introduction informelle à Python, 3.1.2 « Chaînes de caractères », consulté le 28/10/2026.
20
S4 · VENDREDI · Pratiquer · Final

Ton jeu, ta boîte à outils et ton certificat

Présenter ton jeu, rassembler tes outils, puis célébrer la fin du Pro.

⏱ 20 min · boîte à outils · carrousel · certificat
[1]Scénario
Inès · Vendredi, 12 h 40

La salle du club est pleine. Sur l'écran d'Inès : « === Le mot mystère === ». Un élève de 6e appuie sur Entrée sans rien taper : « Tape une seule lettre ! » Il essaie « R » majuscule : accepté. Il gagne en huit lettres et demande à rejouer. Malik, qui a perdu trois parties d'affilée, réclame un mot plus facile. À la fin, l'animatrice demande : « Et la suite ? » Inès a déjà une liste : un tableau des meilleurs scores, des personnages, peut-être un vrai jeu en images.

[2]Outil

Mon carnet de code

Consigne : termine ton jeu avec le plan de test de jeudi, ajoute la possibilité de rejouer (voir épisode 2), puis range tes outils du Pro dans ton carnet.

Le jeu complet (code à copier)

Code
import random

MOTS = ["chat", "python", "robot", "lune", "pirate"]
ERREURS_PERMISES = 6


def choisir_mot(mots):
    """Tire un mot au hasard dans la liste."""
    return random.choice(mots)


def afficher_mot(mot, proposees):
    """Renvoie le mot avec un tiret à la place de chaque lettre pas encore trouvée."""
    affichage = ""
    for lettre in mot:
        if lettre in proposees:
            affichage = affichage + lettre + " "
        else:
            affichage = affichage + "_ "
    return affichage.strip()


def lettre_valide(lettre, proposees):
    """Renvoie True si c'est une seule lettre, jamais proposée ; sinon explique pourquoi."""
    if len(lettre) != 1:
        print("Tape une seule lettre !")
        return False
    if lettre in proposees:
        print("Tu as déjà proposé cette lettre !")
        return False
    return True


def demander_lettre(proposees):
    """Demande une lettre jusqu'à ce qu'elle soit valide, puis la renvoie."""
    lettre = input("Propose une lettre : ").strip().lower()
    while not lettre_valide(lettre, proposees):
        lettre = input("Propose une lettre : ").strip().lower()
    return lettre


def mot_trouve(mot, proposees):
    """Renvoie True si toutes les lettres du mot ont été proposées."""
    for lettre in mot:
        if lettre not in proposees:
            return False
    return True


def jouer():
    """Joue une partie du mot mystère."""
    mot = choisir_mot(MOTS)
    proposees = []
    erreurs = 0
    while erreurs < ERREURS_PERMISES:
        print(afficher_mot(mot, proposees))
        lettre = demander_lettre(proposees)
        proposees.append(lettre)
        if lettre in mot:
            print("Bien vu !")
            if mot_trouve(mot, proposees):
                print(f"Gagné ! Le mot était {mot}.")
                return
        else:
            erreurs = erreurs + 1
            print(f"Raté ! Erreurs : {erreurs} sur {ERREURS_PERMISES}")
    print(f"Perdu ! Le mot était {mot}.")


print("=== Le mot mystère ===")
rejouer = "oui"
while rejouer == "oui":
    jouer()
    rejouer = input("Veux-tu rejouer ? (oui/non) ").strip().lower()
print("Merci d'avoir joué !")

Testé avec le plan de jeudi : victoire, défaite, lettre répétée, R majuscule, saisie vide, ro, ␣o␣ avec espaces, et une deuxième partie après « oui ». Le nombre d'erreurs permises est rangé dans une valeur fixe, ERREURS_PERMISES (voir épisode 13) : pour un jeu plus facile, une seule ligne à changer.

Boîte à outils interactive · Enregistrée dans ce navigateur
[3]Carrousel final

🎨 Carrousel final — Pro

[4]Journal

✍️ Journal de bord — mot de la fin

Qu'as-tu ressenti quand quelqu'un d'autre a joué à ton jeu ? Qu'ajouterais-tu en premier si tu avais une semaine de plus ?

✦ CRÉATRICE · CRÉATEUR DE JEUX · SEMAINE 4 ✦

Bravo ! Tu as terminé la semaine 4. Tu sais trouver un bug qui se cache, suivre un programme pas à pas et tester un jeu comme un vrai joueur.

[5]Certificat

🎓 Ton certificat

Le certificat s'affiche lorsque les 20 épisodes sont marqués comme terminés.

COLLECTION « CHALLENGES » · APPRENDRE À CODER EN PYTHON

Certificat de réussite

Ce certificat atteste que

—

a terminé les épisodes du Pro — Mon premier jeu en Python
et atteint le niveau Créatrice · Créateur de jeux.

Ce que ce parcours couvre : boucles for et while, chaînes et f-strings, listes, modules random, math et turtle, fonctions, lisibilité (PEP 8, docstrings), débogage, débogueur et plan de test.

Annexe · Kit de rattrapage et glossaire
ARattrapage

Tu démarres le Pro sans avoir suivi le Boost ? Voici, en une ligne chacune, les notions supposées acquises.

  • Programme et langage — un programme est une suite d'instructions exécutées dans l'ordre, de haut en bas ; Python les écrit en texte (Boost, épisode 1).
  • Des blocs au texte — « dire » devient print, « demander » devient input, l'emboîtement devient les deux-points et 4 espaces (Boost, épisode 1).
  • Lancer un programme — dans Basthon, Capytale ou Thonny ; console pour essayer, script pour écrire (Boost, épisode 2).
  • Lire une erreur — quelle ligne ? quel type (dernière ligne) ? qu'est-ce qui manque (les ^) ? (Boost, épisode 2).
  • Variables et types — = range une valeur ; nombres entiers, à virgule, texte, vrai/faux (Boost, épisode 3).
  • Conversions et calculs — input renvoie du texte ; int(input(...)) pour un nombre ; priorités des maths (Boost, épisode 3).
  • Conditions — == compare ; if / elif / else testés dans l'ordre (Boost, épisode 3).
  • Une question, un test — ajouter peu de code à la fois, et tester une bonne et une mauvaise réponse (Boost, épisode 4).
BGlossaire
Boucle
instructions répétées. for pour un nombre de tours connu, while tant qu'une condition est vraie.
Tour (ou itération)
un passage dans le corps d'une boucle.
Boucle infinie
boucle dont la condition reste toujours vraie ; le programme ne s'arrête plus.
Chaîne de caractères (str)
un texte, suite de caractères numérotés à partir de 0.
Méthode
outil qui s'écrit après une valeur, avec un point : mot.lower().
f-string
texte précédé de f, où ce qui est entre accolades est remplacé par sa valeur.
Liste
plusieurs valeurs rangées dans l'ordre, entre crochets.
Indice
numéro d'un élément dans une liste ou d'un caractère dans un mot ; le premier est 0, le dernier -1.
Module
boîte à outils fournie avec Python, chargée avec import (random, math, turtle).
Pseudo-aléatoire
nombre produit par un calcul qui imite le hasard.
Fonction
morceau de code nommé, défini avec def et appelé avec des parenthèses.
Paramètre
boîte d'une fonction qui reçoit une valeur à l'appel.
Valeur renvoyée
résultat donné au programme par return ; None s'il n'y a pas de return.
Variable locale
variable créée dans une fonction, qui n'existe que pendant l'appel.
Docstring
phrase entre triples guillemets, sous le def, qui dit ce que fait la fonction.
PEP 8
le guide officiel de style du code Python.
Bug
erreur dans un programme ; bug silencieux : le programme tourne mais donne un mauvais résultat.
print de contrôle
affichage provisoire pour voir la valeur d'une variable pendant l'exécution.
Débogueur
outil qui exécute un programme pas à pas et montre ses variables.
Plan de test
liste de parties à jouer, avec ce qu'on tape et ce qu'on attend.