扫雷课程设计_第1页
扫雷课程设计_第2页
扫雷课程设计_第3页
扫雷课程设计_第4页
扫雷课程设计_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

PAGE1郑州科技学院Java课程设计设计(论文)题目:扫雷游戏所在院:信息工程学院专业班级:学生姓名:学号:指导教师:年月日郑州科技学院课程设计(论文)任务书设计题目:扫雷游戏专业班级:学号姓名主要内容本次课程设计是用java语言及相关知识设计一个扫雷游戏系统,完成扫雷的基本功能。并在此基础上,自行完善和优化系统功能。理解和掌握选择游戏级别,记录游戏时间和保存游戏成绩的方法,所用到的知识点有:类的基本构成,异常处理,图形用户界面。基本要求:按照内容要求,设计完整的扫雷游戏系统。要求调试通过,不存在漏洞,方便用户操作。功能的实现上力求容错能力要强且提示信息完备。完成期限:年月日指导教师签名:评审小组负责人签名:

目录第一部分引言…………1第二部分需求分析……………………12.1设计要求………………12.2设计目的………………22.3功能实现………………2第三部分总体设计…………………23.1设计功能图……………23.2总体流程图………33.3总体设计……………53.4MineGame类…………53.5MineArea类…………73.5MineArea类…………73.6Block类………………103.7BlockView类…………113.8LayMines类…………123.9Record类……………133.10ShowRecord类……………………143.11userDefine类……………………153.12ruleShow类………163.13authorShow类……………………17第四部分本设计改进建议……18第五部分总结…………………18第六部分参考文献…………18附录(部分源代码)……………………19一、引言扫雷最原始的版本可以追溯到1973年一款名为“方块”的游戏。不久之后,“方块”被改写成了游戏“Rlogic”。在“Rlogic”里,玩家的任务是作为美国海军陆战队队员,为指挥中心探出一条没有地雷的安全路线,如果路全被地雷堵死就算输。两年后,汤姆·安德森在“Rlogic”的基础上又编写出了游戏“地雷”,由此奠定了现代扫雷游戏的雏形。1981年,微软公司的罗伯特·杜尔和卡特·约翰逊两位工程师在Windows3.1系统上加载了该游戏,扫雷游戏才正式在全世界推广开来。这款游戏的玩法是在一个9*9(初级),16*16(中级),16*30(高级),或自定义大小的方块矩阵中随机布置一定量的地雷(初级为10个,中级为40个,高级为99个)。由玩家逐个翻开方块,以找出所有地雷为最终游戏目标。如果玩家翻开的方块有地雷,则游戏结束。二需求分析2.1设计要求Windows2000/XP系统提供的扫雷游戏是一个很有趣的游戏。本章的课程设计使用Java语言编写一个与其类似的扫雷游戏。具体要求如下:(1)扫雷游戏分为初级、中级和高级三个级别,扫雷英雄榜存储每个级别的最好成绩,即挖出全部的地雷且用时最少者。单击游戏菜单可以选择“初级”、“中级”和“高级”。(2)选择级别后将出现相应级别的扫雷区域,这是用户使用鼠标左键单击雷区中任何一个方块便启动计时器。(3)用户要揭开某个方块,可单击它。若所揭方块下有雷,用户便输了这一局,若所揭方块下没有雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。(4)如果用户认为某个方块下埋着雷,单击右键即可以,。用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。(5)扫雷胜利后(用时最少者),程序弹出保存成绩的对话框。2.2设计目的可以让我们更加熟悉Java程序设计这门课程,加深对Java语言的掌握,提高编程水平。同时培养独立思考的能力,为毕业设计以及将来的工作打下坚实的基础。2.3功能实现用户可以自定义级别并且可以任意输入雷数;具有计时功能,即显示用户完成移动盘子所花费的时间;自动保存扫雷英雄榜;三总体设计3.1设计功能图扫雷游戏界面扫雷游戏界面退出作者及意见关于扫雷英雄榜自定义扫雷级别选择帮助重新开始游戏菜单退出作者及意见关于扫雷英雄榜自定义扫雷级别选择帮助重新开始游戏菜单3.2总体流程图结束是否有雷展示相应效果方块重新开始退出英雄榜自定义标记选择级别开局菜单按钮事件处理定义并初始化按钮,菜单等开始结束是否有雷展示相应效果方块重新开始退出英雄榜自定义标记选择级别开局菜单按钮事件处理定义并初始化按钮,菜单等开始Y3.3总体设计在设计扫雷游戏时,需要编写个Java源文件:MineGame.java、MineArea.java、Block.java、BlockView.java、LayMines.Java、Record.java、ShowRecord.java、userDefine.java、autherShow.java、ruleShow扫雷游戏除了需要编写上述java源文件所给出的类外,还需要Java系统提供的一些重要的类,如File、JButton、和Jlabel等类。3.4MineGame类3.4.1效果图3.4.2UML类图MineGame类是javax.swing包中Jframe的一个子类,并实现了ActionListener接中以下是UML图中有关数据和方法的详细说明。成员变量·bar和fileMenu提供菜单操作,单击游戏菜单中的选项为“初级”“中级”“高级”“自定义”“扫雷英雄榜”“背景声音”“退出”“游戏规则”“制作人”等·MineArea是扫雷区域,提供有关扫雷的主要功能。·“英雄榜”负责存放三个级别的扫雷最好成绩。·showheroRecord负责显示英雄榜中的数据·userdefine负责用户自定义功能·ruleshow负责显示游戏规则功能·authorshow负责显示作者功能2)·MineGame()是橘色造方法,负责完成窗口的主要功能·actionPerformed(ActionEvent)方法是MineGame类实现的ActionListerer接口中的方法,该方法负责执行菜单发出的有关命令。用户选择菜单项可以触发ActionEvent事件,导致actionPerformed(ActionEvent)方法执行相应的操作,例如将mineAreaw创建的雷区设置为初级中级高级等·Main(String[])方法是程序的入口方法3.5.3代码(见附录1)3.5MineArea类3.5.1效果图3.5.2UML图MineArea类是javax.swing包中JPanel容器的子类,实现了ActionListener和MouserListener接口,所创建的对象:mineArea是MineGame类中最重要的成员之一,作为一个容器添加到MineGame窗口的中心。以下是UML图中有关数据和方法的详细说明。成员变量·Block是Block类型的数组,用来确定雷区有多少需进行扫雷的方块。·blockView是Blockview类型的数组,负责为block数组中的Block对象提供视图。·Lay是LayMines类型的对象,负责设置block数组中的哪些方块是雷或不是雷。·Record负责提供保存成绩的界面,是一个对话框,默认不可见。用户只有扫雷成功后(用时最少),才能看见该对话框。·reStart是一个按钮对象,用户单击它重新开始游戏。·time是计时器对象,负责计算用户的用时。2)方法·initMineArea(int,int,int,int)方法可根据参数提供的数据设置雷区的宽度,高度,雷的数目以及雷区的级别。·actionPerformed(ActionEvent)是MIneArea类实现ActionListener接口中的方法。当用户单击blockView中的某个方块时,actionPerformed(ActionEvent)方法负责执行有关算法,例如,当用鼠标左键单击方块上的按钮后,若该方块下有雷,actionPerformed(ActionEvent)方法将使用户输掉本局,若该方块下又雷,actionPerformed(ActionEvent)方法将显示BlockView对象中的标签,该标签上是一个数字,该数字代表当前方块的周围的8个方块中总共有多少颗雷·show()方法是一个递归方法。actionPerformed(ActionEvent)方法执行时将调用show方法进行扫雷。·mousePress(MouseEvent)方法是MineArea类实现的MouseListener接口中的方法,当用户按下鼠标右键时,mousePress(MouseEvent)方法负责让方块上显示一个探雷标记。·inquireWin()方法用来判断用户是否扫雷成功,如果成功该方法负责让record对话框可见。所谓扫雷成功是指不仅找到了全部的雷而且用时最少。3.5.3代码(见附录2)3.6Block类3.6.1效果图Block对象负责封装雷区中方块中的数据以及对这些数据的操作,外观效果由Blockview负责提供。3.6.2.UML图Block类创建的对象是数组block的单元的对象。Block型数组block是MineArea类的重要成员之一。以下是UML图中有关数据的方法的详细说明。1)成员变量·name是方块上的名字。·aroundMineNumber是方块周围雷的数目。·mineIcon是方块上雷的图标。·sMine用来表示方块是否是雷。·isMark用来表示方块是否被标记。·isOpen用来表示方块是否被挖开。2)方法·setAroundMineNumber(int)方法用来设置aroundMineNumber的值。·getAroundMineNumber()方法用来获取aroundMineNumber的值。3.6.3代码(见附录3)3.7BlockView类3.7.1.效果图BlockView创建的对象负责为Block对象提供视图,以便用户通过该视图与Block对象交互。BlockView对象使用一个标签和按钮为Block对象提供视图,标签和按钮按着卡片布局层叠在一起,默认状态按钮遮挡住标签。当用户单击按钮后,如果Block对象时雷,BlockView对象中的标签显示的事雷的图标;如果Block对象不是雷,标签显示的是周围雷的总数。图BlockView对象3.7.2.UML图BlockView类是javax。swing包中JPanel类的一个子类,创建的对象是数组blockView的单元中的对象。BlockView型数组BlockView是MineArea类的重要成员之一。以下是UML图中有关数据的方法的详细说明。1)成员变量·blockNameOrIcon用来显示Block对象的name,number和mineIcon属性。·blockCover用来遮挡blockNameOrIcon。·card卡片布局2)方法·giveView(Blockblock)方法给参数指定的Block对象提供视图,如果Block对象的isMine属性为true,即方块是雷,那么blockNameOrIcon标签上设置的文本就是Block对象的name属性的值,同时blockNameOrIcon标签上设置的图标就是Block对象的mineIcon指定的图标。如果Block对象的isMine属性为false,blockNameOrIcon标签上设置的图标就是Block对象的aroundMineNumber属性的值,及周围雷的数目·seeblockNameOrIcon()方法让用户看见视图中的标签,无法看见按钮。·seeblockNameOrIcon(0方法让用户看见视图中的按钮,无法看见标签。3.7.3代码(见附录4)3.8LayMines类3.8.1效果图LayMines对象使用随机算法制定MineArea对象中的哪些Block对象是雷,哪些对象不是雷,没有可现实的效果图。3.8.2.UML图LayMines创建的对象Lay是MineArea中的重要成员以下是UML图中有关数据的方法的详细说明。1)成员变量mineIcon用来存放一个格式为gif的图像。2)方法layMinesForBlock(Block[][],in)方法对参数指定的Block数组进行设置,其中int参数指定雷的数目,当指定Block数组中每个单元中的方块是雷时,就将该房快上的图标设置为mineIcon,当指定Block数组中每个单元中的方块不是雷时,就将该方块的名字设置为周围的雷的数目。3.8.3代码(见附录5)3.9Record类3.9.1效果图Record创建的对象负责提供保存成绩的界面,效果如图3.9.2.UML图Record是javax。swing包中jDialog对话框的子类,并实现了ActionListener接口。Record创建的对象:record是MineArea类的成员之一,当用户扫雷成功时,该对象提供了保存成绩到文件的界面。以下是UML图中有关数据的方法的详细说明。1)成员变量·textName提供用户扫雷优胜者输入姓名·用户单击”确定“按钮,可以保存成绩2)方法·actionPerformed(ActionEvent)方法是Record类实现的ActionListener接口中的方法,当用户单击”确定“按钮后,该方法被执行,所执行的操作就是获取用户输入的名字和用时然后调用writeRecord(String,String)方法将信息写入”英雄榜“中。·writeRecord(String,String)方法负责将有关信息扫雷用时,扫雷级别,扫雷优胜者姓名等心思写入到”英雄榜“文件。3.9.3代码(见附录6)3.10ShowRecord类3.10.1.效果图ShowRecord创建的对象负责提供显示成绩的界面,效果如图3.10.2.UML图ShowRecord是javax。swing包中JDialog对话框的子类,并实现了ActionListener接口。ShowReacord创建的对象showHeroRecord是MineGame类的成员之一,当用户选择查看"英雄榜“菜单项时,该对话框可见,提供了查看扫雷的最好成绩的界面。以下是UML图中有关数据的方法的详细说明。成员变量·File存放文件的引用·用户单击”显示成绩“按钮,可以查看各个级别扫雷的最好成绩。·用户单击”重新计分“按钮,可以将”英雄榜“中的成绩恢复为初始值。2)方法·actionPerformed(ActionEvent)方法是ShowRecord类实现的ActionListener接口中的方法,当用户单击”显示成绩“按钮后,该方法被执行,所执行的操作就是调用readAndShow()方法。·readAndShow()方法负责读取存放在文件中的各个级别的扫雷最好成绩以及扫雷者姓名,并显示这些相关信息。3.10.3代码(见附录7)3.11userDefine类3.11.1效果图如图3.11.2UML图userDefine是java.awt包中Rame框架的子类,并实现了ActionListener接口。userDefine创建的对像:usedefine是MineArea类的成员之一,当用户点击菜单栏中的游戏->自定义时,弹出界面,在界面的文本框中输入相应的数字。然后单击确定即可,或者单击取消退出界面。以下是UML图中有关数据和方法的详细说明。1)成员变量·行数,列数,雷数,分数:分别用来显示行数,列数,雷数,分数·行数1,列数1,雷数1,分数1:用来自定义雷区的长度值,宽度值,所有的雷数值以及每赢一局所得的分数·说明1,说明2说明3,说明4:用来说明上述内容·容器1,容器2,容器3:用来装Label和TextFiled,以方便布局·确定,取消;单击“确定”后,如果输入的内容合法,就会实现自定义的雷区,如果不合法的话,就会弹出一个警告框,提示输入有误;单击“取消”退出自定义窗口。2)方法actionPerformrd(ActonEvent)方法是userDefine类中实现的ActionListener接口中的方法,当用户单击界面的“确定”,该方法被执行,所执行的操作就是,将用户输入的信息传入程序,实验自定义雷区的难度级别。当用户单击界面的“取消”,该方法被执行,所执行的操作就是,退出用户自定义界面。3.12ruleShow类3.12.1效果图如图3.12.2UML图ruleShow是javax.swing包中JRame框架的子类,并实现了ActionListener接口。以下是UML图中有关数据和方法的详细说明。1)成员变量·la1:用来显示扫雷游戏的规则如下·la2,la2………;用来显示下面几条游戏规则·Con1,Con2,Con3;用来装la1,la2以实现在JFrame中布局;·bu1;用记单击bu1,关闭窗口;2)方法actionPerformrd(ActonEvent)方法是ruleShow类中实现的ActionListener接口中的方法,当用户单击界面的“确定”,该方法被执行,所执行的操作就是,并关闭界面。3.13authorShow类3.13.1效果图如图3.13.2UML图authorShow是javax.swing包中JRame框架的子类,并实现了ActionListener接口。以下是UML图中有关数据和方法的详细说明。成员变量·bu1:用户单击bu1,可以提交用户输入的信息以及关闭窗口·tx1:用来输入用户的建议·la1,la2……:用来显示作者信息2)方法actionPerformrd(ActonEvent)方法是authorShow类中实现的ActionListener接口中的方法,当用户单击界面的“确定”,该方法被执行,所执行的操作就是将用户的建议与意见保存在一个advice.txt文档中,并关闭界面。四本设计改进建议1、界面的美观性做的不太好,比如说布局,颜色搭配有待改进2、MineGame的初始化界面大小难以控制,特别是在自定义的情况下,需在手动改面窗口的大小。3、插入图片始终插不进去,也许是程序仍存在一些问题,仍然需要改进。五总结做完之后,确实有一点成就感,这种感觉激励着自已更加努力的学习这门课程,编程的进程肯定会遇到困难,要充分利用现有的资源比如说互联网,书籍,这次实验多亏JavaAPI,帮助我解决了不小困难。这个扫雷游戏是完全模拟微软系统自带的扫雷游戏,所以难度是很大,必然在编程过程中也遇到很多问题,有些问题比较简单但就不知道错在哪里,有些大问题之道在哪就是不知道怎么办才好,后来经过自己的不断调试,这个扫雷游戏终于大功告成。而且在编写这个扫雷游戏,我认识到应该注意细节问题,虽然是很小的问题,但可以提高自己编程的能力,而且还可以培养自己编程的严谨性,同时还可以为以后的编程积累经验。编写完这个扫雷游戏,我发现自己有很多的不足,感触最深的就是我们真的要扎扎实实的打基础!六主要参考文献[1]Java课程设计(第二版)清华大学出版社耿祥义张跃平[2]Java2实用教程(第三版)清华大学出版社耿祥义等[3]孙卫琴.精通Struts:基于MVC的JavaWeb设计与开发.北京:电子工业出版社,2004.08[4]《JAVA语言与面向对象程序设计》.印旻.清华大学出版社。

[5]《JavaApplet实例编程》,赤金、聂松编著,中国水利水电出版社

[6]《Java开发利器——Eclipse从入门到精通》张峰科技编,清华大学出版社

[7]《Java2核心》第二版窗体底端

[8]Sun中国技术社区/

[9]Java之家/

[10]Apache社区附录附录1:importjava.awt.event.*;importjava.awt.*;importjavax.swing.*;importjavax.swing.border.*;importjava.util.*;importjava.io.*;importjavax.swing.KeyStroke;importjava.awt.event.KeyEvent;publicclassMineGameextendsJFrameimplementsActionListener{JMenuBarbar;JMenufileMenu,fileMenu1;JMenuItem初级,中级,高级,扫雷英雄榜;JMenuItem自定义,游戏规则,制作人,退出;staticMineAreamineArea=null;File英雄榜=newFile("英雄榜.txt");Hashtablehashtable=null;ShowRecordshowHeroRecord=null;userDefineuserdefine=newuserDefine();voiceShowvoiceshow;ruleShowruleshow;authorShowauthorshow;MineGame(){mineArea=newMineArea(16,16,40,1);add(mineArea,BorderLayout.CENTER);bar=newJMenuBar();fileMenu=newJMenu("游戏");fileMenu.setMnemonic(KeyEvent.VK_G);fileMenu1=newJMenu("帮助");fileMenu1.setMnemonic(KeyEvent.VK_H);初级=newJMenuItem("初级",KeyEvent.VK_P);初级.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,ActionEvent.CTRL_MASK));中级=newJMenuItem("中级",KeyEvent.VK_M);中级.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M,ActionEvent.CTRL_MASK));高级=newJMenuItem("高级(H)",KeyEvent.VK_H);高级.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H,ActionEvent.CTRL_MASK));扫雷英雄榜=newJMenuItem("扫雷英雄榜",KeyEvent.VK_B);扫雷英雄榜.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B,ActionEvent.CTRL_MASK));自定义=newJMenuItem("自定义",KeyEvent.VK_S);自定义.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,ActionEvent.CTRL_MASK));游戏规则=newJMenuItem("游戏规则",KeyEvent.VK_R);游戏规则.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M,ActionEvent.CTRL_MASK));制作人=newJMenuItem("制作人",KeyEvent.VK_O);制作人.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,ActionEvent.CTRL_MASK));退出=newJMenuItem("退出",KeyEvent.VK_E);退出.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,ActionEvent.CTRL_MASK));voiceshow=newvoiceShow();ruleshow=newruleShow();authorshow=newauthorShow();fileMenu.add(初级);fileMenu.add(中级);fileMenu.add(高级);fileMenu.add(自定义);fileMenu.add(扫雷英雄榜);fileMenu.add(退出);fileMenu1.add(游戏规则);fileMenu1.add(制作人);bar.add(fileMenu);bar.add(fileMenu1);setJMenuBar(bar);初级.addActionListener(this);中级.addActionListener(this);高级.addActionListener(this);扫雷英雄榜.addActionListener(this);自定义.addActionListener(this);背景声音.addActionListener(this);游戏规则.addActionListener(this);制作人.addActionListener(this);退出.addActionListener(this);hashtable=newHashtable();hashtable.put("初级","初级#"+999+"#匿名");hashtable.put("中级","中级#"+999+"#匿名");hashtable.put("高级","高级#"+999+"#匿名");if(!英雄榜.exists()){try{FileOutputStreamout=newFileOutputStream(英雄榜);ObjectOutputStreamobjectOut=newObjectOutputStream(out);objectOut.writeObject(hashtable);objectOut.close();out.close();}catch(IOExceptione){}}showHeroRecord=newShowRecord(this,hashtable);setBounds(100,100,280,380);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);validate();}publicvoidactionPerformed(ActionEvente){if(e.getSource()==初级){mineArea.initMineArea(8,8,10,1);setBounds(100,100,360,340);}if(e.getSource()==中级){mineArea.initMineArea(16,16,40,2);setBounds(100,100,320,420);}if(e.getSource()==高级){mineArea.initMineArea(22,22,99,3);setBounds(100,100,390,450);}if(e.getSource()==自定义){ userdefine.setvisible(true);}if(e.getSource()==游戏规则){ ruleshow.setVisible(true);}if(e.getSource()==制作人){ authorshow.setVisible(true);}if(e.getSource()==扫雷英雄榜){if(showHeroRecord!=null)showHeroRecord.setVisible(true);}if(e.getSource()==退出){System.exit(0);}}publicstaticvoidmain(Stringargs[]){newMineGame();}}附录2:importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;import.*;importjava.io.*;importjava.applet.*;publicclassMineAreaextendsJPanelimplementsActionListener,MouseListener{JButtonreStart;Block[][]block;BlockView[][]blockView;URLurl;Stringstr;AudioClipclip;LayMineslay;introw,colum,mineCount,markMount;//雷区的行数、列数以及地雷个数和用户给出的标记数ImageIconmark;intgrade;JPanelpCenter,pNorth;JTextFieldshowTime,showMarkedMineCount;//显示用时以及标记数Timertime;//计时器intspendTime=0;Recordrecord;publicMineArea(introw,intcolum,intmineCount,intgrade){reStart=newJButton("重新开始");//reStart.setSize(4,4);mark=newImageIcon("★");//探雷标记time=newTimer(1000,this);showTime=newJTextField(4);showMarkedMineCount=newJTextField(4);showTime.setHorizontalAlignment(JTextField.CENTER);showTime.setForeground(newColor(255,0,0));showMarkedMineCount.setHorizontalAlignment(JTextField.CENTER);showMarkedMineCount.setForeground(newColor(255,0,0));showMarkedMineCount.setFont(newFont("Arial",Font.BOLD,20));showTime.setFont(newFont("Arial",Font.BOLD,20));pCenter=newJPanel();pNorth=newJPanel();lay=newLayMines();initMineArea(row,colum,mineCount,grade);//初始化雷区,见下面的LayMines()reStart.addActionListener(this);pNorth.add(showMarkedMineCount);pNorth.add(reStart);pNorth.add(showTime);setLayout(newBorderLayout());add(pNorth,BorderLayout.NORTH);add(pCenter,BorderLayout.CENTER);}publicvoidinitMineArea(introw,intcolum,intmineCount,intgrade){pCenter.removeAll();spendTime=0;markMount=mineCount;this.row=row;this.colum=colum;this.mineCount=mineCount;this.grade=grade;block=newBlock[row][colum];for(inti=0;i<row;i++){for(intj=0;j<colum;j++)block[i][j]=newBlock();}lay.layMinesForBlock(block,mineCount);blockView=newBlockView[row][colum];pCenter.setLayout(newGridLayout(row,colum));for(inti=0;i<row;i++){for(intj=0;j<colum;j++){blockView[i][j]=newBlockView();blockView[i][j].giveView(block[i][j]);//给block[i][j]提供视图pCenter.add(blockView[i][j]);blockView[i][j].getBlockCover().addActionListener(this);blockView[i][j].getBlockCover().addMouseListener(this);blockView[i][j].seeBlockCover();blockView[i][j].getBlockCover().setEnabled(true);blockView[i][j].getBlockCover().setIcon(null);}}showMarkedMineCount.setText(""+markMount);validate();}publicvoidsetRow(introw){this.row=row;}publicvoidsetColum(intcolum){this.colum=colum;}publicvoidsetMineCount(intmineCount){this.mineCount=mineCount;}publicvoidsetGrade(intgrade){this.grade=grade;}publicvoidactionPerformed(ActionEvente){if(e.getSource()!=reStart&&e.getSource()!=time){time.start();intm=-1,n=-1;for(inti=0;i<row;i++){for(intj=0;j<colum;j++){if(e.getSource()==blockView[i][j].getBlockCover()){m=i;n=j;break;}}}if(block[m][n].isMine()){for(inti=0;i<row;i++){for(intj=0;j<colum;j++){blockView[i][j].getBlockCover().setEnabled(false);if(block[i][j].isMine())blockView[i][j].seeBlockNameOrIcon();}}try{Filefile=newFile(str);url=file.toURL();clip=Applet.newAudioClip(url);clip.play();}catch(Exceptionh){}time.stop();spendTime=0;markMount=mineCount;}else{show(m,n);//见本类后面的show方法}}if(e.getSource()==reStart){initMineArea(row,colum,mineCount,grade);showTime.setEditable(false);showMarkedMineCount.setEditable(false);}if(e.getSource()==time){spendTime++;showTime.setText(""+spendTime);}inquireWin();}publicvoidshow(intm,intn){if(block[m][n].getAroundMineNumber()>0&&block[m][n].getIsOpen()==false){blockView[m][n].seeBlockNameOrIcon();block[m][n].setIsOpen(true);return;}elseif(block[m][n].getAroundMineNumber()==0&&block[m][n].getIsOpen()==false){blockView[m][n].seeBlockNameOrIcon();block[m][n].setIsOpen(true);for(intk=Math.max(m-1,0);k<=Math.min(m+1,row-1);k++){for(intt=Math.max(n-1,0);t<=Math.min(n+1,colum-1);t++)show(k,t);}}}publicvoidmousePressed(MouseEvente){JButtonsource=(JButton)e.getSource();for(inti=0;i<row;i++){for(intj=0;j<colum;j++){if(e.getModifiers()==InputEvent.BUTTON3_MASK&&source==blockView[i][j].getBlockCover()){if(block[i][j].getIsMark()){source.setIcon(null);block[i][j].setIsMark(false);markMount=markMount+1;showMarkedMineCount.setText(""+markMount);}else{source.setIcon(mark);block[i][j].setIsMark(true);markMount=markMount-1;showMarkedMineCount.setText(""+markMount);}}}}}publicvoidinquireWin(){intnumber=0;for(inti=0;i<row;i++){for(intj=0;j<colum;j++){if(block[i][j].getIsOpen()==false)number++;}}if(number==mineCount){time.stop();record=newRecord();switch(grade){case1:record.setGrade("初级");break;case2:record.setGrade("中级");break;case3:record.setGrade("高级");break;}record.setTime(spendTime);record.setVisible(true);}}publicvoidmouseReleased(MouseEvente){}publicvoidmouseEntered(MouseEvente){}publicvoidmouseExited(MouseEvente){}publicvoidmouseClicked(MouseEvente){}}附录3:importjavax.swing.ImageIcon;publicclassBlock{Stringname;//名字,比如"雷"或数字intaroundMineNumber;//周围雷的数目ImageIconmineIcon;//雷的图标booleanisMine=false;//是否是雷booleanisMark=false;//是否被标记booleanisOpen=false;//是否被挖开publicvoidsetName(Stringname){=name;}publicvoidsetAroundMineNumber(intn){aroundMineNumber=n;}publicintgetAroundMineNumber(){returnaroundMineNumber;}publicStringgetName(){returnname;}publicbooleanisMine(){returnisMine;}publicvoidsetIsMine(booleanb){isMine=b;}publicvoidsetMineIcon(ImageIconicon){mineIcon=icon;}publicImageIcongetMineicon(){returnmineIcon;}publicbooleangetIsOpen(){returnisOpen;}publicvoidsetIsOpen(booleanp){isOpen=p;}publicbooleangetIsMark(){returnisMark;}publicvoidsetIsMark(booleanm){isMark=m;}}附录4:importjavax.swing.*;importjava.awt.*;publicclassBlockViewextendsJPanel{JLabelblockNameOrIcon;//用来显示Block对象的name、number和mineIcon属性JButtonblockCover;//用来遮挡blockNameOrIcon.CardLayoutcard;//卡片式布局BlockView(){card=newCardLayout();setLayout(card);blockNameOrIcon=newJLabel("",JLabel.CENTER);blockNameOrIcon.setFont(newFont("Arial",Font.BOLD,12));blockNameOrIcon.setHorizontalTextPosition(AbstractButton.CENTER);blockNameOrIcon.setVerticalTextPosition(AbstractButton.CENTER);blockCover=newJButton();add("cover",blockCover);add("view",blockNameOrIcon);}publicvoidgiveView(Blockblock){if(block.isMine){blockNameOrIcon.setText(block.getName());blockNameOrIcon.setIcon(block.getMineicon());}else{intn=block.getAroundMineNumber();setBackground(newColor(0,0,122));if(n>=1){blockNameOrIcon.setText(""+n);if(n==1)blockNameOrIcon.setForeground(newColor(255,0,0));if(n==2)blockNameOrIcon.setForeground(newColor(0,0,255));if(n==3)blockNameOrIcon.setForeground(newColor(0,255,0));if(n==4)blockNameOrIcon.setForeground(newColor(125,200,200));if(n==5)blockNameOrIcon.setForeground(newColor(200,0,50));}elseblockNameOrIcon.setText("");}}publicvoidseeBlockNameOrIcon(){card.show(this,"view");validate();}publicvoidseeBlockCover(){card.show(this,"cover");validate();}publicJButtongetBlockCover(){returnblockCover;}}附录5:importjava.util.*;importjavax.swing.*;publicclassLayMines{ImageIconmineIcon;LayMines(){mineIcon=newImageIcon("mine.gif");}publicvoidlayMinesForBlock(Blockblock[][],intmineCount){introw=block.length;intcolumn=block[0].length;LinkedList<Block>list=newLinkedList<Block>();for(inti=0;i<row;i++){for(intj=0;j<column;j++)list.add(block[i][j]);}while(mineCount>0){intsize=list.size();//list返回节点的个数intrandomIndex=(int)(Math.random()*size);Blockb=list.get(randomIndex);b.setIsMine(true);b.setName("雷");b.setMineIcon(mineIcon);list.remove(randomIndex);//list删除索引值为randomIndex的节点mineCount--;}for(inti=0;i<row;i++){for(intj=0;j<column;j++){if(block[i][j].isMine()){block[i][j].setIsOpen(false);block[i][j].setIsMark(false);}else{intmineNumber=0;for(intk=Math.max(i-1,0);k<=Math.min(i+1,row-1);k++){for(intt=Math.max(j-1,0);t<=Math.min(j+1,column-1);t++){if(block[k][t].isMine())mineNumber++;}}block[i][j].setIsOpen(false);block[i][j].setIsMark(false);block[i][j].setName(""+mineNumber);block[i][j].setAroundMineNumber(mineNumber);}}}}}附录6:importjava.io.*;importjava.util.*;importjavax.swing.*;importjava.awt.event.*;importjava.awt.*;publicclassRecordextendsJDialogimplementsActionListener{inttime=0;Stringgrade=null;Stringkey=null;Stringmessage=null;JTextFieldtextName;JLabellabel=null;JButton确定,取消;publicRecord(){setTitle("记录你的成绩");this.time=time;this.grade=grade;setBounds(100,100,240,160);setResizable(false);setModal(true);确定=newJButton("确定");取消=newJButton("取消");textName=newJTextField(8);textName.setText("匿名");确定.addActionListener(this);取消.addActionListener(this);setLayout(newGridLayout(2,1));label=newJLabel("您现在是...高手,输入您的大名上榜");add(label);JPanelp=newJPanel();p.add(textName);p.add(确定);p.add(取消);add(p);setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);}publicvoidsetGrade(Stringgrade){this.grade=grade;label.setText("您现在是"+grade+"高手,输入您的大名上榜");}publicvoidsetTime(inttime){this.time=time;}publicvoidactionPerformed(ActionEvente){if(e.getSource()==确定){message=grade+"#"+time+"#"+""+textName.getText();key=grade;writeRecord(key,message);setVisible(false);}if(e.getSource()==取消){setVisible(false);}}publicvoidwriteRecord(Stringkey,Stringmessage){Filef=newFile("英雄榜.txt");try{FileInputStreamin=newFileInputStream(f);ObjectInputStreamobject_in=newObjectInputStream(in);Hashtablehashtable=(Hashtable)object_in.readObject();object

温馨提示

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

评论

0/150

提交评论