このプログラムは至ってシンプル。1画面サイズの迷路を作るだけのプログラムなのだ。
つまり、迷路を生成する仕組み(アルゴリズム)を紹介する、サンプルプログラムというわけだね。
どのように動作しているのかは、実行してみるとすぐにわかるだろう。迷路が完成したあとは任意のボタン/キー操作で次の迷路を作成し直すぞ。
VSYNC 10:
と付けて動作を遅らせてみるとわかりやすいかな?
- ’┌───────┐
- ’│メイロサクセイ│
- ’└───────┘
- CLEAR
- CLS
- MX=30:MY=21
- DIM M(MX,MY)
- DIM V(4,2)
- DATA 1,0,0,1,-1,0,0,-1
- FOR I=0 TO 3
- READ V(I,0),V(I,1)
- NEXT
- ’---
- @RESET
- ’---
- FOR Y=0 TO MY-1
- FOR X=0 TO MX-1
- M(X,Y)=0
- NEXT
- NEXT
- GOSUB @PUTWALL
- ’---
- TX=0:TY=0
- M(TX,TY)=1
- LOCATE TX+1,TY+1:PRINT” ”
- ’---
- @LOOP
- X=TX:Y=TY
- LOCATE 0,23
- PRINT TX;”,”;TY;
- ’---
- @MOVELOOP
- D=RND(4):C=4
- PX=X:PY=Y
- LOCATE 10,23
- PRINT ”(”;X;”,”;Y;”)”;
- ’---
- @DIRLOOP
- X=PX+V(D,0)
- Y=PY+V(D,1)
- IF X<0 OR X>MX-1 GOTO @DIRNEXT
- IF Y<0 OR Y>MY-1 GOTO @DIRNEXT
- ’---サユウ
- _X=X:_Y=Y
- O=1:GOSUB @WALL
- IF R GOTO @DIRNEXT
- O=-1:GOSUB @WALL
- IF R GOTO @DIRNEXT
- ’---マエ
- O=0:GOSUB @WALL
- IF R GOTO @DIRNEXT
- ’---マエノサユウ
- X=CX:Y=CY
- O=1:GOSUB @WALL
- IF R GOTO @DIRNEXT
- O=-1:GOSUB @WALL
- IF R GOTO @DIRNEXT
- ’---
- X=_X:Y=_Y
- M(X,Y)=1
- LOCATE X+1,Y+1:PRINT” ”
- GOTO @MOVELOOP
- ’---
- @DIRNEXT
- C=C-1:IF C==0 GOTO @POSNEW
- D=D+1:D=D AND 3
- GOTO @DIRLOOP
- ’---
- @POSNEW
- TX=TX+1
- IF TX<MX GOTO @POSCHK
- TX=0:TY=TY+1
- IF TY>MY-1 GOTO @POSEND
- @POSCHK
- CX=TX:CY=TY:GOSUB @WALL2
- IF R==FALSE GOTO @POSNEW
- GOTO @LOOP
- ’
- ’
- ’---
- @POSEND
- LOCATE 0,0
- @LOOP2
- IF BUTTON() GOTO @RESET
- K$=INKEY$()
- IF K$==”” GOTO @LOOP2
- GOTO @RESET
- ’
- ’
- ’
- @PUTWALL
- FOR Y=0 TO 22
- FOR X=0 TO 31
- LOCATE X,Y:PRINT”В”;
- NEXT
- NEXT
- RETURN
- ’
- ’
- @WALL
- I=D+O:I=I AND 3
- CX=X+V(I,0):CY=Y+V(I,1)
- ’---
- @WALL2
- R=FALSE
- IF CX<0 OR CX>MX-1 THEN RETURN
- IF CY<0 OR CY>MY-1 THEN RETURN
- IF M(CX,CY)==0 THEN RETURN
- R=TRUE
- RETURN