扫雷游戏 课程设计报告.docx
- 文档编号:5916144
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:30
- 大小:190.90KB
扫雷游戏 课程设计报告.docx
《扫雷游戏 课程设计报告.docx》由会员分享,可在线阅读,更多相关《扫雷游戏 课程设计报告.docx(30页珍藏版)》请在冰豆网上搜索。
扫雷游戏课程设计报告
课程设计报告
课程:
面向对象程序设计
学号:
姓名:
班级:
嵌入式应用技术
教师:
时间:
2013年12月10日
计算机科学与技术系
设计名称:
扫雷游戏
日期:
2013年11月30日
设计内容:
设计一个简单GUI界面的扫雷游戏。
扫雷游戏的规则如下:
(1)在不掀开任何不藏有地雷的方块情况下,以最快的速度找出所有的地雷。
如果再掀开方块的过程中,不小心翻开藏有地雷的方块,则宣告失败,惟有将所有不含地雷的地方掀开,游戏才算成功法。
(2)游戏的操作方面主要以鼠标为主,当鼠标的指针对准未翻开的方块按下左键时即表示翻开方块,当鼠标的指针对准未翻开的方块按下右键时即表示标示地雷。
游戏者可以通过地雷区内的数字提示了解以数字为中心的其其周边八个方格内所含的地雷数,假若翻开的方块显示数字“3”,则表示以其为中心的周边方块内藏有3个地雷。
(3)当按下的方块不是地雷,且周边的八个方块也没有地雷时,方块会以被翻开方块的八个方向将空白方块翻开。
设计目的与要求:
一:
基本要求
(1)扫雷游戏分为初级、中级和高级三个级别。
单击游戏菜单可以选择“初级”、“中级”和“高级”。
(2)选择级别后将出现相应级别的扫雷区域,这时用户使用鼠标左键选择单击‘“开始”便启动计时器。
(3)用户要揭开某个方块,可左键单击它。
若所揭方块下有雷,用户便输了这一局,若所揭方块下无雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。
(4)如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。
用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。
(5)当用户点中雷时,将有“你输了”的提示出现,胜利时,将有“你赢了”的提示出现。
二:
实现功能
(1)开局:
首先选择游戏等级,然后生成不同等级的雷区界面。
游戏等级分为三级:
各等级方块数为——初级:
8×8、中级:
16×16、高级:
24×24;各级地雷数=总方块数/6;雷区每个方块下面或埋藏有1个地雷,或者没有地雷;
(2)扫雷:
将光标移到某个方块,使用鼠标的左右键进行扫雷;如果方块上出现数字,它代表在它周围的8个方块中共有多少颗地雷;
(3)标记地雷:
把光标光标移到有雷的某个方块上点击右键,标记此块下埋着地雷(实际上可能是误标,如果后面发现是误标再点击鼠标右键恢复标记前)。
每标记一个地雷,地雷数减少1;
(4)重新开始:
在游戏过程中想要重新只需开始,要点击开始即可。
(5)显示时间:
即显示用户完成移动盘子所花费的时间
(6)结果输出:
游戏结束时会提示游戏是否成功。
三:
问题定义
本课程设计是用JAVA编写一个扫雷游戏。
程序的功能是生成指定数目的地雷,通过鼠标操作玩游戏。
点击屏幕上的“开始”按钮重新开始游戏;标出所有地雷后胜出;当鼠标左键击中地雷失败。
扫雷游戏是考验智力和眼力的小游戏,在玩扫雷游戏的过程中也可以很好的培养耐心和细心,同时在无聊得时候可以用以休闲娱乐,如果我们自己也能动手做一个小程序来实现这个功能,自然能乐在其中。
设计环境或器材、原理与说明:
一、设计环境:
处理器:
IntelCorei5
内存:
2G
硬盘空间:
500G
显卡:
NVIDA显示卡适配器
操作系统;window7中文旗舰版
开发平台:
JDK6.0,eclipse
2、说明:
总体游戏过程分析:
在屏幕中央位置显示一个雷区,雷区范围内预先埋设了一定数量的随机分布的地雷;玩家通过上下左右键控制光标在雷区的各个小方块之间移动并做标记;若能正确标记出雷区中的所有地雷,则游戏胜利;否则踩雷,游戏失败。
设计过程(步骤)或程序代码(可以加页):
1.需求分析
1.1扫雷棋盘的布局设计
系统的整体布局为:
CardLayout布局,采用了菜单、按钮、面板…等组件,菜单主要包括开始,选择级别,按钮的功能是重新开始新的游戏。
1.2雷区的设计
1、成员变量
(1)block是Block类型的数组,用来确定雷区有多少需进行扫雷的方块。
(2)blockView是BlockView类型的数组,负责为block数组中的Block对象提供视图。
(3)lay是LayMines类型的对象,负责设置block数组中的哪些方块是雷或不是雷。
(4)record负责提供保存成绩的界面,是一个对话框,默认不可见。
用户只有扫雷成功后(用时最少),才可以看见对话框。
(5)reStart是一个按钮对象,用户单击它重新开始游戏。
(6)time是计时器对象,负责计算用户的用时。
2、方法
(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对话框可见。
所谓扫雷成功是指不仅找到了全部的累而且用时最少。
1.3SWING基本组件
(1)标签组件(JLabel)
标签组件显示的是静态文本,在通常情况下是不能编辑的,能起到提示的作用
JLabel组件有三种构造函数:
JLabel():
创建空的标签
JLabel(String):
创建一个带初始字符串的标签。
JLabel(String,int):
创建一个带初始字符串及指定对齐方式的标签。
(2)按钮(JButton)
几乎所有的交互式程序中都会有按钮,它是一种交互能力强且交互方便的控件,这个控件提供了“按下并动作”的基本用户界面。
按钮的构造方法有:
JButton():
建立一个没有标示字符串的新按钮类对象。
JButton(StringJLabel):
建立一个标示字符串为JLabel的新按钮类的对象
(3)画板组件(JPanel)
我们在界面上安排各种组件时,有时会需要将组件成组放置,这时就可以使用面板组件。
JPanel是最简单的容器组件,本身是一个矩形区域,可以在其中放入各种组件。
但它仅仅是安排各种组件的一种结构,需要最后加入到别的容器中才能实现GUI的功能。
面板组件的创建
JPanel():
用默认的布局管理器创建面板组件。
JPanel(LayoutManagerlayout):
用指定的布局管理器创建面板组件。
(4)框架窗口组件(JFrame)
JFrame是独立于浏览器的可独立运行的主窗口,通常用于进行开发桌面应用程序。
JFrame拥有边界和标题栏设置,其大小可以进行设置调整。
JFrame里面需要加入组件,也可以加入菜单,或在上面绘图。
(5)布局管理器
FlowLayout布局管理是一种最简单的布局管理方法,是Panel的默认布局。
它以流式的方式,自左向右,自上而下地放置容器中的组件,即组件按每行先后自左向后放置,一行放不下再换行。
FlowLayout():
创建默认的FlowLayout布局管理器
FlowLayout(int):
以指定的对齐方式创建FlowLayout布局管理器。
其中的参数有FlowLayout.LEFT、FlowLayout.RIGHT、FlowLayout.CENTER
1.4记录时间方法
在程序中使用Timer类,该类在javax.swing包中。
当要开始扫雷游戏时就可以使用计数器进行计数。
可以使用Timer类的构造方法:
Timer(inta,Objectb)创建一个计时器,其中的参数a的单位是毫秒,确定计时器每隔a毫秒“震铃”一次,参数b是计时器的监视器。
当使用Timer(inta,Objectb)创建计时器,对象b就自动地成了计时器的监视器。
timer=newTimer(1000,(ActionListener)this);试验中a的值是1000,表示每隔1000毫秒就触发一次动作事件的监听。
在本实验中点击扫雷游戏的“开始”选项,游戏就自动开始计时。
当游戏结束时计时器自动停止。
在游戏过程中再次点击“开始”,计数器就会清零重新开始计时。
2总体设计
2.1总体功能图
图2-1总体功能图
2-2类之间关系图
图2-2类之间关系图
2.3功能设计图
2.4雷区设计流程图
图2-3雷区设计流程图
设计结果与分析(可以加页):
3.运行效果图
图3-1运行主界面效果图
图3-2游戏失败效果图
图3-3游戏胜利效果图
附录:
程序代码
packageSaolei;
importjava.awt.BorderLayout;//导入边框布局
importjava.awt.Container;//container就是一个可以放组件的容器
importjava.awt.Font;
importjava.awt.GridLayout;//GridLayout类是一个布局管理器,它以矩形网格形式对容器中的组件进行布局。
importjava.awt.Insets;//对象描述容器的边界区域。
它指定一个容器在它的各个边界上应留出的空白区间。
这个空白可以是一个边界,一个不显示区域或一个标题。
importjava.awt.event.ActionEvent;//动作事件类
importjava.awt.event.ActionListener;//动作监听器。
《对组件》
importjava.awt.event.MouseAdapter;//添加鼠标事件的时候。
。
用适配器mouseAdapter可以不用实现所有的方法。
只需要写自己需要的方法即可
importjava.awt.event.MouseEvent;
importjavax.swing.JButton;//按钮类
importjavax.swing.JFrame;
importjavax.swing.JLabel;//JLabel对象可以显示文本、图像或同时显示二者
importjavax.swing.JMenu;//Swing菜单和菜单项是按钮,因为JMenuItem扩展AbstractButton,JMenu扩展JMenuItem。
importjavax.swing.JMenuBar;
importjavax.swing.JMenuItem;
importjavax.swing.JPanel;
importjavax.swing.Timer;
publicclassScanLei1extendsJFrameimplementsActionListener{
/*
serialVersionUID作用:
序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
有两种生成方式:
一个是默认的1L,比如:
privatestaticfinallongserialVersionUID=1L;
一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:
privatestaticfinallongserialVersionUID=xxxxL;
*/
privatestaticfinallongserialVersionUID=1L;
privateContainercontentPane;
privateJButtonbtn;
privateJButton[]btns;
privateJLabelb1;
privateJLabelb2;
privateJLabelb3;
privateTimertimer;
privateintrow=9;//行
privateintcol=9;//列
privateintbon=10;//雷
privateint[][]a;
privateintb;
privateint[]a1;
privateJPanelp,p1,p2,p3;//JPanel为javax.swing包中的,为面板容器,可以加入到JFrame中,它自身是个容器
publicScanLei1(Stringtitle){
super(title);
contentPane=getContentPane();//一个容器
setSize(297,377);//设置尺寸
this.setBounds(400,100,400,500);//设定一个窗体的偏移量(离屏幕左侧多少,顶端多少),高度,宽度。
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
timer=newTimer(1000,(ActionListener)this);
a=newint[row+2][col+2];
initGUI();
}
publicvoidinitGUI(){
p3=newJPanel();
b=bon;
JMenuBarmenuBar=newJMenuBar();
JMenumenu1=newJMenu("游戏");
JMenumenu2=newJMenu("帮助");
JMenuItemmi1=newJMenuItem("初级");
JMenuItemmi2=newJMenuItem("中级");
JMenuItemmi3=newJMenuItem("高级");
mi1.addActionListener(this);
menu1.add(mi1);
mi2.addActionListener(this);
menu1.add(mi2);
mi3.addActionListener(this);
menu1.add(mi3);
menuBar.add(menu1);
menuBar.add(menu2);
p3.add(menuBar);
b1=newJLabel(bon+"");
a1=newint[bon];
btn=newJButton("开始");
btn.addActionListener(this);
b2=newJLabel("0");
b3=newJLabel("");
btns=newJButton[row*col];
p=newJPanel();
p.setLayout(newBorderLayout());
contentPane.add(p);
p.add(p3,BorderLayout.NORTH);
//combo=newJComboBox(newObject[]{"初级","中级","高级"});
//加监听
/*combo.addItemListener(newItemListener(){
}});*/
p1=newJPanel();
//在那个位置
//((FlowLayout)p1.getLayout()).setAlignment(FlowLayout.RIGHT);
p1.add(b1);
p1.add(btn);
p1.add(b2);
p1.add(b3);
p.add(p3,BorderLayout.NORTH);
p.add(p1,BorderLayout.CENTER);
p2=newJPanel();
p2.setLayout(newGridLayout(row,col,0,0));
for(inti=0;i btns[i]=newJButton(""); btns[i].setMargin(newInsets(0,0,0,0)); btns[i].setFont(newFont(null,Font.BOLD,25)); btns[i].addActionListener(this); btns[i].addMouseListener(newNormoreMouseEvent()); p2.add(btns[i]); } contentPane.add(p,BorderLayout.NORTH); contentPane.add(p2,BorderLayout.CENTER); } publicvoidgo(){ setVisible(true); } publicstaticvoidmain(String[]args){ newScanLei1("扫雷").go(); } publicvoidout(int[][]a,JButton[]btns,ActionEvente,inti,intx,inty){ intp=1; if(a[x][y]==0){ a[x][y]=10; btns[i].setEnabled(false);//33 for(intl=y-1;l<=y+1;l++){ intm=x-1-1; intn=l-1; p=1; System.out.println(a[1][2]); if(n>-1&&n { for(intq=0;q if(((n+col*q)>=(m*col))&&((n+col*q)<(m+1)*col)){ if(a[x-1][l]! =0&&a[x-1][l]! =10){ btns[n+col*q].setText(a[x-1][l]+""); a[x-1][l]=10; btns[n+col*q].setEnabled(false); } elseif(a[x-1][l]==0){ //a[x-1][l]=10; btns[n+col*q].setEnabled(false); out(a,btns,e,n+col*q,x-1,l);////55//// a[x-1][l]=10; btns[n+col*q].setEnabled(false); } p=0; } } } p=1; m=x; if(n>-1&&n { for(intq=0;q if(((n+col*q)>=(m*col))&&((n+col*q)<(m+1)*col)){ if(a[x+1][l]! =0&&a[x+1][l]! =10){ btns[n+col*q].setText(a[x+1][l]+""); a[x+1][l]=10; btns[n+col*q].setEnabled(false); } elseif(a[x+1][l]==0){ out(a,btns,e,n+col*q,x+1,l);///55//// a[x+1][l]=10; btns[n+col*q].setEnabled(false); } p=0; } } } } intm=x-1; intn=y-1-1; p=1; if(n>-1&&n { for(intq=0;q if(((n+col*q)>=(m*col))&&((n+col*q)<(m+1)*col)){ if(a[x][y-1]! =0&&a[x][y-1]! =10){ btns[n+col*q].setText(a[x][y-1]+""); a[x][y-1]=10; btns[n+col*q].setEnabled(false); } elseif(a[x][y-1]==0){ out(a,btns,e,n+col*q,x,y-1); a[x][y-1]=10; btns[n+col*q].setEnabled(false); } p=0; } } } p=1; m=x-1; n=y+1-1; if(n>-1&&n { for(intq=0;q if(((n+col*q)>=(m*col))&&((n+col*q)<(m+1)*col)){ if(a[x][y+1]! =0&&a[x][y+1]! =10){ btns[n+col*q].setText(a[x][y+1]+""); a[x][y+1]=10; btns[n+col*q].setEnabled(false); } elseif(a[x][y+1]==0){ out(a,btns,e,n+col*q,x,y+1); a[x][y+1]=10; btns[n+col*q].setEnabled(f
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 扫雷游戏 课程设计报告 扫雷 游戏 课程设计 报告