扫雷游戏课程设计报告整合_第1页
扫雷游戏课程设计报告整合_第2页
扫雷游戏课程设计报告整合_第3页
扫雷游戏课程设计报告整合_第4页
扫雷游戏课程设计报告整合_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PAGE 面向对象程序设计课程设计报告题 目: 扫雷游戏设计 院 (系): 计算机与电子系 专业班级: 计算机科学与技术0903班 学生姓名: = 学 号: = 指导教师: = 20 12 年 6 月 4 日至20 12 年 6 月 15 日华中科技大学武昌分校制 面向对象程序设计 课程设计任务书一、设计(调查报告/论文)题目扫雷游戏设计二、设计(调查报告/论文)主要内容内容:Windows系统提供的扫雷游戏是一个很有趣的游戏。这里使用Java语言编写一个与其类似的扫雷游戏。 基本功能与要求:1扫雷游戏分为初级,中级和高级三个级别,扫雷英雄榜存储每个级别的最好成绩,即挖出全部的地雷且用时最少者

2、。游戏菜单可以选择“初级”,“中级”和“高级”或“查看英雄榜”。2选择级别后将出现相应级别的扫雷区域,这时用户使用鼠标左键单击雷区中的任何一个方块启动计时器。3用户要揭开某个方块,可单击它。若所揭方块下有雷,用户便输了这一局,若所揭方块下无雷,则显示数字,该数字代表方块周围的八个方块中共有多少颗雷。4如果用户认为某个方块下埋有地雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。用户每标记出一个扫雷标记(无论用户标记是否正确),程序将显示剩余雷数减少一个。5. 扫雷胜利后(用时最少者),程序弹出保存成绩对话框。三、原始资料1.面向对象程序设计课程设计指导书2. 耿祥义JAV

3、A大学实用教程北京:清华大学出版社,2009四、要求的设计(调查/论文)成果1.课程设计报告2.课程设计软件五、进程安排布置任务,查找资料、需求分析1天总体设计1天详细设计1.5天编制源程序实现3.5天测试与修改1天撰写课设报告2天六、主要参考资料1 张广彬. Java课程设计案例精编(第二版).北京:清华大学出版社, 2011. 2 耿祥义. Java课程设计(第二版).北京:清华大学出版社, 2008.3 耿祥义JAVA大学实用教程北京:清华大学出版社,20094 邹林达陈国君 Java2程序设计基础北京:清华大学出版社,20105 邹林达Java2程序设计基础实验指导北京:清华大学,20

4、10指导教师(签名): 20 年 月 日目 录1需求与总体设计11.1需求分析11.2总体设计12详细设计42.1 MineGame类42.2 MineArea类52.3 Block类62.4 BlockView类72.5 LayMines类82.6 Record类82.7 ShowRecord类92.8 userDifine类93编码实现113.1 MineGame类113.2 MineArea类143.3 Block类173.4 BlockView类183.5 LayMines类193.6 Record类203.7 ShowRecord类213.8 userDifine类244系统测试26

5、总结30PAGE - 31 -1需求与总体设计1.1需求分析1.11扫雷游戏概述扫雷是一种具有迷惑性的对记忆和推理能力的简单测试,它是长久以来最受欢迎的 Windows 游戏之一。游戏目标:找出空方块,同时避免触雷。1.1.2扫雷的操作方法游戏主区域由很多个方格组成。使用鼠标随机点击一个方格,方格即被打开并显示出方格中的数字;方格中数字则表示其周围的8个方格隐藏了几颗雷;如果点开的格子为空白格,即其周围有0颗雷,则其周围格子自动打开。例如,方格中出现1,说明上下左右及斜角合计有一颗雷,依次类推,2则有2颗,3则有3颗。1.1.3游戏具有的功能 = 1 * ROMAN I.能够显示主菜单和界面游

6、戏需要提供主菜单让玩家进行游戏设置,同时能够显示当前剩余的地雷数量及当前花费时间等相关信息到界面上。 = 2 * ROMAN II.能够接收鼠标输入功能能够接收玩家的鼠标输入功能,左键和右键输入。 = 3 * ROMAN III. 能够根据规则翻转相应的格子翻动指定位置的格子。 = 4 * ROMAN IV. 能够标示指定格子的功能即能够对确定或者怀疑是地雷的格子进行旗子和?符号的标示。 = 5 * ROMAN V.游戏胜负判断功能当玩家单击的格子中有地雷时,判定玩家失败,游戏结束。当扫雷游戏中全部格子被打开时,判定玩家成功。 = 6 * ROMAN VI英雄榜记录更新当有玩家把当前等级的地雷

7、全部扫出来后,并且时间比记录中的时间短时,在结束游戏时,要求玩家把名字保存下来。游戏初始时时间为999秒。例如,当第一个玩家把全部地雷扫出来的时间为120秒,这时玩家的记录时间将被保存下来并作为记录时间线。直到有玩家的时间少于120秒,才能更新当前记录时间线并保存玩家的名字。1.2总体设计在设计扫雷游戏时,需要编写8个Java源文件:MineGame.java、MineArea.java、Block.java、BlockView.java、userDefine.java、LayMines.java、Record.java和ShowRecord.java.扫雷游戏除了需要编写上述8个Java源文

8、件所给出的类外,还需要Java系统提供的一些重要的类,例如File、JButton和JLabel等类。扫雷游戏所用到的一些重要的类以及之间的组合关系如图1-1所示,系统功能图如图1-2所示。Block图1-1 类之间的组合关系MineGameFileShowRecordMineAreaRecordBlockViewLayMinesJButtonJLabeluserDefine帮助图1-2 功能图扫雷游戏主界面重新开始关于扫雷游戏低级中级高级英雄榜开始退出自定义1.2.1 MineGame.java(主类)MineGame类负责创建扫雷游戏主窗口,该文件含有main方法。扫雷游戏从该类开始执行。

9、1.2.2 MineArea.javaMineArea类创建的对象是MineArea类最重要的成员之一,代表“扫雷区域”。1.2.3 Block.javaBlock类是雷区中“方块”的类封装,含有关于“方块”的属性以及操作,即负责为雷区创建代表“方块”的Block对象。1.2.4 BlockView.javaBlockView是JPanel容器的子类,BlockView创建的对象负责为Block对象提供视图,以方便用户通过该视图与Block对象交互。1.2.5 LayMines.javaLayMine类对象不需要视图,在游戏中不需要看见该类。LayMine对象使用随机算法指定MineArea对

10、象中的哪些Block对象是雷,哪些Block对象不是雷。1.2.6 Record.javaRecord类是JDialog对话框的子类,对用户扫雷成功时,Record对象负责保存用户的成绩到文件。1.2.7 ShowRecord.javaShowRecord类是JDialog对话框的子类,当用户查看扫雷的最好成绩时,ShowRecord对象负责提供读取文件数据的界面。1.2.8 userDefine 类userDefine 类是JDialog对话框的子类,当用户想自定义扫雷难度时,ShowRecord对象负责设置用户想要的难度设置。2详细设计2.1 MineGame类MineGame类是java

11、x.swing包中JFrame的一个子类,并实现了ActionListener接口。标明该类的只要成员变量和方法的UML图如图2-1所示。JFrameActionListenerMineGamebar: JMenuBar;fileMenu, heipMenu: JMenu开始,初级,中级,高级,英雄榜,自定义,退出,关于:JMenuItemmineArea: MineArea英雄榜: FileshowHeroRecord: ShowRecordMineGame(): 无类型actionPerformed(ActionEvent)main(String): void图2-1 MineGame类的

12、UML图以下是UML图中有关数据和方法的详细说明。成员变量bar和fileMenu提供菜单操作,单击游戏菜单项为“开始”、“初级”、“中级”、“高级”、“扫雷英雄榜”、“自定义”和“退出”。单击帮助菜单项为“关于”。mineArea是扫雷区域,提供有关扫雷的主要功能。“英雄榜”负责存放三个级别的扫雷最好成绩。showHeroRecord负责显示英雄榜中的数据。方法MineGame()是构造方法,负责完成窗口的初始化。ActionPerformed(ActionEven)方法是MineGame类实现的ActionListener接口中的方法,该方法负责执行菜单发出的有关命令。用户选择菜单中的菜单

13、项可触发ActionEvent事件,导致actionPerformed(ActionEvent)方法执行相应的操作,例如将mineArea创建的雷区设置为初级、中级、高级。main(String)方法是程序运行的入口方法。2.2 MineArea类MineArea类是javax.swing包中JPanel容器的子类,实现了ActionListener和MouseListener接口,所创建的对象:mineArea是MineGame类中最重要的成员之一,作为一个容器添加到MineGame窗口的中心。标明MineArea类的主要成员变量、方法以及和MineGame类之间组合关系的UML图如图2-2

14、所示。MineArearow,colum,mineCount,markMount: int lay: LayMinesblock:Block record: RecordblockView:BlockViewresStart: JButtonshowTime: JTextFieldtime: TimershowMarkedMineCount: JTextFieldinitMineArea(int,int,int,int): void show(int m,int n):voidactionPerformed(ActionEvent ): void inquireWin(): voidmouse

15、Pressed(MouseEvent): voidJPanelActionListenerMouseListenerMineGamemineArea:MineArea图2-2 MineArea类的UML图以下是UML图中有关数据和方法的详细说明。成员变量a. Block是Block类型的数组,用来确定雷区有多少需进行扫雷的方块。b. blockView是Blockview类型的数组,负责为block数组中的Block对象提供视图。c. Lay是LayMines类型的对象,负责设置block数组中的哪些方块是雷或不是雷。d. Record负责提供保存成绩的界面,是一个对话框,默认不可见。用户只有

16、扫雷成功后(用时最少),才能看见该对话框。e. reStart是一个按钮对象,用户单击它重新开始游戏。f. time是计时器对象,负责计算用户的用时。2)方法A. initMineArea(int,int,int,int)方法可根据参数提供的数据设置雷区的宽度,高度,雷的数目以及雷区的级别。B. actionPerformed(ActionEvent)是MIneArea类实现ActionListener接口中的方法。当用户单击blockView中的某个方块时,actionPerformed(ActionEvent)方法负责执行有关算法,例如,当用鼠标左键单击方块上的按钮后,若该方块下有雷,ac

17、tionPerformed(ActionEvent)方法将使用户输掉本局,若该方块下又雷,actionPerformed(ActionEvent)方法将显示BlockView对象中的标签,该标签上是一个数字,该数字代表当前方块的周围的8个方块中总共有多少颗雷。C. show()方法是一个递归方法。actionPerformed(ActionEvent)方法执行时将调用show方法进行扫雷。D. mousePress(MouseEvent)方法是MineArea类实现的MouseListener接口中的方法,当用户按下鼠标右键时,mousePress(MouseEvent)方法负责让方块上显示一

18、个探雷标记。E. inquireWin()方法用来判断用户是否扫雷成功,如果成功该方法负责让record对话框可见。所谓扫雷成功是指不仅找到了全部的雷而且用时最少。2.3 Block类 Block对象负责封装雷区中方块中的数据以及对这些数据的操作,外观效果由Blockview负责提供(见后面的BlockView)。Block类创建的对象是数组block的单元的对象。Block型数组block是MineArea类的重要成员之一。标明Block类的主要成员变量和方法以及和MineArea类之间的组合关系的UML图如下图2-3所示。图2-3 Block类的UML图以下是UML图中有关数据的方法的详细

19、说明。1)成员变量a. name是方块上的名字。b. aroundMineNumber是方块周围雷的数目。c. mineIcon是方块上雷的图标。d. sMine用来表示方块是否是雷。e. isMark用来表示方块是否被标记。f. isOpen用来表示方块是否被挖开。2)方法A. setAroundMineNumber(int)方法用来设置aroundMineNumber的值。B. getAroundMineNumber()方法用来获取aroundMineNumber的值。2.4 BlockView类BlockView创建的对象负责为Block对象提供视图,以便用户通过该视图与Block对象交

20、互。BlockView对象使用一个标签和按钮为Block对象提供视图,标签和按钮按着卡片布局层叠在一起,默认状态按钮遮挡住标签。当用户单击按钮后,如果Block对象时雷,BlockView对象中的标签显示的事雷的图标;如果Block对象不是雷,标签显示的是周围雷的总数。BlockView类是javax。swing包中JPanel类的一个子类,创建的对象是数组blockView的单元中的对象。BlockView型数组BlockView是MineArea类的重要成员之一。标明BlockView类的主要成员变量和方法以及和MineArea类之间的组合关系的UML图如图2-4所示。图2-4 Block

21、View类的UML图以下是UML图中有关数据的方法的详细说明。1)成员变量a. blockNameOrIcon用来显示Block对象的name,number和mineIcon属性。b. blockCover用来遮挡blockNameOrIcon。c. card卡片布局。2)方法A. giveView(Block block)方法给参数指定的Block对象提供视图,如果Block对象的isMine属性为true,即方块是雷,那么blockNameOrIcon标签上设置的文本就是Block对象的name属性的值,同时blockNameOrIcon标签上设置的图标就是Block对象的mineIcon

22、指定的图标。如果Block对象的isMine属性为false,blockNameOrIcon标签上设置的图标就是Block对象的aroundMineNumber属性的值,及周围雷的数目B. seeblockNameOrIcon()方法让用户看见视图中的标签,无法看见按钮。C. seeblockNameOrIcon(0方法让用户看见视图中的按钮,无法看见标签。2.5 LayMines类 LayMines对象使用随机算法制定MineArea对象中的哪些Block对象是雷,哪些对象不是雷,没有可现实的效果图。LayMines创建的对象Lay是MineArea中的重要成员,表明该类的主要成员变量和方法

23、以及和MineArea类之间组合关系的UML图如图2-5所示。图2-5 LayMines类的UML图以下是UML图中有关数据的方法的详细说明。1)成员变量 mineIcon用来存放一个格式为gif的图像。2)方法layMinesForBlock(Block,in)方法对参数指定的Block数组进行设置,其中int参数指定雷的数目,当指定Block数组中每个单元中的方块是雷时,就将该房快上的图标设置为mineIcon,当指定Block数组中每个单元中的方块不是雷时,就将该方块的名字设置为周围的雷的数目。2.6 Record类Record创建的对象负责提供保存成绩的界面。Record是javax。

24、swing包中jDialog对话框的子类,并实现了ActionListener接口。Record创建的对象:record是MineArea类的成员之一,当用户扫雷成功时,该对象提供了保存成绩到文件的界面。标明Record类的主要成员变量,方法以及和MineArea类之间组合关系的UML图如图2-6所示。图2-6 Record类的UML图以下是UML图中有关数据的方法的详细说明。1)成员变量textName提供用户扫雷优胜者输入姓名用户单击”确定“按钮,可以保存成绩2)方法actionPerformed(ActionEvent)方法是Record类实现的ActionListener接口中的方法,

25、当用户单击”确定“按钮后,该方法被执行,所执行的操作就是获取用户输入的名字和用时然后调用writeRecord(String,String)方法将信息写入”英雄榜“中。writeRecord(String,String)方法负责将有关信息扫雷用时,扫雷级别,扫雷优胜者姓名等心思写入到”英雄榜“文件。2.7 ShowRecord类ShowRecord创建的对象负责提供显示成绩的界面。ShowRecord是javax。swing包中JDialog对话框的子类,并实现了ActionListener接口。ShowReacord创建的对象showHeroRecord是MineGame类的成员之一,当用户

26、选择查看英雄榜“菜单项时,该对话框可见,提供了查看扫雷的最好成绩的界面。标明ShowRecord类的主要成员变量,方法以及和MineGame类之间组合关系的UML图如图2-7所示。图2-7 ShowRecord类的UML图以下是UML图中有关数据的方法的详细说明。成员变量File存放文件的引用用户单击”显示成绩“按钮,可以查看各个级别扫雷的最好成绩。用户单击”重新计分“按钮,可以将”英雄榜“中的成绩恢复为初始值。2)方法actionPerformed(ActionEvent)方法是ShowRecord类实现的ActionListener接口中的方法,当用户单击”显示成绩“按钮后,该方法被执行,

27、所执行的操作就是调用readAndShow()方法。readAndShow()方法负责读取存放在文件中的各个级别的扫雷最好成绩以及扫雷者姓名,并显示这些相关信息。2.8 userDefine 类userDefine是java.awt包中Rame框架的子类,并实现了ActionListener接口。userDefine创建的对像:usedefine是MineArea类的成员之一,当用户点击菜单栏中的游戏-自定义时,弹出界面,在界面的文本框中输入相应的数字。然后单击确定即可,或者单击取消退出界面。标明userDefine类的主要成员变量、方法以及和MineArea类之间的组合关系的UML图如图2-

28、8所示。JFrameActionListeneruserDefinerow,colum,mineCount,score: JLableex1,ex2,ex3,ex4: JLablerow1,colum1, mineCount1,score1:JTextFieldcon1,con2,con3,con4: JPanel确定,取消:JButtonactionPerformed(ActionEvent)setVisible(boolean) : void图2-8 userDefine类的UML图MineAreauserdefin: userDefine以下是UML图中有关数据和方法的详细说明。1)成员

29、变量a. row,colum,mineCount,score:分别用来显示行数,列数,雷数,分数b. row1,colum1, mineCount1,score1:用来自定义雷区的长度值,宽度值,所有的雷数值以及每赢一局所得的分数c. ex1,ex2,ex3,ex4::用来说明上述内容d. con1,con2,con3,con4:用来装Label 和TextFiled,以方便布局e. 确定,取消;单击“确定”后,如果输入的内容合法,就会实现自定义的雷区,如果不合法的话,就会弹出一个警告框,提示输入有误;单击“取消”退出自定义窗口。2)方法 actionPerformrd(ActonEvent)

30、方法是userDefine类中实现的ActionListener接口中的方法,当用户单击界面的“确定”,该方法被执行,所执行的操作就是,将用户输入的信息传入程序,实验自定义雷区的难度级别。当用户单击界面的“取消”,该方法被执行,所执行的操作就是,退出用户自定义界面。3编码实现各个类的的主要源代码实现如下:3.1 MineGame.java(主类)import java.awt.event.*;/包含事件类import java.awt.*;/包含抽象窗口工具集中的图形文本、窗口GUI类import javax.swing.*;/包含SWING组件import javax.swing.Box.F

31、iller;import javax.swing.border.*;/包含布局类import java.util.*;/包含有用的数据类型类import java.util.List;import java.io.*;/包含输入流和输出流类import javax.swing.ImageIcon;/包含图标public class MineGame extends JFrame implements ActionListener JMenuBar menubar; /负责创建菜单条 JMenuItem 开始,初级,中级,高级,扫雷英雄榜,自定义,退出,关于;/负责创建菜单项 JMenu fil

32、eMenu,helpMenu;/负责创建菜单 ImageIcon app;/负责创建标题栏的图标 JLabel l1,l2,l3,l4; JTextArea ta; MineArea mineArea=null; File 英雄榜=new File(英雄榜.txt);/创建文件保存记录 Hashtable hashtable=null; ShowRecord showHeroRecord=null; userDefine userdefine=new userDefine();/调用userDefine类 MineGame() mineArea=new MineArea(8,8,10,1);

33、add(mineArea,BorderLayout.CENTER); app=new ImageIcon(app.gif);/给标题栏创建图标 setIconImage(app.getImage();/获取图标并调用类实现 setTitle(扫雷); /加入标题字段 menubar=new JMenuBar();/创建菜单条 JMenu fileMenu=new JMenu(游戏(G);/创建菜单 JMenu helpMenu=new JMenu(帮助(H);/创建菜单 fileMenu.setMnemonic(G); helpMenu.setMnemonic(H); 开始=new JMenu

34、Item(开始);/创建菜单项 开始.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F2,0);/添加快捷方式 初级=new JMenuItem(初级); 中级=new JMenuItem(中级); 高级=new JMenuItem(高级); 扫雷英雄榜=new JMenuItem(扫雷英雄榜); 扫雷英雄榜.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4,0); 自定义=new JMenuItem(自定义,KeyEvent.VK_S); 自定义.setAccelerator(Key

35、Stroke.getKeyStroke(KeyEvent.VK_F5,0); 退出=new JMenuItem(退出); 关于 = new JMenuItem(关于); 关于.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1,0); fileMenu.add(开始); /加入菜单的容器 fileMenu.addSeparator();/加入分隔符 fileMenu.add(初级); fileMenu.add(中级); fileMenu.add(高级); fileMenu.addSeparator(); fileMenu.add(扫雷英雄榜

36、); fileMenu.addSeparator(); fileMenu.add(自定义); fileMenu.addSeparator(); fileMenu.add(退出); helpMenu.add(关于); menubar.add(fileMenu);/加入菜单条的容器 menubar.add(helpMenu); setJMenuBar(menubar);/完成封装 /添加事件监听器 开始.addActionListener(this); 初级.addActionListener(this); 中级.addActionListener(this); 高级.addActionListe

37、ner(this); 扫雷英雄榜.addActionListener(this); 自定义.addActionListener(this); 退出.addActionListener(this); 关于.addActionListener(this); /设置英雄榜 hashtable=new Hashtable(); hashtable.put(初级,初级#+999+#匿名); hashtable.put(中级,中级#+999+#匿名); hashtable.put(高级,高级#+999+#匿名); if(!英雄榜.exists() try FileOutputStream out=new

38、FileOutputStream(英雄榜); ObjectOutputStream objectOut=new ObjectOutputStream(out); objectOut.writeObject(hashtable); objectOut.close(); out.close(); catch(IOException e) showHeroRecord=new ShowRecord(this,hashtable); setBounds(100,100,300,300); setVisible(true);/设为可见 setDefaultCloseOperation(JFrame.EX

39、IT_ON_CLOSE);/结束窗体所在的应用程序 validate(); /负责执行菜单发出的有关命令public void actionPerformed(ActionEvent e) if(e.getSource()=开始) mineArea.initMineArea(8,8,10,1);/默认为初级 if(e.getSource()=初级) mineArea.initMineArea(8,8,10,1); setBounds(100,100,300,300); mineArea.showTime.setText(0); mineArea.time.stop(); if(e.getSou

40、rce()=中级) mineArea.initMineArea(16,16,40,2); setBounds(100,100,500,500); mineArea.showTime.setText(0); mineArea.time.stop(); if(e.getSource()=高级) mineArea.initMineArea(22,22,99,3); setBounds(100,100,650,650); mineArea.showTime.setText(0); mineArea.time.stop(); if(e.getSource()=扫雷英雄榜) if(showHeroReco

41、rd!=null) showHeroRecord.setVisible(true); if(e.getSource()=自定义) userdefine.setVisible(true); if(e.getSource()=退出) System.exit(0); if(e.getSource()=关于) JDialog dialog=new JDialog(); dialog.setTitle(关于帮助); FlowLayout fl=new FlowLayout(); dialog.setLayout(fl); dialog.setSize(500,500); dialog.setVisibl

42、e(true); String s=扫雷游戏的规则如下:; final JLabel l1 = new JLabel(); l1.setText(s); l1.setForeground(new Color(0,0,0); l1.setFont(new Font(Dialog,10,20); / l1.setBounds(60,84,345,26); final JLabel l2 = new JLabel(1,游戏区包括雷区、地雷计数器和计时器.); final JLabel l3 = new JLabel(2,通过单击即可挖开方块,如果挖开的是地雷,则您输掉游戏.); final JLab

43、el l4 = new JLabel(3,如果方块上出现数字,表示在其周围的八个方块中共有多少颗地雷); dialog.add(l1); dialog.add(l2); dialog.add(l3); dialog.add(l4); setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); if(dialog!=null) dialog.setVisible(true); validate(); public static void main(String args) MineGame mg = new MineGame();3.2 MineArea.ja

44、vapublic MineArea(int row,int colum,int mineCount,int grade) reStart=new JButton(重新开始); mark=new ImageIcon(flag.gif); /探雷标记 time=new Timer(1000,this); showTime=new JTextField(3); showMarkedMineCount=new JTextField(3); showTime.setHorizontalAlignment(JTextField.CENTER); showMarkedMineCount.setHorizon

45、talAlignment(JTextField.CENTER); showMarkedMineCount.setFont(new Font(Arial,Font.BOLD,16); showTime.setFont(new Font(Arial,Font.BOLD,16); showTime.setEditable(false);/不可更改 showMarkedMineCount.setEditable(false); pCenter=new JPanel();/创建面板 pSouth=new JPanel(); la1 = new JLabel(new ImageIcon(app.gif);

46、 la2 = new JLabel(new ImageIcon(time.gif); pCenter.setBorder(BorderFactory.createLoweredBevelBorder(); lay=new LayMines(); initMineArea(row,colum,mineCount,grade); /初始化雷区 reStart.addActionListener(this); pSouth.add(la1); pSouth.add(showMarkedMineCount); pSouth.add(reStart); pSouth.add(showTime); pSo

47、uth.add(la2); setLayout(new BorderLayout(); add(pSouth,BorderLayout.SOUTH); add(pCenter,BorderLayout.CENTER); public void initMineArea(int row,int colum,int mineCount,int grade) pCenter.removeAll(); spendTime=0; markMount=mineCount; this.row=row; this.colum=colum; this.mineCount=mineCount; this.grad

48、e=grade; block=new Blockrowcolum; for(int i=0;irow;i+) for(int j=0;jcolum;j+) blockij=new Block(); lay.layMinesForBlock(block,mineCount); blockView=new BlockViewrowcolum; pCenter.setLayout(new GridLayout(row,colum); for(int i=0;irow;i+) for(int j=0;jcolum;j+) blockViewij=new BlockView(); blockViewij

49、.giveView(blockij); /给blockij提供视图 pCenter.add(blockViewij); blockViewij.getBlockCover().addActionListener(this); blockViewij.getBlockCover().addMouseListener(this); blockViewij.seeBlockCover(); blockViewij.getBlockCover().setEnabled(true); blockViewij.getBlockCover().setIcon(null); showMarkedMineCou

50、nt.setText(+markMount); validate(); /当用户单击BlockView中的某个方块时,执行有关算法 public void actionPerformed(ActionEvent e) /点击Block方块区域 if(e.getSource()!=reStart&e.getSource()!=time) time.start(); /开始计时 int m=-1,n=-1; for(int i=0;irow;i+) for(int j=0;jcolum;j+) if(e.getSource()=blockViewij.getBlockCover() m=i; n=

51、j; break; /鼠标左键单击方块上的按钮, if(blockmn.isMine() /如果该方块有雷,则用户输掉本局 for(int i=0;irow;i+) for(int j=0;j0&blockmn.getIsOpen()=false) /周围有雷 blockViewmn.seeBlockNameOrIcon(); blockmn.setIsOpen(true); return; else if(blockmn.getAroundMineNumber()=0&blockmn.getIsOpen()=false)/周围没有雷 blockViewmn.seeBlockNameOrIco

52、n(); blockmn.setIsOpen(true); for(int k=Math.max(m-1,0);k=Math.min(m+1,row-1);k+) for(int t=Math.max(n-1,0);t=Math.min(n+1,colum-1);t+) show(k,t); public void mousePressed(MouseEvent e) JButton source=(JButton)e.getSource(); for(int i=0;irow;i+) for(int j=0;j=1) blockNameOrIcon.setText(+n); if(n=1)

53、blockNameOrIcon.setForeground(new Color(255,0,0); if(n=2) blockNameOrIcon.setForeground(new Color(0,0,255); if(n=3) blockNameOrIcon.setForeground(new Color(0,255,0); if(n=4) blockNameOrIcon.setForeground(new Color(125,200,200); if(n=5) blockNameOrIcon.setForeground(new Color(200,0,50); else/周围没有雷 bl

54、ockNameOrIcon.setText( ); public void seeBlockNameOrIcon()/只能看见视图中的标签 card.show(this,view); validate(); public void seeBlockCover()/只能看见视图中的按钮 card.show(this,cover); validate(); public JButton getBlockCover() return blockCover; 3.5 LayMines.java/使用随机算法指定MineArea对象中的哪些Block对象是雷,哪些不是public class LayMi

55、nes ImageIcon mineIcon=new ImageIcon(app.gif); /创建雷的图标 public void layMinesForBlock(Block block,int mineCount) int row=block.length; int column=block0.length; LinkedList list=new LinkedList(); for(int i=0;irow;i+) for(int j=0;j0) int size=list.size(); / list返回节点的个数 int randomIndex=(int)(Math.random(

56、)*size); Block b=list.get(randomIndex); b.setIsMine(true); b.setMineIcon(mineIcon); list.remove(randomIndex); /list删除索引值为randomIndex的节点 mineCount-; for(int i=0;irow;i+) for(int j=0;jcolumn;j+) if(blockij.isMine()/该方块设为雷,在该方块上设置图标 blockij.setIsOpen(false); blockij.setIsMark(false); else /该方块设为不是雷,设置周

57、围雷的数目 int mineNumber=0; for(int k=Math.max(i-1,0);k=Math.min(i+1,row-1);k+) for(int t=Math.max(j-1,0);t=Math.min(j+1,column-1);t+) if(blockkt.isMine() mineNumber+; blockij.setIsOpen(false); blockij.setIsMark(false); blockij.setName(+mineNumber); blockij.setAroundMineNumber(mineNumber); 3.6 Record.ja

58、va/提供保存成绩的界面 public Record() setTitle(记录你的成绩);/新界面的标题 this.time=time; this.grade=grade; setBounds(100,100,240,160); setResizable(false); setModal(true); 确定=new JButton(确定); 取消=new JButton(取消); textName=new JTextField(8); textName.setText(匿名); 确定.addActionListener(this); 取消.addActionListener(this); C

59、ontainer con = getContentPane(); con.setLayout(new GridLayout(2,1); label=new JLabel(您现在是.高手,输入您的大名上榜); con.add(label); JPanel p=new JPanel(); p.add(textName); p.add(确定); p.add(取消); con.add(p); setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); public void setGrade(String grade) this.grade=grade; label

60、.setText(您现在是+grade+高手,输入您的大名上榜); public void setTime(int time) this.time=time; public void actionPerformed(ActionEvent e) if(e.getSource()=确定) message=grade+#+time+#+ +textName.getText(); key=grade; writeRecord(key,message); setVisible(false); if(e.getSource()=取消) setVisible(false); public void wri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论