P2E-FAST-GAME
Fast Game
Ce jeu du plus rapide se joue à deux joueurs.
Le but de chaque joueur étant de presser le plus rapidement possible son bouton une fois que le signal sonore est émis.
La LED du vainqueur clignotera avec un petite mélodie de victoire.
A noter que si un joueur presse son bouton avant le signal sonore alors ce dernier est automatiquement perdant (accompagné d'une petite mélodie funèbre).
Déroulement d'une partie
Le déroulement d'une partie est décrit par le diagramme ci-dessous:
Brancher
Réaliser les branchements suivants:
Pico | Pico-2-Explorer |
GP28 | LED Rouge |
GP27 | Led Orange |
GP26 | LED Verte |
GP21 | Bouton 3 |
GP20 | Bouton 2 |
GP19 | Bouton 1 |
GP13 | Buzzer |
Code
Le script fastgame.py est disponible dans le dépôt dédié au Pico-2-Explorer.
Ce dernier est repris-ci dessous avec quelques commentaire sur son fonctionnement.
1 from micropython import const
2 from random import randint
3 from machine import Pin
4 from rtplay import *
5 import time
6
7 START_SONG = "Counter Strike - Time Bomb : d=4,o=5,b=100:16c#7,8p,16c#7,8p,16c#7,8p,16c#7"
8 WIN_SONG = "Black Robb - Whoa : d=4,o=5,b=100:16g,16p,16g6,16a#6,16a6,16a#6,16g6,16p,16g,16p,16g6,16a#6,16a6,16a#6,16g6"
9 LOOSE_SONG = "dark:d=4,o=5,b=140:8f#6,8e6,2f#6,16e6,16d#6,16d6,16b,a#,1b"
10
11 class Blinky:
12 """ Just handle LED with blink state """
13 FIXED = const( 0 )
14 BLINK_SLOW = const( 500 ) # 500 ms
15 BLINK_FAST = const( 200 ) # 200 ms
16
17 def __init__( self, pin ):
18 self.pin = pin
19 self.off()
20
21 def on( self ):
22 self.interval = self.FIXED
23 self.last_update = time.ticks_ms()
24 self.pin.value( True )
25
26 def off( self ):
27 self.interval = self.FIXED
28 self.last_update = time.ticks_ms()
29 self.pin.value( False )
30
31 def blink( self, fast=False ):
32 self.interval = self.BLINK_FAST if fast else self.BLINK_SLOW
33 self.last_update = time.ticks_ms()
34 self.pin.value( True )
35
36
37 def update( self ):
38 if self.interval == self.FIXED:
39 return
40 if time.ticks_diff( time.ticks_ms(), self.last_update ) < self.interval:
41 return
42 self.pin.toggle()
43 self.last_update = time.ticks_ms()
44
45
46 # === Player 1 / Joueur 1 =================================
47 led1 = Blinky( Pin( Pin.board.GP28, Pin.OUT ) )
48 btn1 = Pin( Pin.board.GP19, Pin.IN, Pin.PULL_UP )
49 first_btn1 = None # first time btn1 was pressed
50 def btn1_pressed( obj ):
51 global first_btn1
52 if first_btn1==None:
53 first_btn1 = time.ticks_ms()
54 btn1.irq( trigger=Pin.IRQ_FALLING, handler=btn1_pressed )
55
56 # === Player 2 / Joueur 2 =================================
57 led2 = Blinky( Pin( Pin.board.GP22, Pin.OUT ) ) # <<<<<<<<<<<<<<<<<<<<<<<<<<< GP26
58 btn2 = Pin( Pin.board.GP21, Pin.IN, Pin.PULL_UP )
59 first_btn2 = None
60 def btn2_pressed( obj ):
61 global first_btn2
62 if first_btn2==None:
63 first_btn2 = time.ticks_ms()
64 btn2.irq( trigger=Pin.IRQ_FALLING, handler=btn2_pressed )
65
66 # === Other / Autre =======================================
67 # Start / Demarrer
68 btn_start = Pin( Pin.board.GP20, Pin.IN, Pin.PULL_UP )
69 # LED status / LED de Status
70 led_status = Blinky( Pin( Pin.board.GP27, Pin.OUT ) )
71 # Buzzer
72 buzzer = RingTonePlayer( Pin.board.GP13 )
73
74 # === Game / Jeux =========================================
75
76 # Start --->
77 # buzzer.play_str( START_SONG )
78 # buzzer.play_str( WIN_SONG )
79 # buzzer.play_str( LOOSE_SONG )
80
81 # Start Button ? / Boutons Start ?
82 led_status.blink()
83 while btn_start.value()==1:
84 led_status.update()
85 time.sleep_ms(20)
86 led_status.off()
87
88 while True:
89 # All LEDs on / Toutes LEDs allumées
90 led1.on()
91 led2.on()
92 led_status.on()
93
94 # Init round / initialisation round
95 wait_ms = randint( 3, 10 )*1000
96 first_btn1 = None
97 first_btn2 = None
98 buzzer.play_str( START_SONG )
99
100 # The round is starting / debut du round
101 led1.off()
102 led2.off()
103 led_status.off()
104
105 # Wait loop
106 start_ms = time.ticks_ms()
107 _led = None
108 while time.ticks_diff( time.ticks_ms(), start_ms ) < wait_ms:
109 time.sleep_ms(100)
110 if (first_btn1!=None) or (first_btn2!=None):
111 _led = led1 if first_btn1!= None else led2
112 _led.on()
113 buzzer.play_str( LOOSE_SONG ) # End of game
114 break
115
116 # Still running the game ? / Le jeux continue encore ?
117 if (first_btn1==None) and (first_btn2==None):
118 # Go Signal
119 buzzer.play_tone( 2500, 500 )
120
121 # Wait the first player to press a button
122 # Attendre le premier joueur qui presse son bouton
123 while (first_btn1==None) and (first_btn2==None):
124 time.sleep_ms( 20 )
125
126 # We have a Winnner / Nous avons un gagnant
127 if first_btn1==None:
128 _led = led2
129 elif first_btn2==None:
130 _led = led1
131 else:
132 _led = led1 if first_btn1<first_btn2 else led2
133 _led.on()
134 buzzer.play_str( WIN_SONG )
135
136 _led.blink()
137
138 # Start Button ? / Boutons Start ?
139 while btn_start.value()==1:
140 _led.update()
141 time.sleep_ms(20)
142 _led.off()
Quelques mots d'explications:
- Lignes 11 à 43 : déclaration de la classe `Blinky` prenant en charge une broche (en sortie) afin d'allumer, éteindre une LED mais aussi pour la faire clignoter. L'appel régulier à la méthode `update()` fera en sorte de mettre à jour l'état de la LED au moment adéquat.
- Ligne 47 : déclaration de la LED pour je joueur 1. L'utilisation de la classe `Blinky` permet de doter celle-ci d'un effet de clignotement.
- Ligne 48 : déclaration du bouton pour le joueur 1. L'entrée en maintenue au niveau HAUT par la résistance PULL_UP interne. L'entrée passe au niveau bas quand le bouton est pressé.
- Ligne 49 : déclaration de la variable `first_btn1` pour le joueur 1.
Un problème?
xxx
Traduction augmentée réalisée par Meurisse. D pour shop.MCHobby.be - Licence CC-BY-SA.