A* 算法(4个方向)

by redky

HTML

<body>
<div id="box" class="box"></div>
</body>

CSS

body, dl, dd { margin:0; padding:0; }
html { font-size:12px; background:#F5F5F5; }
.block { border:1px solid #eaeaea; width:30px; background:#FFF; }
.start, .start.path { background-color:#007de7; }
.end, .end.path { background-color:#333; }
.fence { background-color:#d1d1d1; }
.path { background-color:#57e700; -webkit-transition:.5s all ease; }

JavaScript

window.onload = function () {
    var oBox = document.getElementById('box');  // 主容器
    //创建一个文档碎片,把所有的新结点附加上,然后把文档碎片的内容一次性添加到document中,只需要一次页面刷新就可
    var oFrag = document.createDocumentFragment();  // 存放临时文档碎片
    var oStart = null;  // 起始点
    var oEnd = null;  // 结束点  
    var aPoint = oBox.getElementsByTagName('div');  // 存放地图元素
    var aMaps = [];  // 存放地图数据
    var maps = [];
    //参数设置
    var iRnd = 100;  // 随机障碍数
    var iRow = 30;  // 存放行数
    var iCol = 30;  // 存放列数
    var iWidth = 20;  // 单元格宽
    var iHeight = 20;  // 单元格高
    var iTime = 50;  // 动画延时
    //创建div元素,加入到oBox中
    function render() {
        oBox.innerHTML = '';        
        for (var i = 0; i < iRow; i++) {
            for (var j = 0; j < iCol; j++ ) {
                var oBlock = document.createElement('div');
                oBlock.className = 'block';
                oBlock.row = i;
                oBlock.col = j;
                oBlock.style.position = 'absolute';
                oBlock.style.left = iWidth * j + 'px';
                oBlock.style.top = iHeight * i + 'px';
                oBlock.style.width = iWidth - 1 + 'px';
                oBlock.style.height = iHeight - 1 + 'px';
                //先加入到文档碎片中
                oFrag.appendChild(oBlock);
            }
        }
        //再将文档碎片加入oBox中
        oBox.appendChild(oFrag);
        oBox.style.width = iWidth * iCol + 'px';
        oBox.style.height = iHeight * iRow + 'px';
        oBox.style.position = 'absolute';
        oBox.style.left = '50%';
        oBox.style.top = '50%';
        oBox.style.marginLeft = -oBox.offsetWidth / 2 + 'px';
        oBox.style.marginTop = -oBox.offsetHeight / 2 + 'px';
    }    
    //将oBox中的div添加到aMaps中(创建地图)
    function module() {
        aMaps = [];
        aPoint = oBox.getElementsByTagName('div');//此时已经有div加入到oBox中        
        for (var i = 0; i < iRow; i++) {
            aMaps[i] = [];
            for (var j = 0; j < iCol; j++) {
                aMaps[i][j] = aPoint[i * iCol +...