一文了解自动寻路算法

自动寻路算法

    • 自动寻路算法
      • 1、地图类
        • 地图展示图
        • 代码展示
      • 2、寻路类
        • 寻路展示图
        • 代码展示
      • 3、测试主类
        • 代码展示
      • 4、寻路结果展示

主要思想来源

1、地图类

主要包含初始化地图(二维数组)、生成障碍(可随机)、寻路结果查询等功能模块

制定基础游戏规则:

0、未走过的 1、墙体 2、走过的 3、走不通的

地图展示图

一文了解自动寻路算法_第1张图片

代码展示

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、寻路类

主要包含设置出口、自动寻路等功能

这里的寻路策略主要优先级是 右→下→上→左

寻路展示图

一文了解自动寻路算法_第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、寻路结果展示

一文了解自动寻路算法_第3张图片
可以看到为2的点连成一条线,这就是最后的路线。

你可能感兴趣的:(算法,java,开发语言)