Smalltalk 用DFS算法生成迷宫

Smalltalk 用DFS算法生成迷宫,smalltalk,pharo,maze,Smalltalk,Pharo,Maze,下面是DFS算法的伪代码 创建一个单元堆栈(LIFO)以保存单元位置列表 设置TotalCells=网格中的单元格数 随机选择一个单元格并将其命名为CurrentCell 设置VisitedCells=1 而VisitedCells>newCellAt:i at:j |c| 单元总数:=8*7。 [(已访问的单元格

下面是DFS算法的伪代码

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

而VisitedCells 如果找到一个或多个 随机选择一个
拆掉它和CurrentCell之间的墙
将CurrentCell位置推到CellStack上
使新单元格成为当前单元格
将1添加到VisitedCells

否则

将最近的单元格条目从单元格堆栈中弹出
让它成为一个电池

恩迪夫 结束时

我的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 
Maze>>newCellAt:i at:j
|c|
单元总数:=8*7。
[(已访问的单元格<单元格总数)]同时:
[“我一直在选择当前单元格旁边的单元格,使其成为
“看不见的正方形”
“否则就这样做”
c:=可视广场新建。
原点:=自内边界原点。
自加回:c。
c位置:((i-1)*c宽度)@((j-1)*c高度)+原点。
^c

我有两个类,一个是Visiblesquare,只不过是红方块,另一个是Invisiblesquare,它是空方块,我想你的问题在于使用
行:列:表格:
来填充矩阵,因为你没有使用算法中描述的深度优先方法(你似乎也在为每个单元格再次循环;我真的不明白它应该做什么:()。从我的观点来看,你应该:

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

  • HTH

    那么,问题是什么?我想你是对的,它使整个过程对我来说很复杂,我现在使用TileMorph类,用它很容易实现迷宫