Loading... ```ecode .版本 2 .子程序 A星_寻路_, 逻辑型 .参数 地图点阵, 整数型, 数组 .参数 宽_, 整数型 .参数 高_, 整数型 .参数 起点_, 坐标型 .参数 终点_, 坐标型 .参数 八方向, 逻辑型, 可空, 默认4方向 .参数 跨越障碍, 逻辑型, 可空, 默认不可跨越 .参数 路径, 坐标型, 参考 可空 数组 .局部变量 计次, 整数型 .局部变量 计次1, 整数型 .局部变量 计次2, 整数型 .局部变量 开放列表, 节点型, , "0" .局部变量 关闭列表, 节点型, , "0" .局部变量 临时节点, 节点型 .局部变量 最小F, 整数型 .局部变量 i, 整数型 .局部变量 待检测坐标, 坐标型 .局部变量 待检测节点, 节点型 .局部变量 编号, 整数型 .局部变量 方向数, 整数型 .局部变量 已存在于关闭列表, 逻辑型 .局部变量 已存在于开放列表, 逻辑型 .局部变量 预计的G值, 整数型 .局部变量 反_路径, 坐标型, , "0" .局部变量 临时数据, 坐标型 .局部变量 n, 整数型 重定义数组 (路径, 假, 0) 方向数 = 选择 (八方向, 8, 4) 临时节点.当前坐标.x = 起点_.x 临时节点.当前坐标.y = 起点_.y 插入成员 (开放列表, 1, 临时节点) .循环判断首 () 处理事件 () 最小F = 0 .计次循环首 (取数组成员数 (开放列表), i) 处理事件 () .如果真 (最小F = 0) 最小F = 开放列表 [1].f 编号 = i .如果真结束 .如果真 (开放列表 [i].f < 最小F) 最小F = 开放列表 [i].f 编号 = i .如果真结束 .计次循环尾 () ' 通过上面的循环,我们已经找出了最短路径的一个节点,下面把这个节点加入关闭列表 临时节点 = 开放列表 [编号] 删除成员 (开放列表, 编号, ) 插入成员 (关闭列表, 1, 临时节点) .如果真 (临时节点.当前坐标.x ≠ 起点_.x 或 临时节点.当前坐标.y ≠ 起点_.y) .如果真 (临时节点.当前坐标.x ≠ 终点_.x 或 临时节点.当前坐标.y ≠ 终点_.y) ' 画板_指定位置画图 (临时节点.当前坐标.x, 临时节点.当前坐标.y, #黄色, ) .如果真结束 .如果真结束 处理事件 () ' 这里检测一下当前的关闭列表,是否有终点信息 .计次循环首 (取数组成员数 (关闭列表), 计次1) .如果真 (关闭列表 [计次1].当前坐标.x = 终点_.x 且 关闭列表 [计次1].当前坐标.y = 终点_.y) ' 查询父节点坐标 待检测节点 = 关闭列表 [计次1] .循环判断首 () n = n + 1 .计次循环首 (取数组成员数 (关闭列表), 计次2) .如果真 (关闭列表 [计次2].当前坐标.x = 待检测节点.父节点坐标.x 且 关闭列表 [计次2].当前坐标.y = 待检测节点.父节点坐标.y) 待检测节点 = 关闭列表 [计次2] 跳出循环 () .如果真结束 .计次循环尾 () ' 画颜色 .如果 (待检测节点.当前坐标.x ≠ 起点_.x 或 待检测节点.当前坐标.y ≠ 起点_.y) 画板_指定位置画图 (待检测节点.当前坐标.x, 待检测节点.当前坐标.y, #紫色, 到文本 (关闭列表 [计次2].f), 到文本 (关闭列表 [计次2].g), 到文本 (关闭列表 [计次2].h), 到文本 (关闭列表 [计次2].i), 待检测节点.方向) 临时数据.x = 待检测节点.当前坐标.x 临时数据.y = 待检测节点.当前坐标.y 加入成员 (反_路径, 临时数据) .否则 画板_指定位置画图 (待检测节点.当前坐标.x, 待检测节点.当前坐标.y, #蓝色, , , , , 到文本 (n)) 临时数据.x = 待检测节点.当前坐标.x 临时数据.y = 待检测节点.当前坐标.y 加入成员 (反_路径, 临时数据) .如果结束 处理事件 () .循环判断尾 (待检测节点.当前坐标.x ≠ 起点_.x 或 待检测节点.当前坐标.y ≠ 起点_.y) 路径 = 反_路径 返回 (真) .如果真结束 .计次循环尾 () ' 首先得出待检测坐标 .计次循环首 (方向数, 计次1) .如果 (方向数 = 4) .判断开始 (计次1 = 1) 待检测坐标.x = 临时节点.当前坐标.x 待检测坐标.y = 临时节点.当前坐标.y - 1 .判断 (计次1 = 2) 待检测坐标.x = 临时节点.当前坐标.x - 1 待检测坐标.y = 临时节点.当前坐标.y .判断 (计次1 = 3) 待检测坐标.x = 临时节点.当前坐标.x + 1 待检测坐标.y = 临时节点.当前坐标.y .默认 待检测坐标.x = 临时节点.当前坐标.x 待检测坐标.y = 临时节点.当前坐标.y + 1 .判断结束 .否则 .判断开始 (计次1 = 1) 待检测坐标.x = 临时节点.当前坐标.x - 1 待检测坐标.y = 临时节点.当前坐标.y - 1 .判断 (计次1 = 2) 待检测坐标.x = 临时节点.当前坐标.x 待检测坐标.y = 临时节点.当前坐标.y - 1 .判断 (计次1 = 3) 待检测坐标.x = 临时节点.当前坐标.x + 1 待检测坐标.y = 临时节点.当前坐标.y - 1 .判断 (计次1 = 4) 待检测坐标.x = 临时节点.当前坐标.x - 1 待检测坐标.y = 临时节点.当前坐标.y .判断 (计次1 = 5) 待检测坐标.x = 临时节点.当前坐标.x + 1 待检测坐标.y = 临时节点.当前坐标.y .判断 (计次1 = 6) 待检测坐标.x = 临时节点.当前坐标.x - 1 待检测坐标.y = 临时节点.当前坐标.y + 1 .判断 (计次1 = 7) 待检测坐标.x = 临时节点.当前坐标.x 待检测坐标.y = 临时节点.当前坐标.y + 1 .默认 待检测坐标.x = 临时节点.当前坐标.x + 1 待检测坐标.y = 临时节点.当前坐标.y + 1 .判断结束 .如果结束 处理事件 () 延时 (全_延时) ' 这里 暂停 .判断循环首 (全_暂停) 延时 (100) 处理事件 () .判断循环尾 () .如果真 (待检测节点.当前坐标.x = 终点_.x 或 待检测节点.当前坐标.y = 终点_.y) ' 到循环尾 () .如果真结束 ' 先判断一下坐标是否越界,如果越界,直接放弃该坐标 .如果真 (待检测坐标.x ≤ 0 或 待检测坐标.x > 宽_ 或 待检测坐标.y ≤ 0 或 待检测坐标.y > 高_) 到循环尾 () .如果真结束 ' 再检测一下是否是障碍,如果是障碍,也直接放弃该坐标 .如果真 (地图点阵 [(待检测坐标.y - 1) × 宽_ + 待检测坐标.x] = 0) 到循环尾 () .如果真结束 ' 判断一下是否有障碍 .如果真 (跨越障碍 = 假) .如果真 (待检测坐标.x ≠ 临时节点.当前坐标.x 且 待检测坐标.y ≠ 临时节点.当前坐标.y) .' 如果真 (G_标签 [临时节点.当前坐标.x] [待检测坐标.y].背景颜色 = #黑色 或 G_标签 [待检测坐标.x] [临时节点.当前坐标.y].背景颜色 = #黑色) ' 到循环尾 () .如果真结束 .如果真 (地图点阵 [宽_ × (待检测坐标.y - 1) + 临时节点.当前坐标.x] = 0 或 地图点阵 [宽_ × (临时节点.当前坐标.y - 1) + 待检测坐标.x] = 0) 到循环尾 () .如果真结束 .如果真结束 .如果真结束 ' 检查是否在关闭列表内,如果已存在,放弃该坐标 已存在于关闭列表 = 假 .计次循环首 (取数组成员数 (关闭列表), 计次2) .如果真 (关闭列表 [计次2].当前坐标.x = 待检测坐标.x 且 关闭列表 [计次2].当前坐标.y = 待检测坐标.y) 已存在于关闭列表 = 真 跳出循环 () .如果真结束 处理事件 () .计次循环尾 () .如果真 (已存在于关闭列表) 到循环尾 () .如果真结束 ' 至此,已经筛选掉了不合格的坐标,下面遍历开放列表 已存在于开放列表 = 假 .计次循环首 (取数组成员数 (开放列表), 计次2) .如果真 (开放列表 [计次2].当前坐标.x = 待检测坐标.x 且 开放列表 [计次2].当前坐标.y = 待检测坐标.y) ' 该坐标在开放列表,检查最短路径 .如果 (待检测坐标.x ≠ 临时节点.当前坐标.x 或 待检测坐标.y ≠ 临时节点.当前坐标.y) 预计的G值 = 14 .否则 预计的G值 = 10 .如果结束 ' 该待检查节点发现更短路径,该一下 .如果真 (临时节点.g + 预计的G值 < 开放列表 [计次2].g) 开放列表 [计次2].父节点坐标 = 临时节点.当前坐标 .如果真结束 已存在于开放列表 = 真 跳出循环 () .如果真结束 处理事件 () .计次循环尾 () ' 该坐标没有在开放列表内,加入 .如果真 (已存在于开放列表 = 假) 计次 = 计次 + 1 .如果 (待检测坐标.x = 临时节点.当前坐标.x 或 待检测坐标.y = 临时节点.当前坐标.y) 预计的G值 = 10 .否则 预计的G值 = 14 .如果结束 待检测节点.g = 临时节点.g + 预计的G值 待检测节点.h = 取绝对值 (终点_.x - 待检测坐标.x) × 10 + 取绝对值 (终点_.y - 待检测坐标.y) × 10 待检测节点.f = 待检测节点.g + 待检测节点.h 待检测节点.i = 计次 待检测节点.方向 = 取父节点方向箭头 (临时节点.当前坐标, 待检测坐标) 待检测节点.当前坐标 = 待检测坐标 待检测节点.父节点坐标 = 临时节点.当前坐标 插入成员 (开放列表, 1, 待检测节点) .如果真 (待检测坐标.x = 终点_.x 且 待检测坐标.y = 终点_.y) 到循环尾 () .如果真结束 画板_指定位置画图 (待检测节点.当前坐标.x, 待检测节点.当前坐标.y, #黄色, 到文本 (待检测节点.f), 到文本 (待检测节点.g), 到文本 (待检测节点.h), 到文本 (待检测节点.i), 待检测节点.方向) .如果真结束 .计次循环尾 () .循环判断尾 (取数组成员数 (开放列表) ≠ 0) 返回 (假) ``` 最后修改:2024 年 07 月 10 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏