看了网上的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() ; },