java迷宫


package 迷宫;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Point;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
/**
*
* @author Wang Jianxin
*
*/
public class MainUI extends JFrame {

public static int[][] array = new int[DealTool.Rows][DealTool.Columns]; // 创建一个矩阵
public static int[][] array_2 = new int[DealTool.Rows][DealTool.Columns];// 创建第二个数组用来存放初始数据
public int i2, j2;

// 函数重载 得到矩阵数组
public MainUI(int[][] array) {
this.array = array;
this.array_2 = array;
}

/**
* @param args
*/
public static void main(String[] args) {
DealTool dt = new DealTool();
MainUI test = new MainUI(dt.array);
test.printarray();
test.FindStart();// 找到迷宫入口坐标

test.FindPath(); //开始查找路径
// System.out.println("找到所有点>>>>>>>>>>>>>>>>>>"
// + DealTool.PointList.size());

// 画出迷宫
test.DrawPanel();

}

/**
* 查找迷宫路径的方法
*/
public void FindPath() {
try {
// 得到队列最后一个的point对象
Point p_end1 = DealTool.PointList
.get(DealTool.PointList.size() - 1);
// 得到当前点在数组中的位置 用以查找 8个方向的值
int i1 = p_end1.y;
int j1 = p_end1.x;

if (DealTool.PointList.size() > 1) { // 得到队列中倒数第二个point对象

Point p_end2 = DealTool.PointList
.get(DealTool.PointList.size() - 2);
i2 = p_end2.y;
j2 = p_end2.x;
} else {
i2 = 0;
j2 = 0;
}

/************************* 找到出口的条件 ******************************************/
if ((i1 == DealTool.Rows - 2) && (j1 == DealTool.Columns - 2)) {
return;
}

/********************* 从3点钟方向逆时针遍历查找周围8个point及其对应数组 *********************/

if (array[i1][j1 + 1] == 0) {// 向 右 方向找
Point p = new Point(j1 + 1, i1); //将找到的通路的点对应的下表存入Point对象
DealTool.PointList.add(p); //再将Point对象存入队列中
array[i1][j1] = 1; //并将原来的点改为“障碍点”

System.out.println("<<<<<<<<<<<右>>>>>>>>>>>"+
DealTool.PointList.get(DealTool.PointList.size() - 1));
FindPath();
return;
}
if (array[i1 - 1][j1 + 1] == 0) { // 向 右上方向找
Point p = new Point(j1 + 1, i1 - 1);
DealTool.PointList.add(p);
array[i1][j1] = 1;

System.out
.println("<<<<<<<<<<<右上>>>>>>>>>>>"
+ DealTool.PointList.get(DealTool.PointList
.size() - 1));
FindPath();
return;

}
if (array[i1 - 1][j1] == 0) { // 向上方向找
Point p = new Point(j1, i1 - 1);
DealTool.PointList.add(p);
array[i1][j1] = 1;

System.out
.println("<<<<<<<<<<<上>>>>>>>>>>>"
+ DealTool.PointList.get(DealTool.PointList
.size() - 1));
FindPath();
return;

}
if (array[i1 - 1][j1 - 1] == 0) { // 向 左上方向找
Point p = new Point(j1 - 1, i1 - 1);
DealTool.PointList.add(p);
array[i1][j1] = 1;

System.out
.println("<<<<<<<<<<<左上>>>>>>>>>>>"
+ DealTool.PointList.get(DealTool.PointList
.size() - 1));
FindPath();
return;

}
if (array[i1][j1 - 1] == 0) { // 向左方向找

Point p = new Point(j1 - 1, i1);
DealTool.PointList.add(p);
array[i1][j1] = 1;

System.out
.println("<<<<<<<<<<<左>>>>>>>>>>>"
+ DealTool.PointList.get(DealTool.PointList
.size() - 1));
FindPath();
return;

}
if (array[i1 + 1][j1 - 1] == 0) { // 向 左下方向找
Point p = new Point(j1 - 1, i1 + 1);
DealTool.PointList.add(p);
array[i1][j1] = 1;

System.out
.println("<<<<<<<<<<<左下>>>>>>>>>>>"
+ DealTool.PointList.get(DealTool.PointList
.size() - 1));
FindPath();
return;

}
if (array[i1 + 1][j1] == 0) { // 向下方向找

Point p = new Point(j1, i1 + 1);
DealTool.PointList.add(p);
array[i1][j1] = 1;

System.out
.println("<<<<<<<<<<<下>>>>>>>>>>>"
+ DealTool.PointList.get(DealTool.PointList
.size() - 1));
FindPath();
return;
}
if (array[i1 + 1][j1 + 1] == 0) { // 向右下方向找

Point p = new Point(j1 + 1, i1 + 1);
DealTool.PointList.add(p);
array[i1][j1] = 1;

System.out
.println("<<<<<<<<<<<右下>>>>>>>>>>>"
+ DealTool.PointList.get(DealTool.PointList
.size() - 1));
FindPath();
return;
}
array[i1][j1] = 1; //如果找不到通路点,就将该点改为“路障点”
array[i2][j2] = 0; //并且使栈中倒数第二个点 “路长点”恢复为“通路点” 方便下一次查找
DealTool.PointList.remove(DealTool.PointList.size() - 1); //将现在的“路障点”从栈中删除
System.out.println("删除了一个点 " + " 现在还有"
+ DealTool.PointList.size() + "个点");
FindPath(); //继续递归
return;

} catch (Exception ef) {//异常处理
JOptionPane.showMessageDialog(null, "该迷宫找不到出路了,请重新启动程序!");
ef.printStackTrace();
}

}

/**
* 找到迷宫矩阵入口
*/
private void FindStart() {
for (int i = 1; i < DealTool.Rows - 1; i++) {
for (int j = 1; j < DealTool.Columns - 1; j++) {
if (array[i][j] == 0) {
// 存储点的横纵坐标 横坐标为 j 纵坐标为 i
Point p = new Point(j, i);
DealTool.PointList.add(p);
// System.out.println(p.x+" "+p.y);
return;
}
}
}

}

/**
* 打印矩阵
*/
public void printarray() {
// 测试矩阵
for (int i = 0; i < DealTool.Rows; i++) {
for (int j = 0; j < DealTool.Columns; j++) {
System.out.print(array[i][j] + " ");
}
System.out.println();
}
}

/**
* 绘制迷宫图的方法
*/
public void DrawPanel() {
this.setTitle("简单迷宫1.0");
this.setSize(500, 600);
this.setLayout(new FlowLayout());

JPanel panel = new NewPanel();
panel.setLayout(null);
panel.setName("panel");
panel.setPreferredSize(new Dimension(450, 550));
panel.setBackground(Color.LIGHT_GRAY);

Graphics g = panel.getGraphics(); 
原文地址:https://www.cnblogs.com/bjanzhuo/p/3575900.html