Ruby 多算法迷宫生成器的特定数据结构

Ruby 多算法迷宫生成器的特定数据结构,ruby,algorithm,data-structures,maze,Ruby,Algorithm,Data Structures,Maze,我已经阅读了这个问题,并对我的问题做了研究,但我发现我还没有一个合适的答案 我想用ruby构建一个通用的数据结构,用它我可以实现我认为合适的任何(2d,矩形)迷宫生成算法。首先,我将实施和,然后我将要实施和其他。目标是能够生成各种不同外观的迷宫。仅供参考,墙不是一个“填充”的单元——它是两个相邻单元之间的分隔物,是实心还是非实心 但我面临的问题是,所有的算法都需要了解不同的东西。例如,Prim说选择一个单元格,并将其墙添加到墙列表。没关系,我可以从这个开始: class Cell def g

我已经阅读了这个问题,并对我的问题做了研究,但我发现我还没有一个合适的答案

我想用ruby构建一个通用的数据结构,用它我可以实现我认为合适的任何(2d,矩形)迷宫生成算法。首先,我将实施和,然后我将要实施和其他。目标是能够生成各种不同外观的迷宫。仅供参考,墙不是一个“填充”的单元——它是两个相邻单元之间的分隔物,是实心还是非实心

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

class Cell
  def get_surrounding_walls
    # some code
  end
end


class Wall
  @solid = true
  def remove
    @solid = false
  end
end

wall_list = []
但现在我开始对如何存储具体细节感到困惑。我应该有一个多维的细胞阵列吗?细胞能追踪自己的四壁吗?如果我这样做了,那么当我切换一个墙时,我必须增加复杂性,因为我还需要获得相邻单元的墙。如果我让一个单元格只跟踪,比如说,它的右墙和下墙,那么我就增加了获取上墙和左墙状态的复杂性

另一方面,如果单元格和墙保持在单独的列表中,我应该为所有墙设置一个数组,还是为上/下墙设置一个数组,为左/右墙设置一个数组?在第一种情况下,更容易选择随机墙,并查询特定墙的状态,但更难实际构造墙,因为墙与网格没有很好地对齐。这使得细胞更难了解周围的墙

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


这可能是一个分析瘫痪的案例,但事实是我不知道从哪里开始

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

创建这样的散列

wall[[10,5]] = [1,0]
wall[[11,5]][0]
wall[[10,4]][1]
所以第10行第5列中的单元格有一个顶墙,没有右墙

获取一个牢房的所有墙壁。您必须查询它的底部和左侧单元格

因此,要获得[10,5]的所有墙,需要像这样查询散列

wall[[10,5]] = [1,0]
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\u wall,“up”=>up\u wall,“right”=>right\u wall}
,其中边界单元格缺少条目。墙参照其两个相邻的单元并存储它们是否为实体。迷宫对象存储二维单元阵列

因为您是用Ruby编程的,所以我假设速度不是最重要的。我试图在简单的使用和简单的实现之间取得平衡

下面是一些受支持的操作

  • 找一个牢房的邻居。在散列中查找
    “up”
    ,以获得墙。比较单元与墙的一个相邻单元是否相等;返回不相等的邻居
  • 获取与单元格相邻的单元格。遍历散列值并执行上一步
  • 将墙标记为实心/非实心。简单
  • 查询墙的状态。简单
  • 获取一个随机单元。简单
  • 得到一个随机的墙。我们没有墙的清单,所以我们必须聪明一点。选择一个随机单元和一个随机方向。如果该单元格在该方向上有墙,则返回它。否则,请再试一次。我们可以使用类似的技术获得随机的左/右墙

  • 引用伟大的弗雷德·布鲁克斯(Fred Brooks)的话:“计划扔掉一个,无论如何,你会的。”哦,我已经编写和重写了大约100行代码,现在只删除了大约3到4次。似乎没有什么东西包含了我所需要的一切:(