;makemaze.as 乱数で迷路を作成する ;前提 ;正方形を迷路の最小構成単位(セル)とし、1つのセルは壁と通路のいずれかとする ;迷路は縦も横も奇数個のセルから成り、Xが0または最大座標、またはYが0または ;最大座標のセルを外壁(周囲の壁)とする ;アルゴリズム ;【0】 初期状態ではすべてのセルは通路とする ;【1】 外壁を作る ;【2】 X座標もY座標も偶数のセルを壁にする(外壁を除く) ;【3】 上記のそれぞれのセルに対して、上下左右いずれかの隣のセル(乱数で選ぶ)を ;  壁にする ;  ただし、 ;【3−1】 上隣のセルを壁にすることができるのはYが2の場合のみ ;【3−2】 選択したセルが既に壁である場合、選び直す ;※このアルゴリズムで作った迷路は、必ずすべての壁が外壁とつながるため、 ; 右手法ですべての通路セルを通ることができる。 ; (右手法とは、右手を壁につけ壁から離さずに進むやり方) ; これを避けるには、3−2を外せばよい(下記★印の行をコメントアウトする) wid=640: heit=480 ;ウィンドウサイズ cwid=20: cheit=22 ;セルサイズ mwid=(wid/cwid-1)/2*2+1: mheit=(heit/cheit-1)/2*2+1 ;迷路のセルの数(奇数) dim maze,mwid,mheit dim dirx,4: dim diry,4 ;方向コード 0:左 1:下 2:右 3:上 dirx=-1,0,1, 0 ;方向コードに対応するX座標増分 diry= 0,1,0,-1 ;方向コードに対応するY座標増分 sdim s,mwid*2+1 randomize screen 0,wid,heit,,(dispx-wid)/2,(dispy-heit)/2 ;外壁を作る【1】 repeat mheit maze.0.cnt=1: x=mwid-1: maze.x.cnt=1 loop repeat mwid-2,1 maze.cnt.0=1: y=mheit-1: maze.cnt.y=1 loop ;内部の作成 y=2: m=4 repeat mheit/2-1 x=2: if y==4: m=3 ;【3−1】 repeat mwid/2-1 maze.x.y=1 ;【2】 repeat ;★ rnd dir,m: xx=x+dirx.dir: yy=y+diry.dir if maze.xx.yy==0: break ;★【3−2】 loop ;★ maze.xx.yy=1 ;【3】 x+=2 loop y+=2 loop ;表示 y=0 repeat mheit s="" repeat mwid if maze.cnt.y { s+="■" } else { s+=" " } loop mes s y++ loop stop