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つ先の交差点)しか実質やっていません。これでコードを簡略化しています。表示速度も案外速かったのでよかったです。