A*寻路算法
什么是A*寻路算法?
(A-Star)算法是一种静态路网中求解最短路最有效的直接搜索方法
A*寻路算法的分析
首先,就点的种类来说,就是三种,开始节点,结束节点,障碍节点
从开始节点开始,每次找到九宫格中的其他节点(非开始的节点),并保存其 F = G + H的值,之后对F的值按照从小到大进行排序
取得排序之后的第一个元素,按照上面的方法进行,直到该元素是结束元素为止
具体的代码
(1) 根据给出的map数组初始化界面
function createMap() { oUl.style.width = cols * (size + 1) +'px'; for(var i = 0; i < map.length; i++) { var oli = document.createElement('li'); oli.style.width = size + 'px'; oli.style.height = size + 'px'; oUl.appendChild(oli); if(map[i] == 1) { oli.className = 'star'; open.push(oli); }else if(map[i] == 2) { oli.className = 'end'; }else if (map[i] == 3) { oli.className = 'obst'; close.push(oli); } } }
(2) 找到对应的九宫格的其他元素
function lookup(newLi) { var result = []; for(var i = 0; i < oLis.length; i++) { //减小查找范围 空白格子 if(filter(oLis[i])) { result.push(oLis[i]); } } for(var j = 0; j < result.length; j++) { //找到九宫格的其他元素 if(Math.abs(newLi.offsetLeft - result[j].offsetLeft) <= size+1 && Math.abs(newLi.offsetTop - result[j].offsetTop) <= size+1 && result[j] != newLi) { open.push(result[j]); result[j].num = f(result[j]); result[j].parent = newLi; } } }; function filter(node) { //过滤函数 for(var i = 0; i < close.length; i++) { if(close[i] == node) { //遇到障碍物 return false; } } for(i = 0; i < open.length; i++) { if(open[i] == node) { return false; } } return true; }
(3)找到下一步的位置(直至结束)
function openFn() { //查找所有要走的路线 newLi = open.shift(); newLi.style.background = 'lightyellow'; newLi.innerText = k++; open.length = 0; lookup(newLi); closeFn(newLi); if(newLi == endLi[0]) { //结束了 return false; } open.sort(function(li1, li2) { return li1.num - li2.num; }); openFn(); }