import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
public class Maze extends JLayeredPane{
File mazeFile;
MazePoint [][] mazePoint;
WallOrRoad [][] wallOrRoad;
PersonInMaze person;
HandleMove handleMove;
File wallImage,roadImage;
int distance=26,m=0,n=0;
public Maze(){
setLayout(null);
wallImage=new File("wall.jpg");
roadImage=new File("road.jpg");
person=new PersonInMaze();
handleMove=new HandleMove();
handleMove.initSpendTime();
person.addKeyListener(handleMove);
setLayer(person,JLayeredPane.DRAG_LAYER);
}
public void setMazeFile(File f){
mazeFile=f;
char [][]a;
RandomAccessFile in=null;
String lineWord=null;
try{ in=new RandomAccessFile(mazeFile,"r");
long length=in.length();
long position=0;
in.seek(position);
while(position<length){
String str=in.readLine().trim();
if(str.length()>=n)
n=str.length();
position=in.getFilePointer();
m++;
}
a=new char[m][n];
position=0;
in.seek(position);
m=0;
while(position<length){
String str=in.readLine();
a[m]=str.toCharArray();
position=in.getFilePointer();
m++;
}
in.close();
wallOrRoad=new WallOrRoad[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
wallOrRoad[i][j]=new WallOrRoad();
if(a[i][j]=='1'){
wallOrRoad[i][j].setIsWall(true);
wallOrRoad[i][j].setWallImage(wallImage);
wallOrRoad[i][j].repaint();
}
else if(a[i][j]=='0'){
wallOrRoad[i][j].setIsRoad(true);
wallOrRoad[i][j].setRoadImage(roadImage);
wallOrRoad[i][j].repaint();
}
else if(a[i][j]=='*'){
wallOrRoad[i][j].setIsEnter(true);
wallOrRoad[i][j].setIsRoad(true);
wallOrRoad[i][j].repaint();
}
else if(a[i][j]=='#'){
wallOrRoad[i][j].setIsOut(true);
wallOrRoad[i][j].setIsRoad(true);
wallOrRoad[i][j].repaint();
}
}
}
mazePoint=new MazePoint[m][n];
int Hspace=distance,Vspace=distance;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
mazePoint[i][j]=new MazePoint(Hspace,Vspace);
Hspace=Hspace+distance;
}
Hspace=distance;
Vspace=Vspace+distance;
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
add(wallOrRoad[i][j]);
wallOrRoad[i][j].setSize(distance,distance);
wallOrRoad[i][j].
setLocation(mazePoint[i][j].getX(),mazePoint[i][j].getY());
wallOrRoad[i][j].setAtMazePoint(mazePoint[i][j]);
mazePoint[i][j].setWallOrRoad(wallOrRoad[i][j]);
mazePoint[i][j].setIsWallOrRoad(true);
if(wallOrRoad[i][j].getIsEnter()){
person.setAtMazePoint(mazePoint[i][j]);
add(person);
person.setSize(distance,distance);
person.
setLocation(mazePoint[i][j].getX(),mazePoint[i][j].getY());
person.requestFocus();
person.repaint();
}
}
}
handleMove.setMazePoint(mazePoint);
}
catch(IOException exp){
JButton mess=new JButton("无效的迷宫文件");
add(mess);
mess.setBounds(30,30,100,100);
mess.setFont(new Font("宋体",Font.BOLD,30));
System.out.println(exp+"mess");
}
}
public void setWallImage(File f){
wallImage=f;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(wallOrRoad[i][j].getIsWall())
wallOrRoad[i][j].setWallImage(wallImage);
wallOrRoad[i][j].repaint();
}
}
}
public void setRoadImage(File f){
roadImage=f;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(wallOrRoad[i][j].getIsRoad())
wallOrRoad[i][j].setRoadImage(roadImage);
wallOrRoad[i][j].repaint();
}
}
}
public HandleMove getHandleMove(){
return handleMove;
}
}
在本文中,我们将深入探讨如何使用Java编程语言实现一个迷宫游戏。这个迷宫游戏具有两种不同的地图生成方法:随机布点法和图的深度优先遍历法,并且能够自动寻找路径并显示出来。让我们逐一解析这些关键概念。 我们要理解**迷宫生成算法**。迷宫生成算法是构建迷宫结构的一种方法。在这个游戏中,提供了两种策略: 1. **随机布点法**(Random Walk Algorithm):这种算法通常从一个起点开始,随机地在空白的网格上移动,每次移动后将经过的路径标记为墙壁,直到整个迷宫被填满。这种方法简单易懂,但生成的迷宫可能不够复杂或连通性不佳。 2. **深度优先遍历法**(Depth-First Search, DFS):DFS是一种图遍历算法,适用于生成连通性良好的迷宫。从起点开始,遍历所有可能的路径,直到没有可走的路径,然后回溯。在迷宫生成中,我们通常使用非递归的DFS,通过栈来存储未访问的节点,以避免堆栈溢出。 在Java实现中,迷宫通常表示为二维数组或链表结构,其中0代表可通行的空间,1代表墙壁。这两种算法都需要维护一个当前位置和一个边界条件来确定何时停止生成。 接下来,我们要介绍**路径查找算法**。在这个游戏中,可能使用了**广度优先搜索**(Breadth-First Search, BFS)或**A*搜索算法**来找到从起点到终点的最短路径。BFS确保找到的路径是最短的,因为它总是先探索距离起点最近的节点。而A*算法在BFS的基础上加入了一种启发式函数,可以更高效地找到目标,尤其在大型迷宫中。 在Java中,BFS通常使用队列数据结构,而A*则需要一个优先级队列以及一个评估函数(如曼哈顿距离或欧几里得距离)来确定节点的优先级。 **显示路径**的部分涉及到用户界面(UI)的设计。这可能是一个基于文本的输出,或者更复杂的是图形用户界面(GUI)。对于文本输出,可以使用ASCII字符来表示迷宫和路径;而对于GUI,可能需要使用Java Swing或JavaFX库来创建窗口和绘制迷宫。在显示路径时,需要跟踪并更新每个步骤,直至到达终点。 在实际的代码实现中,你需要考虑以下几点: - **类的设计**:合理地组织代码,可能包括Maze、Node、PathFindingAlgorithm等类。 - **错误处理**:确保程序能处理无效输入或异常情况,如无解的迷宫。 - **性能优化**:对于大型迷宫,路径查找算法的效率至关重要,可能需要考虑使用更高级的数据结构或算法优化。 总结起来,这个"java 走迷宫 maze"项目涵盖了迷宫生成、路径查找和用户界面显示等核心概念,涉及到了Java编程、算法和数据结构等多个方面。通过这个项目,开发者不仅可以提升编程技能,还能对图论和搜索算法有更深入的理解。











































- 1

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整
- yaoyaohaohaizi2014-08-31真心不错,能自己添加地图,谢谢了
- philJ2011-10-24不好意思,不是我要的东西。我想要有界面的
- 理工2322013-01-22不好意思,不是我要的东西。我想要有界面的
- doubleSk2012-11-08...没界面啊.......

- 粉丝: 37
- 资源: 21
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 【生产线平衡】基于matlab混合遗传粒子群算法求解生产线平衡优化问题(含平衡率 平滑系数)【含Matlab源码 9242期】.mp4
- 【优化拆卸】基于matlab多目标人工蜂群算法求解拆卸优化问题【含Matlab源码 10365期】.mp4
- 【优化调度】基于matlab模拟退火算法SA求解平行机的调度优化问题【含Matlab源码 13042期】.mp4
- 【优化调度】基于matlab人工鱼群算法求解场桥和AGV联合调度【含Matlab源码 10366期】.mp4
- 【优化成本】基于matlab求解在一组不同的平行机上处理一组独立订单的成本最小化问题【含Matlab源码 13046期】.mp4
- 【优化调度】基于matlab遗传算法GA求解护士排班调度优化问题【含Matlab源码 13044期】.mp4
- 【优化覆盖】基于matlab布谷鸟算法CS求解无线传感器节点3D覆盖优化问题【含Matlab源码 10364期】.mp4
- 【优化规划】基于matlab改进的粒子群算法求解6节点电网规划优化问题【含Matlab源码 11193期】.mp4
- 【优化控制】基于matlab遗传算法求解动态矩阵控制优化问题【含Matlab源码 11003期】.mp4
- 【优化选址】基于matlab瞪羚算法GOA求解物流配送中心选址优化问题【含Matlab源码 12077期】.mp4
- 【优化选址】基于matlab模拟退火粒子群算法求解分布式电源定容选址优化规划【含Matlab源码 11181期】.mp4
- 【语音编码】基于matlab语音信号PCM编解码(含前后波形对比 SNR)【含Matlab源码 11159期】.mp4
- 【端点检测】基于matlab短时能量和过零率语音信号端点检测【含Matlab源码 9765期】.mp4
- 【回声处理】基于matlab RLS算法语音噪声回声消除处理【含Matlab源码 9248期】.mp4
- 【语音处理】基于matlab GUI IIR+FIR滤波器声音信号时域频域分析【含Matlab源码 9953期】含报告.mp4
- 【语音处理】基于matlab GUI OLA算法音频信号变速不变调系统【含Matlab源码 9906期】.mp4


