目录
效果:
地图:
自动寻路:
手动游玩:
代码:
package com.gao.test.recursion;
import java.util.Scanner;
/**
* @Author lie
* @Description 迷宫
*/
public class Maze {
public static void main(String[] args) {
// 有8个一维数组 每个一维数组中有10个元素
char[][] array = {
//y 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
{'#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#'},//0 ----- x
{'#','0',' ',' ',' ','#',' ',' ',' ',' ',' ','#',' ',' ',' ','#',' ',' ',' ','#',' ',' ',' ',' ',' ',' ',' ',' '},//1
{'#','#',' ','#','#','#','#','#',' ','#',' ','#','#','#',' ','#',' ','#',' ','#',' ','#','#',' ','#','#','#','#'},//2
{'#',' ',' ',' ',' ','#','#','#',' ','#',' ','#','#','#',' ',' ',' ','#','#','#',' ','#','#',' ','#',' ',' ','#'},//3
{'#',' ','#','#',' ','#',' ',' ',' ','#',' ','#',' ',' ','#','#',' ',' ',' ',' ',' ','#','#',' ','#',' ',' ','#'},//4
{'#',' ',' ','#',' ','#',' ','#','#','#',' ','#','#',' ','#','#','#','#','#','#','#','#','#',' ','#',' ',' ','#'},//5
{'#',' ','#','#',' ','#',' ',' ',' ','#',' ','#','#',' ','#','#','#','#',' ',' ',' ',' ','#',' ','#',' ','#','#'},//6
{'#','#',' ',' ',' ','#',' ','#',' ','#',' ','#','#',' ',' ','#','#','#',' ','#',' ','#','#',' ','#',' ',' ','#'},//7
{'#','#',' ','#','#','#','#','#',' ','#',' ','#','#','#',' ',' ',' ',' ',' ','#',' ','#','#',' ','#','#',' ','#'},//8
{'#',' ',' ',' ',' ',' ',' ',' ',' ','#',' ',' ',' ','#',' ','#','#','#',' ','#',' ',' ',' ',' ','#',' ',' ','#'},//9
{'#','#',' ','#','#','#','#','#','#','#','#','#',' ','#',' ',' ',' ','#',' ','#',' ','#','#',' ','#',' ','#','#'},//10
{'#',' ',' ','#','#','#','#','#','#','#',' ','#',' ','#','#',' ',' ','#',' ','#',' ','#','#',' ','#',' ','#','#'},//11
{'#','#',' ','#',' ',' ',' ',' ',' ','#',' ','#',' ',' ','#','#',' ','#',' ','#','#','#','#',' ','#',' ',' ','#'},//12
{'#','#',' ','#','#','#','#','#',' ','#',' ','#',' ','#',' ',' ',' ','#',' ','#','#','#','#',' ','#','#',' ','#'},//13
{'#','#',' ',' ',' ',' ',' ',' ',' ','#',' ','#',' ','#',' ','#',' ','#',' ','#','#',' ',' ',' ','#',' ',' ','#'},//14
{'#','#',' ','#','#','#','#','#','#','#',' ','#',' ','#',' ','#',' ','#',' ','#','#',' ','#',' ','#',' ','#','#'},//15
{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#',' ',' ',' ','#',' ',' ','#',' ',' ',' ','#',' ',' ',' ',' ','#'},//16
{'#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#'},//17
};
// 打印地图
printMap(array);
// 声明要用的变量 起始
int x = 1;
int y = 1;
// 结束
int ex = 1;
int ey = 27;
//自动寻路和手动寻路
Scanner scanner = new Scanner(System.in);
System.out.println("请选择:1.自动寻路 2.手动游玩 \n注:输入1或者2,其他退出");
int choose = scanner.nextInt();
if(1 == choose){
boolean autoResult = findway(array, x, y, ex, ey);
if (autoResult) {
System.out.println("自动寻路成功,路线为:");
printMap(array);
}else{
System.out.println("此迷宫无解");
}
}else if(2 == choose){
controll(array, x, y, ex,ey);
System.out.println("恭喜通关!");
}else{
System.out.println("请输入正确的数字");
}
}
/**
* 自动寻路 策略
* 2:通路 3:死路
* @param array 迷宫数组
* @param x 开始x坐标
* @param y 开始y坐标
* @param ex 结束x坐标
* @param ey 结束y坐标
*/
private static boolean findway(char[][] array, int x, int y, int ex, int ey) {
//出口位置的值变为2表示自动寻路成功
if (array[ex][ey] == '2') {
return true;
}else {
if (array[x][y] == ' ' || array[x][y] == '0') {//递归进入寻路方法
array[x][y] = '2';
//行走策略方法
return strategy(array, x, y, ex, ey);
} else {//迷宫无解
return false;
}
}
}
//行走策略:→↓←↑
private static boolean strategy(char[][] array, int x, int y, int ex, int ey) {
if(findway(array,x,y+1,ex,ey)){ //右
return true;
}else if (findway(array,x+1,y,ex,ey)){ //下
return true;
}else if (findway(array,x,y-1,ex,ey)){ //左
return true;
}else if (findway(array,x-1,y,ex,ey)){ //上
return true;
}else{
array[x][y] = '^';
return false;
}
}
/**
* 控制器
* @param array 迷宫数组
* @param x 开始x坐标
* @param y 开始y坐标
* @param ex 结束x坐标
* @param ey 结束y坐标
*/
private static void controll(char[][] array, int x, int y, int ex, int ey) {
Scanner scanner = new Scanner(System.in);
// 提示输入 w a s d
while (array[ex][ey] != '0') {
System.out.println("请输入w(↑) a(←) s(↓) d(→)");
// 接收输入的值
String string = scanner.nextLine();
// 判断往哪里移动
switch (string) {
case "w":
if (array[x - 1][y] != '#') {
// 把原来的改空格
array[x][y] = ' ';
// 向左移动
x = x - 1;
array[x][y] = '0';
}
break;
case "a":
if (array[x][y - 1] != '#') {
// 把原来的改空格
array[x][y] = ' ';
// 向左移动
y = y - 1;
array[x][y] = '0';
}
break;
case "s":
if (array[x + 1][y] != '#') {
// 把原来的改空格
array[x][y] = ' ';
// 向左移动
x = x + 1;
array[x][y] = '0';
}
break;
case "d":
// 判断是不是墙
if (array[x][y + 1] != '#') {
// 把原来的改空格
array[x][y] = ' ';
// 向左移动
y = y + 1;
array[x][y] = '0';
}
break;
default:
break;
}
// 修改完毕后 再打印一遍地图
printMap(array);
}
}
// 打印地图的方法
public static void printMap(char[][] array) {
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j]);
}
System.out.println();
}
}
}