二维随机地图生成方法
CheapMeow/Godot-MapGeneratorSampleProject (github.com)
1.新建一个枚举类型的二维数组 map,每个元素代表着每一个格子,枚举内容代表格子的种类,例如空地、墙(六边形网格地图可以变形为四边形网格地图)
2.自定义随机填充算法初始化 map
3.自定义平滑算法处理 map
例如:遍历 map 每个元素,计算其周围 8 个元素为墙的个数,等于 4 个时保持不变,大于一半则自己也变成墙,反之为空地
4.清除小的墙体、空地
map 中一些位置连续的,同一枚举类型的元素可以视为一个整体,它不是墙就是空地,用 List 表示,通过广度优先找出
先删掉小墙体,这样有些房间就会变大,找小空洞时,所有房间的大小确定不变
再删掉小空地,并且把没删掉的作为房间存起来
最后把房间最大的作为主房间
5.房间连接
遍历所有房间,对其中每一个房间,寻找可能存在的,距离自己最近的,与自己尚未连接的房间
连接房间时,进行两项操作:
(1) 连接时遍历两个房间的边界上的节点,找到两个房间之间距离最近的一对边节点,由直线生成算法获得直线上各点。遍历各点,在以给定的通道宽度为半径,列表元素为圆心的,圆内的所有地图节点,都置为空地
(2) 房间 a 如果可以到达主房间,那么与之相连的所有房间都可以连接到主房间 重复遍历若干次,直至所有房间都可以到达主房间
# 生成随机地图
func generate_map():
for x in range(width):
map.append([])
for y in range(height):
map[x].append(GEnum.TileType.Empty)
random_fill_map()
for i in range(smoothLevel):
smooth_map()
# 清除小洞,小墙
eliminate_small_hole_and_wall()
# 连接各个幸存房间
connect_all_rooms_to_mainroom()