Différences entre versions de « P2E-FAST-GAME »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
Ligne 201 : Ligne 201 :
 
_led.off()
 
_led.off()
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
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? ==
 
== Un problème? ==

Version du 4 mars 2025 à 22:10

Page-under-construction.pngPage(s) en cours de traduction/élaboration.

Page(s) under translation/construction

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.

P2E-fast-game-players.jpg

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:

P2E-fast-game-diagram-FR.jpg

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

P2E-fast-game-wiring.jpg

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.


MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.