見出し画像

【フ】ORANGE pico でフラッシュ暗算

#クリエイターフェス 8日目、テーマは「フ」である。

フラッシュ暗算

ORANGE pico でフラッシュ暗算の出題を行うプログラムを作ってみた。
タイマーで使用したフォントを再び使用する。

プログラム

カナを用いているので、UART経由で流し込む場合は文字コードをShift_JISにすること。

10 mptr 0:bit=0:byte=0:bitcount=0:loaded=0:cls:white=rgb(255,255,255):black=rgb(0,0,0):gprint 92,96,"Loading",white
20 s$="~ ~ ~ l#J)D.@1>3<5;697988+#*7)'*6)()6(*)4)*)4)+)3(,)2)-(2)-(1).(1).)0)/(/)0).)0).)1),)2),)2),)2)+)3)+)4(+)4)))5)))5)))5)))5)))5)))5))(7(()7)')7)')7)')7)')7)')7)')7)')7)')7)')7)()6)()6)()6)()6)()6)))5)))5)))5(*)4)*)4)+)3)+)3)+)3(,)2)-)1)-)1)-*"
30 l=len(s$)
40 for i=1 to l
50 c=asc(mid$(s$,i,1))-&H20
60 if c==0 then goto 120
70 for j=1 to c
80 byte=(byte<<1)|bit
90 bitcount=bitcount+1
100 if bitcount==8 then b=byte:byte=0:bitcount=0:mdata b
110 next
120 bit=1-bit
130 next
140 gprint 92+8*(7+loaded),96,".",white:loaded=loaded+1:if loaded>1 then return
150 s$="/)/)/)/*-*0*,)1+**2+'+4<5:6:7896;4=1A-E)~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -%J'I'H)G)F*F*E+E+D,D,C-C-C-B.B.A/A/A/A/A/A/B.D!\")G)G)G)G)G)G)G)G)G)H(H)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)H(H'I'J%M!~ ~ ~ ~ ~":gosub 30
160 s$=" ~ ~ ~ +,A2;78:4=2>2?0@/A.-,*-+/)-)1),*1),)2)+)3)+)3)+)3)*)4)+(4)+'5)+'5),%6).!8)G)G)G)G(G)G)G)F)G)G)G(G)G)G(G)G)G)F)G)F*F)F*F)F)G)F)G)F*E*F*E*E*E+D+D+E*E*E+D+D+D+D+D+C-B-A/@C,G)H(H(I'H)G+D:4~ ~ ~ ~ ~ ~ ~ ~ Q#I*C.@1>3;698796;40\"*4-":gosub 30
170 s$="&*2,))1,+)0*-)/*/(.+/)-*0)-)1),)2),)3(-(3),'4),'4)-%5)/!7)G)G)G)F)F*F)F*E*F*E*E*E+D+D+D,C,A.?0:5878797997:6;6;7:B/D,F+F*G*G)G)G)H)G)G)G)G)H)/%3).'2).'2).(1)-)1).)0).*/).+.)/+++0?2>2=4;6:7896<1A,~ ~ ~ ~ ~ ~ ~ !%J'I'H)G)G(G)G(H(G)G)G)":gosub 30
180 s$="G(G)G)G)G(G)G)G(G)-%5),'4(-'3)-(2),)2(-)1)-(2),)2),)2),)2),(3(,)2),)2),)2),)2(-(2),)2),)2),)2),)1)-(2),)2),)2),)2),)2),(3(,)2),)2),)2>2G)H'J'I'J&I(H*E;3=)G(G)G)G)G(G)G)G(G)G)F*F)G)F)G)G)G(G)H(H'I'J%M!~ ~ ~ ~ ~ ~ ~ Q?0C-D+E+F*E+E+D,B":gosub 30
190 s$=".)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)F)((7)$/4)!33?1@/A/B.C-D,2(*,.-*+,0)*+3))*4)*(6))'7))'8))%9)+!;)G)G)G)G)G)G)G)G)G)F)G)G)G)G)F)G)G)F)G)0!5*-'2)-*.+-,++..(,.A/@1>4;78:5=2@.E(~ ~ ~ ~ ~ ~ ~ ~ 3&G*E+D-B-B.B-B-B,D*E*F)F*F)F*E*F)G)":gosub 30
200 s$="F)G)F)G)G(G)G)F)G)G(G)G)G(G)G)G)G)!&@3<7997:5<4>2?1?1,&.0),,/)-+/).+.)/*.)0).)1)-)1)-)1)-)1)-)1)-)1)-)1)-)1)-)1)-)1)-)1)-)1)-)1)-)1)-)1)-)1(/)/)/)/)/)/)0).)0).(2),)2*+)2+(+3<4<5:7987:5<3?/C)~ ~ ~ ~ ~ ~ G!LD+H(I'I&K%J&J&I'I')6)()6)()":gosub 30
210 s$="5)()6)()6)()5)))5)))5)*(5(+'5)+'5),%6).!8(G)G)G(G)G)G(G)G)G(G)G)G)G)G(G)G)G)G)G(G)G)G(G)G)G(G)G)G(G)G)F)G)G(G)G)G(G)G)F)G)G(G)G)F*F)G)F)G)G(G)G)F)G)G)F)G)G(H(H'J%L#~ ~ ~ ~ ~ ~ ~ a)D/?3<5996;4=3=2?0,)+0*,*0).*.)0).)0*-(2),)3)+)3)+)3)":gosub 30
220 s$="+)3)+)3)+)3)+)3)+)3)+)3)+)3)+)2),)2),)0*-)/+-).,.(-,/)*./)).1((.2)%.4)$.6)!/7796;4<2?0A-B.A0?2=5:7897+\"-5+%,3+',2*),0*++0)-+/).+-)0*-)1*,)2),)2*+)3)+)4(+)4)*)4)+(4)+)3)+)3),(3),)1*,)0+-),.-*&2.B/@0?2=4:77:4=/C(~ ~ ~ ~ ~ ~ ~ ~ ,)D0?":gosub 30
230 s$="4:87;5=2?0A.B.+(0,*.,,)1*,)2)+)3)+)2*+)1+*)2*+)1++)1*,)0+,)/,,)/+-).,-).+.)-,.)-,.),,/)+-/))//)'10?1?1>3=3=4;6:8-!*:)#)G)G(G)G)G(G)G)G)G(G)G)G(G)G)G)G(G)G)G)G)G(G)G)G)F)G)G)F*F)G)F)G)G)F)G)G)G(H(I&L\"~ ~ ~ ~ ~ F":gosub 30
240 mset 6*48*2*10,&HFF,12*96
250 cls
260 input "     ケタ スウ (1-6): ",digits
270 input "    タス スウチ ノ カズ: ",num
280 input " ヒョウジ ジカン [ms]: ",showtime
290 input "アイダ ノ ジカン [ms]: ",intervaltime
300 if digits<1 || 6<digits || num<1 || showtime<1 || intervaltime<1 then print "ムコウ ナ セッテイ デス":goto 260
310 print "ナニカ キー ヲ オス ト 3 ビョウ ゴ ニ スタート":cursor 0
320 if inkey()=0 then goto 320
330 cls:gprint 140,96,"* * *",white
340 for i=0 to 2
350 pause 1000
360 gput 140+16*(2-i),96,8,6*48*2*10,black
370 next
380 pause intervaltime
390 max=1
400 for i=1 to digits
410 max=max*10
420 next
430 min=max/10
440 leftx=160-48*digits/2:rightx=leftx+48*digits
450 sum=0
460 for i=1 to num
470 value=rnd(max-min)+min:sum=sum+value:drawvalue=value
480 for j=1 to digits
490 d=drawvalue%10:drawvalue=drawvalue/10
500 gput rightx-48*j,100-48,48,6*48*2*d,white
510 gput rightx-48*j,100,48,6*48*2*d+6*48,white
520 next
530 pause showtime
540 for j=1 to (digits+1)/2
550 gput leftx+96*(j-1),100-48,96,6*48*2*10,black
560 next
570 pause intervaltime
580 next
590 input "ゴウケイ ハ? ",answer
600 if answer==sum then print "セイカイ!" else print "ザンネン! セイカイ ハ ";sum;" デシタ"
610 print "":cursor 0
620 print "1 : リトライ"
630 print "2 : セッテイ ヲ ヘンコウ"
640 print "3 : シュウリョウ"
650 choice=inkey()-48
660 if choice==1 then goto 330
670 if choice==2 then goto 250
680 if choice<>3 then goto 650

実行の様子

実行を開始すると、まずフォントのロード (デコード) が行われる。

フォントのロード中

フォントのロードが完了すると、出題のパラメータを設定する画面になる。

フォントのロード完了

パラメータを設定し、キーを押すと、出題が開始される。

設定を入力した状態
出題開始直前のカウント
出題中

出題が終わると、表示された数値の合計の入力を求める画面になる。

合計の入力を求める画面

合計を入力してEnterキーを押すと、その正誤が表示される。
不正解の場合は、正しい合計も表示される。

正誤判定画面

この画面で1キーを押すと、同じパラメータで再び出題が開始される。
2キーを押すと、出題のパラメータを設定する画面に戻る。
3キーを押すと、プログラムの実行を終了する。

活用のヒント

  • 足す数値の数を「1」に設定すると、表示される数字を覚えて入力するゲームになる。

  • 数字とEnter (とBackspace) の入力のみで操作できるため、プログラムの実行開始後はテンキーでも操作できるはずである。

仕様の注意点

  • 設定できる時間は、描画にかかる時間を考慮しないだいたいの時間である。

  • 多い桁数であまりにも大量の数を足すと、オーバーフローして正しい判定が行えない可能性がある。

改造のヒント

たとえば、以下の変更を行うことが考えられる。
これらは読者への宿題とする。

  • パラメータを直接入力させるのではなく、簡単/普通/難しいなどのプリセットの組み合わせを用意する

  • 数値を表示する際に音を鳴らすようにする

  • 正解・不正解の表示を豪華にする

  • 最初にメモリー配列の内容をチェックし、既にデコード済みのフォントが格納されている場合はデコード処理をスキップするようにする

ライセンス

今回のプログラムと解説 (「フラッシュ暗算」節の内容) は、CC BY 4.0 でライセンスする。


この記事が気に入ったらサポートをしてみませんか?