【micro:bit】MicroPython飄落的雪花及避障遊戲

focused photo of a snow flake

儘管micro:bit只有小小的LED螢幕以及兩顆互動式按鈕,但由於每一個LED都有9種亮度可以控制,所以製作個小小的遊戲也是可以的,這篇文章就來教大家如何製作一個非常簡單的小遊戲。

利用前面所提供的圖案的平移函數功能,再加上亂數的使用,很容易地就可以建立一個模擬雪花飄落的動畫,先來看程式碼的內容:

from microbit import *
import random
track = Image(
              '00000:'
              '00000:'
              '00000:'
              '00000:'
              '00000')
while True:
    track.set_pixel(random.randint(0,4), 0, random.randint(3,6))
    display.show(track)
    sleep(400)
    track = track.shift_down(1)

這個程式的第3行建立一個空白的圖案,然後在第10行,也就是迴圈中的第1行的位置利用set_pixel函數在LED矩陣第0列的某一個位置(以隨機數來產生)設定一個要點亮的值,而這個值也是利用亂數在3到6之間任選一個數值,營造出不同亮度的效果。

在加入一個位置的LED點亮數值之後,接著就顯示出目前的結果,最重要的是,在第13行,利用shift_down函數把整個圖案往下移動一列,再設定回新的track值上面,如此不斷地循環,就可以看到一個逐漸落下的LED燈光的效果,而且可以確保每一列中只有一個隨機選定的LED位置是點亮的。

學會了如何製作出落下物效果之後,接下來就可以製作避障遊戲了,先來看程式:

from microbit import *
import random
track = Image(
              '00000:'
              '00000:'
              '00000:'
              '00000:'
              '00000')
             
car = 2
while True:
    track.set_pixel(random.randint(0,4), 0, random.randint(3,6))
    if button_a.was_pressed():
        car -= 1
        if car < 0:
            car = 0
    if button_b.was_pressed():
        car += 1
        if car > 4:
            car = 4
    if track.get_pixel(car, 4) > 0:
        break
    track.set_pixel(car, 4, 9)
    display.show(track)
    sleep(400)
    track = track.shift_down(1)
display.scroll('Game Over')

程式的第10行先設定我們的汽車(想像它是一台汽車)的位置在第2行(直行橫列來看的話),在第13行到第16行偵測A按鈕來決定是否要把汽車的位置往左移動(也就是把car的內容減1),當然如果減到小於0的話就是0,不能是負數。

在第17行到第20行檢查B按鈕是否被按下去,如果有的話,就再把汽車的位置往右移動(也就是把car的內容加1,當然car的內容不能超過4。

第21行檢查汽車所在的位置是否已經有亮燈,如果該值大於0的話,就表示發生了磁撞,就要執行第22行的break,離開迴圈結束這個遊戲。

如果幸運沒有發生碰撞的話,就在第23行把代表汽車的燈點亮上去,之後在第24行顯示出整個完成處理之後的圖案,在第25行暫停0.4秒之後,就在第26行把整個圖案往下降一列,這個操作讓東西有落下來的感覺。

第27行是離開迴圈的地方,會離開迴圈表示發生了碰撞,因此只要顯示Game Over代表遊戲結束即可。

假設我們需要有計分的功能的話,就需按額外加上1個變數 score來記錄目前的分數,我們希望在每下降一列的時候加1分,程式設計如下:

from microbit import *
import random
track = Image(
              '00000:'
              '00000:'
              '00000:'
              '00000:'
              '00000')
             
car = 2
score = 0
while True:
    track.set_pixel(random.randint(0,4), 0, random.randint(3,6))
    if button_a.was_pressed():
        car -= 1
        if car < 0:
            car = 0
    if button_b.was_pressed():
        car += 1
        if car > 4:
            car = 4
    if track.get_pixel(car, 4) > 0:
        break
    track.set_pixel(car, 4, 9)
    display.show(track)
    sleep(400)
    track = track.shift_down(1)
    score += 1
display.scroll('Game Over')
display.scroll('Score:{}'.format(score))

在上述的程式中可以看到,在第11行的地方定義一個score變數,接著在第28行完成下降一列的操作時加1分,最後在第30列的地方顯示獲得的分數。

發佈留言

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