スマイルブーム自家製プログラム特集 PART4 →PART5

迷路作成 by スマイルブーム

再生

 このプログラムは至ってシンプル。1画面サイズの迷路を作るだけのプログラムなのだ。
 つまり、迷路を生成する仕組み(アルゴリズム)を紹介する、サンプルプログラムというわけだね。
 どのように動作しているのかは、実行してみるとすぐにわかるだろう。迷路が完成したあとは任意のボタン/キー操作で次の迷路を作成し直すぞ。


 CHECK POiNT 

博士
これはあくまで迷路作成の手法のひとつを示したプログラムであって、ゲームではないからの。そのへんオンビンにな?

ワンパク
ムギギギ……。

インテリ
まず左上の開始点から完全に行き詰まるまで、ランダムに道を引き続けているね。
行き止まりになったら、開始点から枝分かれできる最短の場所をサーチして、そこから線を引く、というのを続けているわけだね。

神崎
30行と62行の先頭にVSYNC 10:と付けて動作を遅らせてみるとわかりやすいかな?

博士
画面下の数字は左が現在の開始点(枝分かれ点)、右が現在の座標、というのは言うまでもないじゃろうな。
次はこの迷路を応用したプログラム例をお見せするぞい。

ワンパク
ウムム……。なんだか調子が狂うぜ……。

プログラムリスト

  1. ’┌───────┐
  2. ’│メイロサクセイ│
  3. ’└───────┘
  4. CLEAR
  5. CLS
  6. MX=30:MY=21
  7. DIM M(MX,MY)
  8. DIM V(4,2)
  9. DATA 1,0,0,1,-1,0,0,-1
  10. FOR I=0 TO 3
  11.  READ V(I,0),V(I,1)
  12. NEXT
  13. ’---
  14. @RESET
  15. ’---
  16. FOR Y=0 TO MY-1
  17.  FOR X=0 TO MX-1
  18.   M(X,Y)=0
  19.  NEXT
  20. NEXT
  21. GOSUB @PUTWALL
  22. ’---
  23. TX=0:TY=0
  24. M(TX,TY)=1
  25. LOCATE TX+1,TY+1:PRINT” ”
  26. ’---
  27. @LOOP
  28. X=TX:Y=TY
  29. LOCATE 0,23
  30. PRINT TX;”,”;TY;
  31. ’---
  32. @MOVELOOP
  33. D=RND(4):C=4
  34. PX=X:PY=Y
  35. LOCATE 10,23
  36. PRINT ”(”;X;”,”;Y;”)”;
  37. ’---
  38. @DIRLOOP
  39. X=PX+V(D,0)
  40. Y=PY+V(D,1)
  41. IF X<0 OR X>MX-1 GOTO @DIRNEXT
  42. IF Y<0 OR Y>MY-1 GOTO @DIRNEXT
  43. ’---サユウ
  44. _X=X:_Y=Y
  45. O=1:GOSUB @WALL
  46. IF R GOTO @DIRNEXT
  47. O=-1:GOSUB @WALL
  48. IF R GOTO @DIRNEXT
  49. ’---マエ
  50. O=0:GOSUB @WALL
  51. IF R GOTO @DIRNEXT
  52. ’---マエノサユウ
  53. X=CX:Y=CY
  54. O=1:GOSUB @WALL
  55. IF R GOTO @DIRNEXT
  56. O=-1:GOSUB @WALL
  57. IF R GOTO @DIRNEXT
  58. ’---
  59. X=_X:Y=_Y
  60. M(X,Y)=1
  61. LOCATE X+1,Y+1:PRINT” ”
  62. GOTO @MOVELOOP
  63. ’---
  64. @DIRNEXT
  65. C=C-1:IF C==0 GOTO @POSNEW
  66. D=D+1:D=D AND 3
  67. GOTO @DIRLOOP
  68. ’---
  69. @POSNEW
  70. TX=TX+1
  71. IF TX<MX GOTO @POSCHK
  72. TX=0:TY=TY+1
  73. IF TY>MY-1 GOTO @POSEND
  74. @POSCHK
  75. CX=TX:CY=TY:GOSUB @WALL2
  76. IF R==FALSE GOTO @POSNEW
  77. GOTO @LOOP
  78. ’---
  79. @POSEND
  80. LOCATE 0,0
  81. @LOOP2
  82. IF BUTTON() GOTO @RESET
  83. K$=INKEY$()
  84. IF K$==”” GOTO @LOOP2
  85. GOTO @RESET
  86. @PUTWALL
  87. FOR Y=0 TO 22
  88.  FOR X=0 TO 31
  89.   LOCATE X,Y:PRINT”В”;
  90.  NEXT
  91. NEXT
  92. RETURN
  93. @WALL
  94. I=D+O:I=I AND 3
  95. CX=X+V(I,0):CY=Y+V(I,1)
  96. ’---
  97. @WALL2
  98. R=FALSE
  99. IF CX<0 OR CX>MX-1 THEN RETURN
  100. IF CY<0 OR CY>MY-1 THEN RETURN
  101. IF M(CX,CY)==0 THEN RETURN
  102. R=TRUE
  103. RETURN