这是DFS算法的伪代码 http://www.mazeworks.com/mazegen/mazetut/index.htm
创建一个CellStack(LIFO)来保存单元格位置列表
set TotalCells =网格中的单元格数量
随机选择一个单元格并将其命名为CurrentCell
设置VisitedCells = 1
而VisitedCells< TotalCells
找到所有邻居的CurrentCell,所有墙壁完好无损
如果找到一个或多个
随意选择一个
击倒它和CurrentCell之间的墙壁
推送CellStack上的CurrentCell位置
制作新单元格CurrentCell
将1添加到VisitedCells
否则
从CellStack中弹出最近的单元格条目 使它成为CurrentCell
ENDIF endWhile
我的小代码
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
我有两个类一个,因为Visiblesquare只是红色正方形,而另一个是Invisiblesquare,它是空方
答案 0 :(得分:1)
我认为你的问题在于使用rows:columns:tabulate:
来填充矩阵,因为你没有使用算法中描述的深度优先方法(似乎你也在为每个单元重新循环;我不要真的遵循它应该做的事情:()。从我的POV你应该:
initialize
方法中填写矩阵,将矩阵的所有方块设置为VisibleSquare
的新实例(每个实例至少应保持其位置和/或对其邻居的引用,以便你以后可以要求一个小区的邻居。)self arrangeWalls
方法的末尾添加一个新行(如initialize
),该方法实现了本文所述的算法。HTH