原创 二维地图寻路算法收藏

新一篇: 二维地图的寻路算法2 | 旧一篇: 得到类的绝对路径2

  1.  

      二维地图是游戏中常见的形式。在二维地图中,寻路是我们常见的需求。这里是一个二维地图寻路的简单算法。

     在地图中:

        1表示不可通过的单元格,

        0表示可以通过的单元。

给出一个原始位置和一个目标位置。算法如下:

 

  1. import java.util.Stack;
  2. public class FindPath {
  3.  private static final int wid = 8;
  4.  private static final int hei = 8;
  5.  private Stack stack = new Stack();
  6.  /**
  7.   * @param args
  8.   */
  9.  public static void main(String[] args) {
  10.   // TODO Auto-generated method stub
  11.   byte[] map = {1,1,1,1,1,1,1,1,
  12.     1,1,1,1,0,1,1,1,
  13.     1,0,0,1,0,0,1,1,
  14.     1,0,0,0,0,0,1,1,
  15.     1,1,0,0,1,1,1,1,
  16.     1,1,1,0,1,1,1,1,
  17.     1,1,0,0,1,1,1,1,
  18.     1,1,1,1,1,1,1,1};
  19.   for (int i = 0; i < map.length; i++) {
  20.    System.out.print(map[i] + " ");
  21.    if (i % wid == wid - 1) {
  22.     System.out.print("\n");
  23.    }
  24.   }
  25.   System.out.print("\n");
  26.   FindPath ai = new FindPath();
  27.   ai.find(map, 1250);
  28.  }
  29.  public void find(byte[] map, int origin, int target) {
  30.   int[] step = new int[2];
  31.   step[1] = origin;
  32.   stack.addElement(step);
  33.   if(findPath(map,origin,target)){
  34.    System.out.println("succ");
  35.    for (int i = 0; i < stack.size(); i++) {
  36.     int[] temp = (int[])stack.elementAt(i);
  37.     System.out.println(i+" \t"+(char)temp[0]+" "+temp[1]);
  38.    }
  39.   }else{
  40.    System.out.println("fail");
  41.   }
  42.  }
  43.  /**
  44.   * 在地图上找到从原点到目标位置的路径
  45.   * 
  46.   * @param map
  47.   * @param origin
  48.   * @param target
  49.   * @return
  50.   */
  51.  public boolean findPath(byte[] map, int origin, int target) {
  52.   if (canMoveTo(map, origin, target, 'l')) {
  53.    return true;
  54.   }
  55.   if (canMoveTo(map, origin, target, 'r')) {
  56.    return true;
  57.   }
  58.   if (canMoveTo(map, origin, target, 'u')) {
  59.    return true;
  60.   }
  61.   if (canMoveTo(map, origin, target, 'd')) {
  62.    return true;
  63.   }
  64.   stack.pop();// 如果四个方向都试过,全部不行,那么把当前步骤弹出
  65.   return false;
  66.  }
  67.  /**
  68.   * 是否可以向指定方向移动
  69.   * 
  70.   * @param map
  71.   * @param origin
  72.   * @param target
  73.   * @param direct
  74.   * @return
  75.   */
  76.  private boolean canMoveTo(byte[] map, int origin, int target, char direct) {
  77.   int next = 0;
  78.   switch (direct) {
  79.   case 'l':
  80.    next = origin - 1;
  81.    break;
  82.   case 'r':
  83.    next = origin + 1;
  84.    break;
  85.   case 'u':
  86.    next = origin - wid;
  87.    break;
  88.   case 'd':
  89.    next = origin + wid;
  90.    break;
  91.   }
  92.   if (map[next] == 0) {//如果目标位置可以进入
  93.    if (next == target) {
  94.     int[] step = new int[2];
  95.     step[0] = direct;// 移动方向
  96.     step[1] = next;// 到达的新位置
  97.     stack.addElement(step);    
  98.     return true;
  99.    }
  100.    if (!inStack(next)) {
  101.     int[] step = new int[2];
  102.     step[0] = direct;
  103.     step[1] = next;
  104.     stack.addElement(step);
  105.     if (findPath(map, next, target)) {
  106.      return true;
  107.     }
  108.    }
  109.   }
  110.   return false;
  111.  }
  112.  /**
  113.   * 检查这个位置是否在栈中已经存在了。为了防止在地图中转圈
  114.   * 
  115.   * @param posi
  116.   * @return
  117.   */
  118.  private boolean inStack(int posi) {
  119.   int[] temp;
  120.   for (int i = stack.size() - 1; i >= 0; i--) {
  121.    temp = (int[]) stack.elementAt(i);
  122.    if (posi == temp[1]) {
  123.     return true;
  124.    }
  125.   }
  126.   return false;
  127.  }
  128. }

  

 

 

程序运算结果如下:

1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1
1 0 0 1 0 0 1 1
1 0 0 0 0 0 1 1
1 1 0 0 1 1 1 1
1 1 1 0 1 1 1 1
1 1 0 0 1 1 1 1
1 1 1 1 1 1 1 1

succ
0       12
1   d  20
2    r  21
3   d  29
4   l  28
5   l  27
6   l  26
7   d  34
8   r  35
9   d  43
10  d 51
11  l  50

 

在这个算法中,寻路是按照左右上下的方向顺序进行的,所以很可能并不是最优路径。

关于这个问题,过两天再解决一下,呵呵。

发表于 @ 2008年08月21日 17:49:00|评论(loading...)|编辑|收藏

新一篇: 二维地图的寻路算法2 | 旧一篇: 得到类的绝对路径2

评论

#PigiRoN 发表于2008-08-22 10:45:42  IP: 125.34.136.*
用广度优先策略即可
#cjs_jackson 发表于2008-08-22 14:41:57  IP: 59.41.50.*
传统的迷宫算法
#Nils 发表于2008-08-22 14:43:06  IP: 222.182.17.*
我比较喜欢AStar
#wanruirui 发表于2008-08-22 14:52:24  IP: 218.93.20.*
专家大哥,拜托,搞点专业点的算法。
#aresfe 发表于2008-08-22 17:10:23  IP: 61.172.247.*
这个算法..........也太......
#layptm 发表于2008-08-25 01:27:08  IP: 122.246.207.*
摆脱,这种迷宫走路的算法不要拿出来了好不好,专业点撒。
#chenqiu1024 发表于2008-08-25 11:41:42  IP: 121.248.10.*
这个就是最简单的回溯搜索而已嘛
#turkeyzhou 发表于2008-08-26 01:25:00  IP: 118.24.210.*
别装逼了,不是每个人都可以随便写出上面的算法的,别装逼啦,真牛的就不会来看啦!谦虚点吧!~
精通算法的不在这里!
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © cuilichen