0
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

今日の時間が少なくなってくる中、いまだにアドベントカレンダーの枠が埋まっていない。
残り少ない時間でサクッと作れる程度の何かを作ろう。
たとえば……神経衰弱とか?

プログラム

10 ' シンプル シンケイスイジャク
20 FORI=0TO25:[I]=I/2:[26+I]=0:NEXT
30 FORI=0TO24:S=RND(26-I)+I:T=[I]:[I]=[S]:[S]=T:NEXT
40 M=0:G=0:S=-1:T=-1
50 CLS:?"ハズレ x ";M
60 IFG=13?"クリア!":END
70 FORI=0TO25
80 IF[26+I]<2LOCATEI%4*4,I/4+1:?CHR$(#41+I);":";
90 IF[26+I]=1?HEX$([I]);
100 NEXT
110 IFT>=0WAIT60:Y=[S]=[T]:M=M+!Y:G=G+Y:[26+S]=Y*2:[26+T]=Y*2:S=-1:T=-1:GOTO50
120 K=INKEY()&#DF-#41:IFK<0OR25<KWAIT1:GOTO120
130 IF[26+K]<>0GOTO120
140 [26+K]=1
150 IFS<0S=K:GOTO50
160 T=K:GOTO50

遊び方

画面 (:の左側) に表示されているアルファベットのキーを押すことで、選択する。
2個選択し、同じものが出ればそれらは消える。
違うものが出れば、それらはもとに戻り、ハズレのカウントが増える。
より少ないハズレ数で全て消すことを目指そう!

ポイント

  • 直接アルファベットのキーを押して選択する仕様にすることで、カーソルの実装を不要に
  • 変化するところだけ描き直すのは面倒なので、毎回全部描き直す
  • SWITCH1VIDEO3 の画面に収まるコンパクトなUI
  • 最初の手がかりが全く無いときに揃わないのも「ミス」とするのは嫌だと思ったので、「ハズレ」という表現を採用

実行結果例

↓ゲーム開始時の画面
ゲーム開始時の画面

↓ゲーム中の画面
ゲーム中の画面

↓ゲームクリア時の画面
ゲームクリア時の画面

↓ゲーム開始時の画面 (VIDEO3)
ゲーム開始時の画面 (VIDEO3)

解説

初期化

10 ' シンプル シンケイスイジャク
20 FORI=0TO25:[I]=I/2:[26+I]=0:NEXT
30 FORI=0TO24:S=RND(26-I)+I:T=[I]:[I]=[S]:[S]=T:NEXT
40 M=0:G=0:S=-1:T=-1

まず、26枚の「カード」を用意する。
添字を2で割ることで、同じ「カード」を2枚ずつ用意する。
ついでに、それらの「カード」の選択状態を初期化する。

次に、用意した「カード」をシャッフルする。
それぞれの「カード」を、(それを含めた) 残りの「カード」のうちランダムな1枚と入れ替えていく。

最後に、状態を表す以下の変数を初期化する。

  • M:ハズレの回数
  • G:ペアが揃った回数
  • S:選択した1枚目の添字
  • T:選択した2枚目の添字

描画

50 CLS:?"ハズレ x ";M
60 IFG=13?"クリア!":END
70 FORI=0TO25
80 IF[26+I]<2LOCATEI%4*4,I/4+1:?CHR$(#41+I);":";
90 IF[26+I]=1?HEX$([I]);
100 NEXT
110 IFT>=0WAIT60:Y=[S]=[T]:M=M+!Y:G=G+Y:[26+S]=Y*2:[26+T]=Y*2:S=-1:T=-1:GOTO50

ハズレの回数と、それぞれの「カード」を描画する。
選択状態が2未満 (0か1) であれば、その「カード」はまだ消していないので、選択するために押すキーを描画する。
選択状態が1であれば、その「カード」は選択されているので、中身を描画する。
中身は、十六進数を用い、全て1桁で描画する。

13回ペアが揃った場合、全ての「カード」を消したはずなので、「カード」の描画は行わず、「クリア!」を表示して終了する。

2枚目を選択したら、1枚目と2枚目が揃ったかを変数 Y に格納し、少し待機したあと状態を進める。
揃っている場合 (Y=1) は、揃った回数 G を1増やし、選択状態を 2 (消した) にする。
揃っていない場合 (Y=0) は、ハズレの回数 M を1増やし、選択状態を 0 (初期状態) にする。
いずれの場合も、選択した「カード」の添字の情報をリセットし、再び描画を行う。

操作

120 K=INKEY()&#DF-#41:IFK<0OR25<KWAIT1:GOTO120
130 IF[26+K]<>0GOTO120
140 [26+K]=1
150 IFS<0S=K:GOTO50
160 T=K:GOTO50

INKEY() 関数で、キー入力を受け付ける。
#20 をビット反転した値とのビットANDをとることで、アルファベット小文字が入力されても大文字に変換する。
さらに、A の文字コードである #41 を引き、添字に変換する。
変換結果が添字として無効である場合は、処理を行わず、次の入力を受け付ける。
(キー入力が無く 0 を受け取った場合も、変換結果は無効となる)

添字として有効であっても、それが既に選択されている場合 (揃って消した場合を含む) は、処理を行わず、次の入力を受け付ける。

選択されていなかった「カード」を選択したら、選択したというフラグを立てる。
1枚目の選択 (S に添字が記録されていない) なら S に、そうでなければ T に選択された「カード」の添字を記録する。
そして、描画を行う。

まとめ

IchigoJam で、あまり労力をかけずに神経衰弱ゲームを作ることができた。

※IchigoJamはjig.jpの登録商標です。

0
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
0
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?