自己用cocoscreator写的寻路算法

看了网上的A*算法的教程后,自己尝试着写了一个,也不知道正不正宗哈哈,A*算法的原理我就不说了,下面是具体代码实现。

首先 我在场景上平铺了100个格子,然后随机生成了障碍物,这样地图就完成了,


接下来就是具体的寻路算法。

//寻路
foundBestMove:function(){


    this.blocknow.setColor(cc.Color.YELLOW);
        this.blocknow.inend = true;
        this.checklist.splice(0,1);
    this.checkBlock();

    if(this.blocklist[99].inend===true){
        var block = this.blocklist[99];
        while (block.getComponent("blockControl").index !== 0) {
            block.setColor(cc.Color.ORANGE);
            if (block.getComponent("blockControl").parentblock) {
                block = block.getComponent("blockControl").parentblock;
            }else{
                return;
            }
        }
        block = this.blocklist[0];
        block.setColor(cc.Color.ORANGE);
    }else if(this.checklist.length<1){
        cc.log("无法到达终点");
    }else{
        this.foundBestMove();
    }
},

//检查周围格子
checkBlock:function() {
    var num = this.blocknow.getComponent("blockControl").index;
    if (num !== 99) {
        if ((num + 1) % 10 < 10 && this.blocklist[num + 1].getComponent("blockControl").isobstacle === false && this.blocklist[num + 1].inend !== true) {
            if (this.blocklist[num + 1].getComponent("blockControl").ischecked === false) {
                this.blocklist[num + 1].getComponent("blockControl").ischecked = true;
                this.blocklist[num + 1].getComponent("blockControl").parentblock = this.blocknow;
                this.checklist.push(this.blocklist[num + 1]);
                this.blocklist[num + 1].setColor(cc.Color.GREEN);
                var w = Math.abs(this.blocklist[num + 1].getComponent("blockControl").landscapeCount - this.blocknow.getComponent("blockControl").landscapeCount);
                var h = Math.abs(this.blocklist[num + 1].getComponent("blockControl").portraitCount - this.blocknow.getComponent("blockControl").portraitCount);
                this.blocklist[num + 1].getComponent("blockControl").startCount = w + h;
            } else {
                var w = Math.abs(this.blocklist[num + 1].getComponent("blockControl").landscapeCount - this.blocknow.getComponent("blockControl").landscapeCount);
                var h = Math.abs(this.blocklist[num + 1].getComponent("blockControl").portraitCount - this.blocknow.getComponent("blockControl").portraitCount);
                if (this.blocklist[num + 1].getComponent("blockControl").parentblock.getComponent("blockControl").startCount >w+h) {
                    this.blocklist[num + 1].getComponent("blockControl").parentblock = this.blocknow;
                }
                this.blocklist[num + 1].getComponent("blockControl").startCount = w + h;
            }
        }
        if (Math.floor((num + 10) / 10) < 10 && this.blocklist[num + 10].getComponent("blockControl").isobstacle === false && this.blocklist[num + 10].inend !== true) {
            if (this.blocklist[num + 10].getComponent("blockControl").ischecked === false) {
                this.blocklist[num + 10].getComponent("blockControl").ischecked = true;
                this.blocklist[num + 10].getComponent("blockControl").parentblock = this.blocknow;
                this.checklist.push(this.blocklist[num + 10]);
                this.blocklist[num + 10].setColor(cc.Color.GREEN);
                var w = Math.abs(this.blocklist[num + 10].getComponent("blockControl").landscapeCount - this.blocknow.getComponent("blockControl").landscapeCount);
                var h = Math.abs(this.blocklist[num + 10].getComponent("blockControl").portraitCount - this.blocknow.getComponent("blockControl").portraitCount);
                this.blocklist[num + 10].getComponent("blockControl").startCount = w + h;
            } else {
                var w = Math.abs(this.blocklist[num + 10].getComponent("blockControl").landscapeCount - this.blocknow.getComponent("blockControl").landscapeCount);
                var h = Math.abs(this.blocklist[num + 10].getComponent("blockControl").portraitCount - this.blocknow.getComponent("blockControl").portraitCount);
                if (this.blocklist[num + 10].getComponent("blockControl").parentblock.getComponent("blockControl").startCount > w+h) {
                    this.blocklist[num + 10].getComponent("blockControl").parentblock = this.blocknow;
                }
                this.blocklist[num + 10].getComponent("blockControl").startCount = w + h;
            }
        }
        if (Math.floor((num - 10) / 10) > 0 && this.blocklist[num - 10].getComponent("blockControl").isobstacle === false && this.blocklist[num - 10].inend !== true) {
            if (this.blocklist[num - 10].getComponent("blockControl").ischecked === false) {
                this.blocklist[num - 10].getComponent("blockControl").ischecked = true;
                this.blocklist[num - 10].getComponent("blockControl").parentblock = this.blocknow;
                this.checklist.push(this.blocklist[num - 10]);
                this.blocklist[num - 10].setColor(cc.Color.GREEN);
                var w = Math.abs(this.blocklist[num - 10].getComponent("blockControl").landscapeCount - this.blocknow.getComponent("blockControl").landscapeCount);
                var h = Math.abs(this.blocklist[num - 10].getComponent("blockControl").portraitCount - this.blocknow.getComponent("blockControl").portraitCount);
                this.blocklist[num - 10].getComponent("blockControl").startCount = w + h;
            } else {
                var w = Math.abs(this.blocklist[num - 10].getComponent("blockControl").landscapeCount - this.blocknow.getComponent("blockControl").landscapeCount);
                var h = Math.abs(this.blocklist[num - 10].getComponent("blockControl").portraitCount - this.blocknow.getComponent("blockControl").portraitCount);
                if (this.blocklist[num - 10].getComponent("blockControl").parentblock.getComponent("blockControl").startCount > w+h) {
                    this.blocklist[num - 10].getComponent("blockControl").parentblock = this.blocknow;
                }
                this.blocklist[num - 10].getComponent("blockControl").startCount = w + h;
            }
        }
        if ((num - 1) % 10 > 0 &&num % 10!==0&& this.blocklist[num - 1].getComponent("blockControl").isobstacle === false && this.blocklist[num - 1].inend !== true) {
            if (this.blocklist[num - 1].getComponent("blockControl").ischecked === false) {
                this.blocklist[num - 1].getComponent("blockControl").ischecked = true;
                this.blocklist[num - 1].getComponent("blockControl").parentblock = this.blocknow;
                this.checklist.push(this.blocklist[num - 1]);
                this.blocklist[num - 1].setColor(cc.Color.GREEN);
                var w = Math.abs(this.blocklist[num - 1].getComponent("blockControl").landscapeCount - this.blocknow.getComponent("blockControl").landscapeCount);
                var h = Math.abs(this.blocklist[num - 1].getComponent("blockControl").portraitCount - this.blocknow.getComponent("blockControl").portraitCount);
                this.blocklist[num - 1].getComponent("blockControl").startCount = w + h;
            } else {
                var w = Math.abs(this.blocklist[num - 1].getComponent("blockControl").landscapeCount - this.blocknow.getComponent("blockControl").landscapeCount);
                var h = Math.abs(this.blocklist[num - 1].getComponent("blockControl").portraitCount - this.blocknow.getComponent("blockControl").portraitCount);
                if (this.blocklist[num - 1].getComponent("blockControl").parentblock.getComponent("blockControl").startCount > w+h) {
                    this.blocklist[num - 1].getComponent("blockControl").parentblock = this.blocknow;
                }
                this.blocklist[num - 1].getComponent("blockControl").startCount = w + h;
            }
        }
        this.sortCheckList();

        //this.selectBestMove();
    }
},
//检查列表按移动步数排序
sortCheckList:function(){
    for(var i=0;i.checklist.length-1;i++){
        for(var j=0;j.checklist.length-1-i;j++){
            if(this.checklist[j].getComponent("blockControl").endCount>this.checklist[j+1].getComponent("blockControl").endCount){
                var temp=this.checklist[j];
                this.checklist[j]=this.checklist[j+1];
                this.checklist[j+1]=temp;
            }
        }
    }
    this.blocknow = this.checklist[0];
    //cc.log(this.checklist[0].getComponent("blockControl").index);
        //this.blocknow.setColor(cc.Color.BLUE);
      //  this.endlist.push(this.blocknow);
       // this.checkBlock() ;
},

你可能感兴趣的:(自己用cocoscreator写的寻路算法)