MicroPython電子輪盤遊戲實作

先來看看如何讓電子輪盤可以依亂數的方式不定時停止:

from microbit import *
import random
def setLED(number, value):
x = number % 5
y = number // 5
display.set_pixel(x, y, value)
seq = [0, 1, 2, 3, 4, 9, 14, 19, 24, 23, 22, 21, 20, 15, 10, 5]
counter, old = 0, 0
delay = 1
while True:
setLED(seq[old], 0)
setLED(seq[counter], 9)
delay += random.randint(1,10)
sleep(delay)
if delay > 500: break
old = counter
counter = counter + 1
if counter >= len(seq):
counter = 0
sleep(2000)
display.show(Image.HEART)

這個程式一開始執行之後,就會有一個LED由快而慢地輪流在LED矩陣外圍旋轉顯示,至於會停在哪一個位置上並不會固定,因為主要在輪流點亮LED位置的迴圈是第12行,它沒有預定的重複次數,一開始的delay變數從1開始,每一次在第15行執行的時候就會在1~10之間隨機取一個數字加到delay中,一直到第17行的地方檢查delay是否大於500,如果大於500就離開迴圈,也就是它的停止條件 。

當離開迴圈的時候,先在第22行暫停2秒鐘,讓使用者可以看清楚LED停留的位置,最後再以第21行顯示一個愛心圖案為程式的結束記號。

為了要讓遊戲可以進行,在開始執行旋轉LED作業之前還需要讓玩家有設定猜測位置的機會,程式如下:

counter, old = 0, 0
setLED(seq[counter], 9)
while True:
if old != counter:
setLED(seq[old], 0)
setLED(seq[counter], 9)
if button_a.is_pressed() and button_b.is_pressed():
break
elif button_a.was_pressed():
old = counter
counter -= 1
if counter < 0:
counter = len(seq)-1
sleep(200)
elif button_b.was_pressed():
old = counter
counter += 1
if counter >= len(seq):
counter = 0
sleep(200)

不同於前面的程式,這個程式是由玩家來決定要顯示的LED位置,一開始把counter設定在串列seq的第0個位置,並在第2行的時候點亮該位置的LED。接著進入迴圈中,這個迴圈也是不定重複次數,它是由第7行的偵測動作以決定是否要離開這個迴圈,也就是當玩家同時按下A按鈕及B按鈕的時候,就會離開這個迴圈以繼續後續的作。

如果玩家按下A按鈕的話,就讓LED逆時針移動,若是按下B按鈕,則讓LED順時針轉動。如此,這個程式片段就可以讓玩家設定要猜測的位置,也就是當玩家同時按下A和B按鈕離開這個迴圈的時候,此時的counter變數的內容就是玩家要猜測的編號,在離開迴圈之後,要用另外一個變數guess來記錄此數值,以便和後來的隨機數做比較。

以下是完整的程式碼:

from microbit import *
import random
def setLED(number, value):
x = number % 5
y = number // 5
display.set_pixel(x, y, value)
seq = [0, 1, 2, 3, 4, 9, 14, 19, 24, 23, 22, 21, 20, 15, 10, 5]
counter, old = 0, 0
setLED(seq[counter], 9)
while True:
if old != counter:
setLED(seq[old], 0)
setLED(seq[counter], 9)
if button_a.is_pressed() and button_b.is_pressed():
break
elif button_a.was_pressed():
old = counter
counter -= 1
if counter < 0:
counter = len(seq)-1
sleep(200)
elif button_b.was_pressed():
old = counter
counter += 1
if counter >= len(seq):
counter = 0
sleep(200)
answer = counter
counter, old = 0, 0
delay = 1
while True:
setLED(seq[old], 0)
setLED(seq[counter], 9)
delay += random.randint(1,10)
sleep(delay)
if delay > 500: break
old = counter
counter = counter + 1
if counter >= len(seq):
counter = 0
sleep(2000)
if counter == answer:
display.show(Image.HEART)
else:
display.show(Image.SAD)

如果想要再玩一次的話,可以按下重置按鈕。不過,也許同學們可以想一下,如何在程式中詢問使用者是否重玩一遍,並利用按鈕A或按鈕B來決定重玩。