# MicroPython電子輪盤遊戲實作

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

```python
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作業之前還需要讓玩家有設定猜測位置的機會，程式如下：

```python
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來記錄此數值，以便和後來的隨機數做比較。

以下是完整的程式碼：

```python
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來決定重玩。


---

# 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/zi-zuo.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.
