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

下载本文档

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

文档简介

徐州工程学院课程设计报告 成 绩10信计2011-2012(二)Java程序设计课程设计设计题目 Java扫雷游戏课程设计 设计时间 2012.6.18 至 2012.6.24 学生姓名 卢浩洋 学生学号 20100405130 所在班级 10信计(1)班 指导教师 刘 风 华 徐州工程学院数学与物理科学学院摘要扫雷游戏最初是由微软公司xp系统自带的一种小游戏,整个游戏界面简单而且容易操作,深受各位玩家的喜爱。这个游戏一共分为4个等级,分别为初级、中级、高级和超高级等几个等级,在代码中定义了一个公共函数public void 级别雷布局(int row1,int co1,int 雷数1),各种级别的实现只需要改变实参的大小就能实现级别的差异,操作简单,节省了大量的代码,加快了程序的运行速度。扫雷的整体布局采用了GridLayout布局,整体布局都是用JButton按钮组成,再分别设置MouseListener监视器,分别通过鼠标左键或者右键对其进行控制。通过继承JFrame窗口来进行窗口的实现。并且通过public void 创建图形界面()方法来实现窗口的其他布局。雷数的判断是采用八个if( )语句对周围八个按钮进行判断,并调用相应雷数的图片显示在该按钮上,对于周围无雷地按钮,也将会使用八个if( )语句,把其周围的八个雷给翻开。最后在插旗的控制上,采用对每一个按钮添加一个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系统的开发和运行环境及安装配置说明44.1 系统开发和运行环境44.2 安装配置说明45系统实现55.1代码分析55.1.1 主类中成员变量的管理55.1.2 成员方法55.2 运行结果的代码实现66总结与心得体会10参考文献11附录12徐州工程学院课程设计报告需求分析1.1.扫雷游戏概述扫雷游戏,是Windows操作系统自带的一款经典游戏。其规则简单,上手容易,不论男女老少皆可娱乐。扫雷的目的就是要把所有非地雷的格子揭开即胜利。踩到地雷格子就算失败。扫雷是一款非常经典的游戏,到现在为止还是有许多人玩这款游戏。扫雷游戏过程就是排除布在面板上的所有地雷,在左击面板上按钮的时候,可能有三种情况出现:1.点的是地雷,游戏挑战失败,2.点的是空白区域,将会将周围的一些按钮炸开,3.点的那个按钮有数字,那数字是显示,该按钮周围八个按钮中有多少个地雷。1.2.扫雷的操作方法游戏主区域由很多个方格组成。使用鼠标随机点击一个方格,方格即被打开并显示出方格中的数字;方格中数字则表示其周围的8个方格隐藏了几颗雷;如果点开的格子为空白格,即其周围有0颗雷,则其周围格子自动打开。例如,方格中出现1,说明上下左右及斜角合计有一颗雷,依次类推,2则有2颗,3则有3颗。在确实是地雷的方格上点了旗子,就安全了,不是地雷的被点了旗子,后面会被炸死。在不确定是否是地雷的方格上用右键标示?符号,表示怀疑这个格子是地雷。这样格子在自动打开时,被标示的格子就不会被打开,导致游戏结束。1.3.扫雷游戏的基本规则在游戏中,当玩家不小心踩到地雷格子就算失败。而当地雷计数器中的数字变成0时,说明地雷全部被查到,游戏结束,玩家胜利。1.4.有背景音乐支持在游戏中,我添加了适当的背景音乐以便扫雷的时候能够轻松应对,另外,我还在碰到雷区的时候能够以音乐的时候提示。1.5.游戏的帮助在游戏界面中需要提供游戏使用说明等帮助提示,以方便对本游戏不了解的玩家对游戏进行操作和使用。2.设计方法及设计方案2.1.扫雷的整体布局系统的整体布局为:BordLayout布局, 总共设置了4个面板JPanel,其中有两个P1,P3一起嵌套在P面板中,在P面板中设置了BordLayout布局,接下来就是扫雷区的整体布局,采用了GridLayout布局,在上面依次添加了n*nd的按钮构成了扫雷的重要组成部分。 (1).开始一栏:其中有开局、暂停、继续、退出、初级、中级、高级、超高级、自定义、标记、颜色、声音、打雷英雄榜、开局。定义了Jmenu,JmenuBar,JmenuItem,之后分别将选项一次添加即可。对可选项里面的每一项分别设置监视器来监控ActionEvent事件。(2)帮助一栏:目录、查找帮组主题、使用帮助、关于扫雷(3)暂停:暂停,通过新建一个线程Thread,调用stop()方法停止。(4)继续:继续开始线程,根据判断条件重新调用run()方法。(5)退出:退出,通过实现WindowApater适配器中的方法windowclosing()来完成界面退出界面。2.2.雷区的整体设置 在整个代码设置中总共用到了两个类,分别是public class 扫雷程序和实现鼠标接口的NormoreMouseEvent类,其中NormoreMouseEvent类的作用就是控制鼠标点击按钮是能触发的事件。主要的雷区的布局就掌握在“扫雷程序”这个类上面。2.3.音效的设计AudioStream是sun.audio.AudioPlayer包中一个流类; AudioPlayer是sun.audio.AudioPlayer包中的一个类。通过构造音效声音方法,在“扫雷程序”主类中,通过ActionListener来监视是否已开始游戏,来决定播放计时声,之后又通过ActionListener来监视是否踩到雷和是否完成来决定,播放相应的音乐。3.系统设计3.1.模块设计 总体模块图3.2.雷区布局设计雷区设计流程图4.系统的开发和运行环境及安装配置说明4.1系统的开发和运行环境 该程序代码的实现可以通过专门的java编译运行软件来编译运行如TextPad等,也可以用命令行窗口进行编译,输入javac 类名.java以及java 类名即可。如果是Applet小程序,则必须要在浏览器窗口下执行,当然这个前提是要安装java软件即可(必须要改变环境变量Path和classPath来设置文件编译的默认路径)。4.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是一定要装的 不然有这个工具也不能编译。5.系统实现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主要是在整个游戏中控制时间的流程;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界面的各种属性功能以及一些内部的各种布局所需要的内容,是一个程序的必不可少的一部分。(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):主要是对整个扫雷的思想的整个算法,完整实现了该游戏九宫图的思想,并且对雷区的布局进行了详细的设置。(5).public void 级别雷布局(int row1,int col1,int 雷数1):这个方法是对各种级别即初级、中级、高级、超高级的实现的一个公共方法,实现对级别的控制只需要传递相应的参数即可。(6).public void actionPerformed(ActionEvent e):是“扫雷程序”类实现的ActionListener接口中的方法。当用户单击“按钮组”中的某个方块时,actionPerformed(ActionEvent)方法负责执行有关算法,例如,当用鼠标左键单击方块上的按钮后,若该方块下有雷,actionPerformed(ActionEvent)方法将使结束本局的游戏,若该方块下无雷,actionPerformed(ActionEvent)方法将显示blockView对象中的标签,该标签上是一个数字,该数字代表当前方块的周围的8个方块中共有多少颗雷。(7).public void mouseClicked(MouseEvent e):方法是NormoreMouseEvent类实现的MouseListener接口中的方法,当用户按下鼠标有件事mousePressed(MouseEvent)方法负责让方块上显示一个探雷标记。5.2运行结果的代码实现(运行一开始的界面)(游戏的级别选择)(中级的界面)(高级的界面)(超高级的界面)(失败后的界面)6.总结与心得体会通过这个扫雷游戏,我学到了许多在课本上学不到的知识并且也把课本上的知识结合运用了起来,自己的能力也有了一定程度的提高。我同时也领悟到了其中的编程的乐趣所在。当然我也遇到了一些问题,虽然是很小的问题,但可以提高自己编程的能力,而且还可以培养自己编程的严谨性,同时还可以为以后的编程积累经验。编写完这个扫雷游戏,我发现自己有很多的不足,我想如果让我来单独来编写这个游戏,我感觉很困难,因为这个游戏涉及到好多算法。感触最深的就是我们真的要扎扎实实的打基础!并且我感觉到只要我们自己肯下功夫学习,我们也可以做出很好的东西,不需要每次都抄袭别人的,只有自己的才是最珍贵的!这次课程设计通过把枯燥的的课本知识变得生动有趣,激发了学习的积极性。把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。现在通过自己动手做实验,从实践上认识了操作系统是如何处理命令的,课程设计中程序比较复杂,在调试时应该仔细。 虽然在过程当中我花了很多的精力和时间,但是我的java编程能力有了一定程度的提高,我相信再加以一定的努力,我一定会学的更好。参考文献1 王浩. 获得客户需求的语言描述,清华大学出版社,2010-07-312 陈丹丹.Java学习手册,北京中新伟业,2011年4月3 David Brackeen.Java游戏编程,北京希望电子出版社,2004.34 李志刚.由浅入深学Java,电子工业出版社,2011年7月附录程序源代码:import java.awt.event.*;import java.awt.*;import 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; 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); 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=请首先在游戏一栏里面选择级别;JOptionPane.showMessageDialog(this,s1,问题对话框,JOptionPane.QUESTION_MESSAGE); public static void main(String args) int i=1;new 扫雷程序(卢浩洋的扫雷程序); try if(boo1) FileInputStream fileau = new FileInputStream(欢乐斗地主.wav); AudioStream as = new AudioStream(fileau); AudioPlayer.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=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(打雷英雄榜); 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.addActionListener(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); menu2.add(mi11); menu2.add(mi12); menu2.add(mi13); menu2.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.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;irow*col;i+) 按钮组i=new JButton();按钮组i.setMargin(new Insets(0,0,0,0);按钮组i.setFont(new Font(隶书,Font.BOLD,30);按钮组i.addActionListener(this); 按钮组i.setBackground(Color.yellow);按钮组i.addMouseListener(new NormoreMouseEvent(); 按钮组i.setSize(3,4);p2.add(按钮组i);add(p,BorderLayout.NORTH); add(p2,BorderLayout.CENTER); public void out(int a,JButton 按钮组,ActionEvent e,int i,int x,int y) int p=1; if(axy=0) axy=10; 按钮组i.setEnabled(false); for(int l=y-1;l-1&n-1&mrow) for(int q=0;q=(m*col)&(n+col*q)-1&n-1&mcol) for(int q=0;q=(m*col)&(n+col*q)-1&n-1&mcol) for(int q=0;q=(m*col)&(n+col*q)-1&n-1&mcol)for(int q=0;q=(m*col)&(n+col*q)(m+1)*col)if(axy+1!=0&axy+1!=10)按钮组n+col*q.setText(axy+1+);axy+1=10;按钮组n+col*q.setEnabled(false);else if(axy+1=0)out(a,按钮组,e,n+col*q,x,y+1); axy+1=10;按钮组n+col*q.setEnabled(false);p=0; public void 级别雷布局(int row1,int col1,int 雷数1) row=row1;col=col1;雷数=雷数1;a1=new int雷数;b=雷数;a = new introw+2col+2;this.remove(p2);timer.stop();if(雷数=10) 标签1.setText(一共有+雷数+颗雷数);标签2.setText(0);标签3.setText(初级); else if(雷数=40) 标签1.setText(一共有+雷数+颗雷数);标签2.setText(0);标签3.setText(中级); else if(雷数=99) 标签1.setText(一共有+雷数+颗雷数);标签2.setText(0);标签3.setText(高级); else 标签1.setText(一共有+雷数+颗雷数);标签2.setText(0);标签3.setText(超高级);按钮组=new JButtonrow*col;p2=new JPanel();p2.setLayout(new GridLayout(row,col);for(int i=0;irow*col;i+) 按钮组i=new JButton( );按钮组i.setMargin(new Insets(0,0,0,0);按钮组i.setFont(new Font(null,Font.BOLD,30);按钮组i.addActionListener(this);按钮组i.addMouseListener(new NormoreMouseEvent(); if(雷数=10)按钮组i.setBackground(Color.yellow); else if(雷数=40)按钮组i.setBackground(Color.red); else if(雷数=9)按钮组i.setBackground(Color.cyan); else if(雷数=199)按钮组i.setBackground(Color.blue); p2.add(按钮组i);this.pack(); add(p2,BorderLayout.CENTER);for(int i=0;irow*col;i+) 按钮组i.setText( );按钮组i.setEnabled(true);for(int i=0;irow+2;i+)for(int j=0;jcol+2;j+)aij=0; public void actionPerformed(ActionEvent e) if(e.getActionCommand()=初级) 级别雷布局(9,9,10); else if(e.getActionCommand()=中级) 级别雷布局(16,16,40); else if(e.getActionCommand()=高级) 级别雷布局(16,32,99); else if(e.getActionCommand()=超高级) 级别雷布局(32,32,199); else if(e.getActionCommand()=退出) dispose(); if(e.getSource()=按钮) ImageIcon icon=new ImageIcon(1.jpg);/加入笑脸图像 按钮.setIcon(icon);timer.start();b=雷数;标签3.setText(开始计时);for(int i=0;irow*col;i+)按钮组i.setText();按钮组i.setEnabled(true);for(int i=0;irow+2;i+)for(int j=0;jcol+2;j+)aij=0;/产生随机数for(int i=0;i雷数;i+)int p=1;int m=(int)(Math.random()*row*col);while(p=1)int l=1;int j;for( j=0;ji&l=1;j+)if(a1j=m)m=(int)(Math.random()*row*col); l=0;if(j=i)a1i=m;p=0;标签1.setText(一共有+雷数+颗雷数);标签2.setText(0); for(int i=0;i雷数;i+)int x=(a1i/col+1); int y=(a1i%col+1);axy=100; for(int i=0;irow+2;i+) for(int j=0;jcol+2;j+) if(i=0|j=0|i=row+1|j=col+1)aij=0; for(int i=1;i=row;i+) for(int j=1;j=col;j+) if(aij!=100)for(int l=j-1;l=500)timer.stop(); else t+;标签2.setText(t+); for(int i=0;icol*row;i+) if(按钮组i.getText()!=#) int x=i/col+1; int y=i%col+1;

温馨提示

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

评论

0/150

提交评论