【问题标题】:Using 2D Arrays to create a level使用二维数组创建关卡
【发布时间】:2020-06-08 21:52:49
【问题描述】:

我有一个 9x9 二维阵列。我想创建一个非常Binding of Isaac-esque 的地板系统。我想使用 2D 数组制作 9x9 数组中的房间地图。我浏览了整个互联网,但找不到算法或某种有用的代码来帮助我做到这一点。问题是: 使用 2D 阵列制作连接房间的地板 - 让我们说这样的话,其中 1 是房间,而 0 什么都不是......

[['0','0','0','0','0','0','0','0','0'],
 ['0','0','0','0','1','0','0','0','0'],
 ['0','0','1','1','1','1','1','0','0'],
 ['0','0','1','0','1','0','0','1','0'],
 ['0','2','1','1','1','1','1','1','0'],
 ['0','0','0','0','1','0','1','0','0'],
 ['0','0','0','0','1','0','1','1','0'],
 ['0','0','0','0','1','0','0','0','0'],
 ['0','0','0','0','0','0','0','0','0']]

然后对于每个房间,算法必须确定房间是否有 4 个门 - 4 个与之相连的房间 - 或者假设有 2 个门,一个在上面,一个在下面,这样我就不会得到任何房间,比如说,有 4 扇门,但只有一个房间与之相连。

最后,起始房间必须在中心,而外面的房间必须选择一个作为结束房间,这将是不同风格的房间(在上面的代码中显示为 2 )。如果可能的话,这个房间应该只连接到另一个更难找到的房间。

【问题讨论】:

  • 您可以定义可能的房间类型及其属性的列表。作为起点,其中的最大门数(将来您可能会添加其他约束,例如与中心的最小距离)。对于每个关卡生成器,您都会保留有关您在关卡中需要多少个给定类型的房间的信息。从中心的房间开始。然后你可以迭代地尝试通过在每次迭代中放置一个房间 A 来构建地图,这样它就会接触现有的房间 B,如果它会打破 A 或 B 的约束,然后寻找另一个地方。也可以随机添加更多门.

标签: python arrays algorithm pygame array-algorithms


【解决方案1】:

我认为让这件事变得困难的原因是 python 在游戏中的使用并不多。话虽如此,如果您的搜索具有正确的措辞,您仍然可以找到很多指南。至少在其他语言中,您可以通过查找“procedural dungeon generation python”找到很多信息,即使 python 在搜索中。

问题一)使用二维数组

我认为要真正实现这一点,您需要为您的房间创建一个类来存储数据。弄清楚一个房间有多少扇门非常容易,但如果您以后想使用它,则需要保存该信息的位置。

从简单的开始,我将假设所有房间的大小都是 1x1,

要使用您的二维数组确定连接到该房间的门,您需要使用嵌套的 for 循环遍历每个房间并检查它们的相邻邻居。

非常简单的伪代码

# your 2d array is called map in this example
room_array = []
for i in range(len(map)):
    new_room_row = []

    for j in range(len(map[i])):
        new_room = Room()

        # when our room is initialized all doors are false
        # checking each direction if it's not nothing
        if map[i-1][j] != 0
            new_room.up_door = true
        if map[i+1][j] != 0
            new_room.down_door = true
        if map[i][j-1] != 0
            new_room.left_door = true
        if map[i][j+1] != 0
            new_room.right_door = true

      new_room_row.push(new_room)

  room_array.push(new_room_row)

所以我们首先创建一个“room_array”,这将是开发地下城的下一步。 房间数组是一个 2d 地图,与地图数组大小相同,只是有更多细节。 我们遍历地图数组并创建一个新房间来代表地图数组的每个元素。一路上,我们正在检查相邻的元素,看看是否需要为那个房间打开一扇门。拥有所有房间后,您只需要根据门的位置为它们分配精灵/艺术/墙壁等。 (碰撞在pygame中可能有点难做,我没有太多使用pygame的经验,但我在Unity做了很多工作)

问题 2) 房间限制和地图生成

理想情况下,您的原始 2D 地图应确保有一个只有 1 个开口的房间,如果这是您在最终产品中想要的。从一个好的基础开始,然后添加它。我不知道您是如何生成示例二维数组的,但是有很多方法可以做类似的事情。

这真的取决于您的算法。有很多方法可以做到这一点,但我只是确保在生成原始二维数组“地图”时至少有 1 个房间有 1 个邻居。 示例方法:

  • 一开始在地图上的某个地方画一个 2,然后除了随机方向之外,不允许任何相邻的房间。然后连接开始到结束
  • 在生成结束时,通过遍历数组检查只有 1 个开口的房间,并将其中一个设置为最终房间。如果没有生成只有 1 个开口的房间,请尝试放置一个只有 1 个开口的房间。

在制作游戏时,有上百万种不同的方式来做某事,我希望我能给你一些想法,帮助你前进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 2013-07-16
    • 1970-01-01
    相关资源
    最近更新 更多