> For the complete documentation index, see [llms.txt](https://nkust.gitbook.io/micro-bit/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://nkust.gitbook.io/micro-bit/zi-zuo-jian-led-pian.md).

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

電子輪盤一直都是很有趣的小遊戲，只要程式一執行，看著LED在面板上轉個不停，一直到愈來愈慢而停下來，但是不知道會停在哪一個格子上，如果你有下個小小的賭注的話，搭配上音效的變化，還滿有刺激感的。

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

再看一次micro:bit的板子：

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LNjhnRd2UpDes_b01cT%2F-LNjp6UPBVjJV66-OFu3%2F2018-10-01_21-32-14.png?alt=media\&token=900f8c59-7918-4808-8e48-c0475d6b1cfa)

## LED的座標

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

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LPYDF9QukIBT8_OtP8A%2F-LPYDMdi6LAzkpyGO8EF%2F2018-10-24_07-16-35.png?alt=media\&token=a3203f82-157a-4bad-a706-e5a8e096bc0b)

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

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LP6YvZGzTUW4cjHm5I0%2F-LP6abylstOMi4wZ7aUU%2F2018-10-18_22-35-26.png?alt=media\&token=ecfcb225-ea22-4ca9-91a1-40c8b44ee86e)

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

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

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LP8GW4XStpvUKF18Gvj%2F-LP8HBx0SCtQeFL4nEzl%2F2018-10-19_06-19-26.png?alt=media\&token=fd8e885b-5335-46f7-83a7-04a4fe4c8f3b)

## 依序點亮所有的LED

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

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

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LP6YvZGzTUW4cjHm5I0%2F-LP6bsLWMVc3m33tYTcL%2F2018-10-18_22-40-54.png?alt=media\&token=cce0ab8b-856c-4572-b7f8-e4dc2cf02068)

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

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

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

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LP6cRmzxb_M0Ae3oBxy%2F-LP6dIptdECzB9yCgLkO%2F2018-10-18_22-47-07.png?alt=media\&token=697c03d1-b484-48f2-a616-8080d16df06a)

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

## 一次只點亮一顆LED

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

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LP8S-Uk7aZ38aCJyHBf%2F-LP8S5S_LwNUiYhff34o%2F2018-10-19_07-12-48.png?alt=media\&token=15e0ff0a-2910-4f75-8e89-b6992f8db084)

## 電子輪盤實作

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

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

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LP6YvZGzTUW4cjHm5I0%2F-LP6a-RZ71qSgMsyWRNP%2F2018-10-18_22-32-37.png?alt=media\&token=09a16e33-5006-4789-9473-4bd1e3de0e96)

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

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LP6YvZGzTUW4cjHm5I0%2F-LP6aJcrRIo_lx0hxpK-%2F2018-10-18_22-34-06.png?alt=media\&token=9d5fea7d-6a1a-4005-b34b-bcc1e9f4f9e1)

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

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LP8S-Uk7aZ38aCJyHBf%2F-LP8UTJKAU963NSK7UyL%2F2018-10-19_07-23-28.png?alt=media\&token=d04c7c8d-9cbb-46a2-b8a3-b7cf4f6b7797)

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LP8S-Uk7aZ38aCJyHBf%2F-LP8U_ZVCxXhE0ZyB0Ra%2F2018-10-19_07-23-59.png?alt=media\&token=8c7cbe3c-4eb0-49a6-804a-04d08e42fe2c)

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

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LP8S-Uk7aZ38aCJyHBf%2F-LP8UjeV2Krr1bkJdoiR%2F2018-10-19_07-24-40.png?alt=media\&token=0a0cec3a-929c-4783-8bdb-4747f6293ef7)

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

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LP8S-Uk7aZ38aCJyHBf%2F-LP8VUpv7GfVO2n6TuE2%2F2018-10-19_07-27-58.png?alt=media\&token=79074299-20c0-4fdd-a1d0-fca8c9584e7e)

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

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LP8S-Uk7aZ38aCJyHBf%2F-LP8W8zU0yTOhydHZl2Y%2F2018-10-19_07-30-49.png?alt=media\&token=eea45511-608a-4ca8-a2f0-b2588da6c581)

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

![](https://2988174335-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8UCGGycRFYs2Gx9M%2F-LP8S-Uk7aZ38aCJyHBf%2F-LP8XxJNaRiowckeMb2s%2F2018-10-19_07-38-06.png?alt=media\&token=e4a8f4ad-90b4-4d48-9f90-3645b735a135)

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

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

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