C++如何实现简单的A*寻路算法_C++游戏开发路径规划代码【实战】-C++

A*核心循环需维护openSet(按f=g+h排序)和closedSet;每次取f最小节点,若非终点则更新邻居g值与parent,加入closedSet防重访;推荐用std::set管理openSet,h函数须≤实际距离,四向用曼哈顿距离,八向用切比雪夫或加权欧氏距离;路径通过parent链回溯并反转获得。

怎么写一个能跑通的 A* 核心循环

核心就是维护两个集合:openSet(待探索节点,按预估总代价 f = g + h 排序)和 closedSet(已处理节点)。每次从 openSet 取出 f 最小的节点,检查是否是终点;如果不是,遍历其可达邻居,更新它们的 g 值(起点到该邻居的实际距离)和 parent 指针。

实操建议:

  • 用 std::priority_queue 或 std::set 管理 openSet,但注意 std::priority_queue 不支持修改内部元素优先级,所以更稳妥是用 std::set>,靠 f 值排序,插入/删除都 O(log n)
  • g 值初始化为 INFINITY(可用 std::numeric_limits::max()),起点的 g 设为 0
  • 邻居生成要严格限制在合法格子内(比如地图数组边界、不可通行标识如 1 或 WALL)
  • 别忘了把当前节点加入 closedSet,否则可能重复处理甚至死循环

曼哈顿距离 vs 欧氏距离:h 函数怎么选

h(启发式函数)必须满足“不大于实际剩余距离”,否则 A* 不再保证最优。网格地图中常见两种:

  • 四向移动(上/下/左/右)→ 用 manhattan_distance: abs(x1 - x2) + abs(y1 - y2)
  • 八向移动(含对角线)→ 用切比雪夫距离更准:std::max(abs(x1 - x2), abs(y1 - y2));若对角线代价是 1.414,则用带权重的欧氏距离也行,但要确保不超估
  • 用欧氏距离 sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) 在八向图里会轻微低估,没问题;但在纯四向图里它可能高估(比如 (0,0)→(1,1),欧氏≈1.414,但实际需走 2 步),导致非最优——这点常被忽略

如何从 parent 链还原路径

A* 结束后,如果找到终点,就从终点顺着 parent 指针一路回溯到起点,把每个节点压入 vector,最后反转即可得到正向路径。

立即学习“C++免费学习笔记(深入)”;

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C++如何实现简单的A*寻路算法_C++游戏开发路径规划代码【实战】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4024877+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4024877+
  • 本周更新: 0+
  • 最后更新: 2026-03-16