Cocos2d-x 寻路算法之三 A Star

原创 2013年12月05日 09:12:39

1.A Star 寻路算法介绍:


看过之前的两篇文章:《Cocos2d-x 寻路算法之二 离目的地的距离优先》《Cocos2d-x 寻路算法之一 距离优先》的读者知道,这两种寻路算法都有问题,前一个搜索太广了,资源浪费;后一个还不够聪明,有时候会找不到最佳路线。为什么要先介绍这两种不佳的算法呢?因为A Star 寻路算法就是前面两者的结合。同时考虑离起点的距离和离终点的距离。


Figure 1


究竟是C1还是C2这个格子是最佳路线点呢?因为我们这次离起点的距离和离终点的距离都考虑了,所以C1的价值是1.0 + 1.41 + 4.12 总共 6.53的长度。而C2的价值是 2.0 + 6.32 总共 8.32的长度。显然C1更佳。如果按照我们第一个寻路算法,只考虑离起点距离的话,C2还短些呢!但C2离终点远啊。


2.代码实现


float distanceBetweenTwoCells(float c1X,float c1Y, float c2X, float c2Y){

	return sqrt(pow(c2X - c1X,2) + pow(c2Y - c1Y,2));
}
bool comparebyDistanceBetweenStartAndGoal(Cell *c1, Cell *c2){
	float distanceOfC1AndGoal = c1->getDistance() + 
		distanceBetweenTwoCells((float)c1->getX(),(float)c1->getY(),(float)g_goalX,(float) g_goalY);

	float distanceOfC2AndGoal = c2->getDistance() + 
		distanceBetweenTwoCells((float)c2->getX(),(float)c2->getY(),(float)g_goalX,(float) g_goalY);
	if(distanceOfC1AndGoal <= distanceOfC2AndGoal){
		return false;
	}else{
		return true;
	}
}

只要加上这个方法就行了,把这个方法作为heap的比较条件。整个startPathFinding都不需要改,这里再次给出startPathFinding代码:


    typedef bool (*compareTwoCells)(Cell *c1, Cell *c2);     
    void HelloWorld::startPathFinding(compareTwoCells compareMethod, int startX,int startY,int goalX,int goalY){    
        Cell *startCell = _m_Map.Get(startX, startY);    
        vector<Cell*> vecCells;    
        vecCells.push_back(startCell);    
        make_heap(vecCells.begin(),vecCells.end(),compareMethod);    
        startCell->setMarked(true);    
        Cell *nowProcessCell;    
        
        
        while(vecCells.size() != 0){    
            pop_heap(vecCells.begin(),vecCells.end(),compareMethod);    
            nowProcessCell = vecCells.back();    
            vecCells.pop_back();    
        
            if(nowProcessCell->getX() == _goalX && nowProcessCell->getY() == _goalY){//the goal is reach    
                return;    
            }    
        
            for(int i = 0; i < 8; ++i){ //check eight direction    
        
                int indexX = nowProcessCell->getX() + DIRECTION[i][0];    
                int indexY = nowProcessCell->getY() + DIRECTION[i][1];    
        
                if(indexX >= 0 && indexX < xLineCount && indexY >= 0 && indexY < yLineCount    
                    && _m_Map.Get(indexX,indexY)->getPassable() == true){//check is a OK cell or not    
                        Cell *cell = _m_Map.Get(indexX,indexY);    
                        float beforeDistance = DISTANCE[i] * cell->getWeight() + _m_Map.Get(nowProcessCell->getX(),    
                            nowProcessCell->getY())->getDistance();//calculate the distance    
                        if(cell->getMarked() == false){     
                            cell->setMarked(true);    
                            cell->setLastX(nowProcessCell->getX());    
                            cell->setLastY(nowProcessCell->getY());    
                            cell->setDistance(beforeDistance);    
                            vecCells.push_back(cell);//only push the unmarked cell into the vector    
                            push_heap(vecCells.begin(),vecCells.end(),compareMethod);    
                        }else{// if find a lower distance, update it     
                            if(beforeDistance < cell->getDistance()){    
                                cell->setDistance(beforeDistance);    
                                cell->setLastX(nowProcessCell->getX());    
                                cell->setLastY(nowProcessCell->getY());    
                                make_heap(vecCells.begin(),vecCells.end(),compareMethod);//distance change,so make heap again    
                            }    
                        }    
                }    
        
            }    
        }    
    }    
    startPathFinding(comparebyDistanceBetweenStartAndGoal,_playerX,_playerY,_goalX,_goalY);//A star path finding demo    

函数指针太酷了!


3.三种寻路算法的图片比较


3.1只考虑距离起点的距离,采用Breadth-First



特点:可以找到目标,但搜索Cell太多。


3.2 只考虑离目标距离



特点:搜索Cell大多情况会相对少些,但不一定能找到最短路线。


3.3 A Star ,同时考虑到起点和终点的距离



特点:能找到最短路线,搜索的Cell比第一种要少,看最后的搜索方式,也有第二种搜索的智慧。



4.A Star动态gif演示图



不知道为什么我对GIF这么热衷。



5. Cocos2d-x A Star 源码下载: 


(请用7z解压,开发工具vs2010)

 http://www.waitingfy.com/?attachment_id=828


A*算法应用可以看下这篇文章《贪吃蛇 AI 的实现 snake AI


cocos2dx 3.x 实现 A星(A*)(A-star)算法自动寻路(一)

自动寻路里面的说的最多的就是A星寻路了,但是网上找了些博客大家写的有点简略,导致对于刚接触的人来说理解的不够清楚。在这里我将用大量的图片一步一步地列出A星算法的寻路过程。A星算法对于大地图的效率不高,...
  • u010946556
  • u010946556
  • 2015年10月11日 09:38
  • 3483

A*(也叫A star, A星)寻路算法Java版

A*(也叫A star, A星)寻路算法Java版 寻路算法有很多种,A*寻路算法被公认为最好的寻路算法。 原创文章,转载请注明出处:http://blog.csdn.net/ruils/articl...
  • u012379847
  • u012379847
  • 2014年11月04日 10:43
  • 4254

cocos2d-x学习日志(14) --A星寻路算法之45度地图

一、A星搜索 他就是一种启发性的算法,根据现在到达这个位置的步数及之后的“估计步数”,即f=g+h,f是整个从起点到终点的代价,g是从起点到我们目前位置的步数,h是从目前位置到终点的估计值,注意这...
  • my183100521
  • my183100521
  • 2013年12月16日 12:03
  • 3613

Cocos2d-x 寻路算法之二 离目的地的距离优先

1.介绍: Figure 1 接上一篇《Cocos2d-x 寻路算法之一 距离优先》,看这个图,我们发现这个寻路算法有点傻,明明终点在右侧却每个方向都找。难道没有其他办法了吗?从现实生活中...
  • fox64194167
  • fox64194167
  • 2013年12月05日 09:08
  • 1951

菜鸟福利 A星寻路算法 cocos2d-x实现

这篇blog是翻译自iOS Tutorial Team的成员 Johann Fradj发,他目前是一位全职的资深iOS开发工程师。他是HotApps Factory的创始人,该公司开发了AppCook...
  • qiou2719
  • qiou2719
  • 2014年09月09日 11:58
  • 1551

如何实现A星寻路算法 Cocos2d-x 3.0 beta2

本文实践自 Johann Fradj 的文章《How To Implement A* Pathfinding with Cocos2D Tutorial》,文中使用Cocos2D,我在这里使用Coco...
  • akof1314
  • akof1314
  • 2014年02月17日 13:50
  • 10952

如何实现A星寻路算法 Cocos2d-x 3.0 beta2

本文实践自 Johann Fradj 的文章《How To Implement A* Pathfinding with Cocos2D Tutorial》,文中使用Cocos2D,我在这里使用Coco...
  • xuehaiwuya_1
  • xuehaiwuya_1
  • 2014年08月29日 21:20
  • 569

cocos2d-x寻路

  • 2015年04月14日 17:44
  • 13.09MB
  • 下载

cocos2d-x上的A*寻路

  • 2013年09月17日 21:30
  • 308KB
  • 下载

cocos2d-x的A*寻路

如果你还不熟悉A*寻路,请先看下这篇文章http://blog.csdn.net/dssdss123/article/details/11494065 一、先介绍几个函数和结构: 1、virtua...
  • dssdss123
  • dssdss123
  • 2013年09月15日 23:16
  • 2233
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Cocos2d-x 寻路算法之三 A Star
举报原因:
原因补充:

(最多只允许输入30个字)