基于JAVA的扫雷游戏的设计与实现.docx
《基于JAVA的扫雷游戏的设计与实现.docx》由会员分享,可在线阅读,更多相关《基于JAVA的扫雷游戏的设计与实现.docx(32页珍藏版)》请在冰豆网上搜索。
基于JAVA的扫雷游戏的设计与实现
JAVA程序设计A课程设计
题目基于JAVA的扫雷游戏的设计与实现
院(系)信息工程学院
专业班级计算机科学与技术
(2)班
学生姓名
学号
设计地点教(13)软件实验室
指导教师
起止时间:
2014年6月9日至2014年6月13日
《Java程序设计A》课程设计任务分工及成绩
院(系):
信息工程学院教研室:
软件教研室
课程设计题目
基于JAVA的扫雷游戏的设计与实现
课程设计内容
用JAVA实现扫雷游戏,了解扫雷游戏的基本结构,和理解扫雷的算法,并努力对算法进行改进,调试过程中修复程序中的bugg,使该扫雷游戏尽可能完善。
设计内容:
1、扫雷游戏分为初级、中级和高级三个级别.单击游戏菜单可以选择“初级”、“中级"和“高级”。
2、选择级别后将出现相应级别的扫雷区域,这时用户使用鼠标左键单击‘“开始”便启动计时器。
3、用户要揭开某个方块,可左键单击它。
若所揭方块下有雷,用户便输了这一局,若所揭方块下无雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。
4、如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。
用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。
小组成员及任务分配
姓名
学号
承担任务
成绩
算法实现
游戏布局
设置监听器
基于JAVA的扫雷游戏的设计与实现
摘要
随着时代的发展,电脑进入了普通老百姓的生活,越来越多的人使用电脑办公、娱乐、上网,游戏行业发展一日千里,该行业极大的影响和改变了人们的生活和娱乐方式,游戏为消费者提供丰富多彩的虚拟空间,使消费者可以自由自在的享受虚拟世界的乐趣,实现自己在现实生活着那个可能永远不能实现的梦想,满足了消费者的心理和精神需求。
扫雷游戏是Windows操作系统自带的一款小游戏,本系统要是模仿WINDOWS系统的扫雷,对于实现过程中出现的bug进行调试解决.我这里用的是C#编写了与它功能相似的扫雷游戏。
程序的功能是随机生成地雷数,通过鼠标操作玩游戏,不接受键盘,按任意键结束程序。
单击屏幕上的笑脸可以重新开始游戏。
当鼠标左键单击到地雷时提示游戏失败.报告首先介绍了进行该游戏课程设计的目的,然后是任务描述和设计的相关要求,最后是最重要的需求分析和设计方案.重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最为最要,鼠标事件是利用鼠标所发出的信息了解用户的意图,进而做出相对应的动作。
清除未靠近地雷区的方块较为复杂。
关键词:
扫雷游戏,算法设计,事件,JAVA
1概述
1。
1选题的目的及意义
本次课程设计的主要目的是为了通过具体的程序来加深对Java语言的掌握,提高自己的编程水平。
选择的题目来自《Java课程设计(第二版)》中的扫雷游戏,这是一个综合性的题目,可以对Java中的各项功能有更好的理解和使用,同时也为以后的工作打下一定的基础。
1.2程序设计任务与要求
扫雷游戏是一个很有趣的游戏。
本章的课程设计使用Java语言编写一个与其类似的扫雷游戏。
具体要求如下:
(1)扫雷游戏分为初级、中级和高级三个级别.单击游戏菜单可以选择“初级”、“中级”和“高级”。
(2)选择级别后将出现相应级别的扫雷区域,这是用户使用鼠标左键单击雷区中任何一个方块便启动计时器。
(3)用户要揭开某个方块,可单击它。
若所揭方块下有泪,用户便输了这一局,若所揭方块下五雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。
(4)如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记‘雷’.用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个.
(5)扫雷胜利后,游戏中的标签会显示“你赢了!
”
(6)如果在扫雷过程中一不小心碰到了雷,游戏会显示“你输了,这个游戏不适合你!
”。
2需求分析
2。
1扫雷游戏的需求分析
随着社会的不断进步,人们的压力也不断的提高,在游戏层出不穷的时刻,扫雷游戏任然受到不少人的青睐,,其本身的性质,决定了人们对它的喜爱的程度,不需要特殊的技巧,不需要不断的升级,还不需要太多的时间进行熟悉,简简单单却趣味无穷。
2.2扫雷游戏的基本功能操作
本程序需实现的主要功能有:
(1)用户可以自定义级别,并确定雷的个数.
(2)具有计时功能,即显示用户完成扫雷所花费的时间。
(3)点击开始进行扫雷。
(4)用户识别雷右击可标记“雷"。
2。
3功能要求
(1)程序的总体功能如图2。
1所示。
图2。
1总体功能图
(2)程序总体流程如图2。
2所示。
图2.2总体流程图
3详细设计
3。
1系统总体设计
3。
1。
1算法思想
(1)计算按钮周围雷数。
(2)随机分布。
扫雷游戏要求在M行N列的网格游戏区随即的不上bon个雷,且bon的取值应小于M和N的乘积。
这可以在一张M*N的网格上通过均匀分布的随即算法视线.其中bon的网格是雷区,剩下的网格是非雷区.游戏的目标是尽可能快地找到所有的雷区,而不踩到地雷。
Java提供了视线随即算法的类Math,通过Math类的random()方法这可以很方便的实现随即布雷的功能。
3。
1.2设计思想
(1)扫雷棋盘的布局设计
系统的整体布局为:
CardLayout布局,采用了菜单、按钮、面板…等组件,菜单主要包括开始,选择级别,标记,按钮的功能是重新开始新的游戏。
(2)雷区的设计
ScanLei1类是继承了JFrame实现了ActionListener接口,该类里声明了组键,并进行布局,go方法通过设置是否显示窗体,主方法main()实例化窗体对象,out()方法是ScanLei1类中的重要方法之一,也就是扫雷的算法.
actionPerformed(ActionEvente)就是单击按钮触发的事件,如果是初级按钮触发,分配初级雷区按钮布局.如果是中级按钮触发,分配中级雷区按钮布局.如果是高级按钮触发,分配高级雷区按扭布局。
如果是开始按钮触发,开始计数,并随机分配雷,并计算没有雷的按钮周围有雷的数目。
如果按钮按键触发,调用ScanLei1类中的out()方法进行扫雷。
NormoreMouseEvent()继承了鼠标适配器,当右击按钮后,根据该按钮上的图标来判断该按钮是否被右击过,如果有图标,将图标删除,并雷的个数加一。
如果该按钮没有被右击过,在该按钮中添加图标,并将雷的个数减一.
雷区设计流程图如图3。
3所示.
图3。
3雷区设计流程图
3.1。
3功能分析
用户可以玩扫雷游戏并能自定义级别(初等,中等,高等);具有计时功能,即显示用户完成扫雷任务所花费的时间。
3。
2系统详细设计
3。
2。
1类的设计
(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对话框可见。
所谓扫雷成功是指不仅找到了全部的累而且用时最少。
3.2。
2模块的划分及调用关系
图3。
4关系图
4系统测试与实现
4。
1程序测试结果
4.1.1游戏玩家通过右击鼠标来进行扫雷,并显示“雷”
图4。
1扫雷图
4。
1.2游戏玩家因触到雷而导致游戏结束
图4。
2扫雷失败图
4.1.3游戏玩家扫雷成功
图4.3扫雷成功图
4.1.4游戏玩家可选择游戏难度
图4.4游戏帮助图
总结
这个扫雷游戏是完全模拟微软系统自带的扫雷游戏,所以难度是很大,必然在编程过程中也遇到很多问题,有些问题比较简单但就不知道错在哪里,有些大问题之道在哪就是不知道怎么办才好,后来经过自己的不断调试,这个扫雷游戏终于大功告成。
经过编写这个扫雷游戏,我认识到应该注意细节问题,虽然是很小的问题,但可以提高自己编程的能力,而且还可以培养自己编程的严谨性,同时还可以为以后的编程积累经验。
编写完这个扫雷游戏,我发现自己有很多的不足,我想如果让我来单独来编写这个游戏,我感觉能编出来的可能性很小,因为这个游戏涉及到好多算法。
感触最深的就是我们真的要扎扎实实的打基础!
并且我感觉到只要我们自己肯下功夫学习,我们也可以做出很好的东西,不需要每次都抄袭别人的,只有自己的才是最珍贵的!
参考文献
[1]耿祥义.Java大学实用教程.北京:
清华大学出版社,2009.
[2]耿祥义.Java课程设计.北京:
清华大学出版社,2008.
[3]王鹏.JavaSwing图形界面开发与案例详解.北京:
清华大学出版社,2008.
[4]丁振凡.Java语言实验教程.北京:
北京邮电大学出版社,2005.
[5]郑莉.Java语言程序设计.北京:
清华大学出版社,2006.
[6].孙全党王吴迪赵枫朝,Java程序设计应用教程,电子工业出版社,2006。
2
[7].雷之宇,Java项目开发实践—网络篇,中国铁道出版社,2005。
5
[8].赵玉阳,Java从入门到精通,清华大学出版社,2006.8
[9].李茏怡,Java编程实例讲解,高等教育出版社,2005.11
[10].张利国,Java实用教程案例,北京:
清华大学出版社,2003.10
附录
importjava.awt。
BorderLayout;//导入边框布局
importjava。
awt。
Container;//导入一个容器,也是一个组件,在这个容器里你可以添加其他awt的组件
importjava.awt。
Font;//导入字形,字体
importjava.awt。
GridLayout;//导入网格式布局
importjava。
awt.Insets;//Insets对象描述容器的边界区域.它指定一个容器在它的各个边界上应留出的空白区间.这个空白可以是一个边界,一个不显示区域或一个标题。
importjava。
awt.event。
ActionEvent;//ActionEvent是一个类,指示发生了组件定义的动作的语义事件.
importjava。
awt。
event.ActionListener;//ActionListener用于接收操作事件的侦听器接口。
继承自EventListener。
importjava.awt。
event。
MouseAdapter;//导入鼠标监听适配器,负责对鼠标事件进行监听
importjava.awt.event。
MouseEvent;//接口
importjavax.swing.JButton;//导入按钮类
importjavax。
swing.JFrame;//导入面板类
importjavax.swing。
JLabel;//导入标签类
importjavax。
swing。
JMenu;//菜单
importjavax。
swing。
JMenuBar;//用来创建水平菜单栏
importjavax。
swing.JMenuItem;//创建带有设置文本或图标的JMenuItem菜单项
importjavax。
swing.JPanel;//面板
importjavax.swing.Timer;//定时器,功能是在指定的时间间隔内反复触发指定窗口的定时器事件.
publicclassScanLei1extendsJFrameimplementsActionListener{
//扫雷类继承了JFrame实现了ActionListener接口
privatestaticfinallongserialVersionUID=1L;//serialVersionUID用来表明类的不同版本间的兼容性
privateContainercontentPane;//内容面板,每一个JFrame对应一个内容面板,所有的组件应该置于内容面板之上
privateJButtonbtn;//声明一个按钮对象,开始按钮,对象名为btn,private的意思是把变量或方法声明成私有的,只有在本类中或本类实例可以访问,其他类不可以
privateJButton[]btns;//声明一个按钮数组雷区的每一个雷都是一个按钮,所有按钮放置到该数组中
privateJLabelb1;//声明一个标签对象,该标签用于放置剩余的雷的个数
privateJLabelb2;//声明一个标签对象,该标签用于放置已经游戏的时间
privateJLabelb3;//声明一个标签对象,该标签用于放置游戏的结果
privateTimertimer;//声明一个定时器对象
privateintrow=9;//行,用于指定雷区的行
privateintcol=9;//列用于指定雷区的列
privateintbon=10;//布雷的个数
privateint[][]a;//声明一个int型的二维数组,二维数组的中元素,有以下含义,值为0说明该元素所对应的坐标所在的按钮既不是雷又不是周围有雷的按钮,如果是100,则说明
privateintb;//声明int型的变量b剩余雷的个数
privateint[]a1;//声明int型数组a1,放置随机数,用于确定雷应该布到雷区的位置
privateJPanelp,p1,p2,p3;//声明面板
publicScanLei1(Stringtitle){
//定义扫雷的构造方法,该构造方法有个String类型的参数,参数名为title
super(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:
组件的高度
setDefaultCloseOperation(JFrame。
EXIT_ON_CLOSE);//设置当点击窗体右上角的X按钮时的窗体的行为,这里设置的是当点击这个按钮时关闭并退出程序,没有设置的话,
timer=newTimer(1000,(ActionListener)this);//每隔1000毫秒触发一次动作事件的监听
a=newint[row+2][col+2];//创建数组a,a是一个二维数组,数组时11列,11行
initGUI();//调用初始化图形界面方法
}
publicvoidinitGUI(){//声明初始化图形界面方法
p3=newJPanel();//创建一个面板
b=bon;//将bon的值赋值给变量b
JMenuBarmenuBar=newJMenuBar();//创建一个菜单栏对象
JMenumenu1=newJMenu(”游戏”);//创建游戏菜单
JMenumenu2=newJMenu(”帮助");//创建帮助菜单
JMenuItemmi1=newJMenuItem("初级”);//创建初级菜单项
JMenuItemmi2=newJMenuItem(”中级”);//创建中级菜单项
JMenuItemmi3=newJMenuItem(”高级”);//创建高级菜单项
mi1.addActionListener(this);//为初级菜单项加入动作事件监听器,当你单击鼠标左键点初级菜单项时会执行actionPerformed(ActionEvente)方法
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=newJLabel(bon+””);//创建一个标签,标签的内容是bon的值10
a1=newint[bon];//创建a1数组,数组的长度为10
btn=newJButton(”开始");//创建开始按钮
btn。
addActionListener(this);//为开始按钮加入动作事件监听器
b2=newJLabel(”0”);//创建标签b2,b2的内容是0
b3=newJLabel("”);//创建标签b3,b3暂时内容为空
btns=newJButton[row*col];//创建一个按钮数组,数组的个数为row*col,这个程序中就是9*9个,每一个雷的位置就是一个按钮
p=newJPanel();//创建一个面板
p。
setLayout(newBorderLayout());//设置容器的边框布局,边框布局的样式大致是这样
contentPane.add(p);//将panl放置到内容面板上去,为什么将一个面板放到内容面板,而不是将组件放到内容面板上去呢,你可以看到panl上最多可以直接放置五个
p。
add(p3,BorderLayout.NORTH);//p3添加到面板的北边,也就是在北边放上了菜单栏,结果就如图了
//combo=newJComboBox(newObject[]{"初级”,”中级”,"高级"});
//加监听
/*combo.addItemListener(newItemListener(){
}});*/
p1=newJPanel();//创建一个面板
//在那个位置
//((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);//将带有一个开始按钮,三个标签的按钮加入到窗体的中间位置
p2=newJPanel();//创建面板p2
p2。
setLayout(newGridLayout(row,col,0,0));//GridLayout网格布局,p2设置为网格布局,该布局的最多可以9行9列,正好可以放置81个雷按钮,按钮和按钮之间的水
for(inti=0;i〈row*col;i++){//为按钮数组赋值,此处的作用是创建81个雷按钮对象
btns[i]=newJButton("");//创建雷按钮
btns[i].setMargin(newInsets(0,0,0,0));//设置雷按钮与其他组件的间距
btns[i].setFont(newFont(null,Font.BOLD,25));//设置字体字形。
黑体25px
btns[i].addActionListener(this);//为雷按钮添加监听器,监听动作事件
btns[i].addMouseListener(newNormoreMouseEvent());//添加鼠标监听器,监听普通鼠标事件
p2.add(btns[i]);//将雷按钮添加到面板p2上
}
contentPane.add(p,BorderLayout。
NORTH);
contentPane。
add(p2,BorderLayout.CENTER);//将p2添加到窗体的中间
}
publicvoidgo(){//创建go方法
setVisible(true);//设置是否显示窗体,设置为true就是显示当前窗体
}
publicstaticvoidmain(String[]args){//主方法,作用是实例化窗体对象,调用go方法将窗体显示到屏幕上来
newScanLei1(”11计科2班扫雷软件”).go();//实例化窗体对象,调用go方法将窗体显示到屏幕上来
}
publicvoidout(int[][]a,JButton[]btns,ActionEvente,inti,intx,inty){
intp=1;
if(a[x][y]==0){//如果一个按钮既不是雷周围又没有雷
a[x][y]=10;//将该按钮对应的值设置为10
btns[i].setEnabled(false);//且这个按钮不可用状态
for(intl=y—1;l〈=y+1;l++){//排除按钮左右的位置
intm=x—1—1;//上两行
intn=l-1;//左两列
p=1;
Sy