【micro:bit】MicroPython電子輪盤遊戲實作

black round line on white background

使用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來決定重玩。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *