2

这是 DFS 算法的伪代码 http://www.mazeworks.com/mazegen/mazetut/index.htm

创建一个 CellStack (LIFO) 来保存一个单元格位置列表
set TotalCells = 网格中的单元格数量
随机选择一个单元格并将其命名为 CurrentCell
设置 VisitedCells = 1

当 VisitedCells < TotalCells 找到 CurrentCell 的所有邻居,如果找到一个或多个,则所有墙都完好无损
,如果找到一个或多个随机选择一个,
则将其与 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 个类,其中一个是 Visiblesquare 只是红色方块,另一个是 Invisiblesquare,它是空方块在此处输入图像描述

4

1 回答 1

1

我认为您的问题在于使用rows:columns:tabulate:填充矩阵,因为您没有使用算法中描述的深度优先方法(而且您似乎也在为每个单元格再次循环;我并没有真正理解它是什么应该这样做:()。从我的 POV 来看,你应该:

  1. 在方法中填充矩阵,将矩阵的initialize所有正方形设置为一个新实例VisibleSquare(每个实例至少应保持其位置和/或对其邻居的引用,以便您稍后可以请求单元格的邻居)。
  2. 在实现本文所述算法self arrangeWalls的方法末尾添加一个新行(如)。initialize

高温高压

于 2013-03-05T11:19:32.040 回答