電子輪盤遊戲實作(內建LED篇)

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

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

再看一次micro:bit的板子:

LED的座標

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

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

使用一個編號來操作LED

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

依序點亮所有的LED

因為全部有 5x5 ,共25顆LED

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

把一個數換成2維的行和列,其中要得到第幾列就是使用整除(也就是取其商),而在該列中的第幾行,則是使用餘數。

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

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

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

一次只點亮一顆LED

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

電子輪盤實作

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

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

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

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

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

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

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

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

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

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