大家好啊,我自己写的 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)) × 10f = 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 ])返回 (返回坐标 )
|