代码小记

 #include <iostream>
#include <list> struct POINT {
int X;
int Y;
}; // G: 起点到当前点的成本
// H: 当前点到终点的估算成本
// F: G,H之和
struct MapNode {
int G;
int H;
int F;
bool can_pass;
POINT pt;
MapNode* pParent; MapNode() : G(), H(), F(), can_pass(false), pParent(NULL) {} bool operator==(const MapNode& other) {
return (other.pt.X == pt.X && other.pt.Y == pt.Y);
} bool operator!=(const MapNode& other) {
return !(*this == other);
}
}; bool nodeCompare(MapNode* p1, MapNode* p2) {
return (p1->F < p2->F);
} int maps[][] = {
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
}; MapNode* findNode(std::list<MapNode*>& nodes, const POINT& pt) {
for(std::list<MapNode*>::iterator it = nodes.begin();
it != nodes.end();
++it) {
if((*it)->pt.X == pt.X && (*it)->pt.Y == pt.Y) {
return *it;
}
}
return NULL;
} void pathFinding() {
std::list<MapNode*> all;
std::list<MapNode*> open;
std::list<MapNode*> close; for(int row=; row<; ++row) {
for(int col=; col<; ++col) {
MapNode* pNode = new MapNode;
pNode->pt.X = row;
pNode->pt.Y = col;
pNode->can_pass = (maps[row][col] == ? true : false);
all.push_back(pNode);
}
} POINT pt_start = {, };
POINT pt_target = {, };
MapNode* pStart = findNode(all, pt_start);
MapNode* pTarget = findNode(all, pt_target); open.push_back(pStart);
while(!open.empty()) {
open.sort(nodeCompare);
MapNode *pNode = open.front();
if (*pNode == *pTarget) {
break;
}
open.pop_front();
close.push_back(pNode);
// 查找周围节点并将合适的加入open
int ptMask[][] = { // x坐标相对位置,y坐标相对位置,移动耗费
{-, -, }, // 左上
{ , -, }, // 正上
{ , -, }, // 右上
{-, , }, // 正左
{ , , }, // 正右
{-, , }, // 左下
{ , , }, // 正下
{ , , } // 右下
};
for(int i=; i<; ++i) {
POINT pt;
pt.X = pNode->pt.X + ptMask[i][];
pt.Y = pNode->pt.Y + ptMask[i][]; if(pt.X > && pt.X < && pt.Y > && pt.Y < ) {
MapNode* pChildNode = findNode(all, pt);
if(!pChildNode->can_pass || NULL != findNode(close, pt)) {
// 如果pNodeLT不可抵达的或者它在 close list 中,忽略它
} else {
if(NULL == findNode(open, pt)) {
// 如果pNodeLT不在 open list 中,把它加入 open list,
// 并且把当前方格设置为它的父亲,记录该方格的F,G和H值
pChildNode->pParent = pNode;
pChildNode->G = pChildNode->pParent->G + ptMask[i][];
pChildNode->H = * (abs(pTarget->pt.X - pt.X) + abs(pTarget->pt.Y - pt.Y));
pChildNode->F = pChildNode->G + pChildNode->H;
open.push_back(pChildNode);
} else {
// 如果pNodeLT已经在 open list 中,检查这条路径 ( 即经由
// 当前方格到达它那里 ) 是否更好,用 G 值作参考。更小的 G
// 值表示这是更好的路径
int tG = pNode->G + ptMask[i][];
if(tG < pChildNode->G) {
pChildNode->pParent = pNode;
pChildNode->G = tG;
pChildNode->H = * (abs(pTarget->pt.X - pt.X) + abs(pTarget->pt.Y - pt.Y));
pChildNode->F = pChildNode->G + pChildNode->H;
}
}
}
}
}
}
if(NULL != pTarget->pParent) {
MapNode* pNode = pTarget;
std::cout << "path is : " << std::endl;
do {
std::cout << "pt[" << pNode->pt.X << ", " << pNode->pt.Y << "] ->" << std::endl;
pNode = pNode->pParent;
} while(*pNode != *pStart);
std::cout << "pt[" << pNode->pt.X << ", " << pNode->pt.Y << "]" << std::endl;
}
} int main() { pathFinding(); system("pause"); return ;
}

A* 寻路算法学习的更多相关文章

  1. Unity实现A*寻路算法学习2.0

    二叉树存储路径节点 1.0中虽然实现了寻路的算法,但是使用List<>来保存节点性能并不够强 寻路算法学习1.0在这里:https://www.cnblogs.com/AlphaIcaru ...

  2. Unity实现A*寻路算法学习1.0

    一.A*寻路算法的原理 如果现在地图上存在两点A.B,这里设A为起点,B为目标点(终点) 这里为每一个地图节点定义了三个值 gCost:距离起点的Cost(距离) hCost:距离目标点的Cost(距 ...

  3. cocos2d-x学习日志(13) --A星寻路算法demo

    你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢?如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它! A星算法简介: A*搜寻算法俗称A星 ...

  4. js实现A*寻路算法

    这两天在做百度前端技术学院的题目,其中有涉及到寻路相关的,于是就找来相关博客进行阅读. 看了Create Chen写的理解A*寻路算法具体过程之后,我很快就理解A*算法的原理.不得不说作者写的很好,通 ...

  5. A*寻路算法的探寻与改良(二)

    A*寻路算法的探寻与改良(二) by:田宇轩                                                     第二部分:这部分内容主要是使用C语言编程实现A*, ...

  6. A*寻路算法的探寻与改良(一)

    A*寻路算法的探寻与改良(一) by:田宇轩                                                                    第一部分:这里我们主 ...

  7. A*寻路算法lua实现

    前言:并在相当长的时间没有写blog该,我觉得有点"颓废"该,最近认识到各种同行,也刚刚大学毕业,我认为他们是优秀的.认识到与自己的间隙,有点自愧不如.我没有写blog当然,部分原 ...

  8. [笔记]A*寻路算法初探

    写在开始之前 最近突然对各路游戏的寻路算法很感兴趣,于是去学习了下游戏里的AI们是如何寻路的.网上相关内容很多,但同时有些说法也不一,制作自己的A* 算法时也有因不同的说法而困惑.整理多方资料并自己实 ...

  9. 如何在Cocos2D游戏中实现A*寻路算法(八)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

随机推荐

  1. OSGI原形(.NET)

    OSGI原形(.NET) 目前只做了基础的功能,比如: 各个模块单独的AppDomain容器 Activator激活 导出的服务检查 不过,虽说这样,但目前的这个版本已经能实现模块分离.互相依赖调用等 ...

  2. spring redis入门

    小二,上菜!!! 1. 虚拟机上安装redis服务 下载tar包,wget http://download.redis.io/releases/redis-2.8.19.tar.gz. 解压缩,tar ...

  3. linux学习心得之目录树开端与/etc(图文)

    linux学习心得之目录树开端与/etc(图文) linux中“一切皆文件”,学习linux一年了,在学习过程中对目录树的一点心得,分享给大家,有不对的地方敬请斧正. 不多说了,先上图: 根目录: / ...

  4. 解决phpmailer可以在windows下面发送成功, 在linux下面失败的问题

    谢天谢地...差点因为在linux下面phpmailer发送邮件失败转到了window+IIS... Godaddy的linux服务器无法用phpmailer发送(我用的是网易的邮箱服务器...虽然现 ...

  5. [珠玑之椟]估算的应用与Little定律

    [珠玑之椟]估算的应用与Little定律 估算的数据主要依赖于所能获得的数据和常识,有时还包括实践而不仅仅是理论.它常常作为一个大问题中的子问题,恰当地估算可以省去精确计算的时间和开销.在计算机领域, ...

  6. 从零开始学C++之运算符重载(三):完善String类([]、 +、 += 运算符重载)、>>和<<运算符重载

    在前面文章中使用过几次String类的例子,现在多重载几个运算符,更加完善一下,并且重载流类运算符. []运算符重载 +运算符重载 +=运算符重载 <<运算符重载 >>运算符重 ...

  7. Linux负载均衡软件LVS之二(安装篇)

    一.  安装LVS软件 1.安装前准备工作操作系统:统一采用Centos4.4版本.地址规划,如表1所示:表1 更详细的信息如图2所示: 图2中的VIP指的是虚拟IP地址,还可以叫做LVS集群的服务I ...

  8. mybatis使用@param后掉的坑

    项目里面的一个分页拦截器内某段代码需要判断传入的参数是否属于摸个特定的类,如果不是就直接执行下面的流程,坑爹的@param,在DAO里传入的参数前面加上了这个注解,mabaits内部将传入的参数变成了 ...

  9. windows下练习linux shell

    <---开始学习linux---记录一下---路漫漫其修远兮---加油吧---萌萌达> 使用软件:Cygwin  下载地址(免安装版):链接: http://pan.baidu.com/s ...

  10. 在Node.js中使用RabbitMQ系列一 Hello world

    在前一篇文章中可伸缩架构简短系列中提到过关于异步的问题.当时推荐使用RabbitMQ来做任务队列的实现方案.本篇文章以Node.js为例子,来实际操作如何和RabbitMQ进行交互. 介绍 Rabbi ...