【问题标题】:Data structure for a random world随机世界的数据结构
【发布时间】:2010-10-22 16:55:28
【问题描述】:

所以,我正在考虑制作一个简单的随机世界生成器。该生成器将创建一个起始“单元”,该“单元”将具有一到四个随机出口(在基本方向上,类似于迷宫)。在决定了这些出口之后,我会在每个出口处生成一个新的随机“单元格”,并在玩家靠近尚未生成的世界部分时重复。这个概念将允许一个“无限”的世界,所有这些都是随机生成的;但是,我不确定如何在内部最好地表示这一点。

我正在使用 C++(这并不重要,我可以实现任何必要的数据结构)。起初我想使用一种有向图,其中每个节点都将有向边指向它周围的每个单元格,但是如果用户在世界上找到一个点,回溯并回到那个点,这可能不会很好用从另一个方向发现。世界可能会做一些奇怪的事情,例如在一个位置生成两个单元格。

对于在这种情况下哪种数据结构可能最有效,您有什么想法吗?还是我在随机生成世界时做了一些非常愚蠢的事情?

任何帮助将不胜感激。 谢谢, 克里斯

【问题讨论】:

    标签: c++ data-structures


    【解决方案1】:

    我建议您阅读有关图表的内容。这正是随机图生成的一个应用。您描述的是“节点”和“边缘”,而不是“单元”和“退出”。

    此外,您还可以进行最短路径分析、循环检测和各种其他有用的图论应用。

    This 将帮助您了解节点和边:

    here 是这些概念的最终应用。我以 OOP 方式实现了这一点——每个节点都知道它与其他节点的边缘。一种流行的替代方法是使用adjacency list 来实现它。我认为邻接表的概念基本上就是 user470379 用他的回答描述的。然而,他的地图解决方案允许无限图,而传统的邻接表则不允许。我喜欢图论,这是它的完美应用。

    祝你好运!

    -Brian J. Stianr-

    【讨论】:

    • 我真的很想用图表,也许我会用,我得看看四周。我只是觉得 HashMap 可能更有效。
    • 这取决于你想做什么,以及你想如何解决这个问题。如果您谈论的是人类玩家将与之交互的事物,我认为将其视为图表所带来的清晰性将超过您通过使用 HashMap 获得的任何效率提升。你真的关心你的程序是否需要一秒钟来生成一个易于推理的随机图,而不是 1/10 秒来生成一个难以调试或应用众多现有算法中的任何一种的 HashMap?跨度>
    【解决方案2】:

    map< pair<int,int>, cell> 可能会很好用;该对将代表 x,y 坐标。如果地图中这些坐标处没有单元格,请创建一个新单元格。如果你想让它真正无限,你可以用你必须提供的任意长度的整数类替换整数(例如 bigint)

    【讨论】:

    • 我不敢相信我没有想到这一点,它是如此简单的解决方案,而且速度很快。
    • 正如@Nathon 提到的新单元格,请务必检查相邻单元格是否存在,并酌情创建/防止进入这些相邻单元格的门。
    【解决方案3】:

    如果世界的单元格排列成网格,您可以轻松地为它们提供笛卡尔坐标。如果您保留现有单元格的大列表,那么在确定从给定单元格的退出之前,您可以检查该列表以查看其任何邻居是否已经存在。如果他们这样做,并且您不想拥有单向门(有向图?),那么您将不得不考虑他们的出口。如果您不介意在游戏中使用滑槽,您仍然可以随机选择出口,只要确保您链接到现有单元(如果它们在那里)。

    优化说明:检查哈希表是否包含特定键是 O(1)。

    【讨论】:

    • 唯一的问题是,一旦世界增长,查找时间就会开始变差,不是吗?
    • 关于单向门和需要有向图的要点。
    【解决方案4】:

    难道你不能有一个散列(或 STL 集)来存储包含已占用单元格的所有网格坐标的集合吗?

    然后当你在考虑创建一个新的单元格时,你可以快速检查候选单元格位置是否已经被占用。

    (如果你的空间有限,你可以使用二维数组——我想我在 1980 年左右的 Byte 杂志文章中看到了这一点,但如果我理解正确,你想要一个可以无限扩展的世界)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多