使用DFS算法生成迷宫

时间:2013-03-05 03:42:49

标签: smalltalk pharo maze

这是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,它是空方enter image description here

1 个答案:

答案 0 :(得分:1)

我认为你的问题在于使用rows:columns:tabulate:来填充矩阵,因为你没有使用算法中描述的深度优先方法(似乎你也在为每个单元重新循环;我不要真的遵循它应该做的事情:()。从我的POV你应该:

  1. initialize方法中填写矩阵,将矩阵的所有方块设置为VisibleSquare的新实例(每个实例至少应保持其位置和/或对其邻居的引用,以便你以后可以要求一个小区的邻居。)
  2. self arrangeWalls方法的末尾添加一个新行(如initialize),该方法实现了本文所述的算法。
  3. HTH