1、1成 绩 评 定 表学生姓名 班级学号 专 业 课程设计题目 基于 Java 的扫雷游戏软件设计评语组长签字:成绩日期 2014 年 月 日2课程设计任务书学 院 专 业学生姓名 班级学号课程设计题目 基于 Java 的扫雷游戏软件设计实践教学要求与任务:采用 java 技术设计扫雷游戏软件,设计要求如下:(1) 扫雷游戏风味初级、中级和高级三个级别,扫雷英雄榜存储每个级别的最好成绩,即挖出全部的地雷且用时最少者。单击游戏菜单可以选择“初级” 、“中级”和“高级”或“查看英雄榜” 。(2) 选择级别后将出现相应级别的扫雷区域,这时用户使用鼠标左键单击雷区中的任何一个方块便启动计时器。(3) 用
2、户要揭开摸个方块,可以单击它。若所揭方块下有雷,用户便输了这一局,若所揭方块下无雷,则显示一个数字,该数字代表方块的周围的 8 个方块中共有多少颗雷。(4) 如果用户认为某个方块下埋着雷,单击右键可以在方块上表示一个用户认为是雷的图标,即给出一个扫雷标记。用户每标记出一个扫雷标记(无论用户是否正确) ,程序将显示的剩余雷数减少一个。(5) 扫雷胜利后(用时最少者) ,程序将弹出保存成绩的对话框。工作计划与进度安排:第 19 周:布置课程设计任务,查阅资料,分组设计,程序调试。第 20 周:程序调试,编写课程设计报告,验收,答辩。指导教师:2014 年 月 日专业负责人:2014 年 月 日学院
3、教学副院长:2014 年 月 日3目 录1设计目的 - 42总体设计 - 42.1 设计需求 - 42.2 程序功能模块图 - 43关键技术 - 74程序流程 - 85主要源代码 - 86运行结果及结论 - 277参考文献 - 2941设计目的通过选择扫雷游戏软件设计,这个综合性的题目作为本次的课程设计。可以让我们更加熟悉Java 程序设计这门课程,学会熟练使用 Java 这个软件,加深对 Java 语言的掌握,提高编程水平。同时培养独立思考和同学间团结合作的能力,为毕业设计以及将来的工作打下坚实的基础。2总体设计2.1 设计需求在设计扫雷游戏时,需要编写7个源文件:MineGame.java
4、,MineArea.java,Block.java,BlockView.java,LayMines.java,ShowRecord.java,Record.java 除了这七个源文件外,还需要Java系统提供一些重要的类,如File,JButton和JLabel等类。2.2 程序功能模块图52.2 程序功能模块图2.2.1 MineGame.java(主类):成员变量bar 和 fileMenu 提供菜单操作,单击菜单操作中的选项为“初级” , “中级” , “高级”或“扫雷英雄榜” ;mineArea 是扫雷区域,提供有关雷的主要功能;英雄榜”负责存放三个级别的扫雷最好成绩;showHero
5、Record 负责显示英雄榜中的数据方法MineGame()是构造窗口,负责完成窗口的初始化。ActionPerformed(ActionEvent)方法是 MineGame 类实现的 ActionListener 接口中的方法,该方法负责执行菜单发出的有关命令。用户选择菜单中的菜单项可触发 ActionEvent 事件,导致actionPerformed(ActionEvent)方法执行相应的操作。Main(String)方法是程序运行的入口方法。2.2.2 MineArea.java:6成员变量block 和 Block 类型的数组,用来确定雷区有多少需进行扫雷的方块;blockView
6、是 BlockView 类型的数组,负责 block 数组中 Block 对象提供视图;lay 是 LayMines 类型的对象,负责设置 block 数组中的哪些方块不是雷;record 负责提供保存成绩的界面,是一个对话框,默认为不可见,用户只有扫雷成功后,才可以看见该对话框;reStart 是一个按钮对象,用户单击它重新开始游戏;time 是计时器对象,负责计算用户用时。方法initMineArea(int,int,int,int)方法可根据参数提供的数据设置雷区的宽度,高度,类的数目以及雷区的级别。actionPerformed(actionEvent)是 MineArea 类实现的
7、ActionListener 接口中的方法。当用户单击 blockView 中的某个方块时 actionPerformed(actionEvent)执行有关算法。Show()方法是一个递归方法,actionPerformed(actionEvent)方法执行将调用 show 方法进行扫雷。mousePressed(mouseEvent)方法是 MineArea 类实现的 MouseListener 接口中的方法,当用户按下鼠标右键时,mousePressed(mouseEvent)方法负责让方块上显示一个探雷标记。inquireWin()方法用来判断用户扫雷是否成功,如果成功该方法负责让 re
8、cord 对话框可见。2.2.3 Block.java:成员变量name 方块上的名字aroundMineNumber 是方块周围雷的数目mineIcon 是方块上雷的图标isMine 用来表示方块是否是雷isMark 用来表示方块是否被标记isOpen 用来表示方块是否被挖开方法setAroundMineNumber(int)方法用来设置 aroundMineNumber 的值;getAroundMineNumber()方法用来获取 aroundMineNumber 的值。2.2.4 BlockView.java成员变量blockNameOrIcon 用来显示 Block 对象的 name,
9、number 和 mineIcon 属性;blockCover 用来遮挡 blockNameOrIcon;card 卡片式布局。方法7giveView(Block block)方法给参数指定的 Block 对象提供视图;seeBlockNameOrIcon()方法让用户看见视图中的标签,无法看见按钮;seeBlockCover()方法让用户看见视图中的按钮,无法看见标签。2.2.5 LayMines.java:成员变量mineIcon 用来存放一个格式为 gif 的图像。方法layMinesForBlock(Block,int)方法对参数指定的 Block 数组进行设置,其中 int 参数指定
10、雷的数目。2.2.6 Record.java:成员变量textName 提供用户扫雷优胜者出入姓名;用户单击“确定”按钮,可以保存成绩。方法actionPerformed(ActionEvent)方法是 Record 类实现的 ActionListener 接口中的方法,当用户单击“确定”按钮后,该方法被执行,所执行的操作就是获取用户输入的名字和用时,然后调用writeRecord(String,String)方法将信息写入英雄榜中;writeRecord(String,String)负责将有关信息写入“英雄榜”文件。2.2.7 ShowRecord:成员变量file 存放文件的引用,用户单击
11、“显示成绩”按钮,可以查看各个级别的最好成绩;用户单击“重新计分”按钮,可以将“英雄榜”中的成绩恢复为初始值。方法actionPerformed(ActionEvent)方法是 ShowRecord 类实现的 ActionListener 接口中的方法,当用户单击“显示成绩”按钮后,该方法被执行,所执行的操作就是调用 readAndShow()方法;readAndShow()方法负责读取存放在文件中的各个级别的扫雷最好成绩以及扫雷者姓名,并显示这些相关信息。3关键技术3.1 实现窗口的初始化:利用 MineGame.java 实现MineGame()是构造窗口,负责完成窗口的初始化。Actio
12、nPerformed(ActionEvent)方法是 MineGame 类实现的 ActionListener 接口中的方法,该方法负责执行菜单发出的有关命令。用户选择菜单中的菜单项可触发 ActionEvent 事件,导致actionPerformed(ActionEvent)方法执行相应的操作。3.2 利用产生随机数的方法完成游戏中随机布雷的要求:利用 MineArea.java 实现initMineArea(int,int,int,int)方法可根据参数提供的数据设置雷区的宽度,高度,类的数目以及雷区的级别。8actionPerformed(actionEvent)是 MineArea
13、类实现的 ActionListener 接口中的方法。当用户单击 blockView 中的某个方块时 actionPerformed(actionEvent)执行有关算法。Show()方法是一个递归方法,actionPerformed(actionEvent)方法执行将调用 show 方法进行扫雷。mousePressed(mouseEvent)方法是 MineArea 类实现的 MouseListener 接口中的方法,当用户按下鼠标右键时,mousePressed(mouseEvent)方法负责让方块上显示一个探雷标记。inquireWin()方法用来判断用户扫雷是否成功,如果成功该方法负
14、责让 record 对话框可见。4程序流程941 程序流程图打开程序后点重新开始,游戏定义并初始化,用户开始进行游戏,计数器开始统计用户点击次数并记录,判断用户是否中雷,否继续游戏,是结束游戏并处理结果5主要源代码import java.awt.event.*;import java.awt.*;import javax.swing.*;import javax.swing.border.*;import java.util.*;import java.io.*;public class MineGame extends JFrame implements ActionListener10JM
15、enuBar bar;JMenu fileMenu;JMenuItem 初级,中级,高级,扫雷英雄榜;MineArea mineArea=null;File 英雄榜=new File(“英雄榜.txt“);Hashtable hashtable=null;ShowRecord showHeroRecord=null;MineGame()mineArea=new MineArea(16,16,40,1);add(mineArea,BorderLayout.CENTER);bar=new JMenuBar();fileMenu=new JMenu(“游戏“);初级=new JMenuItem(“初
16、级“);中级=new JMenuItem(“中级“);高级=new JMenuItem(“高级“);扫雷英雄榜=new JMenuItem(“扫雷英雄榜“); fileMenu.add(初级);fileMenu.add(中级);fileMenu.add(高级);fileMenu.add(扫雷英雄榜);bar.add(fileMenu);setJMenuBar(bar);初级.addActionListener(this);中级.addActionListener(this);高级.addActionListener(this);扫雷英雄榜.addActionListener(this);has
17、htable=new Hashtable();hashtable.put(“初级“,“初级#“+999+“#匿名“); hashtable.put(“中级“,“中级#“+999+“#匿名“);hashtable.put(“高级“,“高级#“+999+“#匿名“);if(!英雄榜.exists() 11try FileOutputStream out=new FileOutputStream(英雄榜);ObjectOutputStream objectOut=new ObjectOutputStream(out);objectOut.writeObject(hashtable);objectOu
18、t.close();out.close();catch(IOException e)showHeroRecord=new ShowRecord(this,hashtable);setBounds(100,100,280,380);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);validate();public void actionPerformed(ActionEvent e)if(e.getSource()=初级)mineArea.initMineArea(8,8,10,1);setBounds(100,10
19、0,200,280); if(e.getSource()=中级)mineArea.initMineArea(16,16,40,2);setBounds(100,100,280,380);if(e.getSource()=高级)mineArea.initMineArea(22,22,99,3);setBounds(100,100,350,390);if(e.getSource()=扫雷英雄榜) if(showHeroRecord!=null)showHeroRecord.setVisible(true);12validate();public static void main(String ar
20、gs)new MineGame();import java.awt.*;import java.awt.event.*;import javax.swing.*;public class MineArea extends JPanel implements ActionListener,MouseListenerJButton reStart;Block block;BlockView blockView;LayMines lay;int row,colum,mineCount,markMount;/雷区的行数、列数以及地雷个数和用户给出的标记数ImageIcon mark;int grade
21、; JPanel pCenter,pNorth;JTextField showTime,showMarkedMineCount; /显示用时以及标记数Timer time; /计时器int spendTime=0;Record record;public MineArea(int row,int colum,int mineCount,int grade) reStart=new JButton(“重新开始“);mark=new ImageIcon(“mark.gif“); /探雷标记time=new Timer(1000,this);showTime=new JTextField(5);sh
22、owMarkedMineCount=new JTextField(5);showTime.setHorizontalAlignment(JTextField.CENTER);showMarkedMineCount.setHorizontalAlignment(JTextField.CENTER);13showMarkedMineCount.setFont(new Font(“Arial“,Font.BOLD,16);showTime.setFont(new Font(“Arial“,Font.BOLD,16); pCenter=new JPanel();pNorth=new JPanel();
23、lay=new LayMines(); initMineArea(row,colum,mineCount,grade); /初始化雷区,见下面的 LayMines()reStart.addActionListener(this);pNorth.add(showMarkedMineCount);pNorth.add(reStart);pNorth.add(showTime);setLayout(new BorderLayout();add(pNorth,BorderLayout.NORTH);add(pCenter,BorderLayout.CENTER);public void initMin
24、eArea(int row,int colum,int mineCount,int grade)pCenter.removeAll();spendTime=0;markMount=mineCount;this.row=row;this.colum=colum;this.mineCount=mineCount; this.grade=grade; block=new Blockrowcolum;for(int i=0;i0blockmn.setIsOpen(true);return;else if(blockmn.getAroundMineNumber()=0blockmn.setIsOpen(
25、true);for(int k=Math.max(m-1,0);k=1)blockNameOrIcon.setText(“+n);elseblockNameOrIcon.setText(“ “);public void seeBlockNameOrIcon()card.show(this,“view“);validate();public void seeBlockCover()card.show(this,“cover“);validate();public JButton getBlockCover()return blockCover; import java.util.*;import
26、 javax.swing.*;21public class LayMines ImageIcon mineIcon; LayMines() mineIcon=new ImageIcon(“mine.gif“);public void layMinesForBlock(Block block,int mineCount)int row=block.length;int column=block0.length;LinkedList list=new LinkedList(); for(int i=0;i0)int size=list.size(); / list 返回节点的个数int rando
27、mIndex=(int)(Math.random()*size);Block b=list.get(randomIndex);b.setIsMine(true);b.setName(“雷“);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);el
28、se int mineNumber=0;22for(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); import java.io.*;
29、import java.util.*;import javax.swing.*;import java.awt.event.*;import java.awt.*;public class Record extends JDialog implements ActionListenerint time=0;String grade=null;String key=null;String message=null;JTextField textName; JLabel label=null; JButton 确定,取消;public Record()setTitle(“记录你的成绩“);this
30、.time=time; 23this.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);setLayout(new GridLayout(2,1);label=new JLabel(“您现在是.高手,输入您的
31、大名上榜“);add(label);JPanel p=new JPanel();p.add(textName);p.add(确定);p.add(取消);add(p);setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);public void setGrade(String grade)this.grade=grade;label.setText(“您现在是“+grade+“高手,输入您的大名上榜“);public void setTime(int time)this.time=time;import java.io.*;import java.util
32、.*;import javax.swing.*;import java.awt.event.*;24import java.awt.*;public class ShowRecord extends JDialog implements ActionListenerFile file=new File(“英雄榜.txt“);String name=null;Hashtable hashtable=null;JButton 显示,重新记分;JLabel label 初级,label 中级,label 高级;public ShowRecord(JFrame frame,Hashtable h) s
33、etTitle(“扫雷英雄榜“);hashtable=h;setBounds(100,100,320,185);setResizable(false);setVisible(false);setModal(true); label 初级=new JLabel3;label 中级=new JLabel3;label 高级=new JLabel3;for(int i=0;i3;i+) label 初级i=new JLabel();label 初级i.setBorder(null);label 中级i=new JLabel();label 中级i.setBorder(null);label 高级i=
34、new JLabel();label 高级i.setBorder(null); label 初级0.setText(“初级“);label 初级1.setText(“+999); label 初级1.setText(“匿名“); label 中级0.setText(“中级“);label 中级1.setText(“+999); label 中级1.setText(“匿名“);25label 高级0.setText(“高级“);label 高级1.setText(“+999); label 高级1.setText(“匿名“); JPanel pCenter=new JPanel();pCente
35、r.setLayout(new GridLayout(3,3); for(int i=0;i3;i+)pCenter.add(label 初级i);for(int i=0;i3;i+)pCenter.add(label 中级i);for(int i=0;i3;i+)pCenter.add(label 高级i);pCenter.setBorder(BorderFactory.createTitledBorder(“扫雷英雄榜“); 显示=new JButton(“显示成绩“);重新记分=new JButton(“重新记分“);显示.addActionListener(this);重新记分.add
36、ActionListener(this);JPanel pSouth=new JPanel();pSouth.setLayout(new FlowLayout(FlowLayout.RIGHT);pSouth.add(重新记分);pSouth.add(显示);add(pCenter,BorderLayout.CENTER);add(pSouth,BorderLayout.SOUTH) ;public void readAndShow()try FileInputStream in=new FileInputStream(file);ObjectInputStream object_in=new
37、 ObjectInputStream(in);hashtable=(Hashtable)object_in.readObject();object_in.close();in.close(); String temp=(String)hashtable.get(“初级“);StringTokenizer fenxi=new StringTokenizer(temp,“#“);26label 初级0.setText(fenxi.nextToken();label 初级1.setText(fenxi.nextToken();label 初级2.setText(fenxi.nextToken();
38、temp=(String)hashtable.get(“中级“);fenxi=new StringTokenizer(temp,“#“);label 中级0.setText(fenxi.nextToken();label 中级1.setText(fenxi.nextToken();label 中级2.setText(fenxi.nextToken(); temp=(String)hashtable.get(“高级“);fenxi=new StringTokenizer(temp,“#“);label 高级0.setText(fenxi.nextToken();label 高级1.setText
39、(fenxi.nextToken();label 高级2.setText(fenxi.nextToken(); catch(Exception e)public void actionPerformed(ActionEvent e) if(e.getSource()=重新记分) hashtable.put(“初级“,“初级#“+999+“#匿名“);label 初级0.setText(“初级“);label 初级1.setText(“+999);label 初级2.setText(“匿名“); hashtable.put(“中级“,“中级#“+999+“#匿名“);label 中级0.setT
40、ext(“初级“);label 中级1.setText(“+999);label 中级2.setText(“匿名“);hashtable.put(“高级“,“高级#“+999+“#匿名“);label 高级0.setText(“初级“);label 高级1.setText(“+999);label 高级2.setText(“匿名“);try FileOutputStream out=new FileOutputStream(file);27ObjectOutputStream object_out=new ObjectOutputStream(out);object_out.writeObje
41、ct(hashtable);object_out.close();out.close();catch(IOException event)setVisible(false);if(e.getSource()=显示)readAndShow(); 6. 运行结果及结论286.1 运行过程296.2 运行界面307.参考文献1 Java 面向对象程序设计 清华大学出版社 董小园 2 Java2 实用教程(第三版) 清华大学出版社 耿祥义3 基于 MVC 的 Java Web 设计与开发. 电子工业出版社 孙卫琴4JAVA 语言与面向对象程序设计 清华大学出版社 印旻5 JavaApplet 实例编程 中国水利水电出版社 赤金、聂松编