IchigoJam で「文字当てゲーム」を作ってみた。
※IchigoJamはjig.jpの登録商標です
ルール
ASCII印字可能文字 (空白は除く) が1個、1ピクセルずつ見えてくるから、どの文字からなるべく早く推測してその文字を入力しよう!
早く正解するほど高得点!
ただし、間違った文字を入力してしまうと得られる点数が減っちゃうよ!
全5問で、なるべく高い点数を目指そう!
わかりやすい文字が出題されるか、わかりやすい場所が早く開くかの運も実力のうち……?
プログラム
10 ' モジアテ ゲーム
20 N=5:T=60
30 CLS:LOCATE16,4:?"モジアテ ゲーム":LOCATE16,12:?"キー ヲ オシテネ"
40 IF INKEY()=0 WAIT1:GOTO40
50 S=0:Q=1:LOCATE16,12:?"イマ セイカイ スル ト"
60 LOCATE16,6:?"スコア ";S:LOCATE16,10:?"モンダイ ";Q;"/";N
70 FORI=0TO63:[I]=I:NEXT:FORI=0TO62:C=RND(64-I):J=[I]:[I]=[C]:[C]=J:NEXT
80 FORI=0TO7:LOCATE4,8+I:?"????????":NEXT:A=RND(#7F-#21)+#21
90 I=0:D=100:CLT
100 LOCATE16,13:?"スコア +";D;" "
110 K=INKEY():IF K<>A AND #20<K AND K<#7F PLAY"O3C":LOCATE16,16:?CHR$(K);" ジャナイヨ!":D=D-10:D=D*(D>0):GOTO100
120 IF K=A GOTO160
130 IF I>63 OR TICK()<T WAIT1:GOTO110
140 CLT:P=[I]:I=I+1:LOCATEP%8+4,P/8+8:?CHR$(PEEK(A*8+P/8)>>(7-P%8)&1*#8F)
150 D=D-1-(I>28):D=D*(D>0):GOTO100
160 S=S+D:PLAY"O5E16R64C16.":LOCATE16,16:?CHR$(A);" デ セイカイ!":LOCATE16,18:?"キー ヲ オシテネ"
170 IF INKEY()=0 WAIT1:GOTO170
180 LOCATE16,16:?" ":LOCATE16,18:?" ":Q=Q+1:IF Q<=N GOTO 60
190 LOCATE16,6:?"スコア ";S:LOCATE16,10:?"オツカレ サマ デシタ!":LOCATE16,12:?" ":LOCATE16,13:?" "
200 LOCATE 0,16
- OneFiveCrowd で実行する (高速、非公式) (推奨)
- IchigoJam web で実行する (公式、低速)
実行結果例
↓全体の様子
プログラムのポイント
パラメータの設定
10 ' モジアテ ゲーム
20 N=5:T=60
以下のパラメータを設定する。
-
N:1セットで出題する問題数 -
T:ピクセルを開ける時間の間隔 (TICK()単位)
タイトル画面
30 CLS:LOCATE16,4:?"モジアテ ゲーム":LOCATE16,12:?"キー ヲ オシテネ"
40 IF INKEY()=0 WAIT1:GOTO40
タイトルを描画し、キーが押されるまで待機する。
ゲーム初期化
50 S=0:Q=1:LOCATE16,12:?"イマ セイカイ スル ト"
以下のゲームの状態を初期化する。
-
S:獲得したスコアの合計 -
Q:現在何問目か
また、各問題で共通して使う部分を描画する。
問題初期化
60 LOCATE16,6:?"スコア ";S:LOCATE16,10:?"モンダイ ";Q;"/";N
70 FORI=0TO63:[I]=I:NEXT:FORI=0TO62:C=RND(64-I):J=[I]:[I]=[C]:[C]=J:NEXT
80 FORI=0TO7:LOCATE4,8+I:?"????????":NEXT:A=RND(#7F-#21)+#21
90 I=0:D=100:CLT
1問出ている間は変わらない部分を描画する。
各ピクセルを開ける順番を、配列に連番を置いてからシャッフルすることで決める。
文字を描画する部分を初期化する。
問題で使う以下の状態を初期化する。
-
A:この問題の正解 -
I:何ピクセル開けたか (次に開けるピクセルの添字) -
D:この問題に今正解すると何点獲得できるか
出題と入力の判定
100 LOCATE16,13:?"スコア +";D;" "
110 K=INKEY():IF K<>A AND #20<K AND K<#7F PLAY"O3C":LOCATE16,16:?CHR$(K);" ジャナイヨ!":D=D-10:D=D*(D>0):GOTO100
120 IF K=A GOTO160
130 IF I>63 OR TICK()<T WAIT1:GOTO110
140 CLT:P=[I]:I=I+1:LOCATEP%8+4,P/8+8:?CHR$(PEEK(A*8+P/8)>>(7-P%8)&1*#8F)
150 D=D-1-(I>28):D=D*(D>0):GOTO100
今正解すると獲得できるスコアを描画する。
キー入力を受け取る。
正解になりうるキーが入力され、かつ正解ではなかった場合、不正解の音と表示を出し、獲得できるスコアを減算する。
このとき、獲得できるスコアが負になった場合は、0にする。
正解のキーが入力された場合、正解の処理に移る。
キーが入力されておらず、開けていないピクセルが残っており、かつ開ける間隔の時間が経過した場合は、次のピクセルを開ける処理を行う。
すなわち、正解の文字のフォントから開ける位置のビットを読み取り、それに従って描画を行う。
ピクセルを開けたら、獲得できるスコアを減らす。
前半は1ピクセル1点、後半は1ピクセル2点減算し、不正解が無ければ全64ピクセルを開けるとちょうど0点になるようにした。
ここでも、獲得できるスコアが負になった場合は、0にする。
正解の処理
160 S=S+D:PLAY"O5E16R64C16.":LOCATE16,16:?CHR$(A);" デ セイカイ!":LOCATE16,18:?"キー ヲ オシテネ"
170 IF INKEY()=0 WAIT1:GOTO170
180 LOCATE16,16:?" ":LOCATE16,18:?" ":Q=Q+1:IF Q<=N GOTO 60
正解が出たので、スコアを加算し、正解の音と表示を出す。
キーが押されるまで待機する。
キーが押されたら、正解の表示を消し、規定の問題数が残っているなら次の問題に進む。
終了処理
190 LOCATE16,6:?"スコア ";S:LOCATE16,10:?"オツカレ サマ デシタ!":LOCATE16,12:?" ":LOCATE16,13:?" "
200 LOCATE 0,16
最終的なスコアを出力し、他の部分も終了用に書き換える。
最後に、カーソルを描画した部分の後に移動し、プログラムを終了する。
おまけ:今回新たに見つけた 1.3.1 の弱点
IchigoJam BASIC 1.3.1 では、他のバージョンでは正常に計算できる式でも Complex expression エラーになってしまうことがある。
そのため、1.4 系以降専用でないプログラムは、他のバージョンよりも優先して 1.3.1 で動作確認を行うのがよい。
今回もそれで動作確認を行ったところ、1.3.1 の新たな弱点を発見した。
それは、
?#1 AND 1
が Syntax error になることである。
まず、このコードを 1.4.3 で実行すると、意図通り #1 と 1 の論理ANDが計算され、1 が出力される。
しかし、1.3.1 で実行すると、26 が出力された後 Syntax error となった。
これは、#1 AND 1 が、#1 A までをまとめて16進数として解釈され、残った ND 1 が意味不明となったためと考えられる。
まとめ
Ichigojam BASIC で「文字当てゲーム」を実装し、その過程で 1.4.3 では評価できるが 1.3.1 では評価できない式を発見した。






