Projet : un mini-jeu Plus ou moins
Créez un compte gratuit pour suivre votre avancement et reprendre où vous avez laissé.
Créer un compteOn arrive au bout des tutos Scratch du collège. Pour mettre en pratique tout ce qu'on a vu, on va construire un vrai mini-jeu : le classique « Plus ou moins ». Scratch tire un nombre secret entre $1$ et $100$, et le joueur doit le deviner en le moins de coups possible. C'est un projet court mais qui mobilise six briques différentes — toutes celles des tutos précédents.
Le cahier des charges
Avant de programmer, il faut décrire précisément ce que le jeu doit faire. C'est le réflexe à avoir pour tout projet, et c'est aussi ce qu'on attend au brevet quand on demande de modifier un programme : avoir d'abord le scénario en tête.
| Scratch choisit en secret un nombre entier au hasard entre $1$ et $100$ | la cible |
| Le joueur tape un nombre au clavier | une proposition |
| Si la proposition est plus petite que la cible, Scratch dit « Plus grand ! » | indice |
| Si la proposition est plus grande que la cible, Scratch dit « Plus petit ! » | indice |
| Si la proposition est égale à la cible, le jeu s'arrête | victoire |
| À la fin, Scratch indique le nombre de coups joués | score |
Ce scénario mobilise six briques qu'on a déjà toutes croisées dans les tutos précédents :
| Brique | Quand | Tuto où on l'a vue |
|---|---|---|
| Variables | Pour stocker la cible, la proposition, le nombre d'essais | Variables et compteurs |
| Hasard | Pour tirer la cible | Le hasard en Scratch |
| Saisie utilisateur | Pour récupérer la proposition tapée au clavier | Si… alors (bloc demander) |
| Conditions imbriquées | Pour distinguer les trois cas (plus petit / plus grand / égal) | Si… alors |
| Compteur | Pour compter les essais | Variables et compteurs |
| Boucle conditionnelle | Pour répéter jusqu'à ce que le joueur trouve | nouveau dans ce tuto |
Les variables
On déclare trois variables (catégorie Variables → bouton Créer une variable) :
| cible | le nombre secret à deviner |
| proposition | la valeur tapée par le joueur au tour courant |
| essais | compteur du nombre de propositions |
Au lancement de la partie (drapeau vert), on initialise les trois variables :
Initialisation
La cible est tirée une seule fois, au début de la partie. Les deux autres variables sont mises à $0$ — on les fera évoluer au fil des essais.
Remarque
Pourquoi initialiser proposition à 0 ? Parce que la valeur initiale ne doit pas être égale à la cible. Comme la cible est entre $1$ et $100$, mettre proposition à $0$ garantit qu'on entrera bien dans la boucle pour demander un premier nombre.
La boucle principale
La boucle qui va piloter le jeu doit répéter une action jusqu'à ce que la proposition soit égale à la cible. Scratch a un bloc fait exactement pour ça, dans la catégorie Contrôle : répéter jusqu'à. Il s'utilise comme répéter $N$ fois, sauf qu'on lui donne une condition (bloc hexagonal) au lieu d'un nombre.
| répéter jusqu'à … | Répète le bloc interne, et s'arrête dès que la condition placée dans l'encoche hexagonale devient vraie |
Le squelette est donc :
Squelette de la boucle
À chaque tour : on demande un nombre, on le stocke dans proposition, on incrémente essais de $1$. Quand le joueur tape la bonne valeur, la condition proposition = cible devient vraie et la boucle s'arrête immédiatement.
Attention
Attention au sens de la condition : répéter jusqu'à s'arrête quand la condition devient vraie (c'est l'inverse d'un tant que). Ici, on veut sortir quand la proposition est égale à la cible, donc la condition à mettre est bien proposition = cible.
Indiquer plus grand ou plus petit
Pour l'instant, le joueur tape des nombres « à l'aveugle ». On ajoute maintenant l'indice : après chaque proposition, Scratch indique si elle est plus petite ou plus grande que la cible. On utilise pour ça une instruction conditionnelle si … alors … sinon (cf. tuto Si… alors).
Trois cas se présentent : proposition > cible, proposition < cible, ou proposition = cible. Comme on est déjà à l'intérieur de répéter jusqu'à proposition = cible, le troisième cas ne demande aucune action : la boucle va sortir au prochain test. Il reste deux cas à distinguer.
Boucle complète avec les indices
Le bloc si … alors … sinon est imbriqué dans son propre sinon — c'est une technique classique quand on veut distinguer plus de deux cas. Si la proposition est plus grande, on dit « Plus petit ! » ; sinon (donc elle est plus petite ou égale), on regarde si elle est strictement plus petite et on dit « Plus grand ! » ; le dernier cas (égalité) ne déclenche aucun message car la boucle va sortir.
Annoncer la fin et le score
Une fois la boucle terminée, le joueur a trouvé. Il reste à annoncer la victoire et le nombre d'essais joués. Pour assembler du texte et la valeur d'une variable dans un seul message, on utilise le bloc regroupement (catégorie Opérateurs, bloc rond avec deux champs).
Programme complet
?

Remarque
Stratégie optimale et dichotomie. La meilleure stratégie pour ce jeu est de toujours proposer le milieu de l'intervalle restant : à chaque essai, on divise par $2$ le nombre de valeurs possibles. C'est la dichotomie.
Pour $100$ valeurs au départ : après $1$ essai il reste $\leq 50$ valeurs, après $2$ essais $\leq 25$, après $3$ essais $\leq 13$, puis $7$, $4$, $2$, $1$. En $7$ essais maximum on tombe forcément sur la cible (car $2^7 = 128 > 100$). Plus généralement, pour deviner un nombre entre $1$ et $N$, il faut au plus $\log_2(N)$ essais — un grand classique des questions algorithmiques.
Récapitulatif
| Brique | Bloc Scratch utilisé |
|---|---|
| Variable globale | mettre … à … |
| Compteur | ajouter à … 1 |
| Hasard | nombre aléatoire entre … et … |
| Saisie clavier | demander … et attendre + réponse |
| Boucle conditionnelle | répéter jusqu'à … |
| Conditions imbriquées | si … alors … sinon dans si … alors … sinon |
| Comparaison | … = …, … > …, … < … |
| Concaténation de texte | regroupe … et … |
À toi de jouer
Le jeu actuel est patient : si le joueur tape mal, il peut continuer indéfiniment. Modifier le programme pour limiter à $7$ essais. Au-delà, le jeu doit afficher « Perdu ! La cible était (cible) ».
Pistes :
- Ajouter une variable essaisMax initialisée à $7$.
- Changer la condition de sortie : la boucle s'arrête quand proposition = cible ou essais $\geq$ essaisMax.
- Après la boucle, si proposition est toujours différente de cible, dire « Perdu ! La cible était (cible) » ; sinon dire « Bravo ! Trouvé en (essais) coups. ».
Corrigé
On ajoute une variable essaisMax (= $7$). La condition de sortie de la boucle combine deux tests avec l'opérateur logique ou (catégorie Opérateurs).
Le test essais > 6 devient vrai dès qu'on a fait $7$ propositions infructueuses (puisqu'on incrémente essais à chaque tour avant le test). On peut aussi écrire essais = essaisMax, qui revient au même.
?
Astuce
Variante de niveau 2 — Le fichier ci-dessous propose une variante avec borne configurable : Scratch commence par demander la borne maximale au joueur (par exemple $50$ pour un jeu plus court, $500$ pour un défi plus long), puis tire la cible entre $1$ et cette borne. Tout le reste du programme reste identique.
?
Remarque
C'est la fin de la série Tutos Scratch du collège. Pour faire le point sur les notions algorithmiques attendues au brevet, consulter le cours Scratch et algorithmes (3e). Les sept tutos précédents restent accessibles à tout moment depuis le menu Tutos de la barre supérieure.