6LEDルーレット (二進数シフト版)

HEART★6基板(OUT1~6にLED,IN1~IN4にSWを追加したシールド基板)とIchigoDakeを使った、6灯ルーレットです。

スイッチ1(IN1)を押すとルーレットスタート、スイッチ4(IN4)を押すとルーレットストップ。
ルーレットはストップボタンを押してから徐々に止まるので、どこでとまるかわかりません。
LEDは6個あるので、双六の代わりに使えます。

通常、OUTポートにつないだLEDは、OUT1,1やOUT2,1で光らせますが、このプログラムでは二進数によるシフト演算によって光らせています。

サンプルプログラム

【ソースコード】

1 ‘HEART*6ルーレット ver1.0 by NEXTDAY
10 LET N,2
20 OUT 1<<N
30 IF IN(1)=1 GOTO 30
40 LET W,1

50 OUT 1<<N
60 BEEP 100
70 WAIT W
75 PRINT N,BIN$(1<<N,6),IN(4),IN(3),IN(2),IN(1)
80 LET N,N+1
90 IF N=6 THEN LET N,0
100 IF IN(4)=1 GOTO 50

200 OUT 11,0
210 LET W,W+2
220 IF W<30 GOTO 50

230 OUT 11,-1
300 BEEP 5,60
310 GOTO 30

【プログラム説明】
10行目 変数Nを初期化。最初にLEDを点灯する位置をいれる(0~5)。
20行目 N番目のLEDを点灯する。
30行目 ボタン1が押されるのを待つ。ここがスタートボタン待ち。
40行目 変数Wを初期化。WにはLEDの点灯時間が入る。1が最も早い。

50行目 N番目のLEDを点灯する。
60行目 音を鳴らす。LEDが1つ動くごとに鳴る。
70行目 LED点灯待ち時間。W値の分だけ点灯。
80行目 Nの値を1つプラス。
90行目 もし、Nが6なら Nに0を入れる。
     これでルーレットが一周したことになる。
100行目 ボタン4が押されていなければ、GOTO50へ飛んで次のLEDを点灯。

200行目 IN4をOUTポート(OUT11)に変更して0を出力。
     こうするとIN4の値は常に0となり、
     ボタンを押したままと同じ状態になる。
210行目 WAIT値のWを少し増やす。だんだんゆっくりになる。
220行目 WAIT値Wが30以下なら、GOTO50

230行目 IN4をOUTポートからINポートに戻す。
300行目 ルーレットが停止した合図(BEEP)を鳴らす。

【応用】
・逆回りに光らせたいときは、20行目と50行目をつぎのようにします。
  OUT 1<<(5-N)
   または
  OUT 32>>N

・220行目をつぎのようにかえると、ルーレットの止まり方が毎回変わります。
  IF W<20+R GOTO 50 ELSE LET R,RND(20)

【参考】1行だけのプログラムでLEDをルーレットのように光らせる方法

例1 10 OUT 1<<(TICK()/2%6):IF IN(4)=1 CONT
例2 10 OUT 1<<(TICK()%60):IF IN(4)=1 CONT
例3 10 T=TICK():OUT 1+T/10%6,T/60%2:IF IN(4)=1 CONT ELSE OUT 1<<(TICK()/2%6)
例4 10 OUT TICK()/60%2*255:IF IN(4)=1 CONT ELSE OUT 1<<(TICK()/2%6)
例5 10 OUT 1<<(TICK()/2%6):IF !BTN() CONT ELSE WAIT180:CONT
  (逆回転にするなら、OUT 32>>(TICK()/2%6)に替える)

【機能変更したサンプルプログラム】
・どのボタンでもスタート&ストップ
・右回り回転
・ストップボタンで止まるタイミングも変化
・止まったLEDを点滅

1 ‘HEART*6ルーレット v1.05 by NEXTDAY
10 @START
20 W=2: N=0: R=10

30 @LOOP
40 BEEP 100
50 N=N+1: IF N>5 N=0
55 ? N,W,BIN$(32>>N,6),IN(4),IN(3),IN(2),IN(1)
60 OUT 32>>N: WAIT W
70 GSB @SW(S)
80 IF !S GOTO @LOOP

90 P=0: GSB @PORT(P)
100 W=W+2
110 IF W<20+R GOTO @LOOP

120 R=RND(30)
130 P=-1: GSB @PORT(P)
140 BEEP 5,60
150 GSB @SW(S): IF S CONT
160 FOR S=0 TO 1
170 OUT 6-N,TICK()/30%2
180 GSB @SW(S)
190 NEXT
200 GSB @SW(S): IF S CONT
210 GOTO @START

1000 @SW(S):S=!IN(4)*8+!IN(3)*4+!IN(2)*2+!IN(1):RTN
2000 @PORT(P):OUT8,P:OUT9,P:OUT10,P:OUT11,P:RTN