随笔 - 11, 评论 - 59, 引用 - 0

导航

每月存档

最新留言

  • re: 潜入编译器
    to .X.T.I.M.: <br>如果编译器如此简单,你何不写一个给我们分享一下
    by aniki_sh(匿名) on 2004/10/29 13:19:00
  • re: 潜入编译器
    到底有没有源代码啊,谁有发个给我,非常感谢我的邮箱是anywn1314@163.com
    by 啊浊(匿名) on 2004/10/28 22:29:00
  • re: 来自巴西的Lua语言新星让我脸红
    呵呵,估计是什么都没有研究通吧,学会了c就去研究api,呵呵,能熟悉c吗?
    by wood(匿名) on 2004/9/10 10:19:00
  • re: 潜入编译器
    我见过用VB编的直接产生独立EXE的源代码。 <br>那家伙只有16岁。 <br>其实他是把一种脚本编译成BIN直接写PE的,非常非常NB。
    by HAHA(匿名) on 2004/8/24 8:40:00
  • re: 潜入编译器
    请不要蛊惑新人,编译原理并非什么高深的东西,它不过就是利用有限状态自动机的简单原理多字符串进行模式匹配并进行后续工作罢了,编译器是具有针对性的系统软件,也就是说它依赖于要生成什么,就目前的较普通的编译...
    by .X.T.I.M.(匿名) on 2004/8/3 20:03:00
  • re: 简单介绍
    已经在爽N-Gage了,嗬嗬。
    by netpirate(匿名) on 2004/7/28 19:31:00
  • 回复: 来自巴西的Lua语言新星让我脸红
    中国人都在给别人打工,外国人在给自己打工。
    by Jasper(匿名) on 2004/5/3 19:13:00
  • 回复: 来自巴西的Lua语言新星让我脸红
    哈 <br>你脸红吧 <br>我不脸红
    by Sunmast(匿名) on 2004/5/1 16:06:00
  • 回复: 数据结构
    &quot;很多高手原来都是编译技术的高手&quot;此话不假.不过这类技术高手大多是跟底层次的语言相关的
    by teac(匿名) on 2004/4/22 21:50:00
  • 回复: 开始准备了
    祝好运,我21日研究生复试,苦
    by ceocio(匿名) on 2004/4/11 18:07:00
  • 回复: 开始准备了
    尽管放心好了。尤其是身边有了李庆大哥和Grace姐姐等等。你会有一个难忘和愉快的旅行的!
    by 孙展波(匿名) on 2004/4/11 1:49:00
  • 回复: 潜入编译器
    444444444444444
    by 44444444444(匿名) on 2004/3/31 8:34:00
  • 回复: 基于小范围的寻路法
    可能我看的那个的确不是严格的A*,它确实不是要求找到最短路径.而一般估计函数基本上都是距离.如果是距离,那么路径的选取过程和小范围算法差不多了。只是比小范围算法写起来复杂一点。 <br> ...
    by tangl_99(匿名) on 2004/3/18 23:16:00
  • 回复: 基于小范围的寻路法
    A*算法是有严格数学证明的,评估函数的质量只是影响效率,不影响结论。除非你的评估函数不符合A*算法的必要条件。 <br> <br>你所谓的估计就是这个,或者只是A算法。
    by Ginn(匿名) on 2004/3/18 21:21:00
  • 回复: 基于小范围的寻路法
    晕!www.gameres.com上的有很多关于A*寻路算法的介绍,你可以看到,A*算法的估计函数一般不会使用全优的计算.我保证90%的游戏中,都没有使用。
    by tangl_99(匿名) on 2004/3/18 10:34:00

广告

 

   在我做的一个小游戏中,经常遇到要计算最短路径的问题。从一个格子走到另外一个格子,不过中间有很多障碍物(就是一些格子不能走上去),计算最短路径是个比较困难的问题。

如果使用著名的A*算法,那么消耗的内存太多,不可取.我需要搜索的范围很小,最大也是14*14的矩阵格子,最佳的算法就是一个SLG游戏中常用的小范围寻路算法

小范围寻路法的核心就是在于计算距离.把14x14的格子里面每个点到目的点的距离计算出来后,人物只要一直按距离最小的格子走,那么一定可以走到目的地。这个算法可以很容易证明,只要计算的格子范围足够大,人物是一定可以走到目的点的,而且所走的路径是最短的。

而计算距离的方法也很简单,我们只要把目的点的距离设置成0,然后再计算它周围的点的距离,如果是不能走的格子,那么距离值设置成无穷大,如果可以走,它的距离就是它附近的格子加1.

计算距离的算法我已经写在下面了.

算法的时间复杂度等于 O(n*n*(n/2-1)+n^2),在小范围内,速度比较快,最大的优点就是很简单,不依靠其它数据结构,所有操作都在数组内完成。

//***********************************************************
 /**
  * 计算以某点为中心的矩型区域的每个Tile到中心的距离
  * @param MapPoint int[] 中心点的Tile地图坐标
  * @param Move int  范围值
  * @param bIngnoreNpc boolean 是否需要忽略Npc的阻挡
  * @return int[][]  以某点为中心的矩型区域的每个Tile到中心的距离
  */
 protected int[][] Game_Calulate_Distance(int []MapPoint, int Move, boolean bIngnoreNpc) {
   int i,j;
   int[][] Dst = new int[2*Move+1][2*Move+1];
   int step;
   // 设置初试距离都为无穷大
   for(i=0;i<2*Move+1;i++)
     for(j=0;j<2*Move+1;j++)
       Dst[i][j]= Integer.MAX_VALUE;
  // 设置目标点的距离为0
   Dst[Move][Move] = 0;
   for(step=0; step<=Move-1;step++)
   for(i = Move-step; i<= Move+step; i++) {
     for (j = Move - step; j <= Move + step; j++) {
       if (Game_Tile_Test_CanWalk(new int[] {MapPoint[0] - Move + i - 1,
                                  MapPoint[1] - Move + j}, bIngnoreNpc)) {
         if (Dst[i - 1][j] >  Dst[i][j])
           Dst[i - 1][j] = Dst[i][j] + 1;
       }
       if (Game_Tile_Test_CanWalk(new int[] {MapPoint[0] - Move + i + 1,
                                  MapPoint[1] - Move + j}, bIngnoreNpc)) {
         if (Dst[i + 1][j] > Dst[i][j])
           Dst[i + 1][j] = Dst[i][j] + 1;
       }
       if (Game_Tile_Test_CanWalk(new int[] {MapPoint[0] - Move + i,
                                  MapPoint[1] - Move + j - 1}, bIngnoreNpc)) {
         if (Dst[i][j - 1] > Dst[i][j])
           Dst[i][j - 1] = Dst[i][j] + 1;
       }
       if (Game_Tile_Test_CanWalk(new int[] {MapPoint[0] - Move + i,
                                  MapPoint[1] - Move + j + 1}, bIngnoreNpc)) {
         if (Dst[i][j + 1] > Dst[i][j])
           Dst[i][j + 1] = Dst[i][j] + 1;
       }
     }
   }
   return Dst;
 }

打印 | 张贴于 2004-03-16 23:30:00 | Tag:暂无标签

对不起,本博客主人暂时禁止大家查看或者发表评论,请查看其它博客内容.

Powered by: Joycode.MVC引擎 0.5.2.0