寻路算法实现

实现任意两点间的寻路,自动选择最优或较优路径
1.基本要求
可以以矩阵表示地图,
{1,1,1,1,1,1,1,1,1,1,1 }
{1,0,1,0,1,0,0,0,0,0,1 }
{1,0,1,0,0,0,1,0,1,1,1 }
{1,0,0,0,1,0,1,0,0,0,1 }
{1,0,1,1,0,0,1,0,0,1,1 }           0代表可以通过,1代表不可通过
{1,0,1,0,1,1,0,1,0,0,1 }
{1,0,0,0,0,0,0,0,1,0,1 }
{1,0,1,0,1,0,1,0,1,0,1 }
{1,0,0,1,0,0,1,0,1,0,1 }
{1,1,1,1,1,1,1,1,1,1,1 }
可以任意设定起点和终点,可以任意设定地图,输出路径和步数。
2.项目扩展
在实现基本要求的情况下,进一步完善程序
可以加入移动力、地形以及移动在不同地形上的损耗等因素
可以用图形化界面取代字符界面


用Dijkstra算法,我做的给你个参考,下面各点是有距离的(移动力),BIG表示不可通过

#define BIG 32767 //无穷大 
int pre[6]={0}; //这是关键!pre数组用于记录每个点的前趋,这样算出最短路径后,就可以递归出路径经过的点 
int Distance[6]; //用于记录从起点到达每个点的最短路径长度 
int Cost[6][6]={{0,1450,1650,BIG,BIG,BIG}, //有向网的邻接矩阵,这里以6个点为例 
        {1450,0,BIG,1350,2350,BIG}, 
        {1650,BIG,0,BIG,2550,BIG}, 
        {BIG,1350,BIG,0,BIG,1200}, 
        {BIG,2350,2550,BIG,0,850}, 
        {BIG,BIG,BIG,1200,850,0}, 
        };

//Dijkstra算法函数,求给定点到其余各点的最短路径 
//参数:邻接矩阵、顶点数、出发点的下标、结果数组、每个点的前趋 
void Dijkstra(int Cost[][6],int n,int v0,int Distance[],int pre[]) 

  int s[6]; 
  int mindis,dis; 
  int i,j,u; 
  //初始化 
  for(i=0;i<n;i++) { 
    Distance[i]=Cost[v0][i]; 
    s[i]=0; 
  } 
  s[v0] =1; //标记v0 
  //在当前还未找到最短路径的顶点中,寻找具有最短距离的顶点 
  for(i=0;i<n;i++){ 
    if(Distance[i]<BIG) pre[i]=v0; 
  } 
  for(i=1;i<n;i++) { //每循环一次,求得一个最短路径 
    mindis=BIG; 
    for (j=0;j<n;j++) //求离出发点最近的顶点 
      if(s[j]==0&&Distance[j]<mindis) { 
        mindis=Distance [j]; 
        u=j; 
      } 
    for(j=0;j<n;j++) //修改递增路径序列(集合) 
      if(s[j]==0) { //对还未求得最短路径的顶点 
        //求出由最近的顶点 直达各顶点的距离 
        dis=Distance[u] +Cost[u][j]; 
        //如果新的路径更短,就替换掉原路径 
        if(Distance[j]>dis){ 
          Distance[j]=dis; 
          pre[j]=u; 
        } 
      } 
    s[u]=1; // 标记最短路径已经求得 
  } 
}

用Dijkstra函数算出最短路径后,就可以递归出从给定顶点到各点的最短路径上的每个点了,函数如下(不含终点):

char pathres[100]=""; //保存路径 
char *Vertex[6]={"福州","上海","广州","北京","成都","西安"}; 
//参数:起点、终点 
void shpath(int st,int ed) //起点应该为Dijkstra函数中的v0 

  if(pre[ed]!=st){ 
    shpath(st,pre[ed]); 
  } 
  strcat(pathres,Vertex[pre[ed]]); 
  strcat(pathres,"-"); 
} //最后要在主函数中把终点加到pathres里

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity寻路算法实现和封装可以通过Unity自带的NavMesh系统完成。NavMesh是一种用于自动寻路的数据结构,能够在场景中的不规则地形上为单位提供路径。 要实现和封装寻路算法,首先需要在Unity中建立NavMesh。可以通过在场景中创建一个NavMesh Surface组件,然后在其设置中选择需要生成NavMesh的地形和区域。 接下来,在需要的游戏对象上添加NavMeshAgent组件,这将用于完成单位的寻路任务。在NavMeshAgent组件中,可以设置单位的移动速度、转向速度和停止距离等参数,以及将目标点设置为单位希望到达的位置。 在代码中,可以通过调用NavMeshAgent的SetDestination方法来设置单位的目标点,然后NavMeshAgent将自动计算路径并开始移动。而NavMeshAgent的路径计算算法使用的就是A*寻路算法,该算法可以高效地找到最优路径。 为了封装寻路算法,可以创建一个自定义脚本,将NavMeshAgent的操作封装在其中。该脚本可以包含设置目标点、启动寻路、停止寻路等方法,并可将NavMeshAgent的功能暴露给其他对象进行调用。 最后,为了演示寻路算法的动态效果,可以创建一个简单的场景。在场景中放置一些障碍物和目标点,然后让单位在场景中随机移动或根据玩家的输入来移动。当单位移动时,可以实时显示单位的路径和当前位置,通过不断更新路径和位置,可以展示出寻路算法的实时效果。 这样,通过Unity的NavMesh系统以及自定义脚本的封装,就可以实现和展示Unity寻路算法实现和封装,并带有动态演示demo。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值