IchigoJam で、クイズで使うような早押し判定機を作ってみた。
※IchigoJamはjig.jpの登録商標です。
プログラム
10 ' ハヤオシ ハンテイ
20 CLS:CLV:T=-1:LED0
30 IFBTN()GOTO30
40 IF!BTN()GOTO40
50 CLK:CLT:LED1
60 K=INKEY():E=EOR!BTN():IFEANDBTN()GOTO20ELSEIF!KGOTO60
70 U=TICK():IF[K/16]>>(K%16)&1GOTO60
80 ?CHR$(K);" ";:IFT>=0D=U-T:?"+";D/60;".";DEC$(D%60*100/60+100,2)ELSET=U:?"TOP"
90 [K/16]=1<<(K%16)|[K/16]:GOTO60
DEC$ を用いているので、古い環境では動かない可能性がある。
仕様
早押しの参加者は、それぞれ自分が使うキーを1個決め、そのキーを押せる状態で待機する。
プログラムの起動後、本体のボタンを押すと、LEDが点灯し、早押しの受け付けを開始する。
この状態でキーを押すと、押された順で画面に表示され、最初に押されたキーとの押されたタイミングの差 [秒] も表示する。
もう一度本体のボタンを押すと、リセットし、最初の状態に戻る。
次の早押しの受け付けを開始するには、さらにもう一度本体のボタンを押す。
キーボードの押された順で判定を行うため、IchigoJam BASIC の処理速度に依存せず、解像度の高い判定が行えるはずである。
ただし、タイミングの差の表示は、IchigoJam BASIC の処理速度に依存して不正確になる可能性がある。
押されるキーが多いと、スクロールが発生し、肝心な「最初に押されたキーが何だったか」がわからなくなってしまう恐れがある。
実行結果例
プログラムのポイント
初期化とボタンの待機
10 ' ハヤオシ ハンテイ
20 CLS:CLV:T=-1:LED0
30 IFBTN()GOTO30
40 IF!BTN()GOTO40
50 CLK:CLT:LED1
画面をクリアし、CLV により変数の初期化を行う。
これにより、キーの押し状況を管理する配列と、ボタンの押し状況を管理する変数 E (リセット許可フラグ) がクリアされる。
その後、最初の人がボタンを押したタイミング管理する変数 T を初期化する。
LEDを消灯させる。
ボタンが押されている場合、それは前の操作で押したのがそのままになっているためのはずなので、離されるまで待機する。
そして、ボタンが押されるまで待機する。
ボタンが押されたら、早押しを受け付けるためにキーバッファをクリアし、LEDを点灯させる。
キー入力とリセットの受け付け
60 K=INKEY():E=EOR!BTN():IFEANDBTN()GOTO20ELSEIF!KGOTO60
INKEY() によりキー入力を受け付ける。
ボタンが離されたら、リセット許可フラグ E を真にする。
リセット許可フラグが立っていて (すなわち、一度ボタンが離された後)、かつボタンが押されていたら、リセットを行う。
リセットを行わない場合、キーが押されるまで待機する。
キーが押された際の処理
70 U=TICK():IF[K/16]>>(K%16)&1GOTO60
80 ?CHR$(K);" ";:IFT>=0D=U-T:?"+";D/60;".";DEC$(D%60*100/60+100,2)ELSET=U:?"TOP"
90 [K/16]=1<<(K%16)|[K/16]:GOTO60
キーが押されたら、まず、押された時刻を取得する。
配列を参照し、この回で既に押されたキーであれば、この後の処理を行わずに戻る。
押されたキーを画面に出力する。
最初にキーが押された時刻の情報があるかどうかで分岐する。
情報があればその時刻との差を表示し、無ければ記録して「TOP」を表示する。
今回は、1秒 = 60 TICK() 単位、と決め打ちしている。
PAL 環境や IchigoJam web 環境など、これが成り立たない環境では、時間の表示は不正確になるだろう。
その後、配列にこのキーが押されたことを記録し、キー入力の受け付けに戻る。
おわりに
IchigoJam のキー入力機能とボタン入力機能を用い、早押し判定機を作ることができた。
人が集まり、かつそれらの人が自分の考えた遊びに付き合ってくれるような機会が無いと、活躍の機会は無いかもね……
