• 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(); 
  • 相关阅读:
    超实用的JavaScript代码段 Item1 --倒计时效果
    你不知道的JavaScript--Item23 定时器的合理使用
    你不知道的JavaScript--Item22 Date对象全解析
    解决使用adb卸载应用失败的问题
    使用adb命令安装安卓apk包
    软件测试理论2
    软件测试理论1
    将Django部署到服务器(下)
    MySQL基本语句
    Nginx&uWSGI
  • 原文地址:https://www.cnblogs.com/bjanzhuo/p/3575900.html
Copyright © 2020-2023  润新知