• 寻路算法(晕晕)


    <!DOCTYPE HTML>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>无标题文档</title>
    <style>
    *{ margin:0; padding:0;}
    li{ list-style:none;}
    #ul1{ height:auto; overflow:hidden; margin:20px auto; border:1px #000 solid; border-bottom:none; border-right:none;}
    #ul1 li{border:1px #000 solid; border-top:none; border-left:none; float:left;}
    #ul1 li.sty1{ background:red;}
    #ul1 li.sty2{ background:green;}
    #ul1 li.sty3{ background:blue;}
    #input1{ 100px; position:absolute; left:50%; margin-left:-50px;}
    </style>
    </head>
    
    <body>
    <ul id="ul1">
    </ul>
    <input type="button" value="开始寻路" id="input1">
    <script>
    
    var oUl = document.getElementById('ul1');
    var aLi = oUl.getElementsByTagName('li');
    var oInput = document.getElementById('input1');
    var beginLi = oUl.getElementsByClassName('sty1');
    var endLi = oUl.getElementsByClassName('sty2');
    
    var map = [
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,
        0,0,0,0,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,2,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    ];
    
    var cols = Math.sqrt(map.length);
    var sizeGird = 20;
    var openArr = [];
    var closeArr = [];
    
    init();
    
    function init(){
        createMap();
        oInput.onclick = function(){
            openFn();
        };
    }
    
    function createMap(){
        
        oUl.style.width = cols * (sizeGird + 1) + 'px';
        
        for(var i=0;i<map.length;i++){
            var oLi = document.createElement('li');
            oLi.style.width = sizeGird + 'px';
            oLi.style.height = sizeGird + 'px';
            oUl.appendChild(oLi);
            
            if( map[i] == 1 ){
                oLi.className = 'sty1';
                openArr.push(oLi);
            }
            else if(map[i] == 2){
                oLi.className = 'sty2';
            }
            else if(map[i] == 3){
                oLi.className = 'sty3';
                closeArr.push(oLi);
            }
            
        }
    }
    
    function openFn(){
        
        var nowLi = openArr.shift();
        
        if( nowLi == endLi[0] ){
            showLine();
            return;
        }
        
        closeFn(nowLi);
        
        findLi(nowLi);
        
        //console.log( openArr );
        
        openArr.sort(function(li1,li2){
            return li1.num - li2.num;
        });
        
        //console.log( openArr );
        
        openFn();
        
    }
    function closeFn(nowLi){
        closeArr.push( nowLi );
    }
    
    function findLi(nowLi){
        var result = [];
        for(var i=0;i<aLi.length;i++){
            if( filter(aLi[i]) ){
                result.push( aLi[i] );
            }
        }
        function filter(li){
            for(var i=0;i<closeArr.length;i++){
                if( closeArr[i] == li ){
                    return false;
                }
            }
            for(var i=0;i<openArr.length;i++){
                if( openArr[i] == li ){
                    return false;
                }
            }
            return true;
        }
        
        for(var i=0;i<result.length;i++){
            if( (Math.abs(nowLi.offsetLeft - result[i].offsetLeft)<= sizeGird + 1) && (Math.abs(nowLi.offsetTop - result[i].offsetTop)<= sizeGird + 1) ){
                result[i].num = f(result[i]);
                result[i].parent = nowLi;
                openArr.push( result[i] );
            }
        }
        
    }
    
    function showLine(){
        var result = [];
        var lastLi = closeArr.pop();
        var iNow = 0;
        findParent(lastLi);
        function findParent(li){
            result.unshift(li);
            if( li.parent == beginLi[0] ){
                return;
            }
            findParent(li.parent);
        }
        
        var timer = setInterval(function(){
            
            result[iNow].style.background = 'red';
            iNow++;
            if(iNow == result.length){
                clearInterval(timer);
            }
        },500);
        
    }
    
    function f(nodeLi){
        return g(nodeLi) + h(nodeLi);
    }
    function g(nodeLi){
        var a = beginLi[0].offsetLeft - nodeLi.offsetLeft;
        var b = beginLi[0].offsetTop - nodeLi.offsetTop;
        return Math.sqrt(a*a + b*b);
    }
    function h(nodeLi){
        var a = endLi[0].offsetLeft - nodeLi.offsetLeft;
        var b = endLi[0].offsetTop - nodeLi.offsetTop;
        return Math.sqrt(a*a + b*b);
    }
    
    </script>
    </body>
    </html>
    View Code
  • 相关阅读:
    Python程序员用文字加密的方式,给女程序员写情书,一周后牵手回家
    小学生在网吧用python抓取LOL英雄皮肤,步骤简单
    vuex中module的命名空间概念
    动态设置html的font-size值
    JavaScript判断各种数据类型
    vuex脑图
    作用域链和函数内部this指向问题以及bind、call、apply方法
    BOM
    jQuery_base
    js_base_note
  • 原文地址:https://www.cnblogs.com/qiushuixizhao/p/6269392.html
Copyright © 2020-2023  润新知