「フルカラーLEDスカッシュ」を少し改良して、ルーレットゲームにしました。
RUNすると、ルーレットのように、ボールが音をたてて動きます。
タクトスイッチを押すと、ボールがだんだん遅くなって止まります。
赤の「当たり位置」を狙って止めてください。
フルカラーLEDの使い方は、テキスト「LEDでナナイロづくり」の「ルーレット」も参考になります。

‘Simple Roulette フルカラーLEDルーレット
30 CLV:W=5:Q=10
40 F=0:C=1:R=RND(Q)
100 @MAIN
110 LET[ABS(P)*3],0,0,0
120 LET[R*3],0,99,0
130 P=P+1
140 LET[ABS(P)*3],C&1*50,C>>1&1*50,C>>2&1*50
150 WS.LED Q:BEEP
160 IF P==Q-1 P=1-Q
170 WAIT W
180 IF BTN() F=1
190 IF F==1 W=W+5+RND(5)
200 IF W<60 GOTO@MAIN
■変数の説明■
W ボール移動時間(ボールスピード)
ボールが動く際の待ち時間を指定します。
Q フルカラーLEDの個数
WS2812Bの個数を指定します。
P 現在のボール位置
ボールの点灯位置です。
[] WS.LEDの色設定用の配列
WS.LED命令で使用するWS2812BのRGB値です。
F 動作モード
0:回転モード
1:停止モード
C ボール色
0:無(消灯)、1:緑、2:赤、3:黄、4:青、5:青緑、6:紫、7:白
R ルーレットの当たり位置
当たりの点灯位置です。
■プログラムの説明■
30行目40行目
変数の初期化です。
当たり位置は乱数で決めます。
100行目 @MAIN
ルーレットを動かすメイン処理です。
110行目 LET[ABS(P)*3],0,0,0
ボール位置(配列)を消灯に設定します。
Pが負数の場合もあるので、ABSで指定します。
120行目 LET[R*3],0,99,0
ルーレットの当たり位置を赤色に設定します。
130行目 P=P+1
ボール位置を移動します。
値が正数なら順方向、負数なら逆方向に移動します。
140行目 LET[ABS(P)*3],C&1*50,C>>1&1*50,C>>2&1*50
新しいボール位置に、ボール色を設定します。
このプログラムでは緑(C=1)ですが、他の色も試してみてください。
150行目 WS.LED Q:BEEP
配列に設定した値でフルカラーLEDを点灯し、BEEP音を鳴らします。
160行目 IF P==Q-1 P=1-Q
ボール位置が端に到達したら、方向を反転します。
170行目 WAIT W
ボールの移動待ちをします。
180行目 IF BTN() F=1
タクトスイッチが押されたら、ルーレットの動作モードを停止モードにします。
190行目 IF F==1 W=W+5+RND(5)
停止モードならば、ボールの移動時間を増やしていき、だんだん遅くしていきます。
毎回ボールの停止位置が異なるように、RND命令も加えるのがポイントです。
200 IF W<60 GOTO@MAIN
ボールの移動時間が60(1秒)より短いなら、@MAIN処理を繰り返します。
60以上なら、プログラムを終了してコマンドプロンプトになります。
ルーレットが動いている時(F==0)は、Wの値が5のままなので、
ルーレットはいつまでも動き続けます。
停止モード(F==1)になると、いつかはWの値が60以上になるので、
ルーレットが停止するというしくみです。
■応用と改良■
1.ナナイロルーレットにする
ボールの色を、移動するたびに変えます。
色は変数Cの値で決まりますが、0にならないよう注意します。
140 C=C+1:LET[ABS(P)*3],C&1*50,C>>1&1*50,C>>2&1*50:IFC>6C=0
乱数で色を決めることもできます。
140 C=RND(7)+1:LET[ABS(P)*3],C&1*50,C>>1&1*50,C>>2&1*50
2.円形状のフルカラーLEDを使う
ボールが往復移動するのではなく、ルーレットが回転するように連続移動します。
160 IF P==Q-1 LET[ABS(P)*3],0,0,0: P=-1
3.だんだんボールスピードを早くする
ルーレットスタート時に、ボールがだんだん速くなるようにします。
190行目にだんだん遅くするしくみがあるので、このプログラムを利用します。
Wの初期値も大きくしておきます。
30 CLV:W=30:Q=10
190 IF F W=W+5+RND(5) ELSE W=W-7: IF W<5 W=5
ボールスピードが遅いと当たりに止めやすくなるので、
Wの値が5になったら、当たりを点灯するという、工夫をしてもよいかもしれません。
120行目 IF W==5 LET[R*3],0,99,0
4.一定時間経過したら、ルーレットを停止する
タクトスイッチを押さなくても、一定時間が経過したらルーレットを止めます。
TICK命令と一定時間経過の条件をプログラムに追加します。
つぎの例は、10秒後に動作モードを1にして、ルーレットを止めるようにします。
90 CLT
180 IF BTN() || TICK()>600 F=1
5.当たり判定をする
変数PとRを比較して同じなら「当たり」、異なれば「はずれ」の判定をします。
210 IF ABS(P)!=R GOTO@GAMEOVER
220 BEEP 7,180:LET[R*3],99,99,99
230 GOTO@END
240 @GAMEOVER
250 BEEP 100,120
260 @END
6.再ゲーム
判定後は、ルーレットを点滅させてタクトスイッチの押し待ちにします(再ゲーム待ち)。
スイッチが押されたら、ルーレットを再開します。
270 IF !BTN() WAIT30:WS.LED1,Q:WAIT30:WS.LEDQ:CONT
280 LET[0],50,50,50:WS.LED1,Q
290 IF BTN() CONT ELSE WAIT120:RUN

この教材は「Creative Commons — CC BY-SA 4.0」の下に提供されています。
