所以,我正在考虑制作一个简单的随机世界发生器。这个发生器将创建一个起始“细胞”,它将具有一到四个随机出口(在基本方向,类似于迷宫)。决定退出后,我会在每个出口处生成一个新的随机“单元格”,并在玩家接近尚未生成的世界的某个部分时重复。这个概念将允许一个“无限”的世界,所有这些都是随机生成的;但是,我不确定如何在内部最好地代表这一点。
我正在使用C ++(这并不重要,我可以实现任何必要的数据结构)。起初我想过使用一种有向图,其中每个节点都会将边缘定向到它周围的每个单元格,但如果用户在世界中找到一个点,回溯并回到那个位置,这可能不会很好。从另一个方向发现。世界可能会做一些奇怪的事情,例如在一个位置生成两个单元格。
关于哪种数据结构可能对这种情况最有效的任何想法?或者我对随机的世界一代做了一些非常愚蠢的事情?
非常感谢任何帮助。 谢谢, 克里斯
答案 0 :(得分:5)
我建议您阅读有关图表的内容。这正是随机图生成的应用。而不是'单元'和'退出',你描述'节'和'边'。
另外,你可以做一些事情,如最短路径分析,周期检测和各种其他有用的图论应用。
This将帮助您了解节点和边缘:
和here是这些概念的完成应用。我以OOP方式实现了这一点 - 每个节点都知道它与其他节点的边缘。一种流行的替代方法是使用adjacency list来实现这一点。我认为邻接列表概念基本上是user470379用他的答案描述的。但是,他的地图解决方案允许无限图,而传统的邻接列表则不允许。我喜欢图论,这是它的完美应用。
祝你好运!-Brian J. Stianr -
答案 1 :(得分:4)
map< pair<int,int>, cell>
可能效果很好;该对代表x,y坐标。如果地图中的那些坐标处没有单元格,请创建一个新单元格。如果你想让它真正无限,你可以用你必须提供的任意长度整数类替换int(例如bigint)
答案 2 :(得分:3)
如果世界的单元格排列在网格中,您可以轻松地为它们提供笛卡尔坐标。如果您保留现有单元格的大列表,那么在确定从给定单元格退出之前,您可以检查该列表以查看其任何邻居是否已存在。如果他们这样做了,你不想要单向门(有向图?)那么你必须考虑他们的出口。如果您不介意在游戏中使用滑槽,您仍然可以随机选择退出,只需确保链接到现有单元格即可。
优化注释:检查哈希表以查看它是否包含特定键是O(1)。
答案 3 :(得分:2)
你有没有一个散列(或STL集)存储包含被占用单元格的所有网格坐标的集合?
然后,在查看创建新单元格时,可以快速检查候选单元格位置是否已被占用。
(如果你有有限的空间,你可以使用二维数组 - 我想我在1980年的一篇Byte杂志文章中看过这个,但如果我理解正确,你想要一个可以无限延伸的世界) / p>