2

DFS アルゴリズムの擬似コードは次のとおりです http://www.mazeworks.com/mazegen/mazetut/index.htm

セル位置のリストを保持する CellStack (LIFO) を作成します
TotalCells = グリッド内のセルの数を設定し
ます ランダムにセルを選択し、CurrentCell と呼びます
VisitedCells = 1 を設定 します


while VisitedCells < TotalCells 1つ以上が見つかった場合、すべての壁が無傷のCurrentCellのすべての隣人を見つけるランダムに1つを選択して、それと
CurrentCellの間の壁をノックダウンする
CellStackのCurrentCellの位置をプッシュ
する 新しいセルCurrentCell
がVisitedCellsに1を加える

そうしないと

CellStack から最新のセル エントリをポップし、
CurrentCell にします。

endIf endWhile

私のsmalltalkコード

 Maze>>initialize
   |sampleCell width height n sample |

super initialize.
self borderWidth: 0.   
sampleCell := VisibleSquare  new.  
width := sampleCell width.
height := sampleCell  height.
self bounds: (5@5 extent: ((width + n) @ (height + n)) + (2 * self borderWidth)).
visitedcell :=0.
cells := Matrix rows: 8 columns: 7 tabulate: [:i :j |  self newCellAt: i at:j].

その他の方法はこちら。

Maze>>newCellAt:i at:j
  |c|
   celltotal:= 8*7.
[(visitedcell< celltotal)] whileTrue:
["Im stuck with selecting cells next to current cell to make it as
Invisible square" 
"else do this"
c := VisibleSquare new.
origin := self innerBounds origin.
self addMorphBack:  c.
c position: ((i - 1) * c width) @ ((j - 1) * c height) + origin. 
 ^ c 

私は 2 つのクラスを持っています。ここに画像の説明を入力

4

1 に答える 1

1

あなたの問題はrows:columns:tabulate:、アルゴリズムで説明されている深さ優先のアプローチを使用していないため、行列を埋めるために使用することにあると思います(また、セルごとに再度ループしているようです;私はそれが何であるかを実際には理解していません)これを行うことになっています:( ).私のPOVから、次のことを行う必要があります。

  1. メソッドに行列を入力し、行列のinitializeすべての正方形を新しいインスタンスに設定しますVisibleSquare(各インスタンスは少なくともその位置および/または隣接セルへの参照を保持する必要があります。これにより、後でセルの隣接セルを要求できます)。
  2. 記事で説明されているように、アルゴリズムを実装するメソッドself arrangeWallsの最後に新しい行 ( など) を追加します。initialize

HTH

于 2013-03-05T11:19:32.040 に答える