A* 寻路算法学习
代码小记
#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* 寻路算法学习的更多相关文章
- Unity实现A*寻路算法学习2.0
二叉树存储路径节点 1.0中虽然实现了寻路的算法,但是使用List<>来保存节点性能并不够强 寻路算法学习1.0在这里:https://www.cnblogs.com/AlphaIcaru ...
- Unity实现A*寻路算法学习1.0
一.A*寻路算法的原理 如果现在地图上存在两点A.B,这里设A为起点,B为目标点(终点) 这里为每一个地图节点定义了三个值 gCost:距离起点的Cost(距离) hCost:距离目标点的Cost(距 ...
- cocos2d-x学习日志(13) --A星寻路算法demo
你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢?如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它! A星算法简介: A*搜寻算法俗称A星 ...
- js实现A*寻路算法
这两天在做百度前端技术学院的题目,其中有涉及到寻路相关的,于是就找来相关博客进行阅读. 看了Create Chen写的理解A*寻路算法具体过程之后,我很快就理解A*算法的原理.不得不说作者写的很好,通 ...
- A*寻路算法的探寻与改良(二)
A*寻路算法的探寻与改良(二) by:田宇轩 第二部分:这部分内容主要是使用C语言编程实现A*, ...
- A*寻路算法的探寻与改良(一)
A*寻路算法的探寻与改良(一) by:田宇轩 第一部分:这里我们主 ...
- A*寻路算法lua实现
前言:并在相当长的时间没有写blog该,我觉得有点"颓废"该,最近认识到各种同行,也刚刚大学毕业,我认为他们是优秀的.认识到与自己的间隙,有点自愧不如.我没有写blog当然,部分原 ...
- [笔记]A*寻路算法初探
写在开始之前 最近突然对各路游戏的寻路算法很感兴趣,于是去学习了下游戏里的AI们是如何寻路的.网上相关内容很多,但同时有些说法也不一,制作自己的A* 算法时也有因不同的说法而困惑.整理多方资料并自己实 ...
- 如何在Cocos2D游戏中实现A*寻路算法(八)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
随机推荐
- Redis系统学习 一、基础知识
1.数据库 select 1 select 0 2.命令.关键字和值 redis不仅仅是一种简单的关键字-值型存储,从其核心概念来看,Redsi的5种数据结构中的每一个都至少有一个关键字和一个值.在 ...
- linux 下 openssl 编译和交叉编译
此随便记录一下编译openssl时遇到的各种问题以及解决办法. 点击此处下载 OpenSSL(version-1.0.1e) linux 64位系统编译32位版本: setarch i386 ./Co ...
- hdu 1253 胜利大逃亡(BFS)
题目链接:点击链接 三维的BFS,刚开始一直超内存,超无语...... 改了n多次终于AC了 #include <iostream> #include <stdio.h> # ...
- Ubuntu系统中初次下载Android源码的一点经验
这阵子突然心血来潮,想看看android的源代码,所以这一两天晚上都在折腾下载这个东西. (其实在GitHub上可以在线看的,不过不太喜欢在线看,URL附上 https://github.com/an ...
- Speex Acoustic Echo Cancellation (AEC) 回声消除模块的使用
背景:回声与啸叫的产生 http://blog.csdn.net/u011202336/article/details/9238397 参考资料: http://www.speex.org/doc ...
- Hiberbate中的一对多关联查询
Hibernate中一对多关系的应用 案例:一个人可以拥有多辆小轿车 目的:通过hibernate的相关配置,利用HQL语句成功的查询出某人拥有某些车辆 1. 项目结构 2. domain类的创建详情 ...
- 获取Exception的详细信息
转自:http://blog.csdn.net/long95wang/article/details/8089489 方法一: public static String getExceptionAll ...
- iOS开发-内存管理
内存管理 对于这篇呢,其实现在都是ARC模式,正常状态下基本不用我们去手动释放内存,所以如果不是要面试呀.装逼或者扎实功底的,就先别看了或者了解下即可,因为像面试时,有些面试官想看你的基础时,就有些人 ...
- vue使用resource发送ajax请求
<script type="text/javascript"> new Vue({ el:'#app', created:function(){ var url=&qu ...
- cocos2d基本类介绍 director/scene/layer/sprite
[核心类] 导演Director.场景Scene.布景层Layer.精灵Sprite的概念请移步: 导演控制场景,场景控制图层,图层控制精灵,精灵控制动作. 相互之间的关系框架 ...