1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IchigoJam で文字当てゲーム

Posted at

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

実行結果例

↓全体の様子

↓タイトル画面
タイトル画面

↓出題中
出題中

↓出題中 (不正解)
出題中 (不正解)

↓正解
正解

↓終了
終了

プログラムのポイント

パラメータの設定

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 で実行すると、意図通り #11 の論理ANDが計算され、1 が出力される。

1.4.3 での実行結果

しかし、1.3.1 で実行すると、26 が出力された後 Syntax error となった。

1.3.1 での実行結果

これは、#1 AND 1 が、#1 A までをまとめて16進数として解釈され、残った ND 1 が意味不明となったためと考えられる。

まとめ

Ichigojam BASIC で「文字当てゲーム」を実装し、その過程で 1.4.3 では評価できるが 1.3.1 では評価できない式を発見した。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?