`
Wang_Jianxin
  • 浏览: 13066 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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();

this.add(panel);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(3);
this.setVisible(true);

}

/**
* 继承了JPanel的内部类,作为绘制图形的面板
*
* @author Wang Jianxin
*
*/
class NewPanel extends JPanel {
public void paint(Graphics g) {
super.paint(g);
// g.drawLine(0, 0, 50, 60);

for (int k = 0; k < DealTool.PointList.size(); k++) {
Point p = DealTool.PointList.get(k);
int i = p.y;
int j = p.x;

array_2[i][j] = 2; // 将路径标记为2
}

int xc, yc;

for (int i = 0; i < array_2.length; i++) {
for (int j = 0; j < array_2[0].length; j++) {
int x = (j + 1) * 30;
int y = (i + 1) * 30;
int size = DealTool.Chess_Size;

if (array_2[i][j] == 2) {   //画出路径
g.setColor(Color.green);
g.fillOval(x, y, size, size);
g.setColor(Color.LIGHT_GRAY);
} else if (array_2[i][j] == 0) {  //画出通路点(还不是路径点)
g.setColor(Color.WHITE);
g.drawOval(x, y, size, size);
g.setColor(Color.LIGHT_GRAY);
} else {                          //画出"障碍点"
g.setColor(Color.BLACK);
g.fillOval(x, y, size, size);
g.setColor(Color.LIGHT_GRAY);
}
}
}
g.setColor(Color.RED);    //画出起始点
g.fillOval((DealTool.PointList.get(0).x + 1) * 30,
(DealTool.PointList.get(0).y + 1) * 30,
DealTool.Chess_Size, DealTool.Chess_Size);

g.setColor(Color.BLUE);    //画出出口点
g.fillOval((DealTool.Columns - 2 + 1) * 30,
(DealTool.Rows - 2 + 1) * 30, DealTool.Chess_Size,
DealTool.Chess_Size);
}
}

}
/********************************************************/
/********************************************************/
/********************************************************/
/********************************************************/
/********************************************************/
/********************************************************/
/********************************************************/

package 迷宫;

import java.awt.Point;
import java.util.ArrayList;
import java.util.Random;

/**
* 迷宫数据处理类
*
* @author Wang Jianxin
*
*/

public class DealTool {


// 函数重载,初始化一个矩阵, 1 代表障碍 0代表通路
// 要求矩阵四周都是障碍
public DealTool() {
/***************************矩阵初始化部分**************************************/
for (int i = 0; i < DealTool.Columns; i++) { // 矩阵第一行模型全赋值为 1
array[0][i] = 1;
}
for (int i = 0; i < DealTool.Columns; i++) { // 矩阵最后一行模型全赋值为 1
array[DealTool.Rows - 1][i] = 1;
}
for (int i = 0; i < DealTool.Rows; i++) { // 矩阵第一列模型全赋值为 1
array[i][0] = 1;
}
for (int i = 0; i < DealTool.Rows; i++) { // 矩阵最后一列模型全赋值为 1
array[i][DealTool.Columns - 1] = 1;
}

for (int i = 1; i < DealTool.Rows - 1; i++) {
for (int j = 1; j < DealTool.Columns - 1; j++) {
Random rand = new Random();
int temp = rand.nextInt(2); // 产生一个0或1的随机数作为模型
array[i][j] = temp;
}
}

array[DealTool.Rows-2][DealTool.Columns-2] = 0;  //规定迷宫最右下角为出口
/************************************************************************/


}

public static ArrayList<Point> PointList = new ArrayList<Point>();

public static int Rows = 11; // 图形矩阵的行数

public static int Columns = 11; // 图形矩阵的列数

public static int Chess_Size =30;   //迷宫绘制时的图形大小

public static int[][] array = new int[DealTool.Rows][DealTool.Columns]; // 创建一个矩阵

public void testarray (){
//测试矩阵
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();
}
}

}
分享到:
评论

相关推荐

    java迷宫 java迷宫 java迷宫

    在本文中,我们将深入探讨如何使用Java编程语言创建一个迷宫游戏。...通过学习和理解这些基本概念,你可以进一步完善这个Java迷宫游戏,增加更多特性,如多级难度、计时功能、动态迷宫生成等,从而提升游戏体验。

    java迷宫课程设计

    Java迷宫课程设计是一项常见的编程练习,旨在帮助初学者掌握Java编程语言以及图形用户界面(GUI)开发。在这个项目中,我们使用了JavaFX库来创建用户界面,它是一个强大的工具,提供了丰富的功能来构建现代、动态的...

    Java迷宫算法 Java迷宫算法

    Java迷宫算法;Java迷宫算法;Java迷宫算法;Java迷宫算法;Java迷宫算法;Java迷宫算法;Java迷宫算法

    java迷宫小游戏

    Java迷宫小游戏是一种基于编程语言Java开发的娱乐项目,它结合了编程逻辑和游戏设计,为学习者提供了实践编程技能的机会。在这个游戏中,玩家需要控制一个角色在迷宫中找到出路,通过解决路径问题来完成游戏。下面...

    java迷宫小游戏源码打包

    【标题】"java迷宫小游戏源码打包"指的是一个基于Java编程语言开发的迷宫类游戏,它包含游戏的核心逻辑和界面设计。开发者为游戏增加了不同的难度选择,以适应不同玩家的需求,同时还提供了自动演示功能,让玩家可以...

    java迷宫课程设计.zip

    通过java实现的迷宫课程设计。分成算法部分和界面部分,算法部分涉及到迷宫生成算法,深度优先,广度优先,运用了栈和队列等容器。界面部分采用javafx实现。有显示迷宫路线,更改迷宫大小,展示迷宫解谜动画过程。...

    一个简单的java迷宫生成程序

    标题中的“一个简单的java迷宫生成程序”表明我们要讨论的是一个使用Java编程语言实现的算法,该算法用于创建迷宫。迷宫生成是计算机图形学和算法设计的一个有趣领域,通常涉及深度优先搜索(DFS)或Prim算法等方法...

    java 迷宫 随机生成 自动寻找路径 用到树的深度遍历

    Java语言在游戏开发和算法实现中常常被用来创建各种有趣的应用,其中之一就是迷宫生成与解谜。在这个项目中,我们将深入探讨如何使用Java来实现一个迷宫的随机生成以及自动寻找路径的方法,同时会涉及树的深度遍历这...

    java迷宫程序及代码

    本主题将深入探讨使用Java实现的基于深度优先搜索(DFS)和广度优先搜索(BFS)的迷宫生成与游戏玩法。这两种算法都是解决迷宫问题的有效工具,各有其特点和适用场景。 首先,让我们从深度优先搜索(DFS)开始。DFS...

    JAVA迷宫 JAVA程序设计

    当我们谈论“JAVA迷宫”时,这是一个典型的编程问题,它涉及到算法设计、路径查找以及可能的数据结构应用。让我们深入探讨Java如何用于解决迷宫问题。 首先,迷宫可以被抽象为一个二维数组或矩阵,其中每个元素代表...

    L.rar_java迷宫打印_迷宫 java_迷宫问题

    总之,“L.rar_java迷宫打印_迷宫 java_迷宫问题”是一个研究和实践Java算法的好资源,它涵盖了迷宫问题的多个方面,包括不同的搜索算法和迷宫生成技术。对于想要提升算法能力的Java开发者来说,这是一个宝贵的实践...

    【原创】Java迷宫生成器

    【原创】Java迷宫生成器是一个使用Java编程语言编写的程序,它的主要功能是自动生成迷宫。迷宫生成器通常包含算法设计和图形界面展示两大部分。在这个项目中,开发者利用了名为SimpleCanvas.java的类来实现图形界面...

    java迷宫、面板、寻路

    在本课程设计中,我们将深入探讨Java编程语言在构建迷宫生成、面板显示以及路径寻找算法方面的应用。这个项目不仅涵盖了基本的编程概念,还涉及到了数据结构、算法设计以及图形用户界面(GUI)的创建,是提升Java...

    Java 迷宫基于Java23开发的迷宫

    Java 迷宫

    java迷宫设计模式

    利用设计模式对java迷宫进行改写,采用了单例、策略、工厂模式

    java 迷宫 软件体系结构作业

    在Java编程语言中,"迷宫"通常是一个用于展示算法和数据结构的示例问题。这个"软件体系结构作业"可能要求你设计并实现一个基于Java的迷宫生成和求解系统,它可能包含了工厂模式或者是抽象工厂模式的运用。 **软件...

    java 迷宫算法.rar

    本压缩包"java 迷宫算法.rar"可能包含了一个名为"CreateMaze.java"的源代码文件,这个文件可能是用于生成和解决迷宫问题的程序。 迷宫算法通常有多种实现方法,其中最著名的两种是深度优先搜索(DFS)和广度优先...

    我做的JAVA迷宫。有很多功能的

    以一个mXn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 (1)编写递归形式的算法,求得迷宫中所有可能的通路; (2)...

    Java 迷宫--随机生成迷宫地图

    一个Java小游戏,随机生成迷宫地图,可以人机交互

Global site tag (gtag.js) - Google Analytics