SHIROのIchigoJam日記

IchigoJamの電子工作とプログラミングをメインに

リーチゲーム

中学生の頃に紙と鉛筆で遊んだ「リーチゲーム」をIchigoJamで再現しました。
その昔の8ビットPCやプチコンでも作ったことがありますが、かなり圧縮してIchigoJamでも何とか動かせました。
容量がギリギリなので、圧縮して見づらいプログラムになっています。ご了承ください。


プログラムの概要

CPUと対戦するビンゴゲームです。
画面左側に自分のマス目、右側にCPUのマス目が表示されます。
(CPUのマス目は、ゲーム対戦中は隠されていて見えません)
自分のマス目の数字を1手ずつ入力して、「−」にして消していきます。
逆にCPUが選んだ数字は、自分のマス目では「○」になります。
「○」が縦・横・斜めのどこか1列で5個揃えば勝ちです。
どこの列を捨てて消していくかの戦略が難しく、後述のリーチ宣言ルールによる一発大逆転もあり、頭を使いますが楽しいゲームです。
CPUは数秒間考えて打ってきますが、結構強いので、本気でかかってください。

ゲームのルール

  1. 5×5のマス目に1〜25の数字をランダムに並べてスタート。
  2. 自分が言った数字は「−」となり消える。
  3. 相手が言った数字は「○」となる。
  4. 「○」が縦・横・斜めのどこか1列で5個揃えば勝ち。
  5. 相手が言った数字で「○」が4個並んだ時は「リーチ」と宣言し、相手にもう一度数字を言わせることができる。

プログラムの実行方法

プログラムは3分割になっています。
reach0.txt→スロット0
reach1.txt→スロット1
reach2.txt→スロット2
にSAVEした後、「LRUN 0」でスタートしてください。
※8/13修正版から、連続した3スロットに保存すれば、どのスロット番号でもOKです。

(4/9修正)
●リーチの判断のバグ修正。
●引き分けの処理を追加。
●画面表示を一部修正。

(4/10修正)
●ゲーム進行のバグを修正。
●終了時の処理を変更。
●数字入力のバグを修正。
●あまりにCPUが強いので、CPUを先手に。

(8/13修正)
●スタックエラーを回避するように修正。
●FILE関数を使ってEEPROM対応。連続した3スロットに保存すれば、どのスロット番号でもOKです。
●内部処理の一部変更、最適化。

【スロット0】(初期設定)

1 CLV:CLS:LC6,0:?"*** REACH GAME ***":?
2 J=25:K=50:L=75
3 FORM=0TOJSTEPJ
4 FORN=0TO24:[M+N]=N+1:NEXT
5 FORN=1TO30:A=RND(25):B=RND(25):C=[M+A]:[M+A]=[M+B]:[M+B]=C:NEXT:NEXT
6 ?"[YOU]"
7 FORY=0TO4:FORX=0TO4:N=[X+Y*5]
8 LCX*3,Y*2+4:IFN>9THEN?N;ELSE?" ";N;
9 NEXT:NEXT
10 LC16,2:?"[CPU]"
11 FORY=0TO4:FORX=0TO4
12 LC16+X*3,Y*2+4:?".."
13 NEXT:NEXT
14 LET[50],1,0,0,0,2,0,1,0,2,0,0,0,3,0,0,0,2,0,1,0,2,0,0,0,1
15 LRUNFILE()+2

【スロット1】(プレイヤーのターン、リーチ・勝利チェック)

1 F=FILE()+1:IFG=1G=0:GOSUB12:IFZ>24ORQGOTO28 ELSEIFRLRUNF
2 G=0:GOSUB7:G=1:GOSUB12:IFQGOTO28
3 IFRGOTO2 ELSELRUNF
4 LC16*G,2:IFG?"[CPU]"ELSE?"[YOU]"
5 FORY=0TO4:FORX=0TO4:N=[G*25+X+Y*5]:LC16*G+X*3,Y*2+4:IFN<1C=45-188*N:?CHR$(C,C)ELSEIFN>9?NELSE?" ";N
6 NEXT:NEXT:RETURN
7 FORY=15TO22:LC0,Y:?" ":NEXT:LC0,15:INPUT"Erase No.=?",D:IFD<1ORD>25GOTO7
8 GOSUB10:IFU<0GOTO7
9 [A]=0:GOSUB4:RETURN
10 U=-1:FORY=0TO4:FORX=0TO4:N=[G*25+X+Y*5]:IFD=NU=X:V=Y
11 NEXT:NEXT:A=U+V*5:RETURN
12 GOSUB10:[G*25+A]=-1:IF!GGOSUB4
13 LC0,16:R=0
14 E=1:S=0:Y=V:FORX=0TO4:GOSUB25:NEXT:GOSUB19
15 E=1:S=0:X=U:FORY=0TO4:GOSUB25:NEXT:GOSUB19
16 C=[K+U+V*5]:IFC&1GOSUB23:GOSUB19
17 IFC&2GOSUB24:GOSUB19
18 Z=Z+1:WAIT60:RETURN
19 IFS<4OR!EORQRETURN
20 BEEP:IFG?"*CPU ";ELSE?"*YOU ";
21 IFS=5?"WIN!*":G=1:GOSUB4:Q=1:RETURN
22 ?"REACH!*":R=1:RETURN
23 E=1:S=0:FORX=0TO4:Y=X:GOSUB25:NEXT:RETURN
24 E=1:S=0:FORY=0TO4:X=4-Y:GOSUB25:NEXT:RETURN
25 N=[G*25+X+Y*5]:IF!NE=0
26 IFN=-1S=S+1
27 RETURN
28 LC0,20:IF!Q?"=DRAW="
29 END

【スロット2】(CPUのターン)

1 G=1:FORV=0TO4:GOSUB13:FORU=0TO4:[L+U+V*5]=0:GOSUB12:NEXT:NEXT
2 FORU=0TO4:GOSUB14:FORV=0TO4:GOSUB12:NEXT:NEXT
3 GOSUB15:FORU=0TO4:V=U:GOSUB12:NEXT
4 GOSUB16:FORU=0TO4:V=4-U:GOSUB12:NEXT
5 W=200:FORY=0TO4:FORX=0TO4
6 A=X+Y*5:C=[L+A]:IFC0W=C:U=X:V=Y
7 NEXT:NEXT
8 A=U+V*5:D=[J+A]
9 FORY=15TO22:LC0,Y:?" ":NEXT
10 LC0,15:?"CPU erase=";D:[J+A]=0
11 LRUNFILE()-1
12 A=U+V*5:[L+A]=[L+A]+([K+A]+S)*E:RETURN
13 E=1:S=0:Y=V:FORX=0TO4:GOSUB17:NEXT:RETURN
14 E=1:S=0:X=U:FORY=0TO4:GOSUB17:NEXT:RETURN
15 E=1:S=0:FORX=0TO4:Y=X:GOSUB17:NEXT:RETURN
16 E=1:S=0:FORY=0TO4:X=4-Y:GOSUB17:NEXT:RETURN
17 N=[G*25+X+Y*5]:IF!NE=0
18 IFN=-1S=S+1
19 RETURN