铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 2287|回复: 13

S大蓝大以及各位大大,请教寻路函数的几个概念

  [复制链接]
发表于 2012-2-18 14:12 | 显示全部楼层 |阅读模式

马上注册,结交更多侠友!

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
本帖最后由 南风一梦 于 2012-2-18 14:18 编辑

寻路函数有几个概念一直无法理解,只好向大大们请教:

1、对于函数War_CalMoveStep和War_FindNextStep,其中的
      steparray[step].num
      steparray[step].bushu[ i ]
      steparray[step].x
      steparray[step].y
     都分别指什么?特别是 steparray[step].bushu[ i ] 的意义很想搞明白

2、对于War_FindNextStep,其中有个函数fujinnum,是判断附近有无敌人有则无法穿越。其中tnum是什么?为什么仅仅在x增加方向tnum为9999,其他3个方向都是tnum为999?有什么区别吗?

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-2-18 15:09 | 显示全部楼层
本帖最后由 隋唐 于 2012-2-18 15:14 编辑

steparray应该是自定义数据类型。下面的NUM/BUSHU[I]等都是成员。
NUM大概是序号?BUSHU[I]是数组,x是横坐标,Y是纵坐标
是不是每走一步调用函数判断下一步是否能迈出(即无障碍),是则可以迈出,否则不可。
bushu放的什么数据呢?

要写寻路函数是不是应该先看看数据结构里面讲到的算法。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-2-18 15:33 | 显示全部楼层
本帖最后由 tsmdsyp 于 2012-2-18 15:36 编辑

这两个函数不是很好理解么,你一步一步的看,理清其中的逻辑就行了
steparray[step].bushu 最初的值就是人物的移动步数,然后会依次递减
此值为0或小于0时就停止计算了

而fujinnum函数的返回值tnum
你看看它的值用在什么地方?你觉得9999和999有区别吗?


【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-2-18 15:34 | 显示全部楼层
哦噶,南风在弄自动战斗的AI?
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2012-2-18 17:21 | 显示全部楼层
谢谢S大,但还是不懂num这个变量是统计什么?和step又有何不同?
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-2-18 18:54 | 显示全部楼层
看了一下應是這樣

step 是已移動的步數

num 是當前座標下(即移動step步之後), 相鄰位置(上下左右)還能移動的數量, 即num的值只有 0~4 (一般是0~3)

点评

谢谢指点!  发表于 2012-2-19 10:13
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-2-20 12:08 | 显示全部楼层
南风,你还在纠结这个问题
steparray[step].num           
--可移动的总格子数,初为1即自身所在的格子。如果主角可移动范围是3,那么在平地上num最后的值应该为16,(3+2+1)*4

steparray[step].bushu[ i ]
--步数,此值最大为可以移范围的值(3),然后依次递减,走到最边时,此值为0或者小于0
999和9999没啥子区别,目的就是为了让步数小于0,表示最靠边的格子。 即使你用100,200效果也是一样的

下面两个坐标比较容易理解
steparray[step].x      
steparray[step].y

点评

嗯。 对。 是25。 额,数学都丢回给老师了。 这么简单的公式都算错  发表于 2012-2-20 15:00
蓝大,按你那么计算的话,似乎num应该是(3+2+1)*4+1=25,包括初始出发点哪一格。  发表于 2012-2-20 14:43
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-2-21 17:52 | 显示全部楼层
这个地方感觉确实比较艰深,我也是研究了几个小时才弄明白
999和9999不会有什么区别,99应该也可以
steparray[step].num  我的看法应该是可以大于4的
赞叹一下精彩的递归调用

不过目前还不太清楚那个被注释掉的排序是干什么用的……
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-2-22 00:46 | 显示全部楼层
回复 jy02785317 的帖子


七大,你还没有回答俺的问题

  1. --尝试加入一个排序,把步数低的放后面
  2. --不过如果反过来的话,zoc的效果就很极其明显了...
  3. --[[
  4. for i=1,num-1 do
  5. for j=i+1,num do
  6. if steparray[step1].bushu[i]>steparray[step1].bushu[j] then
  7. steparray[step1].bushu[i],steparray[step1].bushu[j]=steparray[step1].bushu[j],steparray[step1].bushu[i]
  8. steparray[step1].x[i],steparray[step1].x[j]=steparray[step1].x[j],steparray[step1].x[i]
  9. steparray[step1].y[i],steparray[step1].y[j]=steparray[step1].y[j],steparray[step1].y[i]
  10. end
  11. end
  12. end]]--
复制代码

这里这个排序的用意是啥?

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-2-21 23:06 | 显示全部楼层
怎么还在纠结这个函数?

这个函数真如8楼所言,是很经典的递归

首先地图64x64的范围数组全部标记为255,这个数值表示还没有被计算,或者经过计算无法到达
然后输入是起始点,以及可移动步数,还有一个flag
接着,标记起始点为0,即这个点我已经计算过了,只需要0步就能到达
然后对这个点上下左右分别进行计算,根据flag,有的需要考虑是否有建筑物阻挡,是否是水
就这样递归调用上面的计算,这里递归的出口,就是移动的步数是否到了
同时,还会标记每个点,移动所需要的步数。

这样,就能把地图上所能移动到的点全部标记出来,只要是小于255的,就能到,对应的数值是移动所需的步数。
至于从当前位置,到某个特定的点,这个路径就需要之前标记的步数来实现。首先靠目标点标记的数值是多少,如果大于等于255就表示无法移动到。如果小于255,那么就在附近寻找比目标掉小1的坐标,随便找一个就行,然后再以刚刚找出的点为目标点,急需要小1的点,只到找到0,这个路径反过来就是实际需要的路径。

最后,我在这个函数里加了考虑ZOC,如果某个点附近有敌人,那么该点的可移动步数为0.

基本就这样了
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-2-21 23:09 | 显示全部楼层

  1.       steparray[step].num
  2.        steparray[step].bushu[ i ]
  3.       steparray[step].x
  4.       steparray[step].y
复制代码
steparray[step]={}
表示第step步,所有可到达点的坐标
下面的x,y应该都是表,具体的x,y都记录在里面
num表示这里一共有多少个点
那么就能通过
for i=1,steparray[step].num do
   
end
来遍历具体这step步的每个点的坐标
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-2-22 00:12 | 显示全部楼层
呵呵, 若當年教我的老師有027大的耐性及細心便好了
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-2-22 01:03 | 显示全部楼层
递归啊……
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2012-2-24 16:31 | 显示全部楼层
实际上num是代表从第N步外推第N+1步的邻格时,所有有效的邻格总数。
比如,Step=2时,num = (2+1)*4 =12, 即从所有的第2步位置向周围四个方向移动一步,其中“有效的”(无障碍的、未到过的)第3步的格子是12个。
      同理,Step=3时,num = (3+1)*4 =16
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-5-17 01:22

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表