跳到主要内容

10、数据结构和算法 - 实战:归-迷宫游戏

1.1 迷宫游戏

今天做一个简单的迷宫游戏,用二维数实现地图,让程序自动寻路的小游戏。

 

1.2 简单的迷宫

1、 简单的迷宫;

用二维数实现地图,找路策略:【右->下->左->上】方式进行找路, 0:表示是路 1:表示迷宫墙 2:表示是通路 3:表示是不通。

package com.yuanxw.datastructure.chapter10;

/**
 * 简单的迷宫
 * 迷宫寻路的方法:
 * 找路策略:【右->下->左->上】方式进行找路
 * 是否找到:map[map.length - 2][map[0].length - 2] == 2 表示找到终点。即9,9的从标为:2标识找到终点
 * 图示如下: 0:表示是路 1:表示迷宫墙 2:表示是通路 3:表示是不通
 */
public class MazeExample {
   
     
    public static void main(String[] args) {
   
     
        int[][] mazeMap = drawMazeMap();
        // 从左上角,1,1坐标的位置开始寻路
        getWay(mazeMap, 1, 1);
        System.out.println("==================迷宫地图==================");
        printMap(mazeMap);

    }

    /**
     * 创建10 * 10 迷宫图
     * 说明:1 表示是墙,0 表示是路
     *
     * @return
     */
    private static int[][] drawMazeMap() {
   
     
        int[][] map = new int[10][10];
        // 绘制横行坐标墙
        for (int x = 0; x < map.length; x++) {
   
     
            map[0][x] = 1;
            map[map.length - 1][x] = 1;
        }

        // 绘制纵向坐标墙
        for (int y = 0; y < map[0].length; y++) {
   
     
            map[y][0] = 1;
            map[y][map[0].length - 1] = 1;
        }

        // 设置路障
        for (int y = 1; y <= 7; y++) {
   
     
            map[3][y] = 1;
        }

        return map;
    }

    /**
     * 迷宫寻路的方法。
     * 找路策略:【右->下->左->上】方式进行找路
     * 是否找到:map[map.length - 2][map[0].length - 2] == 2 表示找到终点。即9,9的从标为:2标识找到终点
     * 图示如下: 0:表示是路 1:表示迷宫墙 2:表示是通路 3:表示是不通
     *
     * @param map 地图
     * @param x   横向坐标
     * @param y   纵向坐标
     * @return
     */
    private static boolean getWay(int[][] map, int x, int y) {
   
     
        if (map[map.length - 2][map[0].length - 2] == 2) {
   
     
            return true;
        } else if (map[x][y] != 0) {
   
     
            return false;
        } else {
   
     
            // 初始坐标初始值为:2。暂时表示是通路,寻路结束后,可得到最终结果。
            map[x][y] = 2;
            // 找路策略:【右->下->左->上】方式进行找路
            if (getWay(map, x + 1, y)) {
   
     
                return true;
            } else if (getWay(map, x, y + 1)) {
   
     
                return true;
            } else if (getWay(map, x - 1, y)) {
   
     
                return true;
            } else if (getWay(map, x, y - 1)) {
   
     
                return true;
            }
            // 如果 右->下->左->上 都寻路失败,那么表示该位置不通,赋值为:3
            map[x][y] = 3;
            return false;
        }
    }

    /**
     * 打印迷宫地图
     *
     * @param map
     */
    public static void printMap(int[][] map) {
   
     
        for (int i = 0; i < map.length; i++) {
   
     
            for (int j = 0; j < map[0].length; j++) {
   
     
                if(map[i][j] == 1){
   
     
                     System.out.print(String.format("\033[31m%s\033[m\t", map[i][j]));
                }else if(map[i][j] == 2){
   
     
                    System.out.print(String.format("\033[46m%s\033[m\t",  map[i][j]));
                }else {
   
     
                    System.out.print(map[i][j] + "\t");
                }
            }
            System.out.println("");
        }
    }
}

执行结果: