A-star寻路算法

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值