为游戏地图构建有向图的好策略是什么(在Python中)?

时间:2009-03-04 14:48:20

标签: python graph procedural-generation

我正在用Python开发一个程序生成的游戏世界。世界的结构将类似于MUD / MUSH范例的房间和出口被安排为有向图(房间是节点,出口是边缘)。 (请注意,这是必然是非循环图,但我愿意考虑非循环解决方案。)

对于世界生成算法,不同种类的房间将通过每个房间的“标签”属性(一组字符串)来区分。实例化后,可以通过标签查询房间(单标签,标签交叉,标记联合,最佳候选)。

我将使用模板化对象和工厂方法的美化系统创建特定类型的房间 - 我不认为细节在这里很重要,因为当前的实现可能会改变以匹配所选择的策略。 (例如,可以向房间模板系统添加标签和标签查询。)

举个例子,我会有这些房间:

side_street, main_street, plaza, bar, hotel, restaurant, shop, office

最后,问题是:实例化和安排这些房间以创建可能符合给定规则的图表的好策略是什么?

有些规则可能包括:每万人口一个广场; main_streetplaza相关联; side_streetmain_streetside_street相关联; hotel偏好main_streetplaza个关联,并相应地接收更多标签;等

如果建议的策略能够实现数据驱动的实施,则获得奖励。

2 个答案:

答案 0 :(得分:7)

首先,您需要一些位置感。你的各种物体占据了一定的坐标空间。

你必须决定这些不同的事情是多么规律。在简单的情况下,您可以将它们作为简单的矩形(或矩形实体)放入坐标空间,以使位置更容易规划。

如果事情不规则 - 而且密集 - 生活有点复杂。

定义包含位置的地图。每个位置都有一个坐标范围;如果你使用简单的矩形,那么每个位置都可以有一个(左,上,右,下)元组。

你的地图将需要方​​法来确定谁住在一个给定的空间,以及与空间相邻的东西等。

然后,您可以使用一组固定的位置进行单元测试,这些位置可以全部放入地图中,并为非冲突,相邻等传递一些基本的健全性检查。


其次,你需要一种“迷宫发生器”。一个简单连接的迷宫很容易生成一个折叠到给定空间的树状结构。

迷宫/树有一个“根”节点,它将成为迷宫的中心。不一定是你的空间的物理中心,但根节点将是迷宫结构的中间。

理想情况下,此节点的一个分支包含整个空间的一个“入口”。

此节点的另一个分支包含整个空间的一个“出口”。

有人可以从入口到出口漫步,沿途可以参观很多“死胡同”的地点。

为根节点选择一种空间。将其放入地图空间。

这将有1 - n 入口,每个入口都是一个带有根节点和1 - n 入口的子树。正是这种多入口业务使树木成为这种结构的自然选择。另外,正确的树总是连接良好,因为你永远不会有无法到达的孤立部分。

您将 - 递归地 - 从根节点扇出,挑选位置并将它们放入可用空间。

对此进行单元测试,以确保它能够合理地填充空间。


您的其他要求是对迷宫生成器选择位置的方式进行微调。

最简单的是有一张重量表和随机选择。选择一个随机数,将其与权重进行比较,以查看哪种位置得到识别。


您对空间的定义可以是2D或3D - 两者都非常合理。对于奖励积分,请考虑如何实现使用六边形而不是正方形平铺的2D空间。

此“几何”可以是各种算法的策略插件。如果您可以用六边形2D替换方形2D,那么您已经很好地完成了OO设计。

答案 1 :(得分:2)

查看关于The MUD Connector的讨论 - 在“高级编码与设计”(或类似)论坛中,有关于世界布局和生成以及不同类型的坐标/导航系统的一些很好的讨论。