1、Java课程设计走迷宫 Java语言与面向对象技术课程设计报告(2014) Java语言与面向对象技术 课程设计报告 ( 2014 -- 2015年度第 1 学期) 走迷宫 1 目 录 目 录 2 1 概 述 1 1.1 课程设计目的 1 1.2 课程设计内容 1 2 系统需求分析 2 2.1 系统目标 2 2.2 主体功能 2 2.3 开发环境 3 3 系统概要设计 3 3.1 系统的功能模块划分 3 3.2 系统流程图 4 4系统详细设计 6 4.1系统
2、的主界面设计 6 4.2 MAZE的设计 7 4.3 PERSONINMAZE的设计 8 4.4 WALLORROAD的设计 8 4.5 MAZEPOINT的设计 9 4.6 SOUND的设计 10 4.7 RECORD的设计 10 5 测试 11 5.1 测试方案 11 5.2 测试结果 11 6 小结 16 参考文献 17 附录1 源程序清单 18 3 走迷宫的设计 1 概 述 1.1 课程设计目的 1.加深对《Java语言与面向对象技术》课程基础知识的理解,掌握Java语言面向对象程序设计的开发方法和步骤; 2.进一步
3、理解面向对象程序设计的思想和方法,利用Java语言进行程序设计的能力; 3.课程设计将课本上的理论知识和实际应用相结合,锻炼学生发现问题、分析问题和解决问题的能力。加强学生研发、编写、调试程序的能力; 4.培养学生在项目开发中团队合作精神、创新意识及能力; 5.提高学生科技论文写作能力,规范完成课程设计报告。 1.2 课程设计内容 设计GUI界面的走迷宫游戏,游戏的目的是让走迷宫者从迷宫的入口处进从迷宫出口处出。具体内容如下: (1)程序根据文本文件生成迷宫,这些文本文件称作迷宫文件。迷宫文件的扩展名为.maze,其中的文本内容有着特殊的组织结构:任意两行文本所含有的字符个数必
4、须相同,而且字符只可以是“*”、“#”、“0”或“1”。迷宫文件中的“*”和“#”分别代表迷宫的入口和出口,“0”和“1”分别代表迷宫中的“路”和“墙”。 例如,迷宫文件“中等迷宫.maze”所生成的迷宫如图1-1所示。 //中等迷宫.maze文件 000000101000101001010 010010100010100001010 *00001010100010100101 010001000100000101010 00101000101011010010# 101000010100000010001 010101001001101010010 1010001000
5、11101001010 001010100101010100100 图1-1 中等迷宫界面 (2)用户可以通过界面上提供的菜单选项,选择“迷宫文件”来生成对应的迷宫类型。 (3)用户可以通过界面上提供的菜单选项,选择迷宫中的“墙”和“路”的外观图像以及默认“墙”和“路”的图像。同时用户也可以更改迷宫中“走迷宫者”的图像。 (4)当用户开始玩游戏时想重新开始,用户可以随时单击界面上下方图片位置提供的按钮,重新开始走迷宫。 (5)本程序还具有音乐播放的功能,当用户成功移动走迷宫者后,程序播放简短的一声音乐。 (6)本迷宫程序增加“英雄榜”功能既排名功能,当用户成功将迷宫中的走迷宫者从
6、入口移动到出口,如果成绩能排进前三名,就弹出一个对话框,将用户的成绩保存到“英雄榜”中,并且可以查看“英雄榜”以及删除“英雄榜”。 2 系统需求分析 2.1 系统目标 设计一个基于java的走迷宫小游戏,游戏的结果是让走迷宫者从迷宫的入口处走到迷宫的出口处。 根据已有的走迷宫小游戏进行新功能的增加。 2.2 主体功能 (1)玩家可以任意选择不同的迷宫图进行走迷宫游戏。 (2)玩家可以自定义玩家头像、墙的图像以及路的图像。 (3)游戏进行时可以点击提示按钮重新开始游戏 (4)根据玩家所玩的记录进行排行榜设置,分别列出保存各类型迷宫(简单迷宫、中等迷宫、复杂迷宫)的前三名,玩家完
7、后可以点击英雄榜自行查看。 (5)玩家可以清除英雄榜并且重新载入游戏。 2.3 开发环境 Eclipse 3 系统概要设计 3.1 系统的功能模块划分 1.系统的总体设计 在设计走迷宫时,需要编写6个java源文件:MazeWindow.java、Maze.java、WallOrRoad.java、MazePoint.java、PersonInMaze.java、HandleMove.java、Record.java、ShowRecord.java和Sound.java。走迷宫除了上述6个java源文件所给出的类外,还需要Java系统提供的一些重要的类,如JmenuItem和Fi
8、le等类。走迷宫所用到的一些重要的类以及之间的组合关系如下图所示: MazelWindow Maze PersonInMaze HandleMove Record ShowRecord Sound File JMenuItem WallOrRoad MazePoint 图3-1 各类之间的关系 2.系统模块划分 本系统主要有以下几个功能模块:创建走迷宫的主窗口、创建迷宫、创建墙和路及确定位置的对象,创建走迷宫者,创建处理键盘事件对象,创建英雄榜及显示英雄榜。 该软件主要组成
9、模块和各个模块之间的调用关系如下图所示: 创建迷宫 创建主窗口 编写迷宫文件 创建墙 创建路 确定墙和路的位置 创建走迷宫者 创建处理键盘事件对象 创建及显示英雄榜 图3-2功能模块图 3.2 系统流程图 玩家开始打开界面进行游戏,通过菜单选项选择简单、中等、复杂迷宫中的一种进行游戏。开始的界面各个图像是程序默认的图像,玩家也可以根据自己的喜好自行选择文件夹里的图像来设置墙的图像、路的图像以及走迷宫者的图像。然后玩家根据提示点击走迷宫者开始游戏,玩家通过对键盘的操作来控制走迷宫者,使其从入口进入从出口出来。在玩的期间如果玩家在十秒内没能从出口出来则玩家的图像会变成猪
10、的图像。游戏结束后如果玩家破纪录则根据提示进入英雄榜,同时可以查看英雄榜。玩家还可以清除英雄榜重新打开界面进行游戏。具体活动流程图如下所示: 图3-3 活动流程图 4系统详细设计 4.1系统的主界面设计 1.成员变量 maze是Maze类声明的对象,用来刻画迷宫,是MazeWindow类中最重要的成员之一。MazeWindow类根据迷宫文件,即根据该类中的mazeFile来创建maze对象。 bar是JMenuBar创建的菜单条,用来添加菜单。bar被放置在窗口的顶部。 menuChoice是JMenu创建的菜单,其名字为“选择迷宫文件”。menuChoice和menuIma
11、ge被添加到菜单条bar中。 wallImage、roadImage、和defaultImage是JMenuItem创建的菜单项,名字依次为“墙的图像”、“路的图像”和“墙和路的默认图像”,这三个菜单项被添加到菜单menuImage中。wallImage、roadImage和defaultImage都将当前窗口注册为自己的ActionEvent事件监控器。 mazeFile、wallImageFile和roadImageFile是File的对象,其中mazeFile用来存放迷宫文件的引用,而wallImageFile和roadImageFile分别用来存放迷宫中“墙”和“路”的外观图像文件
12、的引用。 renew是JButton创建的按钮对象,名字为“重新开始”。Renew将当前窗口注册为自己的ActionEvent事件监控器。 2.方法 MazeWindow()是构造方法,负责完成窗口的初始化操作,其重要的操作之一是:读取当前目录中扩展名为.maze的迷宫文件,并根据迷宫文件的名字创建JMenuItem菜单项添加到menuChoice菜单中,然后将当前窗口注册为每个菜单上的ActionEvent事件监控器。另外,该构造方法在执行过程中,将mazeFile初始化为menuChoice菜单中的第一个菜单项所代表的迷宫文件,并根据该迷宫文件创建MazeWindow窗口中的maze
13、对象。该构造方法还对wallImageFile和roadImageFile进行了初始化,并指定迷宫中“墙”和“路”所使用的默认图像。 init()方法根据迷宫文件初始化maze对象,完成必要的初始化操作。 actionPerformed(ActionEvent)方法是MazeWindow类实现的ActionListener接口中的方法。MazeWindow类创建的窗口时menuChoice菜单和menuImage菜单中的菜单项以及renew按钮上的ActionEvent事件监控器。当用户选中某个菜单项或单击按钮时,窗口将执行actionPerformed(ActionEvent)方法进行想
14、应得操作。如果用户选中menuChoice菜单中的某个菜单项,即用户选择了一个迷宫文件,actionPerformed(ActionEvent)方法所执行的操作就是改变mazeFile所引用的迷宫文件,然后调用init()方法。如果用户选中menuImage菜单中的wallImage或roadImageFile菜单项时,actionPerformed(ActionEvent)方法所执行的操作就是分别改变wallImage和roadImage所引用的图像文件,从而让maze对象改变“墙”或路的图像,如果用户选中menuImage菜单中的defaultImage菜单项,actionPerforme
15、d(ActionEvent)方法所执行的操作就是将wallImage和roadImageFile所引用的图像文件恢复到默认设置,并让maze对象恢复“墙”或“路”的默认图像。当用户单击rennew按钮时,actionPerformed(ActionEvent)方法所进行的操作时保持当前的mazeFile所引用的迷宫文件,并执行init方法。 main(String[])方法是程序运行的入口方法。 3. 主界面效果图如下图所示 图4-1 主界面图 4.2 Maze的设计 1.成员变量 mazeFile是File类声明的对象,用来存放迷宫文件的引用。 mazePoint是Maze
16、Point类型的二位数组,其单元为MazePoint类创建的对象,用来确定“墙”和“路”以及“走迷宫者”的位置,即确定WallOrRoad以及PersonInMaze对象在maze对象中的位置。 wallOrRoad是WallOrRoad类型的二维数组,七单元为WallOrRoad类索川江的对象,用来表示迷宫中的“墙”或“路”。 person是PersonInMaze类创建的对象,用来表示迷宫中的“走迷宫者”。 handleMove是HandleMove类创建的对象,负责处理person对象上的键盘事件。 wallImage和roadImage是File类声明的对象,用来存放绘制“墙”
17、和“路”的外观的图文件的引用。 distance、m和n是int型数据。mazePoint对象根据distance的值来进行初始化,以便确定mazePoint对象之间的距离,m和n的值是二维数组mazePoint的行数和列数。 2. 方法 maze()是构造方法,负责创建maze对象。 maze对象调用setmazeFile(File)方法可根据参数指定的迷宫文件完成必要的初始化,例如,创建mazePoint和wallOrRoad数组等。 maze对象调用setWallImage(File)方法可以设置wallImage文件对象。 maze对象调用setRoadImage(Fil
18、e)方法可以设置roadImage文件对象。 maze对象调用getHandleMove()返回到handleMove对象。 3. 根据编写的简单迷宫文件所显示的迷宫图像如下图所示 图4-2 简单迷宫图像- 4.3 PersonInMaze的设计 1.效果图 PersonInMaze创建的对象效果如图所示 图4-3 走迷宫者图像 2.类的主要成员变量和方法 成员变量: point是MazePoint型对象,用来确定PersonInMaze对象在Maze所创建的迷宫容器的位置。 tool是Toolkit对象,用来获得Inage对象。 方法: MazePoint
19、是构造方法,负责完成MazePoint对象的初始化。 PersonInMaze对象调用setAtMazePoint(MazePoint)方法设置自己所在的“点”,即设置属性point的对象引用。 PersonInMaze对象电影getAtMazePoint()返回自己所在的“点”,即返回point对象的引用。 PersonInMaze对象调用painTComponent(Graphics)方法绘制图形,即绘制tool对象所获得的Image对象。 4.4 WallOrRoad的设计 1.成员变量 isRoad、isWall、isEnter和isOut是boolean型数据,取值为
20、true或false,分别用了表示WallOrRoad对象是否为“路”、“墙”、“入口”和“出口”。 point是MazePoint型对象,用来确定WallOrRoad对象在Maze所创建的迷宫容器中的位置。 wallImage和roadImage是File类型的对象,用来确定WallOrRoad对象上所绘制的图像文件。 tool是Toolkit型对象,负责创建Image对象。 2.方法 WallOrRoad()是构造方法,负责完成WallOrRoad对象的初始化。 WallOrRoad对象调用setIsEnter(boolean)方法设置自己是否为迷宫的“入口”。 WallO
21、rRoad对象调用getIsEnter()方法判断自己是否为迷宫的“入口”,即返回isEnter属性的值。 WallOrRoad对象调用setIsOut(boolean)方法设置自己是否为迷宫的“出口”。 WallOrRoad对象调用getIsOut()方法判断自己是否为迷宫的“出口”,即返回isOut属性的值。 WallOrRoad对象调用setIsRoad(boolean)方法设置自己是否为迷宫的“路”。 WallOrRoad对象调用getIsRoad()方法判断自己是否为迷宫的“路”,即返回isRoad属性的值。 WallOrRoad对象调用setIsWall(boolean)
22、方法设置自己是否为迷宫的“墙”。 WallOrRoad对象调用getIsWall()方法判断自己是否为迷宫的“墙”,即返回isWall属性的值。 WallOrRoad对象调用setAtMazePoint(MazePonit)方法设置自己所在的“点”,及设置point对象的引用。 WallOrRoad对象调用getAtMazePoint()方法返回到自己所在的“点”,即返回point对象的引用。 WallOrRoad对象调用setWallImage(File)方法设置wallImage文件对象。 WallOrRoad对象调用setRoadImage(File)方法可以设置roadIma
23、ge文件对象。 WallOrRoad对象调用paintComponent(Graphics)方法绘制图像,即绘制tool对象根据roadImage或wallImage文件所见获得的Image对象。 4.5 MazePoint的设计 1.效果图 MazePoint创建的对象负责确定WallOrRoad对象和PersonInMaze对象在Maze容器中的所在位置。MazePoint创建的对象没有可现实的效果图。 2.类的主要成员变量和方法 1) 成员变量 x和y是MazePoint对象中的两个int型数据,分别用来表示容器坐标系中的x轴坐标和y轴坐标值。 havaWallOrRoa
24、d是boolean型数据,如果有WallOrRoad对象在该MazePoint对象上时,haveWallOrRoad的值是true;否则为false。 wallOrRoad是WallOrRoad类声明的对象,用来存放一个WallOrRoad对象的引用,表明该WallOrRoad对象在当前MazePoint对象上。 2) 方法 MazePoint(int,int)是构造方法,用来创建MazePoint对象。 MazePoint对象上是否有WallOrRoad对象,isHaveWallOrRoad()方法返回true;否则返回false。 MazePoint对象调用setIsWallOr
25、Road(boolean)方法可以根据参数的值设置当前MazePoint对象上是否有WallOrRoad对象。 MazePoint对象调用getX()和getY()方法可以返回其中的x轴坐标和y轴坐标。 MazePoint对象调用equls(TowerPoint)方法可以判断当前MazePoint对象是否和参数指定的MazePoint对象相同。 Point对象调用setWallOrRoad(WallOrRoad)方法,将参数指定的WallOrRoad对象放置在当前MazePoint对象上。 Point对象调用getWallOrRoad()方法可以返回当前MazePoint对象上的Wal
26、lOrRoad对象。 4.6 Sound的设计 1. 成员变量 AudioClip声明对象 aau;String 类声明soundname确定铃声的名字; 设定 boolean型的对象 b初始值为false 2.方法 makeSound(String soundname)制作铃声,setSound(String soundname)设置铃声,stop()使铃声停止,boolean isPlaying()判断铃声是否播放 4.7 Record的设计 1.成员变量 Time 为时间,设定其初始值为0. Maze为String类声明的对象,用来确定人物所处的迷宫,messag
27、e用来输出信息。 textName为JTextField声明的对象,用来设置文本名称, label为Label声明的对象,其值为空, Jbutton声明两个对象,分别为确定,取消。 2.方法 Record()方法用来记录成绩,setMaze(String maze)用来设置迷宫类型,actionPerformed(ActionEvent e)用来记录走迷宫者的表现,isBrokenRecord(String key,int time)/在HandleMove中调用,key是迷宫名,此方法用来判断是否破纪录了,writeRecord(String key,String message)
28、key是迷宫文件名,message是记录地图名、时间、用户名的字符串,写下记录。 3. 记录英雄榜效果图如下所示 图4-4 记录成绩效果图 5 测试 5.1 测试方案 首先打开游戏查看游戏的主界面是否符合要求,然后根据提示开始进行游戏。根据菜单栏选项任意选择一种迷宫游戏看是否根据自己的选择而改变。点击菜单栏墙和路的图像选择默认的图像检查是否跟代码编写时设置相同,然后根据自己喜好选择不同的图片作为墙和路的背景。 开始游戏根据提示点击走迷宫者图像开有游戏,检查键盘方向键是否控制走迷宫者走的方向,根据键盘的上下左右的控制是否会分别
29、四种不同的声音发出。检测是否遇到墙就不能走,当走迷宫者在迷宫内十秒内还没有走出看走迷宫者的图像是否变成猪的图像。当玩家走出迷宫破纪录是否记录个人信息,检查英雄榜是否真有前三名的成绩。清空英雄榜重新开始游戏查看英雄榜是否真的被清空。 5.2 测试结果 1.选择迷宫种类的测试 在原文件内编写不同三种迷宫文件,在主界面中根据选择会出现不同的迷宫如下图所示: 图5-1 中等迷宫图像 图5-2 复杂迷宫图像 图5-3 简单迷宫图像 2.迷宫图片的设置测试 以上的图像都是默认的图像,玩家可以更改墙、路以及走迷宫者的图像。在玩家玩超过十秒还没出来的时候走迷宫者会变成
30、猪的头像,点击窗口下方可重新开始游戏。 图5-4 选择图片是打开的文件 图5-5 修改路、墙走迷宫者后的迷宫图像 3.开始游戏的测试 玩家根据提示点击走迷宫者进行游戏同时开始计时,用键盘上、下、左、右键控制走迷宫者开始走迷宫,只有从入口进从出口处出来游戏才结束。如果在迷宫内时间超过十秒钟则走迷宫者的图像变成猪的图像。 图5-6 开始游戏的界面 图5-7游戏超过十秒走迷宫者的图像变化 图5-8 上图有小人图像按钮为重新开始按钮 4.破纪录记录成绩的测试 玩家通过迷宫后程序会根据玩家的成绩做出不同响应,并把玩该种迷宫成绩的前三名列入英雄榜。
31、 图5-9 游戏完成超过十秒界面 图5-10 闯关成功界面 图5-11 记录成绩界面 图5-12 查看英雄榜界面 6 小结 走迷宫的游戏功能已经基本实现,在此次课程设计过程中,我遇到了一些问题在程序中各类的反复关联和依赖关系让类与类之间的关系复杂,不是能很好的把握,这样对游戏的实现造成了一定的麻烦,通过向同学请教渐渐地摸索了一些,而当把各个类都编写完之后,程序运行不起来,当时觉得很困惑,明明自己编写的类已经没什么差错,可就是运行不起来有点小郁闷,再经同学指点发现原来是一些必要的文件的存放路径不对,当一切都整合完毕之后,程序运行起来了,这让我十分开心。同时我也意识
32、到团队合作的重要性,个人的力量在某些方面是有限的,而一个团队的智慧是无穷大的。 通过这次“走迷宫’的课程设计更让我意识到了理论与事件结合的在重要性,只有理论知识是完全不够的,我们还要学会将它运用到实践中,用它来实现我们所要做的项目。亲身的实践让我们对理论知识的一些难点和不懂的地方有了更好地理解与认识。希望以后能有更多的机会动手来进行操作。 29 参考文献 [1]耿祥义,张跃平. Java2实用教程(第三版)[M] . 北京:清华大学出版社, 2006 [2]耿祥义. Java课程设计(第三版)[M] . 北京:清华大学出版社, 2004 [3]张跃平.Java2实用教程实
33、验指导与习题解答(第三版)[M]. 北京:清华大学出版社, 2004 附 录 附录1 源程序清单 MazeWindow import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.Hashtable; import javax.swing.filechooser.*; public class MazeWindow extends JFrame implements ActionListener{ Maze maze;
34、 JMenuBar bar;//声明菜单条对象 JMenu menuChoice,menuImage,hero;//声明菜单对象 JmenuItem wallImage,roadImage,defaultImage,playerImage1,heroItem,heroclear; File mazeFile,wallImageFile,roadImageFile; JButton renew;//声明按钮对象 String player="人.jpg"; ShowRecord showRecord; //Show
35、Record类 创建一个类对象 File 英雄榜=new File("英雄榜.txt"); File file[]=null; static String[] mazeName; static String currentMap; Hashtable hashtable=null; //哈希表 (英雄榜) MazeWindow(){ wallImageFile=new File("墙.jpg"); roadImageFile=new File("路.jpg"); bar=new
36、 JMenuBar();//创建菜单条对象 menuChoice=new JMenu("选择迷宫"); File dir=new File("."); file=dir.listFiles(new FilenameFilter(){ public boolean accept(File dir,String name){ return name.endsWith("maze"); } } ); mazeName=new String[file.length]; for(int i=0;i< file.l
37、ength;i++) { mazeName[i]=file[i].getName().substring(0, file[i].getName().length()-5);//substring(截取的起始位置,截取的长度); } for(int i=0;i< mazeName.length;i++) { JMenuItem item=new JMenuItem(mazeName[i]); item.addActionListener(this); menuChoice.add(item);
38、 } mazeFile=new File(file[0].getName()); currentMap=mazeName[0]; init(); menuImage=new JMenu("选择墙和路的图像"); wallImage=new JMenuItem("墙的图像");//创建菜单项对象 roadImage=new JMenuItem("路的图像"); playerImage1=new JMenuItem("玩家的图像"); defaultImage=new JMenuItem("墙和路的默认图像"); menuImage.add(w
39、allImage);//菜单项添加到菜单上 menuImage.add(roadImage); menuImage.add(playerImage1);// menuImage.add(defaultImage); hero=new JMenu("英雄榜"); heroItem=new JMenuItem("查看英雄榜"); heroclear=new JMenuItem("清空英雄榜"); hero.add(heroItem); hero.add(heroclear); bar.add(menuChoice); bar.add(me
40、nuImage);//菜单添加到菜单条上, bar.add(hero); setJMenuBar(bar); wallImage.addActionListener(this);//为菜单项添加监听器 roadImage.addActionListener(this); playerImage1.addActionListener(this); defaultImage.addActionListener(this); heroItem.addActionListener(this); heroclear.addActionListener(th
41、is); renew=new JButton(new ImageIcon("人.jpg")); /*为“重新开始”按钮添加监听器*/ Font font=new Font("楷体",Font.BOLD,30); renew.setFont(font); renew.setVerticalAlignment(SwingConstants.TOP); renew.addActionListener(this); add(maze,BorderLayout.CENTER);//默认布局 add(renew,BorderLayout.SOUTH);
42、 hashtable=new Hashtable();
for(int i=0;i 43、是File类对象; boolean exists() 测试此抽象路径名表示的文件或目录是否存在。
try{
FileOutputStream out=new FileOutputStream(英雄榜);
ObjectOutputStream objectOut=new ObjectOutputStream(out);
objectOut.writeObject(hashtable);
objectOut.close(); //void close() 关闭流。
44、 out.close();
}
catch(IOException e){}
}
showRecord =new ShowRecord(this,mazeName.length);
setVisible(true);
setBounds(60,60,1012,890);
validate();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/*退出应用程序后的窗口关闭操作*/
}
public void in 45、it(){
if(maze!=null){
remove(maze);
remove(maze.getHandleMove());
}
maze=new Maze();
maze.setWallImage(wallImageFile);
maze.setRoadImage(roadImageFile);
maze.setMazeFile(mazeFile);
maze.person.setImage(player);
add(maze,BorderLayout 46、CENTER);
add(maze.getHandleMove(),BorderLayout.NORTH);
validate();
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==roadImage){//路的图象选择设置
JFileChooser chooser=new JFileChooser();//文件对话框
FileNameExtensionFilter filter=new FileNameExtensio 47、nFilter( "JPG&GIF Images","jpg","gif");
chooser.setFileFilter(filter);
int state=chooser.showOpenDialog(null);
File file=chooser.getSelectedFile();
if(file!=null&&state==JFileChooser.APPROVE_OPTION){
roadImageFile=file;
48、maze.setRoadImage(roadImageFile);
}
}
else if(e.getSource()==wallImage){
JFileChooser chooser=new JFileChooser();
FileNameExtensionFilter filter=new FileNameExtensionFilter("JPG&GIF Images","jpg","gif");
chooser.setFileFilter(fil 49、ter);
int state=chooser.showOpenDialog(null);
File file=chooser.getSelectedFile();
if(file!=null&&state==JFileChooser.APPROVE_OPTION){
wallImageFile=file;
maze.setWallImage(wallImageFile);
}
} 50、
else if(e.getSource()==playerImage1)
{
JFileChooser chooser=new JFileChooser();
FileNameExtensionFilter filter=new FileNameExtensionFilter("JPG&GIF Images","jpg","gif");
chooser.setFileFilter(filter);
int state=chooser.showOpenDia






