Lockstep 之寻路算法

来源:互联网 发布:美国研究生费用 知乎 编辑:程序博客网 时间:2024/05/16 19:51

Lockstep 之寻路算法

最近在学习Unity,在github上发现了一个很好的开源网游架构。也解决了之前的很多困惑,在此和大家分享一下。github地址在文章末尾贡献。

A*寻路算法

1.简易描述

简易地图

1.在A*寻路中,我们首先需要将地图分割成一个一个的格子。2.然后选择一个格子作为起点,一个格子作为终点。如上图所示,A选择作为起点,B选择作为终点。3.然后我们通过A*寻路算法找到从A到B所需要经历的最快捷的格子。4.从图中我们可以看出,A所能到达的格子,只能是在它的8个邻居。而上下左右4个邻居是最短距离的,而4个角上的邻居则距离要长一些。同时每一个格子到达B的距离又是不一样的。所以我们需要给每一个格子设定权值F,并更新。5.权值F由两部分组成,即F=G+H。G表示A节点移动到指定方块的消耗,H表示指定节点移动到B节点的消耗。我们设定横向和纵向移动一个格子的消耗为100,而斜着移动一个格子的消耗为140.6.我们需要找到一条路径,F值是最小的。

2.寻路步骤

  • 准备好数据结构,一个“开启列表”,一个“关闭标志”CloseFalgT=0,并执行++CloseFalgT。开启列表中放置待检查的节点。节点结构:
class Grid{    int x = 0; //X坐标    int y = 0; //Y坐标    Grid parent = null; //自己的上一个节点    int F = 0; //总的权值    int G = 0; //A点到当前节点的权值,在运算过程中更新。    int H = 0;//当前节点到B点的权值,通过公式得出。    int CloseFlag = 0; //快速设定关闭节点。    bool walkable = true; // 该节点是否可以通过。}
  • 从起点A开始,把它作为待处理的节点存入“开启列表”中,并更新好它的权值F=G+H,G为0。
  • 不断做当前操作,直到找到目标或者“开启列表”为空。
    1. 对“开启列表”根据F值进行排序。
    2. CurNode = F值最小的那个,并移除,设置成关闭标志(CloseFalg = CloseFalgT)。
    3. 找出CurNode的邻居Neighbor,把walkable为false或者CloseFlag等于CloseFlagT的丢弃,不处理。
    4. 计算CurNode的G值,对于纵横的Neighbor节点,G = CurNode.G + 100, 而斜方向的Neighbor节点 G = CurNode.G + 140.
    5. 如果改Neighbor不在开启列表中,则加入开启列表中,并设置parent=CurNode,如果在开启列表中,并且新的G值比之前的小,则更新G值,并且更新parent为CurNode。并且计算Neighbor节点的H值。
  • 当到达B点之后,那么最后所有选择过的节点,组成的结构则是树形结构。最终路径就是该节点的parent合集。最终的parent就是A点。
Created with Raphaël 2.1.0A点加入OpenList设定A的F、G、H值开启列表为空找到结果结束CurNode=OpenList中F值最小点从OpenList中移除CurNodeCurNode是B点CurNode设置成关闭状态1.将CurNode的8个neighbor加入OpenList2.heighbor不为空,可通过,不处于关闭状态;3.并更新F G H值yesnoyesno

以下是项目运行test示意图
项目截图
项目截图
图中绿色格子表示一个Node占的位置, 红色线条表示查找出的路径,红色格子表示该Node不可通过。
项目github地址:
https://github.com/bazhi/LockStep 个人重构
https://github.com/SnpM/LockstepFramework 参考

0 0