多算法迷宫构建器的特定数据结构



我已经读过这个问题,并对我的问题进行了研究,但我发现我还没有合适的答案。

我想用ruby构建一个通用的数据结构,用它我可以实现我认为合适的任何(2d,矩形)迷宫生成算法。首先,我将实现随机化Prim和深度优先搜索,稍后我将实现Sidewinder和其他功能。目标是能够生成各种不同外观的迷宫。仅供参考,墙不是一个"填充"的细胞——它是两个相邻细胞之间的分隔物,要么是实心的,要么不是实心的。

但我面临的问题是,所有的算法都需要了解不同的东西。例如,Prim说要选择一个Cell并将其Walls添加到wall_list。没关系,我可以从这个开始:

class Cell
  def get_surrounding_walls
    # some code
  end
end

class Wall
  @solid = true
  def remove
    @solid = false
  end
end
wall_list = []

但现在我开始对如何存储特定细节感到困惑。我应该有一个多维单元格数组吗?细胞会追踪自己的四壁吗?如果我这样做,那么当我切换Wall时,我必须增加复杂性,因为我也需要获得相邻单元格的Wall。如果我让一个单元格只跟踪它的右墙和下墙,那么我会增加获取上墙和左墙状态的复杂性。

另一方面,如果单元格和墙被保存在单独的列表中,我应该为所有墙保留一个数组,还是为上/下墙和左/右墙各保留一个?在第一种情况下,可以更容易地选择一堵随机墙,并查询特定墙的状态,但更难实际构建——墙与网格不太对齐。这让细胞更难了解它周围的墙壁

我应该追踪细胞吗?常识说它们需要是对象,因为后来的一些算法需要细胞知道是哪个设置了它们。但如果我想使用某种图,比如邻接矩阵,那么整个结构似乎只设置为跟踪墙。此外,对于大型迷宫,矩阵会变得非常大。

这很可能是一种分析麻痹症,但事实仍然是,我不知道从哪里开始。

为了避免墙信息的重复,因为单元可以共享墙。让每个单元格只存储顶部和右侧墙的状态。您需要处理最左边的列和最下面一行的边缘大小写,因为它们的墙状态将不会被覆盖。您可以通过引入包含该信息的虚拟单元来实现这一点。

创建一个类似的散列

wall[[10,5]] = [1,0]

所以第10行第5列中的单元格有一个顶壁,没有右壁。

得到一个细胞的所有壁。你必须查询它的底部和左侧单元格

因此,要获得[10,5]的所有墙,您需要像以下一样查询哈希

wall[[11,5]][0]
wall[[10,4]][1]

因此,细胞[10,5]的全套壁是

[ wall[[10,5]][0], wall[[10,5]][1] , wall[[11,5]][0] , wall[[10,4]][1] ]

上面的数组是从顶部开始顺时针移动的每面墙的状态。

因此,墙的信息被存储,细胞的墙被推断出来。

您也可以使用数组而不是散列来存储墙的位置

为每个单元和每个墙创建一个对象。每个单元格存储其坐标和类似{"left"=>left_wall, "up"=>up_wall, "right"=>right_wall}的散列,其中边界单元格缺少条目。墙参照其相邻的两个单元,并存储它们是否为实体。迷宫对象存储一个二维的细胞阵列。

由于您使用Ruby进行编程,我认为速度不是首要任务。我试图在使用的简单性和实现的简单性之间取得平衡。

以下是一些支持的操作。

  1. 找一个牢房的上邻居在散列中查找"up"以获得墙。将单元格与墙的相邻单元格之一进行相等比较;返回不相等的邻居
  2. 获取与单元格相邻的单元格遍历散列值并执行上一步
  3. 将墙标记为实心/非实心简单
  4. 查询墙的状态简单
  5. 获取一个随机单元格简单
  6. 随便找一面墙我们没有墙的清单,所以我们得聪明一点。选择一个随机单元格和一个随机方向。如果该单元格在该方向上有墙,请将其返回。否则,请重试。我们可以使用类似的技术得到一个随机的左/右墙

最新更新