A-star寻路算法

来源:互联网 发布:淘宝怎么发货填写单号 编辑:程序博客网 时间:2024/05/30 23:21

A*寻路算法

  1. 什么是A*寻路算法?

    (A-Star)算法是一种静态路网中求解最短路最有效的直接搜索方法

  2. A*寻路算法的分析

    首先,就点的种类来说,就是三种,开始节点,结束节点,障碍节点

    从开始节点开始,每次找到九宫格中的其他节点(非开始的节点),并保存其 F = G + H的值,之后对F的值按照从小到大进行排序

    取得排序之后的第一个元素,按照上面的方法进行,直到该元素是结束元素为止

  3. 具体的代码

    (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();    }

    完整代码地址:https://github.com/vamouszj/A-star/

0 0