大家好啊,我自己写的 A星算法, 地图小的话50*50 的速度还行, 如果是800*800的 大地图 ,每次计算要挺多时间的,, 大家看看我的有什么改进的地方吗?
大概的思路就是:先把起点的XY 作为 父节点 放进关闭列表中, 然后扫描 父节点 的八个方向 坐标, 判断 不跨界并且不在开放和关闭列表中,后放进开放列表中, 然后 取F=G+H 的F最小的 坐标
作为下一次的父节点 , 把这个节点从开放列表剔除,加入到关闭列表中, 循环扫描直到 扫描到终点
变量名 | 类 型 | 静态 | 数组 | 备 注 | 子节点方向数组X | | | 8 | 子节点方向数组Y | | | 8 | 子节点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 | | | |
条件 = 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 )   子节点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      开放列表下标 = 开放列表下标 + 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 ]    计次循环尾 ()  开放列表 [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 ])返回 (返回坐标 )
|