开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 4532|回复: 15
收起左侧

[易源码分享] 分享自己写的A星算法

[复制链接]
结帖率:20% (4/20)
发表于 2019-10-29 15:04:40 | 显示全部楼层 |阅读模式   江苏省苏州市
大家好啊,我自己写的 A星算法,  地图小的话50*50 的速度还行, 如果是800*800的 大地图 ,每次计算要挺多时间的,, 大家看看我的有什么改进的地方吗?
大概的思路就是:先把起点的XY 作为 父节点 放进关闭列表中, 然后扫描 父节点 的八个方向 坐标,  判断 不跨界并且不在开放和关闭列表中,后放进开放列表中, 然后 取F=G+H  的F最小的 坐标
作为下一次的父节点 , 把这个节点从开放列表剔除,加入到关闭列表中,   循环扫描直到 扫描到终点

  
窗口程序集名保 留  保 留备 注
A星   
子程序名返回值类型公开备 注
路径计算坐标型 
参数名类 型参考可空数组备 注
起点x 
起点y 
终点x 
终点y 
变量名类 型静态数组备 注
子节点方向数组X8
子节点方向数组Y8
子节点x  
子节点y  
关闭列表文本型0
开放列表文本型0
f列表整数型0
符合条件的xy列表文本型0
符合条件的fxy列表文本型0
地图大小  
关闭列表下标  
开放列表下标  
符合条件的列表下标  
父节点x整数型 
父节点y整数型 
父节点xy文本型 
子节点xy文本型 
i整数型 
在不在开放列表中  
在不在关闭列表中  
g整数型 
h整数型 
f整数型 
j整数型 
最小F值位置  
temp整数型 
分割文本数组文本型0
条件  
起点xy文本型 
终点xy文本型 
路径数组文本型0
路径数组下标  
下一步坐标数组文本型10
返回坐标坐标型 
jj  
' 12,22
' 39,24
条件 = 0
起点xy = 到文本 (起点x)“,”到文本 (起点y)“,”
父节点x = 起点x
父节点y = 起点y  ' 起点设置第一个父节点
父节点xy = 到文本 (起点x)“,”到文本 (起点y)“,”
终点xy = 到文本 (终点x)“,”到文本 (终点y)“,”
子节点方向数组X = { -1, 0, 1, 1, 1, 0, -1, -1 }
子节点方向数组Y = { -1, -1, -1, 0, 1, 1, 1, 0 }
地图大小 = 地图位图.取宽度 () × 地图位图.取高度 ()
重定义数组 (关闭列表, 假, 地图大小)
重定义数组 (开放列表, 假, 地图大小)
重定义数组 (f列表, 假, 地图大小)
重定义数组 (符合条件的xy列表, 假, 地图大小)
重定义数组 (符合条件的fxy列表, 假, 地图大小)
重定义数组 (路径数组, 假, 地图大小)
关闭列表下标 = 1
开放列表下标 = 1
符合条件的列表下标 = 1
关闭列表 [关闭列表下标] = 父节点xy  ' 把第一个父节点放进关闭列表
关闭列表下标 = 关闭列表下标 + 1
判断循环首 (条件 = 0)
jj = jj + 1
_启动窗口.标签_info.标题 = 到文本 (jj)
计次循环首 (8, i)  ' '遍历父节点周围8个方向的节点,如果没跨界,不是障碍物,不在关闭和开放列表中,然后放进开放列表中,  同时放进 符合条件的数值列表
子节点x = 父节点x + 子节点方向数组X [i]
子节点y = 父节点y + 子节点方向数组Y [i]
子节点xy = 到文本 (子节点x)“,”到文本 (子节点y)“,”
如果真 (子节点x ≥ 0 子节点y ≥ 0 子节点x ≤ 地图位图.取宽度 () 子节点y ≤ 地图位图.取高度 ())  ' 不跨界
如果真 (地图分析 [子节点x + 2] [子节点y + 2] = 0)  ' 没有障碍物
在不在开放列表中 = 0
计次循环首 (开放列表下标, j)
如果真 (倒找文本 (开放列表 [j], 子节点xy, , ) ≠ -1)
在不在开放列表中 = 1
跳出循环 ()

计次循环尾 ()
在不在关闭列表中 = 0
计次循环首 (关闭列表下标, j)
如果真 (倒找文本 (关闭列表 [j], 子节点xy, , ) ≠ -1)
在不在关闭列表中 = 1
跳出循环 ()

计次循环尾 ()
如果真 (在不在开放列表中 = 0 在不在关闭列表中 = 0)  ' 不在开放和关闭列表中
如果 (子节点方向数组X [i] = 0 子节点方向数组Y [i] = 0)
g = 10
g = 14
h (取绝对值 (子节点x - 终点x)取绝对值 (子节点y - 终点y)) × 10
f = g + h
f列表 [开放列表下标] = f
开放列表 [开放列表下标] = 子节点xy  ' F值和开放列表同步
开放列表下标 = 开放列表下标 + 1
符合条件的xy列表 [符合条件的列表下标] = 子节点xy
符合条件的fxy列表 [符合条件的列表下标] = 父节点xy
符合条件的列表下标 = 符合条件的列表下标 + 1



计次循环尾 ()
_启动窗口.标签_info.标题 = “aaa”
temp = f列表 [1]
计次循环首 (开放列表下标 - 1, i)
如果真 (f列表 [i] ≤ temp)
temp = f列表 [i]
最小F值位置 = i

计次循环尾 ()  ' 计算开放列表中最小值的位置
父节点xy = 开放列表 [最小F值位置]  ' 把最小值 给下一次的父节点
关闭列表 [关闭列表下标] = 父节点xy  ' 把最小值放进关闭列表
关闭列表下标 = 关闭列表下标 + 1
计次循环首 (开放列表下标 - 1, i)
如果真 (i ≥ 最小F值位置)
开放列表 [i] = 开放列表 [i + 1]
f列表 [i] = f列表 [i + 1]

计次循环尾 ()  ' 把刚才放进关闭列表的值 从开放列表和F列表中删除
开放列表 [i]“”
f列表 [i] = 0
开放列表下标 = 开放列表下标 - 1  ' 把最后一位清空
分割文本数组 = 分割文本 (父节点xy, “,”, )
父节点x = 到整数 (分割文本数组 [1])
父节点y = 到整数 (分割文本数组 [2])
如果真 (到整数 (分割文本数组 [1]) = 终点x 到整数 (分割文本数组 [2]) = 终点y)
调试输出 (“找到终点了跳出”)
跳出循环 ()  ' 找到终点了跳出

如果真 (开放列表 [1]“”)
返回坐标.x = -1
返回坐标.y = -1
返回 (返回坐标)
调试输出 (“没有路,跳出”)
跳出循环 ()  ' 没有路,跳出

判断循环尾 ()
路径数组下标 = 1
判断循环首 (终点xy ≠ 起点xy)
计次循环首 (符合条件的列表下标, i)
如果真 (符合条件的xy列表 [i] = 终点xy)
路径数组 [路径数组下标] = 符合条件的xy列表 [i]
路径数组下标 = 路径数组下标 + 1
终点xy = 符合条件的fxy列表 [i]

计次循环尾 ()
判断循环尾 ()
下一步坐标数组 = 分割文本 (路径数组 [路径数组下标 - 1], “,”, )
返回坐标.x = 到整数 (下一步坐标数组 [1])
返回坐标.y = 到整数 (下一步坐标数组 [2])
返回 (返回坐标)


i支持库列表   支持库注释   
BmpOperate位图操作支持库
spec特殊功能支持库



结帖率:70% (21/30)
发表于 2019-10-29 15:05:45 | 显示全部楼层   四川省达州市
回复 支持 反对

使用道具 举报

结帖率:100% (14/14)

签到天数: 21 天

发表于 2019-10-29 15:07:54 | 显示全部楼层   内蒙古自治区锡林郭勒盟
感谢分享心得
回复 支持 反对

使用道具 举报

结帖率:0% (0/3)

签到天数: 1 天

发表于 2019-10-29 15:39:49 | 显示全部楼层   河北省邢台市
谢谢大神~~~~~~~~~~~~``````````````````````
回复 支持 反对

使用道具 举报

结帖率:98% (45/46)

签到天数: 22 天

发表于 2019-10-29 16:07:32 | 显示全部楼层   吉林省吉林市
有很多成品例子 学这优化一下
回复 支持 反对

使用道具 举报

结帖率:100% (7/7)

签到天数: 22 天

发表于 2019-10-29 16:41:49 | 显示全部楼层   湖北省武汉市
感谢分享心得
回复 支持 反对

使用道具 举报

结帖率:65% (35/54)

签到天数: 1 天

发表于 2019-10-29 23:30:21 | 显示全部楼层   山东省济宁市
支持开源!~感谢分享
回复 支持 反对

使用道具 举报

签到天数: 13 天

发表于 2019-10-30 10:27:38 | 显示全部楼层   广东省东莞市
谢谢分享学习
回复 支持 反对

使用道具 举报

结帖率:82% (18/22)

签到天数: 8 天

发表于 2019-10-30 14:41:16 | 显示全部楼层   广西壮族自治区贺州市
冒险岛能用吧
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)

签到天数: 3 天

发表于 2019-10-31 10:32:35 | 显示全部楼层   四川省成都市
H=0就变成了迪杰斯特拉算法·哈哈哈!不错!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表