9

我正在用 Python 开发一个程序生成的游戏世界。世界的结构将类似于 MUD/MUSH 范式,房间和出口排列为有向图(房间是节点,出口是边)。(请注意,这不一定是无环图,尽管我愿意考虑无环解决方案。)

对于世界生成算法,不同类型的房间将通过每个房间的“标签”属性(一组字符串)来区分。一旦它们被实例化,就可以通过标签(单标签、标签交集、标签联合、最佳候选)来查询和选择房间。

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

例如,我将拥有以下类型的房间:

side_street, main_street, 广场, 酒吧, 酒店, 餐厅, 商店, 办公室

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

一些规则可能包括:每 10,000 人拥有一个广场;main_street连接到plaza; side_street连接到main_streetside_streethotel青睐main_streetplaza联系,并相应地接收更多标签;等等

如果建议的策略能够实现数据驱动的实施,则可以加分。

4

2 回答 2

7

首先,你需要一些位置感。您的各种对象占用了一些坐标空间。

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

如果这些东西是不规则的——而且是密集的——生命就会更加复杂。

定义地图以包含位置。每个位置都有一个坐标跨度;如果您使用简单的矩形,那么每个位置都可以有一个 (left, top, right, bottom) 元组。

您的地图将需要方​​法来确定谁居住在给定空间中,以及与该空间相邻的事物等。

然后,您可以使用已确定的一组固定位置对其进行单元测试,这些位置都可以放入地图中,并通过一些基本的完整性检查,以检查非冲突、相邻等。


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

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

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

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

有人可以从入口走到出口,一路走来走去很多“死胡同”的地方。

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

这将有 1 - n 个入口,每个入口都是具有根节点和 1 - n 个入口的子树。正是这种多入口业务使树木自然适合这种结构。此外,一棵适当的树总是连接良好,因为您永远不会有无法到达的孤立部分。

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

对此进行单元测试以确保它可以很好地填充空间。


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

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


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

这个“几何”可以是各种算法的策略插件。如果你可以用六边形 2D 代替方形 2D,那么你的 OO 设计已经做得很好了。

于 2009-03-04T15:41:51.253 回答
2

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

于 2009-03-04T22:20:48.253 回答