您的位置:首页 > 其它

关于英雄联盟中的英雄是如何寻找最佳路径的

2015-11-04 17:24 267 查看
LOL的玩家都知道,当您的召唤师随便点击地图上的某一块区域时,小地图便会自动为您画出一条最短路径。比如1级的时候,您想在男爵河道上开个1级小团,只需在河道上点一下,您的英雄便会按照最短路径朝目标区域前进。但是,您有没有想过,游戏中的AI是如何帮您做到这一点的呢?
这个问题就是本文将要讨论的,但讨论之前必须要声明的是,以下内容纯属臆测,可以娱乐但不要当真!
 

在英雄联盟中,地图并不大而且还是静态的,所以我当初最先的猜测是生成最短路径的方法也是静态的,即生成路径无需调用任何算法,只需从内存中取出原先计算好的路径结构体即可。大概原理如下:将地图划分为100个区域,每个区域代表一个点。因为生成的路径是两个点之间的路径,所以我们需要开辟的是二维性质的数组,即100*100=10000,然后我们将地图中的每一点到每另一点的最佳路径都设计好并存放在相应的数组元素中【对英雄联盟这样的制作团队而言,设计好大约4950个最优路径应该不是太大的工作量吧】,最后按照玩家的点击,直接取出来就OK了。比如,玩家站在A点,他点击了要去的B点,那么只需把A与B两个点当成二维数组的两个下标,取出的路径自然是Path[A][B]。但这种方法有一个不确定的问题,那就是划分区域的精确度,毕竟把地图分为100块,其粒度是否过粗我很不确定。但如果增加精确度的话,其对应的内存开销将会呈指数级的增长。比如将地图切割成1000块,其对应内存长度就得是1000000!而这将会是一个不容小觑的内存开销。
 

上面的路径寻找是静态方法,接下来谈谈动态方法。在谈动态生成路径之前,有必要先为大家定义一个认知:那就是先把英雄联盟地图中的的每面墙壁至少附加上两个属性——这面墙壁的顶点和尾部,如下图所示:![那个直角墙壁的顶点是大写A,尾部是小写a。那个直线墙壁的顶点是大写C,尾部是小写c]


还是参照上面那个图,里面的“起”字代表我们英雄现在的位置,“目”字代表我们将要去的目标位置。让我们来看一下,当我们的英雄点击了那个“目”自区域块时,程序内部做了哪些事情。。。
 

1):首先程序会尝试从“目”开始画一条直线到“起”字区域,在直线画到1/4时,遇到了拦路虎【就是那个Aa直角墙】,然后程序先找到拦路虎的“顶点”属性,连接“目”到A点;接着程序再尝试从A点画直线到“起”字区,又遇到拦路虎Bb,连接AB;再从B到“起”,遇到Cc,连接BC,最后从C到“起”,畅通无阻,那么这个路径也就确定下来:目->A->B->C->起,所以目前暂时的最佳路径【目->A->B->C->起】。
 

2):程序回溯一步,从Cc的尾部c开始,画直线到“起”,畅通无阻,第二条路径确定下来:目->A->B->c->起,然后再把它与第一条路径【目->A->B->C->起】比较,发现它比较长,所以目前的最优路径还是【目->A->B->C->起】。
 

3):程序再回溯一步,因为Cc测试连个属性都测试完毕,所以从Bb的尾部开始,从“b”画直线到“起”,遇到拦路虎Cc,连接bC,再从blablabla,最后确定下来路径:目->A->b->C->起,将它与保存下来的最优路径【目->A->B->C->起】比较,发现它还是比【目->A->B->C->起】长,所以目前的最优路径还是【目->A->B->C->起】。
 

4):程序回溯一步,又从Cc的尾部c开始,生成路径:目->A->b->c->起,与保存路径比较,新的路径长,无法取代,目前最优依然是【目->A->B->C->起】。
 

就这样,程序一直连接、计算、回溯、连接。。。直至回溯计算出这样一条路径:目->a->b->C->起,然后计算发现,咦!它比保存下来的【目->A->B->C->起】还要短一些,好吧,那就让它取代原先的最优路径,成为新的最优路径好了。
 

然后的然后,程序还是一直连接、计算、回溯、连接。。。直至计算比较完最后的路径:目->a->b->c->起,因为已经没有什么可以再回溯的了,所以计算完毕,保存下来的最优路径也就成为最后确定下来的最优路径,也就是【目->a->b->C->起】。。。
 

到了这里,静态和动态都说完了,本博貌似也该结束了,但这里还是要重审一下的:以上所有的想法只是本人的胡编,极其的不靠谱!!事实上,想要否定它们的话,可以通过一个简单的小实验来否定,实验很简单,创建自定义模式,你用剑圣,搭档用巨魔,让巨魔来到你的的家园左翼墙壁附近,在那个墙壁中间的单向通道口放一块冰锥,紧接其后你用剑圣点击野区的蓝爸爸,看看系统给你生成的最佳路径是不是平常状态下生成的最佳路径【这种实验,至少可以否定第一种吧】。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息