java扫雷游戏课程设计报告-带有详细注释.doc_第1页
java扫雷游戏课程设计报告-带有详细注释.doc_第2页
java扫雷游戏课程设计报告-带有详细注释.doc_第3页
java扫雷游戏课程设计报告-带有详细注释.doc_第4页
java扫雷游戏课程设计报告-带有详细注释.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

高级语言程序设计(2)课程设计任务书题 目扫雷游戏程序学生姓名王大伟学号201001010117专业班级计算1001设计内容与要求【问题描述】整个扫雷游戏程序的整体布局为:CardLayout布局, 采用了菜单、按钮、面板等组件,菜单主要包括开始,选择级别,按钮的功能是重新开始新的游戏。【软件功能】1, 用户可以玩扫雷游戏并能自定义级别(初等,中等,高等)2, 具有计时功能,即显示用户完成移动盘子所花费的时间。【基本要求】 1,扫雷游戏分为初级、中级和高级三个级别。单击游戏菜单可以选择“初级”、“中级”和“高级”。2,选择级别后将出现相应级别的扫雷区域,这时用户使用鼠标左键单击“开始”便启动计时器。3,用户要揭开某个方块,可左键单击它。若所揭方块下有雷,用户便输了这一局,若所揭方块下无雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。4,如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。5,当用户点中雷时,将有“你输了”的提示出现,胜利时,将有“你赢了”的提示出现。6,源程序中要有充分的注释,报告中要有详细的流程图和文字材料。7,运行的结果以及图形用户界面要进行屏幕拷贝,插入报告中。【提交成果】 1“高级语言程序设计(2)课程设计任务书”和“高级语言程序设计(2)课程设计报告”打印件各一份; 2 先将上面两项内容的word文档,通过电子邮件交到指导教师,待许可后,打印装袋。起止时间指导教师签名系(教研室)主任签名学生签名任务书限定一页附:课程设计报告格式高级语言程序设计(2)课程设计报告专业 班级 学号 姓名(签名) 完成日期 指导教师(签名)1、 程序设计说明书【设计题目】 扫雷游戏程序【问题描述】 整个扫雷游戏程序的整体布局为:CardLayout布局, 采用了菜单、按钮、面板等组件,菜单主要包括开始,选择级别,按钮的功能是重新开始新的游戏。【软件功能】 用户可以玩扫雷游戏并能自定义级别(初等,中等,高等);具有计时功能,即显示用户完成移动盘子所花费的时间。【算法思想】 1,计算按钮周围雷数。2,随机分布。扫雷游戏要求在M行N列的网格游戏区随即的不上bon个雷,且bon的取值应小于M和N的乘积。这可以在一张M*N的网格上通过均匀分布的随即算法视线。其中bon的网格是雷区,剩下的网格是非雷区。游戏的目标是尽可能快地找到所有的雷区,而不踩到地雷。Java提供了视线随即算法的类Math,通过Math类的random()方法这可以很方便的实现随即布雷的功能。【类的设计】 (1)initMineArea(int,int,int,int)方法可根据参数提供的数据设置雷区的宽度、高度以及雷区的级别。(2)actionPerformed(ActionEvent)是MineArea类实现的ActionListener接口中的方法。当用户单击blockView中的某个方块时,actionPerformed(ActionEvent)方法负责执行有关算法,例如,当用鼠标左键单击方块上的按钮后,若该方块下有雷,actionPerformed(ActionEvent)方法将使用户输掉本局,若该方块下无雷,actionPerformed(ActionEvent)方法将显示blockView对象中的标签,该标签上是一个数字,该数字代表当前方块的周围的8个方块中共有多少颗雷。(3)show()方法是一个递归方法。actionPerformed(ActionEvent)方法执行时将调用show方法进行扫雷。(4)mousePressed(MouseEvent)方法是MineArea类实现的MouseListener接口中的方法,当用户按下鼠标有件事mousePressed(MouseEvent)方法负责让方块上显示一个探雷标记。(5)inquireWin()方法用来判断用户是否扫雷成功,如果成功该方法负责让record对话框可见。所谓扫雷成功是指不仅找到了全部的累而且用时最少。【用户界面】【程序技巧】运用二维数组来判断雷区的每一个按钮是否有雷。当单击blockView中的某个方块时,actionPerformed(ActionEvent)方法负责执行有关算法。当按下鼠标有件事mousePressed(MouseEvent)方法负责让方块上显示一个探雷标记。inquireWin()方法用来判断用户是否扫雷成功,如果成功该方法负责让record对话框可见。【模块划分及调用关系】开始 【模块流程图】 定义并初始化MineGrid类获取相应的设置,并为方块产生随即数字赋值 鼠标是否点击计数器数小于等级雷数 存放赋值雷区,计数器加1处理周围信息,并显示相应效果开始【运行说明】运用JDK环境下或eclipse运行。2、 程序上机调试报告【语法错误及其排除】1,不止一次忘记行程序后面的分号(;)导致程序运行时出现大量错误。2,程序后面的注释要加/,而多次忘记双斜杠或者直接写成单斜杠。3,if,else语句不是很熟悉导致了许多不该犯的错误。4,将=和=混淆,导致了不少语法错误。【算法错误及其排除】在设计排雷的过程中,一个雷区中的一个按钮的周围通常是八个相邻的按钮而不是四个,致使在程序算法设计的过程中没有充分考虑到,最后才加上。还有actionPerformed是MineArea类实现的ActionListener接口中的方法。当用户单击blockView中的某个方块时,actionPerformed(ActionEvent)方法负责执行有关算法,例如,当用鼠标左键单击方块上的按钮后,若该方块下有雷,actionPerformed(ActionEvent)方法将使用户输掉本局,若该方块下无雷,actionPerformed(ActionEvent)方法将显示blockView对象中的标签,该标签上是一个数字,该数字代表当前方块的周围的8个方块中共有多少颗雷。此方法开始运用不恰当,导致若方块下有雷,依然显示标签上的数字,最后运行检查的时候才发现错误,得以改正。3、 程序测试结果【输出结果】【收获及体会】这个扫雷游戏是完全模拟微软系统自带的扫雷游戏,所以难度是很大,必然在编程过程中也遇到很多问题,有些问题比较简单但就不知道错在哪里,有些大问题之道在哪就是不知道怎么办才好,后来经过自己的不断调试,这个扫雷游戏终于大功告成。经过编写这个扫雷游戏,我认识到应该注意细节问题,虽然是很小的问题,但可以提高自己编程的能力,而且还可以培养自己编程的严谨性,同时还可以为以后的编程积累经验。编写完这个扫雷游戏,我发现自己有很多的不足,我想如果让我来单独来编写这个游戏,我感觉能编出来的可能性很小,因为这个游戏涉及到好多算法。感触最深的就是我们真的要扎扎实实的打基础!并且我感觉到只要我们自己肯下功夫学习,我们也可以做出很好的东西,不需要每次都抄袭别人的,只有自己的才是最珍贵的!4、 源程序代码(注释)import java.awt.BorderLayout; /导入边框布局import java.awt.Container; /导入一个容器,也是一个组件,在这个容器里你可以添加其他awt的组件import java.awt.Font; /导入字形,字体import java.awt.GridLayout; /导入网格式布局import java.awt.Insets; / Insets 对象描述容器的边界区域。它指定一个容器在它的各个边界上应留出的空白区间。这个空白可以是一个边界,一个不显示区域或一个标题。import java.awt.event.ActionEvent; / ActionEvent是一个类,指示发生了组件定义的动作的语义事件。 import java.awt.event.ActionListener; / ActionListener用于接收操作事件的侦听器接口。继承自EventListener。import java.awt.event.MouseAdapter; /导入鼠标监听适配器,负责对鼠标事件进行监听import java.awt.event.MouseEvent; /接口import javax.swing.JButton;/导入按钮类import javax.swing.JFrame;/导入面板类import javax.swing.JLabel;/导入标签类import javax.swing.JMenu; /菜单import javax.swing.JMenuBar; /用来创建水平菜单栏import javax.swing.JMenuItem; /创建带有设置文本或图标的 JMenuItem 菜单项import javax.swing.JPanel; /面板import javax.swing.Timer; / 定时器,功能是在指定的时间间隔内反复触发指定窗口的定时器事件。 public class ScanLei1 extends JFrame implements ActionListener/扫雷类继承了JFrame实现了ActionListener接口private static final long serialVersionUID = 1L; / serialVersionUID 用来表明类的不同版本间的兼容性private Container contentPane; /内容面板,每一个JFrame对应一个内容面板,所有的组件应该置于内容面板之上private JButton btn; /声明一个按钮对象,开始按钮,对象名为btn,private的意思是把变量或方法声明成私有的,只有在本类中或本类实例可以访问,其他类不可以private JButton btns;/声明一个按钮数组 雷区的每一个雷都是一个按钮,所有按钮放置到该数组中private JLabel b1;/声明一个标签对象,该标签用于放置剩余的雷的个数private JLabel b2; /声明一个标签对象,该标签用于放置已经游戏的时间private JLabel b3; /声明一个标签对象,该标签用于放置游戏的结果private Timer timer;/声明一个定时器对象private int row=9; /行,用于指定雷区的行private int col=9; /列 用于指定雷区的列private int bon=10; /布雷的个数private int a;/声明一个int型的二维数组,二维数组的中元素,有以下含义,值为0说明该元素所对应的坐标所在的按钮既不是雷又不是周围有雷的按钮,如果是100,则说明该元素所对应的坐标所在的按钮时雷,如果该元素是10,在说明对应的坐标所在的按钮已经被单击过,如果不是以上几个值,则这个元素的值代表了该按钮附近可能有几颗雷。private int b;/声明int型的变量b 剩余雷的个数private int a1;/声明int型数组a1,放置随机数,用于确定雷应该布到雷区的位置private JPanel p,p1,p2,p3;/声明面板public ScanLei1(String title)/定义扫雷的构造方法,该构造方法有个String类型的参数,参数名为titlesuper(title);/调用JFrame的构造方法,将title字符串传入该构造方法,这样的话窗体显示时,标题栏会显示传入的title值contentPane=getContentPane();/获取当前JFrame对象的内容面板,注意因为ScanLei1类继承了JFrame对象,所以ScanLei1的对象也是JFrame对象setSize(300,400);/设置扫雷窗体的大小事300*400像素this.setBounds(400, 100, 400, 500); / setBounds(x,y,width,height); x:组件在容器X轴上的起点 y:组件在容器Y轴上的起点 width:组件的长度 height:组件的高度,在这里的意思就是该窗体打开时,会以屏幕的左上角为原点的水平方向是400像素,垂直方向是100像素的位置显示,后面设置的400*500像素指的是窗体的大小,所以最终窗体的大小是400*500像素,覆盖掉了上面setSize(300,400)的值setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /设置当点击窗体右上角的X按钮时的窗体的行为,这里设置的是当点击这个按钮时关闭并退出程序,没有设置的话,默认点关闭时只是隐藏窗体,在后台进程中还可以看到timer =new Timer(1000,(ActionListener) this);/每隔1000毫秒触发一次动作事件的监听a = new introw+2col+2;/创建数组a,a是一个二维数组,数组时11列,11行initGUI();/调用初始化图形界面方法public void initGUI()/声明初始化图形界面方法 p3=new JPanel();/创建一个面板b=bon;/将bon的值赋值给变量bJMenuBar menuBar=new JMenuBar();/创建一个菜单栏对象JMenu menu1=new JMenu(游戏);/创建游戏菜单JMenu menu2=new JMenu(帮助);/创建帮助菜单JMenuItem mi1=new JMenuItem(初级);/创建初级菜单项JMenuItem mi2 = new JMenuItem(中级);/创建中级菜单项JMenuItem mi3 =new JMenuItem(高级);/创建高级菜单项mi1.addActionListener(this);/为初级菜单项加入动作事件监听器,当你单击鼠标左键点初级菜单项时会执行actionPerformed(ActionEvent e)方法menu1.add(mi1); mi2.addActionListener(this);menu1.add(mi2);mi3.addActionListener(this);menu1.add(mi3);/以上几个操作类似menuBar.add(menu1);/将游戏菜单加入到菜单栏menuBar.add(menu2);/将帮助菜单加入到菜单栏p3.add(menuBar); /将菜单栏加入到p3面板上去b1=new JLabel(bon+);/创建一个标签,标签的内容是bon的值10a1=new intbon;/创建a1数组,数组的长度为10btn =new JButton(开始);/创建开始按钮btn.addActionListener(this);/为开始按钮加入动作事件监听器b2=new JLabel(0);/创建标签b2,b2的内容是0b3=new JLabel();/创建标签b3,b3暂时内容为空btns=new JButtonrow*col;/创建一个按钮数组,数组的个数为row*col,这个程序中就是9*9个,每一个雷的位置就是一个按钮 p=new JPanel();/创建一个面板p.setLayout(new BorderLayout(); /设置容器的边框布局,边框布局的样式大致是这样北东中西南这样的话这个panl中就可以放置五个组件了contentPane.add(p); / 将panl放置到内容面板上去,为什么将一个面板放到内容面板,而不是将组件放到内容面板上去呢,你可以看到panl上最多可以直接放置五个组件或者容器,但如果将组件或者容器直接放置到内容面板上去的话,就只能放一个组件或者容器了。p.add(p3,BorderLayout.NORTH);/p3添加到面板的北边,也就是在北边放上了菜单栏,结果就如图了游戏 帮助东中西南/combo=new JComboBox(new Object初级,中级,高级 );/加监听/*combo.addItemListener(new ItemListener();*/ p1=new JPanel();/创建一个面板/在那个位置/(FlowLayout)p1.getLayout().setAlignment(FlowLayout.RIGHT); /Alignment列队p1.add(b1);/将标签b1添加到面板上p1.add(btn);/将开始按钮添加到面板上p1.add(b2);/将标签b2添加到面板上p1.add(b3);/将标签b3添加到面板上p.add(p3,BorderLayout.NORTH);/这行代码重复 还是将菜单栏加入到窗体的北边p.add(p1,BorderLayout.CENTER);/将带有一个开始按钮,三个标签的按钮加入到窗体的中间位置游戏 帮助东10开始0西南 p2=new JPanel();/创建面板p2p2.setLayout(new GridLayout(row,col,0,0); / GridLayout网格布局,p2设置为网格布局,该布局的最多可以9行9列,正好可以放置81个雷按钮,按钮和按钮之间的水平间隔,垂直间隔都为0pxfor(int i=0;irow*col;i+)/为按钮数组赋值,此处的作用是创建81个雷按钮对象btnsi=new JButton();/创建雷按钮btnsi.setMargin(new Insets(0,0,0,0);/设置雷按钮与其他组件的间距btnsi.setFont(new Font(null,Font.BOLD,25); /设置字体字形。黑体25pxbtnsi.addActionListener(this);/为雷按钮添加监听器,监听动作事件btnsi.addMouseListener(new NormoreMouseEvent();/添加鼠标监听器,监听普通鼠标事件p2.add(btnsi);/将雷按钮添加到面板p2上contentPane.add(p,BorderLayout.NORTH);contentPane.add(p2,BorderLayout.CENTER);/将p2添加到窗体的中间游戏 帮助东10开始0西南public void go()/创建go方法setVisible(true);/设置是否显示窗体,设置为true就是显示当前窗体public static void main(String args)/主方法,作用是实例化窗体对象,调用go方法将窗体显示到屏幕上来new ScanLei1(扫雷By信息1001樊康).go();/实例化窗体对象,调用go方法将窗体显示到屏幕上来public void out(int a,JButton btns,ActionEvent e,int i,int x,int y) int p=1; if(axy=0)/如果一个按钮既不是雷周围又没有雷 axy=10;/将该按钮对应的值设置为10 btnsi.setEnabled(false);/且这个按钮不可用状态 for(int l=y-1;l-1&n-1&mrow) /如果n值和m值在雷区的范围之内 for(int q=0;qrow; if(n+col*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) btnsn+col*q.setText(axy+1+); axy+1=10; btnsn+col*q.setEnabled(false); else if(axy+1=0)/如果该按钮同一行右侧的按钮相应位置的值既不是雷又没雷,那么递归判断这个按钮周围的其他按钮是什么情况 out(a,btns,e,n+col*q,x,y+1); axy+1=10; btnsn+col*q.setEnabled(false); p=0; public void actionPerformed(ActionEvent e) if(e.getActionCommand()=初级)/如果你单击的是游戏菜单中初级菜单项row=9;/设置雷的行数是9col=9;/列数是9bon=10;a1=new intbon;b=bon;/setSize(297,377);a = new introw+2col+2;this.remove(p2);/从窗体中央移除雷区面板timer.stop();/计时器停止b1.setText(10);/设置标签b1的内容为10b2.setText(0);/b2的标签内容为0b3.setText();/b3的标签内容为空btns=new JButtonrow*col;/创建雷区雷按钮数组 p2=new JPanel();/重新创建面板p2p2.setLayout(new GridLayout(row,col,0,0);/设置p2为网格布局,同样还是9行9列,每一个单元格放一个雷for(int i=0;irow*col;i+)btnsi=new JButton( );/为每一个雷按钮实例化一个按钮对象btnsi.setMargin(new Insets(0,0,0,0);/设置雷按钮的间距btnsi.setFont(new Font(null,Font.BOLD,25);/设置雷按钮上文字的字体为黑体 25pxbtnsi.addActionListener(this);/添加动作事件监听器btnsi.addMouseListener(new NormoreMouseEvent();/添加普通按钮事件监听器p2.add(btnsi);/将雷按钮放置到p2面板上contentPane.add(p2,BorderLayout.CENTER);将雷区面板放置到窗体中间/setSize(297,377);this.pack();/设置窗体的大小为紧紧包容着所有组件for(int i=0;irow*col;i+)btnsi.setText( );/设置所有雷按钮的内容为空格btnsi.setEnabled(true);/设置所有雷按钮为可用状态for(int i=0;irow+2;i+)for(int j=0;jcol+2;j+)aij=0;/将二维数组a的所有元素初始化为0else if(e.getActionCommand()=中级)如果选了游戏菜单中的中级菜单项row=16;/设置雷区有16*16个雷 以下代码作用和选初级时相同,不再注释了col=16;bon=40;/setSize(33*col,33*row+80);a1=new intbon;a = new introw+2col+2; b=bon;this.remove(p2);timer.stop();b1.setText(40);b2.setText(0);b3.setText();btns=new JButtonrow*col; p2=new JPanel();p2.setLayout(new GridLayout(row,col,0,0);for(int i=0;irow*col;i+)btnsi=new JButton( );btnsi.setMargin(new Insets(0,0,0,0);btnsi.setFont(new Font(null,Font.BOLD,25);btnsi.addActionListener(this);btnsi.addMouseListener(new NormoreMouseEvent();p2.add(btnsi);contentPane.add(p2,BorderLayout.CENTER);this.pack();/setSize(33*col,33*row+80);for(int i=0;irow*col;i+)btnsi.setText();btnsi.setEnabled(true);for(int i=0;irow+2;i+)for(int j=0;jcol+2;j+)aij=0;else if(e.getActionCommand()=高级)/如果选择的是高级菜单项row=16;/设置雷区是16*32 以下代码和初级游戏代码作用相同,不在注释了col=32;bon=99;setSize(33*col,33*row+80);a1=new intbon;a = new introw+2col+2;b=bon;this.remove(p2);timer.stop();b1.setText(99);b2.setText(0);b3.setText();btns=new JButtonrow*col; p2=new JPanel();p2.setLayout(new GridLayout(row,col,0,0);for(int i=0;irow*col;i+)btnsi=new JButton( );btnsi.setMargin(new Insets(0,0,0,0);btnsi.setFont(new Font(null,Font.BOLD,25);btnsi.addActionListener(this);btnsi.addMouseListener(new NormoreMouseEvent();p2.add(btnsi);contentPane.add(p2,BorderLayout.CENTER);/setSize(33*col,33*row+80);this.pack();for(int i=0;irow*col;i+)btnsi.setText();btnsi.setEnabled(true);for(int i=0;irow+2;i+)for(int j=0;jcol+2;j+)aij=0;if(e.getSource()=btn)/如果点击了开始按钮timer.start();/计时器开始计时b=bon;b3.setText();/设置标签b3的内容为空/System.out.println(bon);/清空for(int i=0;irow*col;i+)btnsi.setText();/设置所有的雷区的雷按钮的内容为空btnsi.setEnabled(true);/设置所有雷按钮可用,也就是可以单击的状态for(int i=0;irow+2;i+)for(int j=0;jcol+2;j+)aij=0;/初始化数组a所有元素为0值/产生随机数,随机数的作用用于布雷时随机的指定雷所在的位置,for(int i=0;ibon;i+) int p=1;int m=(int)(Math.random()*row*col);/产生一个0-雷按钮数的整数while(p=1) int l=1; int j;for( j=0;ji&l=1;j+)/遍历数组,查看m值是否已经产生过了,如果数组a1中已经有m值,重新产生m值,如果没有产生m值,那么将m值赋值给a1的第i+1个元素,这样就可以保证bon个雷在雷区的不同位置 if(a1j=m) m=(int)(Math.random()*row*col); l=0; if(j=i)a1i=m;p=0;b1.setText(bon+);b2.setText(0);/布雷 for(int i=0;ibon;i+)在雷区中布bon个雷,雷对应位置的元素指定为100 int x=(a1i/col+1); int y=(a1i%col+1);axy=100;/布雷的位置的值为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; /指定雷区四周位置的值为0 for(int i=1;i=row;i+) for(int j=1;j=col;j+) if(aij!=100)/如果aij不等与100,就说明这个位置的雷按钮不是地雷,是安全的,但是安全的按钮上通常是要显示该按钮附近有几个雷的,下面的代码就是判断该按钮周围有几个雷的,那么这个aij就用来表示对应的雷区按钮周围雷的个数 for(int l=j-1;l=600)/如果该值大于600,则定时器停止timer.stop();elset+;/如果t小

温馨提示

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

评论

0/150

提交评论