二维地图是游戏中常见的形式。在二维地图中,寻路是我们常见的需求。这里是一个二维地图寻路的简单算法。
在地图中:
1表示不可通过的单元格,
0表示可以通过的单元。
给出一个原始位置和一个目标位置。算法如下:
- import java.util.Stack;
- public class FindPath {
- private static final int wid = 8;
- private static final int hei = 8;
- private Stack stack = new Stack();
-
- public static void main(String[] args) {
-
- byte[] map = {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};
- for (int i = 0; i < map.length; i++) {
- System.out.print(map[i] + " ");
- if (i % wid == wid - 1) {
- System.out.print("\n");
- }
- }
- System.out.print("\n");
- FindPath ai = new FindPath();
- ai.find(map, 12, 50);
- }
- public void find(byte[] map, int origin, int target) {
- int[] step = new int[2];
- step[1] = origin;
- stack.addElement(step);
- if(findPath(map,origin,target)){
- System.out.println("succ");
- for (int i = 0; i < stack.size(); i++) {
- int[] temp = (int[])stack.elementAt(i);
- System.out.println(i+" \t"+(char)temp[0]+" "+temp[1]);
- }
- }else{
- System.out.println("fail");
- }
- }
-
- public boolean findPath(byte[] map, int origin, int target) {
- if (canMoveTo(map, origin, target, 'l')) {
- return true;
- }
- if (canMoveTo(map, origin, target, 'r')) {
- return true;
- }
- if (canMoveTo(map, origin, target, 'u')) {
- return true;
- }
- if (canMoveTo(map, origin, target, 'd')) {
- return true;
- }
- stack.pop();
- return false;
- }
-
- private boolean canMoveTo(byte[] map, int origin, int target, char direct) {
- int next = 0;
- switch (direct) {
- case 'l':
- next = origin - 1;
- break;
- case 'r':
- next = origin + 1;
- break;
- case 'u':
- next = origin - wid;
- break;
- case 'd':
- next = origin + wid;
- break;
- }
- if (map[next] == 0) {
- if (next == target) {
- int[] step = new int[2];
- step[0] = direct;
- step[1] = next;
- stack.addElement(step);
- return true;
- }
- if (!inStack(next)) {
- int[] step = new int[2];
- step[0] = direct;
- step[1] = next;
- stack.addElement(step);
- if (findPath(map, next, target)) {
- return true;
- }
- }
- }
- return false;
- }
-
- private boolean inStack(int posi) {
- int[] temp;
- for (int i = stack.size() - 1; i >= 0; i--) {
- temp = (int[]) stack.elementAt(i);
- if (posi == temp[1]) {
- return true;
- }
- }
- return false;
- }
- }
程序运算结果如下:
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...)|编辑|收藏