Coder en Python¶
Le code nécessaire à la réalisation du projet Go Fast a été écrit en micropython. Vous trouverez ci-dessous :
Le code, étape par étape¶
Initialisation du programme¶
Incluons la bibliothèque Micro:bit et la bibliothèque
randompour générer de l’aléa :from microbit import * import random
Il y a dans ce jeu différents états. Initialement, le programme commence à l’état 0.
Note
L’utilisation de la variable
etatpermet de naviguer entre différent moment du programme.etat = 0: le jeu est en attente d’une partie. On quitte cet état en pressant le bouton A ou Betat = 1: le compte à rebours se lance. 3 secondes plus tard, on passe automatiquement à l’état 2.etat = 2: la partie est en cours. Une pression sur le bouton A ou B permet de passer à l’état 3.etat = 3: l’écran indique le bouton gagnant puis passe automatiquement à l’état 0.
etat = 0
La variable
victoirestocke le nom du bouton gagnant. Cette variable est un texte qui peut valoir"A"ou"B". En début de partie, nous l’initialisons à un texte vide :victoire = ""
Astuce
Pour faire une pause d’une certaine durée, il n’est parfois pas recommandé d’utiliser la commande
sleep.En effet,
sleepempêche l’exécution de toutes les autres directives du programme durant cette pause.Il est préférable de déterminer une durée depuis un temps de référence et de tester, à chaque boucle d’itération la durée écoulée.
Pour cela, il faudra utiliser la commande
runing_time().Dans ce programme, il faut parvenir à déterminer une durée. Pour cela, nous allons utiliser la commande
running_time()qui retourne la durée depuis laquelle le Micro:bit est sous tension.Après avoir initialisé notre temps de référence
t0(au démarrage du micro:bit ou en appuyant sur un bouton), nous calculerons la différencerunning_time() - t0qui déterminera la durée.Initialisons
t0t0 = running_time()
Pour déterminer une durée, définissons la fonction
chrono().La durée écoulée entre le temps de référence
t0et le moment de l’appel de la fonction.def chrono(t0): t1 = running_time() duree = t1-t0 return duree
Enfin, affichons à l’écran une image pour indiquer le programme est en attente.
display.show(Image.HEART_SMALL)
Boucle¶
Avertissement
Lorsqu’un objet connecté est mis sous tension, le programme s’exécute après une brève phase d’initialisation.
S’il n’y a pas de boucle, le programme ne s’exécute qu’une seule fois puis… plus rien!
En fait, un objet connecté est en permanence en train d’attendre que quelque chose se passe : un bouton pressé, un geste, une certaine température, luminosité ou autres.
Un peu comme votre clavier qui attend en permanence que vous appuyiez sur une touche.
C’est pour cela qu’il est nécessaire d’exécuter une boucle infinie qui met le microcontrôleur en état d’attente.
La phase de configuration est terminée. Passons maintenant à la boucle qui… tourne en boucle.
while True:
Configurons l’état
0du programme qui attend que l’un des joueurs presse son bouton.Lorsqu’un bouton est pressé, il faut initialiser le temps de référence
t0puis changer d’état. La pausesleep(250)permet d’éviter un double-clic du bouton qui entraînerait la fin prématurée de la partie.if etat == 0: if button_a.is_pressed() or button_b.is_pressed(): # remise à zéro de la durée de la partie t0 = running_time() etat = 1 sleep(250)
Il est temps de relever la durée écoulée depuis le temps de référence.
duree = chrono(t0)
L’état
1affiche le compte à rebours.if etat == 1:
Mais attention, si un joueur presse un bouton dans cet état, la partie est immédiatement perdue (et on passe alors à l’état
3sans passer par la case Départ).if button_a.is_pressed(): victoire = "B" etat = 3 if button_b.is_pressed(): victoire = "A" etat = 3
Affichons le compte à rebours (sans oublier que les durées sont en millisecondes).
if duree < 1000: display.show("3") elif duree < 2000: display.show("2") elif duree < 3000: display.show("1") else:
Puis après les 3 secondes, on va effacer l’écran, déterminer une durée d’attente au hasard, choisir une image au hasard et enfin passer à l’état
2.else: display.clear() attente = duree + random.randint(500, 5000) imageAuHasard = random.choice(Image.ALL_CLOCKS) etat = 2
L’état
2est le jeu à proprement dit. Le plus rapide des joueur à presser son bouton sera enfin déclaré vainqueur.if etat == 2:
Mais attention, si un joueur clique avant la durée d’attente alors son adversaire gagne immédiatement (et on passe alors à l’état
3).if duree < attente: if button_a.is_pressed(): victoire = "B" etat = 3 if button_b.is_pressed(): victoire = "A" etat = 3
Une fois que la durée a dépassée l’attente souhaitée, alors là le plus rapide gagne.
if duree > attente: display.show(imageAuHasard) if button_a.is_pressed(): victoire = "A" etat = 3 if button_b.is_pressed(): victoire = "B" etat = 3
L’état
3permet d’indiquer le vainqueur.if etat == 3:
D’abord une petite animation pour le suspens.
for i in range(5): display.show(Image.HEART_SMALL) sleep(100) display.show(Image.HEART) sleep(100)
Puis enfin le vainqueur. Nous allons utiliser une flèche pointant vers le bouton en question. La flêche Ouest qui pointe le bouton de gauche (A) et la flêche Est qui pointe le bouton B de droite.
if victoire == "A": display.show(Image.ARROW_W) if victoire == "B": display.show(Image.ARROW_E) etat = 0
Pour finir, une pause qui ne fait pas de mal (peut être même que ça économise les piles…).
sleep(100)
Le code final¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | # -*- coding: utf-8-*-# Encoding cookie added by Mu Editor
# code utilisé pour l'atelier colloque C2i collège
# auteur : groupe InEFLP IREM de Marseille
from microbit import *
import random
# différente ETAT du jeu
# si etat == 0 : attente du début de partie (A ou B)
# si etat == 1 : compte à rebours
# si etat == 2 : en cours de partie
# si etat == 3 : affichage du gagnant
etat = 0
# victoire == "A" : bouton A gagne
# victoire == "B" : bouton B gagne
# victoire == "" : personne
victoire = ""
# fonction CHRONO qui sert de chronomètre
# retourne la durée écoulée depuis
# l'instant t0
t0 = running_time()
def chrono(t0):
t1 = running_time()
duree = t1-t0
return duree
display.show(Image.HEART_SMALL)
while True:
if etat == 0:
if button_a.is_pressed() or button_b.is_pressed():
# remise à zéro de la durée de la partie
t0 = running_time()
etat = 1
sleep(250)
# duree de la partie
duree = chrono(t0)
if etat == 1:
# si les joueurs sont trop pressés, ils perdent…
if button_a.is_pressed():
victoire = "B"
etat = 3
if button_b.is_pressed():
victoire = "A"
etat = 3
# affichage du compte à rebours
if duree < 1000:
display.show("3")
elif duree < 2000:
display.show("2")
elif duree < 3000:
display.show("1")
else:
# initialisation d'une partie
#
# effacer écran
display.clear()
# attente et image aléatoire
attente = duree + random.randint(500, 5000)
imageAuHasard = random.choice(Image.ALL_CLOCKS)
etat = 2
if etat == 2:
# si les joueurs sont trop pressés, ils perdent…
if duree < attente:
if button_a.is_pressed():
victoire = "B"
etat = 3
if button_b.is_pressed():
victoire = "A"
etat = 3
# détermination du plus rapide des 2 joueurs
if duree > attente:
display.show(imageAuHasard)
if button_a.is_pressed():
victoire = "A"
etat = 3
if button_b.is_pressed():
victoire = "B"
etat = 3
if etat == 3:
# petite animation pour le suspens
for i in range(5):
display.show(Image.HEART_SMALL)
sleep(100)
display.show(Image.HEART)
sleep(100)
# affichage du gagnant
if victoire == "A":
display.show(Image.ARROW_W)
if victoire == "B":
display.show(Image.ARROW_E)
etat = 0
sleep(100)
|