# MicroPython飄落的雪花及避障遊戲

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

```python
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位置是點亮的。

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

```python
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分，程式設計如下：

```python
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列的地方顯示獲得的分數。
