TP micro:bit — Vers le jeu final

Denis Dréano
PROG4-05

TP micro:bit — Vers le jeu final

Objectifs cantonaux : ROBO-1, ROBO-2, ROBO-3 (rattachés à O1.5, O1.6). Semaine dédoublée (×2, groupes A/B séparés).

Cours complet sur la plateforme Runestone de Cédric Donner : TP micro:bit — le jeu.

Vous avez maintenant tous les outils nécessaires (while, break, boutons, pixels, fonctions) pour programmer un petit jeu complet sur le micro:bit.

Attendre un appui sans rien faire d’autre

▷ Motif — bloquer jusqu’à un appui

Le motif while True + break permet aussi de bloquer un programme jusqu’à ce qu’un évènement précis se produise, puis de continuer.

→ Exemple 1 — attendre un bouton
from microbit import *

def wait_press(button):
    while True:
        if button.was_pressed():
            break
        sleep(100)

wait_press(button_a)
display.show(Image.HAPPY)

L’accéléromètre

Le micro:bit contient un accéléromètre, un capteur qui détecte son inclinaison et ses mouvements.

◈ Syntaxe — Accéléromètre

accelerometer.current_gesture()   # renvoie 'up', 'down', 'left', 'right', 'shake', ...
accelerometer.get_x()             # accélération gauche-droite (négatif = gauche)
accelerometer.get_y()             # accélération avant-arrière (négatif = arrière)

Exercice 1 — déplacer un pixel avec l’accéléromètre

En reprenant le programme de la semaine dernière (déplacement d’un pixel avec les boutons), remplacez les boutons par l’accéléromètre : le pixel doit se déplacer dans la direction où vous inclinez le micro:bit.

from microbit import *

x = 2
y = 2
display.set_pixel(x, y, 9)

while True:
    if accelerometer.current_gesture() == 'left':
        x -= 1
    elif accelerometer.current_gesture() == 'right':
        x += 1
    elif accelerometer.current_gesture() == 'up':
        y -= 1
    elif accelerometer.current_gesture() == 'down':
        y += 1

    display.clear()
    display.set_pixel(x, y, 9)
    sleep(200)

Le jeu : atteindre un but

Le but du jeu : partant du centre de l’écran, atteindre une position cible tirée au hasard, en inclinant le micro:bit. Vous allez le construire étape par étape.

▷ Étape 1 — les variables du jeu

Quatre variables globales :

  • x, y : position du joueur (au centre au départ)
  • but_x, but_y : position du but (aléatoire, avec randint(0, 4))

Affichez le joueur à intensité maximale et le but à faible intensité (par exemple 2).

▷ Étape 2 — déplacement en continu

Avec une boucle while True, faites en sorte que le pixel du joueur se déplace selon l’inclinaison détectée par l’accéléromètre (comme à l’exercice 1).

▷ Étape 3 — victoire ou défaite

Après chaque déplacement, testez :

  • si le joueur est sorti de l’écran (\(x\) ou \(y\) en dehors de 0..4) → manche perdue,
  • si le joueur est arrivé au but (\(x\) == but_x et \(y\) == but_y) → manche gagnée.

Affichez une image différente pour chaque cas.

▷ Étape 4 — recommencer une manche

Écrivez une fonction nouvelle_manche() qui réinitialise les positions du joueur et du but (utilisez global pour modifier les variables globales depuis la fonction).

▷ Étape 5 — le score

Ajoutez une variable score. Chaque manche gagnée rapporte un point ; une manche perdue remet le score à zéro. La partie est gagnée à 5 points.

Solution complète (à consulter après avoir essayé)

from microbit import *
from random import randint

def nouvelle_manche():
    global x, y, but_x, but_y
    x = 2
    y = 2
    but_x = randint(0, 4)
    but_y = randint(0, 4)

nouvelle_manche()
score = 0

while True:
    if accelerometer.current_gesture() == 'left':
        x -= 1
    elif accelerometer.current_gesture() == 'right':
        x += 1
    elif accelerometer.current_gesture() == 'up':
        y -= 1
    elif accelerometer.current_gesture() == 'down':
        y += 1

    if x > 4 or x < 0 or y > 4 or y < 0:
        display.show(Image.SAD)
        score = 0
        sleep(500)
        nouvelle_manche()
    elif x == but_x and y == but_y:
        score += 1
        if score >= 5:
            display.show(Image.HAPPY)
            sleep(1000)
            score = 0
        nouvelle_manche()

    display.clear()
    display.set_pixel(x, y, 9)
    display.set_pixel(but_x, but_y, 2)
    sleep(500)

À vous de jouer

Améliorez le jeu si vous en avez le temps : augmenter la vitesse à chaque manche gagnée, ajouter une mise en pause avec le bouton A, ou inventer un nouveau jeu avec les mêmes briques (boutons, pixels, accéléromètre, while True, break).

Devoir donné par Cédric

Terminer le jeu micro:bit (au minimum les étapes 1 à 4).