# 電子輪盤遊戲實作（內建LED篇）

要製作電子輪盤有許多種方式，在這個例子中，我們直接使用程式設計的技巧，搭配內建的25顆LED來呈現，如此在硬體上就不需要任何的外接電路，只要能夠在適當的時候顯示出想要點亮的LED即可。

再看一次micro:bit的板子：

![](/files/-LNjp6UPBVjJV66-OFu3)

## LED的座標

同學們還記得每一個LED的座標資訊嗎？我們把橫軸當做是x，而緃軸當做是y，左上角是 (0, 0)，而右下角則是(4, 4)，就可以明確地知道每一顆LED都有其對應的座標，只要指定該座標，就可以點亮或是不點亮那個LED了。以下就是各LED的x,y座標編號：

![](/files/-LPYDMdi6LAzkpyGO8EF)

要個別點亮這些LED有幾種方法，最簡單的方式就是直接分別指定x和y的位置，如下所示：

![](/files/-LP6abylstOMi4wZ7aUU)

## 使用一個編號來操作LED

但是這要使用到2個變數，在程式設計上會比較複雜，我們其實可以把每一個LED都設定單獨的一個數字作為其編號，0代表最左上角那一顆，1代表0的右邊那顆，依此類推，則24就代表最右下角那一顆，如下所示：

![](/files/-LP8HBx0SCtQeFL4nEzl)

## 依序點亮所有的LED

{% hint style="info" %}
因為全部有 5x5 ，共25顆LED
{% endhint %}

這樣的話，我們就可以設定編號從0開始，每次點亮一個LED，直到所有的LED都亮了為止，方法如下：

![](/files/-LP6bsLWMVc3m33tYTcL)

{% hint style="info" %}
把一個數換成2維的行和列，其中要得到第幾列就是使用整除（也就是取其商），而在該列中的第幾行，則是使用餘數。
{% endhint %}

上面這個方法每次都把item增加1，然後依照item的數值內容分別計算出其餘數和商數，把餘數放在x，商放在y，就可以讓LED從(0,0)一路點亮到(4,4)。不過，在上面的例子中並沒有對item改變之後的值設定一個範圍，所以很快地LED就會被全部點亮，而且item為很快地就超過24了。

為了避免以上的情形，我們通常都會在改變了item的數值之後檢查一下item的內容，如果超過24的話，就把它重新設定為0，讓它從左上角再次開始，修改之後如下所示：

![](/files/-LP6dIptdECzB9yCgLkO)

但是在上面的情形，修改之後的結果並不會被發現，因為我們在這裡就只有做點亮LED的操作，等全部都點亮完畢之後，再點亮已經亮的LED就看不出差別了。

## 一次只點亮一顆LED

為了解決這樣的情形，有一個小技巧就是要記錄上一輸出的點，在點亮新的LED之前先執行不點亮（也就是關閉的意思）舊的LED就可以了。為了達成這樣的目的，除了item這個變數之外，還要多加一個叫做oleitem的變數，用來記錄之前所點亮的LED之編號。方法如下：

![](/files/-LP8S5S_LwNUiYhff34o)

## 電子輪盤實作

電子輪盤要點亮的是周圍的LED而不是全部的LED，而周圍的LED編號本身並沒有順序，因此我們要使用的是陣列，把想要依序點亮的LED編號逐一放在陣列中以便之後輪流取出使用。

以下是電子輪盤在初始化時要做的事，除了設定原有的item以及olditem這兩個變數之外，最重要的就是記錄要顯示的那些LED蹁號的陣列target，有了這個陣列，我們只要依序把陣列中的數值一個一個取出再加以顯示就可以了：

![](/files/-LP6a-RZ71qSgMsyWRNP)

以下則是初始過後，一直不停地讓 LED 轉動的程式，每一次都取得item和olditem的索引值，然後依照這些索引值取出運算，找出(x, y)座標再加以點亮或不點亮：

![](/files/-LP6aJcrRIo_lx0hxpK-)

為了避免主程式過於複雜，我們可以利用函數積木來化簡，分別定義turnon和turnoff積木如下：

![](/files/-LP8UTJKAU963NSK7UyL)

![](/files/-LP8U_ZVCxXhE0ZyB0Ra)

然後主程式就可以化簡如下：

![](/files/-LP8UjeV2Krr1bkJdoiR)

以上這個程式是放在重複無限次的迴圈中，所以只要一通電，這個LED的輪流點亮動作就會一直執行，沒有停止的一天。在遊戲中我們希望能夠以隨機數的方式來決定何時停止，因此我們就不能把它放在無複無限次的迴圈中，而是讓它可以由按鈕來開始，執行一段時間之後就結束。所以，以下的例子是把它放到A+B按鈕的事件中：

![](/files/-LP8VUpv7GfVO2n6TuE2)

然而因為這個事件只有按下去的時候會發生一次，因此每按一次，LED才會移動一格。所以，要透過隨機取數來讓它多移動幾次，如下所示：

![](/files/-LP8W8zU0yTOhydHZl2Y)

同學們可以試試看，這樣子每一次就都不會停在一樣的地方了。可是，傳統的電子輪盤會隨著流動的次數讓LED愈來愈慢，是如何做到的呢？答案就是修改暫停的秒數，以下是我們的作法：

![](/files/-LP8XxJNaRiowckeMb2s)

最終做出來的結果如下面這個示範的影片：

{% embed url="<https://youtu.be/VW0YUeiLJOM>" %}

同學們可以試試看，再加上一些事先猜測的功能以及背景音樂，讓micro:bit的電子輪盤變得更有趣喔。


---

# 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-jian-led-pian.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.
