【发布时间】:2014-10-08 14:29:22
【问题描述】:
我已经阅读了this的问题,并对我的问题进行了研究,但我发现我还没有合适的答案。
我想用 ruby 构建一个通用数据结构,我可以用它来实现我认为合适的任何(2d,矩形)迷宫生成算法。首先,我将实现Randomized Prim's 和Depth-First Search,稍后我将要实现Sidewinder 等。目标是能够生成各种不同外观的迷宫。仅供参考,墙不是“填充”单元格 - 它是两个相邻单元格之间的分隔线,无论是实心的还是非实心的。
但我面临的问题是所有算法都需要了解不同的事物。例如,Prim's 说要选择 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 = []
但现在我开始对如何存储特定细节感到困惑。我应该有一个多维的单元格数组吗?细胞会跟踪自己的四堵墙吗?如果我这样做,那么当我切换墙时,我必须增加复杂性,因为我还需要获取相邻单元格的墙。如果我让一个单元格只跟踪它的 RIGHT 和 DOWN 墙壁,那么我会增加获取 UP 和 LEFT 墙壁状态的复杂性。
另一方面,如果单元格和墙壁维护在单独的列表中,我应该为所有墙壁设置一个数组,还是为 UP/DOWN 墙壁设置一个数组,为 LEFT/RIGHT 墙壁设置一个数组?在第一种情况下,选择随机墙更容易,并查询特定墙的状态,但更难实际构建 - 墙不会与网格很好地对齐。而且它让细胞更难了解它周围的墙壁。
我应该跟踪细胞吗?常识说它们必须是对象,因为后来的一些算法将要求单元格知道它们的位置。但如果我想使用某种Graph,比如Adjacency Matrix,那么整个结构似乎设置为只有轨道墙。此外,对于大型迷宫,矩阵变得非常大。
这可能是分析瘫痪的情况,但事实仍然是我不知道从哪里开始。
【问题讨论】:
-
引用伟大的 Fred Brooks 的话:“打算扔掉一个;无论如何,你会的。”
-
哦,我已经编写和重写了大约 100 行代码,现在只删除了大约 3 或 4 次。似乎没有什么能涵盖我需要的一切:(
标签: ruby algorithm data-structures maze