0

0

C++怎么实现A*算法_C++路径规划教程【游戏】

穿越時空

穿越時空

发布时间:2026-02-25 13:47:02

|

440人浏览过

|

来源于php中文网

原创

astar类需用坐标pair作状态、priority_queue配greater实现小顶堆、unordered_set存y*width+x哈希去重;避免递归和预建节点,超限返回失败而非死循环,小网格手trace验证流程。

c++怎么实现a*算法_c++路径规划教程【游戏】

怎么写一个能跑通的 AStar 类,不卡死也不绕路

核心是状态表示 + 优先队列 + 闭集合去重。别用递归实现主循环,容易栈溢出;也别把所有格子预生成节点对象——内存暴涨还缓存不友好。用坐标 std::pair<int int></int> 当状态最轻量,std::priority_queue 配自定义比较器,闭集合用 std::unordered_set 存哈希值(比如 y * width + x)。

常见错误现象:std::priority_queue 默认是大顶堆,得传 std::greater 或重载 operator;闭集合漏加“已扩展节点”,会导致反复回溯;启发式函数返回负数,优先队列顺序全乱。

  • 启发式必须满足:0 ≤ h(n) ≤ 实际最短距离(否则不保证最优)
  • 地图边界检查必须在邻居生成后立刻做,别等进队列再判——避免无效入队
  • 如果地图动态变化,每次调用前清空闭集合和开集合,别复用旧状态

heuristic 选曼哈顿还是欧氏距离,差别在哪

游戏网格地图基本都用曼哈顿距离(abs(x1-x2) + abs(y1-y2)),因为移动限制在四方向或八方向,欧氏距离会高估斜向成本,破坏可采纳性(admissibility),导致路径非最优。只有你允许任意角度移动且代价按直线算,才考虑欧氏。

八方向地图(斜移代价为 1.414)可用对角线启发式:min(dx, dy) * 1.414 + abs(dx - dy),比纯曼哈顿更紧,搜索更快。

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

Luminal
Luminal

用AI以光速清理、转换和分析电子表格

下载
  • 用错启发式最直接的表现:A* 返回的路径比 BFS 找到的还长
  • 如果地图有不同地形代价(如泥地耗 3 点,草地耗 1 点),启发式仍按最低单位代价估算,不能乘地形系数
  • 浮点启发式要小心精度问题,std::priority_queuefloat 比较不稳定,建议转成 int 放大 100 倍

怎么让 AStar::search() 支持中断和复用

别写成一次性返回完整路径的函数。实际游戏里玩家移动中障碍可能突变,或者帧率受限需分帧计算。把状态拆成成员变量:std::priority_queue<node> openSet</node>std::unordered_map<key node> cameFrom</key>std::unordered_set<key> closedSet</key>,暴露 step() 方法,每次只处理一个节点。

这样既能插帧执行,也能在找到目标前随时 reset(),还能复用已算过的部分状态(比如从同一起点多次搜不同终点)。

  • 中断时记得保存当前 openSet 顶部节点的估价,下次从它继续,别清空重来
  • cameFromstd::unordered_map 而不是 std::vector<:vector></:vector>,稀疏地图下内存省一个数量级
  • 不要在 step() 里返回路径——路径要靠外部调用 reconstructPath() 回溯生成,避免重复遍历

为什么用 std::priority_queue 却改不了队列里的节点优先级

因为 std::priority_queue 不支持降键(decrease-key)操作。这是 A* 实现里最容易被忽略的性能坑:当发现更优路径到达某节点时,你不能更新它在队列里的优先级,只能插入新节点,靠闭集合后续过滤旧节点。

结果就是队列膨胀,尤其在低启发式或高障碍密度地图里,openSet 尺寸可能比总格子数还大几倍。

  • 这不是 bug,是标准容器限制,接受它比换 boost::heap 更实际
  • 真正影响性能的是闭集合查找速度——务必用 std::unordered_set,别用 std::set
  • 如果真卡在队列大小,可以加个硬限制:当 openSet.size() > 10000 时直接返回失败,比死循环强

路径规划没玄学,但每个判断分支都得对齐你的地图模型和移动规则。写完先用 5×5 网格手 trace 一遍节点进出队列顺序,比跑十次 demo 更早发现问题。

相关文章

在线游戏
在线游戏

海量精品小游戏合集,无需安装即点即玩,休闲益智、动作闯关应有尽有,秒开即玩,轻松解压,快乐停不下来

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

智谱清言 - 免费全能的AI助手
智谱清言 - 免费全能的AI助手

智谱清言 - 免费全能的AI助手

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

423

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

596

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

423

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

596

2023.08.10

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

473

2023.08.14

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

36

2026.02.25

Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法
Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法

本专题系统整理Steam官网最新可用入口,涵盖网页版登录地址、新用户注册流程、账号登录方法及官方游戏商店访问说明,帮助新手玩家快速进入Steam平台,完成注册登录并管理个人游戏库。

2

2026.02.25

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

0

2026.02.25

Python数据处理流水线与ETL工程实战
Python数据处理流水线与ETL工程实战

本专题聚焦 Python 在数据工程场景下的实际应用,系统讲解 ETL 流程设计、数据抽取与清洗、批处理与增量处理方案,以及数据质量校验与异常处理机制。通过构建完整的数据处理流水线案例,帮助开发者掌握数据工程中的性能优化思路与工程化规范,为后续数据分析与机器学习提供稳定可靠的数据基础。

0

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.1万人学习

C 教程
C 教程

共75课时 | 4.9万人学习

C++教程
C++教程

共115课时 | 19.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号