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