使用 GDScript 生成随机环状地图,及其算法思路讲解!
extends Node2D export (PackedScene) var Ball var 顶点x = [] var 顶点y = [] var 方向x = [1, 1, 0,-1,-1,-1, 0, 1] var 方向y = [0, 1, 1, 1,0 ,-1,-1,-1] var 路径 = {} var 地图宽度 var 地图高度 func _ready(): 生成地图大小() 生成顶点() 生成路径() var keys = 路径 .keys() for i in keys: 画砖块(i) func 生成地图大小(): 地图宽度 = 生成随机数(15,18) 地图高度 = 生成随机数(15,18) print(地图宽度 , 地图高度 ) func 生成顶点(): 顶点x.resize(9) 顶点y.resize(9) var 半宽 = (地图宽度/2) as int var 半高 = (地图高度/2) as int 顶点x[0] = 生成随机数(3,半宽-1) 顶点y[0] = 0 顶点x[1] = 生成随机数(顶点x[0]+3,地图宽度-4) 顶点y[1] = 0 顶点x[2] = 地图宽度-1 顶点y[2] = 生成随机数(4,半高) 顶点x[3] = 地图宽度-1 顶点y[3] = 生成随机数(顶点y[2]+3,地图高度-3) 顶点x[5] = 生成随机数(3,半宽-1) 顶点y[5] = 地图高度-1 顶点x[4] = 生成随机数(顶点x[5]+3,地图宽度-4) 顶点y[4] = 地图高度-1 顶点x[7] = 0 顶点y[7] = 生成随机数(4,半高) 顶点x[6] = 0 顶点y[6] = 生成随机数(顶点y[7]+3,地图高度-3) 顶点x[8] = 顶点x[0] 顶点y[8] = 顶点y[0] for i in range(8): 路径[Vector2(顶点x[i],顶点y[i])] = 1 func 生成路径(): for i in range(8): 连接线段(顶点x[i],顶点y[i],顶点x[i+1],顶点y[i+1],方向x[i],方向y[i]) func 连接线段(x1,y1,x2,y2,dx,dy): var r var 右增量 = 0 var 下增量 = 0 while x1 != x2 or y1 != y2: 右增量 = 0 下增量 = 0 if x1 == x2: dx = 0 if y1 == y2: dy = 0 if dx == 0: 下增量 = dy elif dy == 0: 右增量 = dx else: r = 生成随机数(0,1) if r == 0 : 右增量 = dx else: 下增量 = dy if 下增量 != 0 or 右增量 != 0: x1 += 右增量 y1 += 下增量 路径[Vector2(x1,y1)] = 1 pass pass func 画砖块(位置): var new_ball = Ball.instance() new_ball.position = Vector2(位置.x*30+50,位置.y*30+50) add_child(new_ball) func 生成随机数(左边界,右边界): randomize() var r = rand_range(左边界, 右边界+1) as int return r
算法思路:
在边缘任选8个点.然后依次把8个点连接起来.
假设从红色点出发.
出发后可以向右走,也可以向上走,具体方向由随机函数控制.
当绿色点的位置和目标点的横坐标相同后,此时绿色点的移动不再随机,而是只能向上移动.
以此类推,最终将所有点连接完毕