mirror of
https://github.com/alankrantas/microbit-micropython-cookbook.git
synced 2026-06-17 03:55:13 +02:00
Create simon_game.py
This commit is contained in:
@@ -0,0 +1,145 @@
|
||||
# Simon Game on BBC micro:bit V2
|
||||
# by Alan Wang
|
||||
|
||||
"""
|
||||
How to play:
|
||||
|
||||
1) Upload the script as main.py or in the form of .hex file.
|
||||
2) After the welcome effects, press A + B to start.
|
||||
3) Memorize the Simon sequence in each turn.
|
||||
4) Tilt the board toward indicated directions to match the sequence.
|
||||
5) After each tilting gesture, you have to return it to horizontal position.
|
||||
6) Game will end when you failed.
|
||||
7) There is no limit how long the Simon sequence can go.
|
||||
"""
|
||||
|
||||
# import modules
|
||||
|
||||
from microbit import display, Image, Sound, sleep
|
||||
from microbit import button_a, button_b, accelerometer
|
||||
import random, music, audio, speech
|
||||
|
||||
|
||||
# prepare data
|
||||
|
||||
"""
|
||||
Note: the indexes of the following tuple represent
|
||||
0 = toward up/north
|
||||
1 = toward left/west
|
||||
2 = toward right/east
|
||||
3 = toward down/south
|
||||
|
||||
Since gesture "up" in micro:bit means "north side up",
|
||||
I inverted the direction here.
|
||||
But you can change the items of gestures, images and notes
|
||||
to customize what would be shown and play on micro:bit.
|
||||
"""
|
||||
|
||||
gestures = ('down', 'left', 'right', 'up')
|
||||
images = (Image('69996:06960:00600:00000:00000:'),
|
||||
Image('60000:96000:99600:96000:60000:'),
|
||||
Image('00006:00069:00699:00069:00006:'),
|
||||
Image('00000:00000:00600:06960:69996:'),
|
||||
Image('30003:60006:90009:60006:30003:'))
|
||||
notes = (262, 330, 392, 523)
|
||||
simon = []
|
||||
guess = []
|
||||
|
||||
|
||||
# start up effects
|
||||
|
||||
display.clear()
|
||||
audio.play(Sound.GIGGLE)
|
||||
sleep(1000)
|
||||
display.show(Image.FABULOUS)
|
||||
speech.say('Simon says', speed=150, pitch=50, throat=100, mouth=50)
|
||||
sleep(500)
|
||||
|
||||
|
||||
# wait for the user to press A + B
|
||||
|
||||
display_flag = True
|
||||
while not (button_a.is_pressed() and button_b.is_pressed()):
|
||||
if display_flag:
|
||||
display.show(images[4])
|
||||
else:
|
||||
display.clear()
|
||||
sleep(200)
|
||||
display_flag = not display_flag
|
||||
|
||||
for i in range(4):
|
||||
music.pitch(notes[i])
|
||||
display.show(images[i])
|
||||
sleep(100)
|
||||
|
||||
display.clear()
|
||||
sleep(400)
|
||||
music.stop()
|
||||
sleep(1000)
|
||||
|
||||
|
||||
# start game
|
||||
|
||||
while True:
|
||||
guess.clear()
|
||||
simon.append(random.randrange(4)) # add a random number to sequence
|
||||
|
||||
for n in simon:
|
||||
music.pitch(notes[n])
|
||||
display.show(images[n])
|
||||
sleep(500)
|
||||
music.stop()
|
||||
display.clear()
|
||||
sleep(250)
|
||||
|
||||
sleep(500)
|
||||
|
||||
# game loop
|
||||
# the loop will end when user matched the whole sequence
|
||||
while len(guess) < len(simon):
|
||||
gesture = None
|
||||
display.show('?')
|
||||
|
||||
# record user's tilting gestures
|
||||
for i in range(4):
|
||||
if accelerometer.was_gesture(gestures[i]):
|
||||
gesture = i
|
||||
break
|
||||
if gesture == None:
|
||||
continue
|
||||
guess.append(gesture)
|
||||
display.show(images[gesture])
|
||||
music.pitch(notes[gesture])
|
||||
sleep(250)
|
||||
music.stop()
|
||||
display.clear()
|
||||
sleep(100)
|
||||
|
||||
# if the gesture don't match, exit the game loop
|
||||
if guess != simon[:len(guess)]:
|
||||
break
|
||||
|
||||
else:
|
||||
# sequence successfully matched, go to next round
|
||||
display.show(Image.YES)
|
||||
music.play(music.POWER_UP)
|
||||
sleep(500)
|
||||
display.clear()
|
||||
sleep(500)
|
||||
continue
|
||||
|
||||
# failed to match sequence
|
||||
sleep(100)
|
||||
display.show(Image.NO)
|
||||
music.play(music.WAWAWAWAA)
|
||||
break
|
||||
|
||||
|
||||
# display final score
|
||||
|
||||
sleep(1000)
|
||||
audio.play(Sound.HAPPY)
|
||||
|
||||
while True:
|
||||
display.scroll('SCORE: {}'.format(len(simon) - 1))
|
||||
sleep(1000)
|
||||
Reference in New Issue
Block a user