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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://nkust.gitbook.io/micro-bit/yi-zhong-de-qi.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
