Jeu Pierre Papier Ciseaux connecté avec microbit
Rappel de la règle du jeu Pierre Papier Ciseaux
L'objectif et le mécanisme de jeu est simple, il faut affronter un ou plusieurs adversaires en utilisant l'une des trois “armes”: la pierre, la feuille ou la paire de ciseaux.
|
Le jeu "Pierre Papier Ciseaux" avec la micro:bit
Il faut au moins deux joueurs assis l'un près de l'autre. Chacun dispose d'une carte micro :bit. Les joueurs secouent (modérément) la carte micro:bit, et cette dernière (après réflexion) va afficher le symbole de la pierre , de la feuille de papier ou des ciseaux. Le gagnant est désigné lorsque son choix correspond à une des règles énoncées ci-avant. L'affichage de la carte micro:bit est très limité, il correspond à une image de 5 pixels de coté. Voici les trois images correspondantes aux trois objets que l'on désire afficher (Pierre, Papier et Ciseaux). |
Créer un nouveau programme nommé ppc1.py, l'enregistrer dans le même dossier que le précédent avec le code source ci-dessous.
Compléter le programme, (les images CISEAUX et PIERRE sont à faire après avoir étudié l'image PAPIER), la fonction qui permet de tester le "secouage" de la carte est : accelerometer.is_gesture('shake')
Transférer ce programme sur la carte.
Tester et vérifier le fonctionnement.
# SI la microbit est secouée# elle tire au hasard un chiffre entre 1 et 3# SI le chiffre est 1 :# AFFICHE(symbole PIERRE)# SI le chiffre est 2 :# AFFICHE(symbole PAPIER)# SI le chiffre est 3 :# AFFICHE(symbole CISEAUX)# #########################################################from microbit import *
import random
PIERRE = Image ('*****:''*****:''*****:''*****:''*****')
PAPIER = Image ('99999:''90009:''90009:''90009:''99999')
CISEAUX = Image('*****:''*****:''*****:''*****:''*****')
while True:
if accelerometer.is_gesture('shake'): # détection du secouage de la carte
tirage = random.randint(1,3) # tirage est une variable qui vaudra 1, 2 ou 3
if tirage==1:
display.show(PIERRE)#Affichage de l'image PIERRE
if ...........?:
..............?if ...........?:
..............?Exemple : Un jeu Pierre-Papier-Ciseaux connecté
Nous allons utiliser une fonction intéressante de la carte micro:bit, la liaison radio. Deux cartes pouvant communiquer entre elles par ondes radio, nous allons voir comment nous pouvons jouer à distance avec un adversaire. Pour cela, les cartes doivent émettre sur le même canal (un nombre compris entre 1 et 25). Chaque binôme devra tirer dans un chapeau un papier sur lequel sera inscrit un nombre . Si le groupe comporte 24 élèves, il y aura 12 papiers comportant un nombre compris entre 1 et 12., comme cela chacun aura un et un seul partenaire. |
Le programme comportera 2 parties : dans la première partie, les deux joueurs doivent signaler qu'ils relèvent le défi de l'adversaire et qu'ils sont prêt à en découdre. Dans la deuxième partie, c'est l'affrontement sauvage proprement dit.
Au départ, un "X" clignote sur les micro:bits et les deux voyants sur le PC sont au rouge, Afin de signaler qu'ils sont prêts, les joueurs doivent appuyer sur le bouton A, ce qui fait passer le voyant local au vert, ainsi que le voyant vert visiteur de l'adversaire. A partir de ce moment, le deuxième joueur a 10 secondes pour appuyer sur son bouton, faute de quoi les voyants repassent au rouge et tout est à refaire.
Lorsque les deux voyants sont au vert, les "X" disparaissent, les joueurs ont alors 10 s pour secouer la carte (encore une fois avec modération), le résultat du tirage s'affiche sur la micro:bit et sur les écrans, et est transmis à l'adversaire. Le score est alors rafraîchi. Si au bout de 10 s, les deux joueurs n'ont pas secoué la carte, les voyants repassent au rouge, on revient au départ, sans modification du score.
Les cartes micro:bit sont communicantes, elles peuvent envoyer des informations au PC sur lequel elles sont connectées grâce à la liaison USB. Elles peuvent envoyer une chaîne de caractères (type string), l'instruction python est alors : print("info à envoyer")
Elles peuvent aussi envoyer une chaîne de caractères à une autre carte micro:bit connectée sur le même canal, l'instruction est alors : radio.send("info à envoyer"). Pour recevoir un message radio, l'instruction est : data = radio.receive(). Si aucun message n'est reçu, data vaut None, sinon data prends pour valeur la chaîne de caractères qui a été envoyée.
Méthode : Installation du logiciel
Entrer dans le répertoire SNT_info_Embarquée, et lancer le programme START3.bat (cela a pour effet de lancer la partie virtuelle à programmer), normalement vous n'aurez plus besoin de le relancer par la suite, car à chaque modification du programme, il suffira de cliquer sur le jeu et d'appuyer sur la touche "R" (comme redémarrage) pour réinitialiser le système.
Méthode : Programmation de la carte Micro:bit
Lancer l'environnement de programmation « Mu » depuis le bureau et sélectionner le mode « BBC micro:bit ».
Nous programmerons la carte avec le langage Python et son module micro:bit.
Gestion du chronomètre :
Pour déclencher le chrono, il faut initialiser la variable T0 : T0=running_time(), "running_time()" est le temps écoulé en ms depuis le démarrage du programme. Pour connaître le temps écoulé depuis le déclenchement du chrono, il suffit de soustraire T0 à "running_time()". Exemple : pour effectuer une action 5,2 s après le déclenchement du chrono : if running_time()-T0>5200 : Action
Gestion des pauses :
à ne pas confondre avec le chronomètre, l'instruction sleep(2500) arrête le programme 2,5 s.
Gestion du tirage Pierre, Papier, Ciseaux :
Pour tirer de manière aléatoire une chaîne de caractères, dans une liste de chaîne de caractère, on crée une liste, par exemple : liste=["Bonjour", "Hello", "Buongiorno", "Kaixo"], on importe la bibliothèque random : import random, et on lance le tirage : tirage = random.choice(liste) , à l'issue de cette instruction, tirage a pris pour valeur par exemple "Hello".
Copier le programme ci-dessous et compléter-le.
Lorsque vous aurez terminé faire valider et demander la correction.
Sauvegarder votre programme sous le nom ppc2.py.
# Ecrit ton programme ici ;-)from microbit import *
import radio
import random
radio.on()
radio.config(channel=1) # Choix du canal de communication (entre 1 et 25)
radio.config(power=7)
uart.init(baudrate=9600)
PAPIER = Image("99999:""90009:""90009:""90009:""99999")
CISEAUX = Image('99009:''99090:''00900:''99090:''99009')
PIERRE = Image('00000:''09990:''09990:''09990:''00000')
display.scroll("SNT")
ready_joueur_local=False
ready_joueur_visiteur=False
X= Image('*****:''*****:''*****:''*****:''*****')# A compléter pour afficher un X
T0=0
mon_prenom="Juliette" #A moins que tu ne t'appelle Juliette, change le prénom
while True:
while ready_joueur_local == False or ready_joueur_visiteur == False: #Tant que les 2 joueurs n'ont pas appuyé sur A
data=radio.receive() # La carte ecoute la radio
if data: # Si un message est reçu
ready_joueur_visiteur = True #C'est que le joueur visiteur est prêt
print(data) # La carte envoie l'info à son PC, qui va inscrire son prénom et passer le voyant au vert
T0=running_time() # On déclenche le chrono
if button_a.is_pressed() and ready_joueur_local==False: #Si Le bouton A est appuyé
ready_joueur_local=True #C'est que le joueur local est prêt
radio.send("visiteur="+mon_prenom) # Il previent son adversaire par radio
print("local="+mon_prenom) # Et aussi son PC
T0=running_time() # On déclenche le chrono
...........? #On fait clignoter l'image "X" sur l'afficheur
...........? #tempo 0,25s
...........? ...........?if running_time()-T0>10000: # Si au bout de 10s les 2 joueurs ne sont pas prêts
ready_joueur_local=False #On réinitialise
ready_joueur_visiteur=False
# Arrivé ici, c'est que les deux joueurs sont prêts, ils ont 10s pour secouer la carte...............? # On redéclenche le chrono
while ready_joueur_local == True or ready_joueur_visiteur == True: #Tant que les 2 joueurs n'ont pas secoué la carte
...................? # La carte ecoute la radio
if ......?: #Si un message est reçu
print(data) # On envoie le tirage de l'adversaire au PC
son_tirage=data[16:] # On stocke le tirage adverse dans la variable son_tirage
ready_joueur_visiteur=False # Le joueur 2 a joué
if accelerometer.is_gesture('shake') and ready_joueur_local==True: #Si la carte est secouée...
liste=........................? # On crée une liste de 3 chaînes, voir ci-dessous pour les trouver
while accelerometer.is_gesture('shake'): #tant qu'on secoue la carte...
...............? # On tire au hasard dans la liste et on affiche le tirage
if mon_tirage=="PIERRE": display.show(PIERRE)
if mon_tirage=="PAPIER": display.show(PAPIER)
if mon_tirage=="CISEAUX": display.show(CISEAUX)
# Le "secouage" s'est arrété... ........?("tirage visiteur=" + mon_tirage) # La carte envoie mon tirage à l'adversaire
........?("tirage local=" + mon_tirage) # Elle l'envoie aussi à son PC
ready_joueur_local=False #Le joueur 1 a joué
if .......................: # Si au bout de 10s les 2 joueurs n'ont pas secoué la carte
ready_joueur_local=False # On réinitialise
ready_joueur_visiteur=False
if ready_joueur_local==False and ready_joueur_visiteur==False: # Lorsque les deux joeurs ont joué
sleep(10000) # On fait une pause de 10s
Complément : Nouvelle fonctionnalité
Nous allons rajouter une nouvelle fonctionnalité : lorsque le joueur a perdu, on affichera un visage triste, et heureux dans le cas contraire.
Pour cela nous allons utiliser les mot clés and et or.
Dans le programme précédent, nous allons supprimer les instructions suivantes :
if ready_joueur_local==False and ready_joueur_visiteur==False: # Lorsque les deux joeurs ont joué
sleep(10000) # On fait une pause de 10s
et les remplacer par les instructions ci-dessous à compléter :
(les caractères "\" servent à aller à la ligne)
Compléter le programme, transférer-le dans la carte et tester.
if ready_joueur_local==False and ready_joueur_visiteur==False: # Lorsque les deux joeurs ont joué
.............? #pause de 5s
if son_tirage=="PIERRE" and mon_tirage=="CISEAUX"\
or ........................................... \
or ............................................:
display.show(Image.SAD) # Affichage visage triste
elif ........................................... \
or ........................................... \
or ........................................... :
display.show(Image.HAPPY) # Affichage visage gai
.............? #pause de 5s









