自动寻路算法
主要思想来源
1、地图类
主要包含初始化地图(二维数组)、生成障碍(可随机)、寻路结果查询等功能模块
制定基础游戏规则:
0、未走过的 1、墙体 2、走过的 3、走不通的
地图展示图
代码展示
import java.util.Arrays;
import java.util.Random;
public class Layouts {
int[][] map;
public Layouts() {
map = new int[9][10];
System.out.println("地图初始化大小为:【9*10】");
}
public Layouts(int length, int width) {
map = new int[length][width];
System.out.println("地图初始化大小为:【" + length + "*" + width + "】");
}
public void showMap() {
/*展示地图*/
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[0].length; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}
public void initMap() {
/*初始化地图
* 0、未走过的 1、墙体 2、走过的 3、走不通的
* */
// 四周围墙
for (int i = 0; i < map.length; i++) {
map[i][0] = 1;
map[i][map[i].length - 1] = 1;
}
for (int i = 0; i < map[0].length; i++) {
map[0][i] = 1;
map[map.length - 1][i] = 1;
}
}
public void setBarrier(int x, int y) {
/*设置其他障碍物*/
if (x < map.length && y < map[0].length) {
map[x][y] = 1;
} else {
System.out.println("障碍物设定失败:" + Arrays.toString(new int[]{x, y}));
}
}
public void randomBarrier(int[][] map, int num) {
/*随机产生障碍物*/
Random random = new Random();
for (int i = 0; i < num; i++) {
int x = random.nextInt(map.length - 1) + 1;
int y = random.nextInt(map[0].length - 1) + 1;
if (x == 1 && y == 1 || x == map.length - 2 && y == map[0].length - 2) {
i--;
continue;
}
map[x][y] = 1;
System.out.println("随机设置障碍:" + Arrays.toString(new int[]{x, y}));
}
}
public void showResult() {
/*展示寻路结果*/
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[0].length; j++) {
if (map[i][j] == 2) {
System.out.println("\n寻路结束:找到了出去的路线");
return;
}
}
}
System.out.println("\n寻路结束:根本就找不到出去的路线");
}
}
2、寻路类
主要包含设置出口、自动寻路等功能
这里的寻路策略主要优先级是 右→下→上→左
寻路展示图
代码展示
import java.util.Arrays;
public class FindWay {
int[] exit;
public void setExit(int[][] map, int x, int y) {
/*设置出口*/
if (map[x][y] == 1) {
System.out.println("出口被堵住了 " + Arrays.toString(new int[]{x, y}) + "\t指定右下角:" + Arrays.toString(new int[]{map.length - 2, map[0].length - 2}));
this.exit = new int[]{map.length - 2, map[0].length - 2};
} else {
this.exit = new int[]{x, y};
}
System.out.println("设定出口成功:" + Arrays.toString(this.exit));
}
public boolean findWay(int[][] map, int x, int y) {
/*
* 自动寻路
* 0、未走过的 1、墙体 2、走过的 3、走不通的
*/
System.out.println("自动寻路:" + Arrays.toString(new int[]{x, y}));
if (map[exit[0]][exit[1]] == 2) {
return true;
} else {
if (map[x][y] == 0) {
// 假定可以走
map[x][y] = 2;
// 使用策略判断 右、下、上、左
if (findWay(map, x + 1, y)) {
return true;
} else if (findWay(map, x, y + 1)) {
return true;
} else if (findWay(map, x - 1, y)) {
return true;
} else if (findWay(map, x, y - 1)) {
return true;
} else {
map[x][y] = 3;
return false;
}
} else { // 1,2,3
return false;
}
}
}
}
3、测试主类
测试各项功能是否正常
代码展示
public class Test {
public static void main(String[] args) {
FindWay findWay = new FindWay();
Layouts l2 = new Layouts(10, 10);
l2.initMap();
l2.randomBarrier(l2.map, 40);
l2.showMap();
findWay.setExit(l2.map, 8, 6);
findWay.findWay(l2.map, 1, 1);
System.out.println("寻路结果:");
l2.showMap();
l2.showResult();
}
}
4、寻路结果展示
可以看到为2的点连成一条线,这就是最后的路线。