点击上方亿元程序员+关注和★星标

引言
哈喽大家好 ,恢复更新之后,有一位读者跟我吐槽 ,面试某大厂游戏 开发岗位,竟然被问到了A*寻路算法
。
他哭笑不得 :"都2025 年了,引擎商店里什么寻路方案 没有,还问这种'古董级'算法?"
我听了也哭笑不得 ,却又忍不住想:正因为是2025 年,面试官还问A*
,才恰恰说明这个问题的价值所在。
为什么?
基础不牢,地动山摇
现在 的游戏引擎确实强大,点点鼠标就能实现复杂的寻路功能。
但当你 遇到NPC卡在角落、群组移动不自然、动态障碍物避让失效时,不了解底层原理,连调试都无从下手。
A*算法
作为寻路领域的经典 ,其核心思想至今未过时。
A*的精髓何在?
想象一下你在一个大型商场找餐厅:
-
盲目搜索 :每个店铺都进去看一眼(类似
Dijkstra
) -
贪心搜索:只朝着餐厅方向走,可能被栏杆挡住(类似最佳优先搜索)
-
A*搜索:既考虑餐厅方向,又计算已走距离,找到最佳平衡
A*
的聪明在于那个简单的评估函数:f(n) = g(n) + h(n)
当前代价+未来预估
(至于上面的,大家想象一下就行,谁饿肚子的时候会想怎么A*寻路?)
那么如何在游戏开发中运用和理解呢?
先来看个例子
不重复造轮 ,我们通过上一期文章的工程,讲一下如何在游戏开发中运用A*
寻路。
1.打开工程
首先打开我们上一期文章的示例工程。

上一期 我们讲到如何根据地图数据生成六边形网格地图 ,我们先给每个格子添加点击事件,方便演示寻路。

2.完善一下代码
定义存储格子节点的二维数组

在生成地图过程中 ,记录每个格子,并且监听点击事件,通过主角位置变化测试代码是否准确。

效果如下:

3.寻路核心
无论 是在面试 ,还是在实际运用 中,我们必须清晰地知道和说出A*寻路
的几个核心含义:
-
G值:g(n)表示从初始节点到任意节点n的代价。当前节点的G值等于移动前节点的G值加上移动到当前节点的距离。如果新路径到相邻点的距离更短,G值更小,更新相邻节点的G值。
-
H值:h(n)表示从节点n到目标点的启发式评估代价。当前节点到终点的距离。固定不变的值。计算H值,忽略障碍(可以认为没有障碍),只计算最近的距离。
-
F值:F值为G值和H值之和。
-
OpenList: 存放着所有的待检测的节点(坐标),每次都会从其中寻找出符合某个条件的节点。
-
ClosedList: 存放着所有不会被检测的节点(坐标),每次检测都会忽略它们。
4.寻路过程:
这是 通用的A*
寻路过程,大家根据步骤替换成自己项目的代码即可。
- 1.创建一个开放列表和一个关闭列表,用于存储待探索和已探索的节点。

- 2.将起点添加到开放列表。

- 3.重复以下步骤直到找到目标节点或开放列表为空:
a. 从开放列表中选择F值最小的节点(通常是H值+G值最小的节点)。
b. 将该节点从开放列表移至关闭列表。
c. 对该节点的邻居节点进行遍历,计算它们的G值和H值。
d. 如果邻居节点不在开放列表中,将其添加到开放列表,并更新其G值和父节点。
e. 如果邻居节点已在开放列表中,检查当前路径是否更短,如果更短则更新G值和父节点。
- 4.当找到目标节点或开放列表为空时,搜索结束。
5.效果演示
调用寻路方法,传入起点和终点。

效果如下:

物是人非
*2025年的A,早已不是你以为的A***
传统A*确实有局限:网格地图不灵活、动态环境适应性差。
但现在的A*已经进化:
-
多维化应用:不再局限于2D平面,用于三维空间导航、对话树选择、任务流程规划
-
混合化实现:与行为树、状态机结合,打造更智能的NPC
-
优化升级:分层路径寻找、双向搜索、动态权重调整,应对万人在线的复杂场景
面试官想看到的,不是你死记硬背的代码,而是你对算法思想的理解和应用能力。
结语
下次面试 再遇到A*
,别翻白眼了,这是展示你深厚功力的绝佳机会。
因为工具会迭代,引擎会更新,但解决问题的思维能力永远不过时。
所以,都2025年了,**问A*寻路怎么了?**该问!
本期示例工程 可以通过阅读原文获取,感谢支持!
我是"亿元程序员",一位有着8年游戏行业经验的主程。在游戏开发中,希望能给到您帮助, 也希望通过您能帮助到大家。
AD:笔者线上的小游戏《打螺丝闯关》《贪吃蛇掌机经典》《重力迷宫球》《填色之旅》《方块掌机经典》大家可以自行点击搜索体验。
实不相瞒,想要个赞 和爱心 !请把该文章分享给你觉得有需要的其他小伙伴。谢谢!
推荐专栏:
点击下方灰色按钮+关注。