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("");
}
}
}
执行结果: