1、 10信计2011-2012 (二)Java程序设计课程设计设计题目 Java 扫雷游戏课程设计 设计时间 2012.6.18 至 2012.6.24 学生姓名 卢浩洋 学生学号 20100405130 所在班级 10 信计(1)班 指导教师 刘 风 华 徐州工程学院数学与物理科学学院成 绩徐 州 工 程 学 院 课 程 设 计 报 告摘要扫雷游戏最初是由微软公司 xp 系统自带的一种小游戏,整个游戏界面简单而且容易操作,深受各位玩家的喜爱。这个游戏一共分为 4 个等级,分别为初级、中级、高级和超高级等几个等级,在代码中定义了一个公共函数 public void 级别雷布局(int row1,
2、int co1,int 雷数 1),各种级别的实现只需要改变实参的大小就能实现级别的差异,操作简单,节省了大量的代码,加快了程序的运行速度。扫雷的整体布局采用了 GridLayout 布局,整体布局都是用 JButton 按钮组成,再分别设置 MouseListener 监视器,分别通过鼠标左键或者右键对其进行控制。通过继承 JFrame 窗口来进行窗口的实现。并且通过 public void 创建图形界面()方法来实现窗口的其他布局。雷数的判断是采用八个 if( )语句对周围八个按钮进行判断,并调用相应雷数的图片显示在该按钮上,对于周围无雷地按钮,也将会使用八个 if( )语句,把其周围的八
3、个雷给翻开。最后在插旗的控制上,采用对每一个按钮添加一个 flag 变量,来对自己进行加锁与解锁,如果一旦该按钮加了锁,再左击该按钮将不会有任何反应,只有解锁后才能将其翻开。关键字 扫雷游戏;监视器;雷数;解锁 徐 州 工 程 学 院 课 程 设 计 报 告目 录1 需求分析 11.1 扫雷游戏概述 .11.2 扫雷的操作方法 .11.3 扫雷游戏的基本规则 .11.4 有背景音乐支持 .11.5 游戏的帮助 .12 设计方法及设计方案 22.1 扫雷的整体布局 22.2 雷区的整体设置 22.3 音效的设置 23 系统设计 .33.1 模块设计 .33.2 雷区布局设计 34 系统的开发和运
4、行环境及安装配置说明 .44.1 系统开发和运行环境 .44.2 安装配置说明 .45 系统实现 .55.1 代码分析 55.1.1 主类中成员变量的管理 .55.1.2 成员方法 .55.2 运行结果的代码实现 .66 总结与心得体会 10参考文献 11附录 12徐 州 工 程 学 院 课 程 设 计 报 告1需求分析1.1.扫雷游戏概述扫雷游戏,是 Windows 操作系统自带的一款经典游戏。其规则简单,上手容易,不论男女老少皆可娱乐。扫雷的目的就是要把所有非地雷的格子揭开即胜利。踩到地雷格子就算失败。扫雷是一款非常经典的游戏,到现在为止还是有许多人玩这款游戏。扫雷游戏过程就是排除布在面板
5、上的所有地雷,在左击面板上按钮的时候,可能有三种情况出现:1.点的是地雷,游戏挑战失败,2.点的是空白区域,将会将周围的一些按钮炸开,3.点的那个按钮有数字,那数字是显示,该按钮周围八个按钮中有多少个地雷。1.2.扫雷的操作方法游戏主区域由很多个方格组成。使用鼠标随机点击一个方格,方格即被打开并显示出方格中的数字;方格中数字则表示其周围的 8 个方格隐藏了几颗雷;如果点开的格子为空白格,即其周围有 0 颗雷,则其周围格子自动打开。例如,方格中出现 1,说明上下左右及斜角合计有一颗雷,依次类推,2 则有 2 颗,3 则有 3 颗。在确实是地雷的方格上点了旗子,就安全了,不是地雷的被点了旗子,后面
6、会被炸死。在不确定是否是地雷的方格上用右键标示“?“符号,表示怀疑这个格子是地雷。这样格子在自动打开时,被标示的格子就不会被打开,导致游戏结束。1.3.扫雷游戏的基本规则在游戏中,当玩家不小心踩到地雷格子就算失败。而当地雷计数器中的数字变成 0 时,说明地雷全部被查到,游戏结束,玩家胜利。1.4.有背景音乐支持在游戏中,我添加了适当的背景音乐以便扫雷的时候能够轻松应对,另外,我还在碰到雷区的时候能够以音乐的时候提示。1.5.游戏的帮助在游戏界面中需要提供游戏使用说明等帮助提示,以方便对本游戏不了解的玩家对游戏进行操作和使用。徐 州 工 程 学 院 课 程 设 计 报 告22.设计方法及设计方案
7、2.1.扫雷的整体布局系统的整体布局为:BordLayout 布局, 总共设置了 4 个面板 JPanel,其中有两个 P1,P3 一起嵌套在 P 面板中,在 P 面板中设置了 BordLayout 布局,接下来就是扫雷区的整体布局,采用了 GridLayout 布局,在上面依次添加了n*nd 的按钮构成了扫雷的重要组成部分。(1).开始一栏:其中有开局、暂停、继续、退出、初级、中级、高级、超高级、自定义、标记、颜色、声音、打雷英雄榜、开局。定义了Jmenu,JmenuBar,JmenuItem,之后分别将选项一次添加即可。对可选项里面的每一项分别设置监视器来监控 ActionEvent 事件
8、。(2)帮助一栏:目录、查找帮组主题、使用帮助、关于扫雷(3)暂停:暂停,通过新建一个线程 Thread,调用 stop()方法停止。(4)继续:继续开始线程,根据判断条件重新调用 run()方法。(5)退出:退出,通过实现 WindowApater 适配器中的方法 windowclosing()来完成界面退出界面。2.2.雷区的整体设置在整个代码设置中总共用到了两个类,分别是 public class 扫雷程序和实现鼠标接口的 NormoreMouseEvent 类,其中 NormoreMouseEvent 类的作用就是控制鼠标点击按钮是能触发的事件。主要的雷区的布局就掌握在“扫雷程序”这个
9、类上面。2.3.音效的设计AudioStream 是 sun.audio.AudioPlayer 包中一个流类; AudioPlayer 是sun.audio.AudioPlayer 包中的一个类。通过构造音效声音方法,在“扫雷程序”主类中,通过 ActionListener 来监视是否已开始游戏,来决定播放计时声,之后又通过 ActionListener 来监视是否踩到雷和是否完成来决定,播放相应的音乐。徐 州 工 程 学 院 课 程 设 计 报 告33.系统设计3.1.模块设计总体模块图3.2.雷区布局设计开始开始定义并初始化M i n e G r i d 类获取相应的设置 , 并为方块产
10、生随机数字赋值计数器数小于等级雷数存放赋值雷区 , 计数器加 1鼠标是否点击处理周围信息 ,并显示相应效果YNYN雷区设计流程图徐 州 工 程 学 院 课 程 设 计 报 告44.系统的开发和运行环境及安装配置说明4.1 系统的开发和运行环境该程序代码的实现可以通过专门的 java 编译运行软件来编译运行如 TextPad等,也可以用命令行窗口进行编译,输入 javac 类名.java 以及 java 类名即可。如果是 Applet 小程序,则必须要在浏览器窗口下执行,当然这个前提是要安装java 软件即可(必须要改变环境变量 Path 和 classPath 来设置文件编译的默认路径) 。4
11、.2. 安装配置说明首先先下 Java(TM)SE Development Kit 6 Update 17.exe 安装到 C java母目录下然后右击我的电脑 属性 高级环境变量在下面的窗口新建变量名 JAVA_HOME 变量值 C:Javajdk1.6.0_17(这一目录是你 JDK 的路径名你如果装的版本不同就用你)然后在找到一个叫 Path 的变量名 把里面的全删了换成这个 或者也可以在前面加上去 记着有分号结尾 C:Javajdk1.6.0_17bin;如果要学 JAVA 这个是不够的 还要去下个 Eclipse 这个工具很强大 不过前面的 JDK是一定要装的 不然有这个工具也不能编
12、译。徐 州 工 程 学 院 课 程 设 计 报 告55.系统实现5.1代码分析5.1.1.主类中成员变量的管理(1).布尔变量 boo,boo1:boo 控制一开始问题对话框的弹出,boo1 主要是控制背景音乐的播放与否。(2).JButton 按钮;JButton 按钮组:JButton 按钮主要是开始笑脸的控制,Jbutton按钮组数组主要是在构造整个 GridLayout 布局时构建的按钮数组,充当雷区的布局。(3).JLabel 标签 1;JLabel 标签 2;JLabel 标签 3:JLabel 标签 1 主要是时刻提示各种级别的雷数的控制;JLabel 标签 2 主要是在整个游戏
13、中控制时间的流程;JLabel 标签 3 主要充当是提示输赢情况。(4).Timer timer;timer 是一个线程变量,控制整个游戏中时间的状况,是判断一个人游戏能力的重要指标。(5).Int row;int col=9;控制按钮个数(6).int 雷数,int b;:控制各个级别中雷数的个数。(7)int a:int a1;:对于雷区的布局有着很重要的作用。(8).JPanel p,p1,p2,p3:四个面板主要是将布局布置的美观。5.1.2.成员方法(1).public 扫雷程序(String s):这个方法是类的构造方法,有着 awt 界面的各种属性功能以及一些内部的各种布局所需要
14、的内容,是一个程序的必不可少的一部分。(2).public static void main(String args):该方法是每一个程序的最总要的核心方法,创建了窗口对象,并且设置了一个 AudioPlayer 对象,来实现对背景音乐的控制。(3).public void 创建图形界面():主要是充当创建图形见面的功能,里面新建了各种 Jmenu 对象并且创建了面板 p2 中的按钮,实现雷区布局(4).public void out(int a,JButton 按钮组,ActionEvent e,int i,int x,int y):主要是对整个扫雷的思想的整个算法,完整实现了该游戏九宫图的
15、思想,并且对雷区的布局进行了详细的设置。(5).public void 级别雷布局(int row1,int col1,int 雷数 1):这个方法是徐 州 工 程 学 院 课 程 设 计 报 告6对各种级别即初级、中级、高级、超高级的实现的一个公共方法,实现对级别的控制只需要传递相应的参数即可。(6).public void actionPerformed(ActionEvent e):是“扫雷程序”类实现的 ActionListener 接口中的方法。当用户单击“按钮组”中的某个方块时,actionPerformed(ActionEvent)方法负责执行有关算法,例如,当用鼠标左键单击方块
16、上的按钮后,若该方块下有雷,actionPerformed(ActionEvent)方法将使结束本局的游戏,若该方块下无雷,actionPerformed(ActionEvent)方法将显示 blockView 对象中的标签,该标签上是一个数字,该数字代表当前方块的周围的 8 个方块中共有多少颗雷。(7).public void mouseClicked(MouseEvent e):方法是 NormoreMouseEvent类实现的 MouseListener 接口中的方法,当用户按下鼠标有件事mousePressed(MouseEvent)方法负责让方块上显示一个探雷标记。5.2 运行结果的
17、代码实现(运行一开始的界面)徐 州 工 程 学 院 课 程 设 计 报 告7(游戏的级别选择)(中级的界面)徐 州 工 程 学 院 课 程 设 计 报 告8(高级的界面)(超高级的界面)徐 州 工 程 学 院 课 程 设 计 报 告9(失败后的界面)徐 州 工 程 学 院 课 程 设 计 报 告106.总结与心得体会通过这个扫雷游戏,我学到了许多在课本上学不到的知识并且也把课本上的知识结合运用了起来,自己的能力也有了一定程度的提高。我同时也领悟到了其中的编程的乐趣所在。当然我也遇到了一些问题,虽然是很小的问题,但可以提高自己编程的能力,而且还可以培养自己编程的严谨性,同时还可以为以后的编程积累
18、经验。编写完这个扫雷游戏,我发现自己有很多的不足,我想如果让我来单独来编写这个游戏,我感觉很困难,因为这个游戏涉及到好多算法。感触最深的就是我们真的要扎扎实实的打基础!并且我感觉到只要我们自己肯下功夫学习,我们也可以做出很好的东西,不需要每次都抄袭别人的,只有自己的才是最珍贵的!这次课程设计通过把枯燥的的课本知识变得生动有趣,激发了学习的积极性。把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。现在通过自己动手做实验,从实践上认识了操作系统是如何处理命令的,课程设计中程序比较复杂,在调试时应该仔细。 虽然在过程当中我花了很多的精力和时间,
19、但是我的 java 编程能力有了一定程度的提高,我相信再加以一定的努力,我一定会学的更好。徐 州 工 程 学 院 课 程 设 计 报 告11参考文献1 王浩. 获得客户需求的语言描述,清华大学出版社,2010-07-312 陈丹丹.Java 学习手册,北京中新伟业,2011 年 4 月3 David Brackeen.Java 游戏编程,北京希望电子出版社,2004.34 李志刚.由浅入深学 Java,电子工业出版社,2011 年 7 月徐 州 工 程 学 院 课 程 设 计 报 告12附录程序源代码:import java.awt.event.*;import java.awt.*;impo
20、rt javax.swing.*;import javax.swing.JOptionPane;import sun.audio.AudioPlayer;import sun.audio.AudioStream;import java.io.*;public class 扫雷程序 extends JFrame implements ActionListener boolean boo=true; static boolean boo1=true;JButton 按钮; JButton 按钮组;JLabel 标签 1; JLabel 标签 2; JLabel 标签 3;Timer timer;
21、int row=9; int col=9; int 雷数=10;int a; int b; int a1;JPanel p,p1,p2,p3;public 扫雷程序(String s)super(s);JLabel imgLabel = new JLabel();ImageIcon img = new ImageIcon(“2.jpg“); imgLabel.setIcon(img);imgLabel.setBounds(0, 0, img.getIconWidth(), img.getIconHeight(); (JPanel)getContentPane().setOpaque(false
22、);getLayeredPane().add(imgLabel, new Integer(Integer.MIN_VALUE); setSize(300,400);setBounds(400, 100, 400, 500);addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)System.exit(0); );timer =new Timer(1000,this);a = new introw+2col+2;创建图形界面();setVisible(true);if(boo)String s1=
23、“请首先在游戏一栏里面选择级别“;JOptionPane.showMessageDialog(this,s1,“问题对话框“,JOptionPane.QUESTION_MESSAGE); public static void main(String args) int i=1;new 扫雷程序(“卢浩洋的扫雷程序“);徐 州 工 程 学 院 课 程 设 计 报 告13try if(boo1) FileInputStream fileau = new FileInputStream(“欢乐斗地主.wav“);AudioStream as = new AudioStream(fileau);Aud
24、ioPlayer.player.start(as);catch(Exception e)System.out.println(e);public void 创建图形界面() p3=new JPanel();b=雷数;JMenuBar menuBar=new JMenuBar();JMenu menu1=new JMenu(“游戏(G)“);JMenu menu2=new JMenu(“帮助(H)“);JMenu menu3=new JMenu(“暂停“);JMenu menu4=new JMenu(“继续“);JMenu menu5=new JMenu(“退出“);JMenuItem mi1=
25、new JMenuItem(“初级“);JMenuItem mi2 = new JMenuItem(“中级“);JMenuItem mi3 =new JMenuItem(“高级“);JMenuItem mi31 =new JMenuItem(“超高级“);JMenuItem mi4 =new JMenuItem(“自定义“);JMenuItem mi5 =new JMenuItem(“标记“);JMenuItem mi6 =new JMenuItem(“颜色“);JMenuItem mi7 =new JMenuItem(“声音“);JMenuItem mi8 =new JMenuItem(“打
26、雷英雄榜“);JMenuItem mi9 =new JMenuItem(“退出“);JMenuItem mi10 =new JMenuItem(“开局“);JMenuItem mi11 =new JMenuItem(“目录“);JMenuItem mi12 =new JMenuItem(“查找帮助主题“);JMenuItem mi13 =new JMenuItem(“使用帮助“);JMenuItem mi14 =new JMenuItem(“关于扫雷“);menu1.add(mi10);mi1.addActionListener(this);menu1.add(mi1);mi2.addActi
27、onListener(this);menu1.add(mi2);mi3.addActionListener(this);mi31.addActionListener(this);menu1.add(mi3);menu1.add(mi31);menu1.add(mi4);menu1.add(mi5);menu1.add(mi6);menu1.add(mi7);menu1.add(mi8);menu1.add(mi9);menu5.add(mi9);徐 州 工 程 学 院 课 程 设 计 报 告14menu2.add(mi11);menu2.add(mi12);menu2.add(mi13);me
28、nu2.add(mi14);mi9.addActionListener(this);menuBar.add(menu1);menuBar.add(menu2);menuBar.add(menu3);menuBar.add(menu4);menuBar.add(menu5);p3.add(menuBar);标签 1=new JLabel(“一共有“+雷数+“颗雷数“);a1=new int雷数;ImageIcon icon=new ImageIcon(“1.jpg“);/加入笑脸图像按钮=new JButton(icon);按钮.addActionListener(this);java.util
29、.Date date=new java.util.Date();String str=date.toString().substring(11,19);标签 2=new JLabel(“时间“+str);标签 3=new JLabel(“);按钮组=new JButtonrow*col;p=new JPanel();p.setLayout(new BorderLayout();add(p);p1=new JPanel();p1.add(标签 1);p1.add(按钮);p1.add(标签 2);p1.add(标签 3);p.add(p3,BorderLayout.NORTH);p.add(p1,BorderLayout.CENTER);p2=new JPanel();GridLayout grid=new GridLayout(row,col);p2.setLayout(grid);for(int i=0;i-1elset+;标签 2.setText(t+“);for(int i=0;i雷数)标签 1.setText(雷数+“); else标签 1.setText(b+“); 按钮组i.setEnabled(true);