SHIROのIchigoJam日記

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

なんちゃって3D迷路

3D表示の迷路ゲームです。かなりごまかした表示なので、あくまで「なんちゃって」です(笑)

  • プログラムは3分割です。スロット0,1,2にそれぞれSAVEして、LRUN0で実行してください。
  • 実行後、数秒待つと迷路の3Dビューが表示されます。ゴールを目指してください。
  • 移動操作は、カーソルキー↑=前進、←=左を向く、→=右を向く、↓=後ろを向く、です。
  • スペースキーを押すと、迷路のマップが表示されます。左上(座標0,0)がスタート地点、右下(座標9,9)がゴールです。もう一度スペースキーを押すと、3Dビューに戻ります。


↑プレイ画面(3Dビュー)です。

↑プレイ画面(マップ表示)です。

※8/13修正

  • スタックがおかしくなるバグを修正
  • マップ表示を一部変更
  • FILE関数を使ってEEPROM対応。好きなスロット番号から3本のプログラムを保存して、LRUNで実行できます。

※8/15修正

  • マップ表示を一般的なLCを使う方法に変更。多少古いファームウェアでも動作します。

スロット0(迷路作成、ゲームプレイ)

1 '*3D-MAZE*
2 CLV:G=FILE()+1:[0]=9:FORX=1TO8:[X]=1:NEXT:[9]=3
3 FORY=1TO8:[Y*10]=8:[Y*10+9]=2:NEXT
4 [90]=12:FORX=1TO8:[90+X]=4:NEXT:[99]=6
5 FORY=0TO8:FORX=0TO8
6 D=RND(4):IFD=0ANDY>0GOTO6
7 Z=X+Y*10
8 IFD=0GOSUB23
9 IFD=1GOSUB24:IFD=-1GOTO6
10 IFD=2GOSUB26:IFD=-1GOTO6
11 IFD=3GOSUB28:IFD=-1GOTO6
12 NEXT:NEXT
13 P=0:Q=0:D=1:CLT:LRUNG
14 K=INKEY()
15 IFK=32BEEP20:LRUNG+1
16 IFK=30BEEP20:GOSUB30:LRUNG
17 IFK=28BEEP20:GOSUB33:LRUNG
18 IFK=29BEEP20:GOSUB35:LRUNG
19 IFK=31BEEP20:GOSUB37:LRUNG
20 LC27,2:?TICK()/60
21 IFP<>9ORQ<>9GOTO14
22 BEEP20,30:LC4,10:?"*** GOAL! ***":LC0,21:END
23 [Z]=[Z]+2:[Z+1]=[Z+1]+8:RETURN
24 IF([Z+1]&4)>0D=-1:RETURN
25 [Z+1]=[Z+1]+4:[Z+11]=[Z+11]+1:RETURN
26 IF([Z+10]&2)>0D=-1:RETURN
27 [Z+10]=[Z+10]+2:[Z+11]=[Z+11]+8:RETURN
28 IF([Z]&4)>0D=-1:RETURN
29 [Z]=[Z]+4:[Z+10]=[Z+10]+1:RETURN
30 B=([P+Q*10]>>D)%2:IFBRETURN
31 P=P-(D=3)+(D=1):Q=Q-(D=0)+(D=2)
32 RETURN
33 D=D-1:IFD<0D=3
34 RETURN
35 D=D+1:IFD>3D=0
36 RETURN
37 D=D+2:IFD>3D=D-4
38 RETURN

スロット1(3Dビュー)

1 CLS:U=P:V=Q:E=10:F=8:GOSUB6:IF!FGOTO5
2 E=7:F=5:GOSUB12:GOSUB14
3 U=U-(D=3)+(D=1):V=V-(D=0)+(D=2):E=4:F=2:GOSUB6:IF!FGOTO5
4 LC9,9:?CHR$(#89,0,#86):LC10,10:?CHR$(1):LC9,11:?CHR$(#86,0,#89)
5 LC22,0:?"X,Y=";P;",";Q:LC22,2:?"TIME=":LRUNFILE()-1,14
6 N=[U+V*10]:S=(N>>D)%2:L=D-1:IFL<0L=L+4
7 IF(N>>L)%2THENGOSUB12 ELSEGOSUB16
8 R=D+1:IFR>3R=R-4
9 IF(N>>R)%2THENGOSUB14 ELSEGOSUB19
10 IFSGOSUB22:F=0
11 RETURN
12 IFSGOSUB23
13 FORX=10-ETO10-F:GOSUB25:NEXT:RETURN
14 IFSGOSUB24
15 FORX=10+FTO10+E:GOSUB25:NEXT:RETURN
16 IF!SGOSUB23
17 FORX=10-ETO10-F:GOSUB26:NEXT:IFP=UANDQ=VRETURN
18 FORY=10-ETO10+E:LC10-E,Y:?CHR$(#85):NEXT:RETURN
19 IF!SGOSUB24
20 FORX=10+FTO10+E:GOSUB26:NEXT:IFP=UANDQ=VRETURN
21 FORY=10-ETO10+E:LC10+E,Y:?CHR$(#8A):NEXT:RETURN
22 FORX=11-FTO9+F:GOSUB26:NEXT:RETURN
23 FORY=10-FTO10+F:LC10-F,Y:?CHR$(#8A):NEXT:RETURN
24 FORY=10-FTO10+F:LC10+F,Y:?CHR$(#85):NEXT:RETURN
25 LCX,X:?CHR$(#89):LCX,20-X:?CHR$(#86):RETURN
26 LCX,10-F:?CHR$(#8C):LCX,10+F:?CHR$(#83):RETURN

スロット2(マップ表示)

1 CLS
2 ?CHR$(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)
3 FOR Y=1 TO 17 STEP 2
4 ?CHR$(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1)
5 ?CHR$(1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1)
6 NEXT
7 ?CHR$(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1)
8 ?CHR$(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)
9 FOR Y=0 TO 9
10 FOR X=0 TO 9
11 N=[X+Y*10]/2
12 U=X*2+1
13 V=Y*2+1
14 IF N%2 LC U+1,V:?CHR$(1)
15 N=N/2
16 IF N%2 LC U,V+1:?CHR$(1)
17 NEXT
18 NEXT
19 IF D=0 C=#E2
20 IF D=1 C=#E1
21 IF D=2 C=#E3
22 IF D=3 C=#E0
23 LC P*2+1,Q*2+1:?CHR$(C)
24 LC 19,19:?"G"
25 LC 22,0:?"X,Y=";P;",";Q
26 LC 22,2:?"TIME="
27 K=INKEY()
28 LC 27,2:?TICK()/60
29 IF K<>32 GOTO 27
30 LRUNFILE()-1

プログラム解説

まともに迷路のデータを記憶しようとすると、メモリ(変数)が全然足りません。迷路の各交差点(1ブロック置き)につき、上下左右に「道がつながっている=0」「壁=1」と4ビットのデータを配列変数に保持することで、10×10=100個の交差点の迷路データを記憶しています。最初の迷路作成では、この配列変数を棒倒し法でいじって迷路データを作っています。

3Dビューは、迷路配列データを元に各交差点の左右と奥を、道/壁をチェックして描画しています。交差点の配置が1ブロック置きなので、自分が交差点に立って見ると、1ブロック先・3ブロック先の左右は必ず壁になるのがミソです。また4ブロック先以降は省略してごまかすことで、道/壁のチェックや描画は、0ブロック(自分が立っている交差点)と2ブロック先(1つ先の交差点)しか実質やっていません。これでコードを簡略化しています。表示速度も案外速かったのでよかったです。