使用二维数组创建关卡
Using 2D Arrays to create a level
我有一个 9x9 二维数组。我想创建一个非常 Binding of Isaac-esque 的地板系统。我想使用二维数组制作 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以上代码)。如果可能的话,这个房间应该只与另一个房间相连,这样更难找到。
我认为难的是 python 在游戏中的使用不多。话虽这么说,但如果您的搜索措辞正确,您仍然可以找到很多指南。至少在其他语言中,即使 python 在搜索中,您也会通过查找 "procedural dungeon generation python" 找到很多信息。
问题1)使用二维数组
我认为要真正实现这一点,您需要为您的房间创建一个 class 来存储数据。弄清楚一个房间有多少扇门会很容易,但是如果您想稍后使用它,则需要保存该信息所在的位置。
首先我假设所有房间的大小都是 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",这将是开发地牢的下一步。
房间数组是一个二维地图,与地图数组大小相同,只是细节更多。
我们遍历地图数组并创建一个新房间来代表地图数组的每个元素。一路上我们正在检查相邻的元素,看看我们是否需要在那个房间的那个方向打开一扇门。一旦你拥有所有的房间,你只需要根据门的位置分配它们 sprite/art/walls 等。 (碰撞在 pygame 中可能有点难做,我没有太多使用 pygame 的经验,但我在 Unity 中做了很多工作)
问题2)房间限制和地图生成
理想情况下,您的原始 2D 地图应确保有一个只有 1 个开口的房间(如果这是您在最终产品中想要的)。从一个良好的基础开始,然后添加到它。我不知道您是如何生成示例二维数组的,但是有很多方法可以做类似的事情。
这真的取决于您的算法。有很多方法可以做到这一点,但我只是确保在生成原始二维数组 "map" 时,至少有 1 个房间有 1 个邻居。
这样做的示例方法:
- 一开始在地图上的某个地方做一个 2 然后不允许任何相邻的房间,除了从一个随机方向。然后将开始连接到结束
- 在生成结束时,通过遍历数组检查只有 1 个开口的房间,并将其中一个设置为结束房间。如果只有 1 个开口没有生成房间,请尝试放置一个只有 1 个开口的房间。
制作游戏时有一百万种不同的方法,我希望我能给你一些想法,帮助你前进。
我有一个 9x9 二维数组。我想创建一个非常 Binding of Isaac-esque 的地板系统。我想使用二维数组制作 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以上代码)。如果可能的话,这个房间应该只与另一个房间相连,这样更难找到。
我认为难的是 python 在游戏中的使用不多。话虽这么说,但如果您的搜索措辞正确,您仍然可以找到很多指南。至少在其他语言中,即使 python 在搜索中,您也会通过查找 "procedural dungeon generation python" 找到很多信息。
问题1)使用二维数组
我认为要真正实现这一点,您需要为您的房间创建一个 class 来存储数据。弄清楚一个房间有多少扇门会很容易,但是如果您想稍后使用它,则需要保存该信息所在的位置。
首先我假设所有房间的大小都是 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",这将是开发地牢的下一步。 房间数组是一个二维地图,与地图数组大小相同,只是细节更多。 我们遍历地图数组并创建一个新房间来代表地图数组的每个元素。一路上我们正在检查相邻的元素,看看我们是否需要在那个房间的那个方向打开一扇门。一旦你拥有所有的房间,你只需要根据门的位置分配它们 sprite/art/walls 等。 (碰撞在 pygame 中可能有点难做,我没有太多使用 pygame 的经验,但我在 Unity 中做了很多工作)
问题2)房间限制和地图生成
理想情况下,您的原始 2D 地图应确保有一个只有 1 个开口的房间(如果这是您在最终产品中想要的)。从一个良好的基础开始,然后添加到它。我不知道您是如何生成示例二维数组的,但是有很多方法可以做类似的事情。
这真的取决于您的算法。有很多方法可以做到这一点,但我只是确保在生成原始二维数组 "map" 时,至少有 1 个房间有 1 个邻居。 这样做的示例方法:
- 一开始在地图上的某个地方做一个 2 然后不允许任何相邻的房间,除了从一个随机方向。然后将开始连接到结束
- 在生成结束时,通过遍历数组检查只有 1 个开口的房间,并将其中一个设置为结束房间。如果只有 1 个开口没有生成房间,请尝试放置一个只有 1 个开口的房间。
制作游戏时有一百万种不同的方法,我希望我能给你一些想法,帮助你前进。