扫雷游戏的设计与开发毕业设计毕业论文.docx
《扫雷游戏的设计与开发毕业设计毕业论文.docx》由会员分享,可在线阅读,更多相关《扫雷游戏的设计与开发毕业设计毕业论文.docx(20页珍藏版)》请在冰豆网上搜索。
扫雷游戏的设计与开发毕业设计毕业论文
扫雷游戏的设计与开发
论文作者姓名:
申请学位专业:
申请学位类别:
指导教师姓名(职称):
论文提交日期:
扫雷游戏的设计与开发
摘要
扫雷是一款玩法相当简单的大众化的小游戏,游戏的胜利条件是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时要避免踩到雷。
随着社会的不断进步,人们的压力也不断的提高,人们的生活节奏不断加快,在游戏层出不穷的时刻,人们对游戏的需求也不断提高,而扫雷游戏任然受到不少人的青睐,其本身的性质,决定了人们对它的喜爱的程度,不需要特殊的技巧,不需要不断的升级,还不需要太多的时间进行熟悉,简简单单却趣味无穷。
人们长时间的面对计算机难免会有倦怠的情绪,而扫雷这款小游戏不会花太多时间,同时把玩家得思维带动起来,达到一举多得得效果。
扫雷游戏的基本功能:
点击鼠标左键于未知区域,如果未知区域有雷,游戏停止,显示所有的地雷。
如果没雷,则显示周围雷数,如果周围没雷,则再查看周围八个区域是否有雷直到有雷为止并显示,玩家需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷。
本次设计的主要目的是为了通过扫雷游戏来加深对Java语言的掌握,提高自己的编程水平。
关键字:
扫雷游戏,算法设计,事件,JAVA
JavaversionofMinesweeperdesignandimplementation
Abstract
Minesweeperisaplayoffairlysimplepopularsmallgame,gamewinningconditionsintheshortestperiodoftimeaccordingtothenumberthatappearsclickthegridtoidentifyallnonraylattice,whileavoidingsteppedonamine.Withtheprogressofsociety,constantlyimprovepeople'spressure,theacceleratingpaceoflifeofpeopleinthegame,thedemandforconstantlyemergeinanendlessstream,thegameisalsorising,andtheMinesweeperstillattractmanypeopleofallages,ofitsownnature,determinestheextentofpeopleloveit,donotneedtospecialskills,donotneedtoconstantlyupgrade,alsodonotneedtoomuchtimetofamiliar,simplebutfun.Thecomputerinthefaceofpeopleforalongtimewillhaveatiredmood,andminethegamewillnotspendtoomuchtimeatthesametime,thegameplayertodriveupthinking,tohavemultipleeffects.Thebasicfunctionofminegame:
clicktheleftmousebuttonintheunknownarea,iftheunknownareathereisthunder,gamestop,displayallthemines.Ifthereisnoray,isdisplayedaroundthenumberofmine,ifnotaroundmine,thencheckwhetherthereisthunderaroundtheeightareasuntilthereisthundernowandshow,gameplayerneedstofindoutalltheminefieldnotminetheboxassoonaspossible,butnotsteppedonlandmines.ThemainpurposeofthisdesignistopasstheMinesweepertodeepentheirunderstandingofJavalanguagelearning,improvetheirlevelofprogramming.
Keywords:
minesweeper,algorithmdesign,event,JAVA
论文总页数:
18页
1引言
1.1课题背景及意义
在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生的一部分,越来越多的人使用计算机办公、娱乐等等。
扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。
本次的毕业设计我将利用VisualBasic6.0作为开发工具,开发一款类似的“扫雷游戏”。
通过研究Windows操作系统自带的扫雷游戏,我们可以发现在这个游戏中主要有以下两个关键的地方:
第一个是初始化问题,包括随机产生本局游戏中雷的总数,雷的分布对于每一个小区域如何获取周围地区分布的雷数等等。
第二就是对鼠标事件的处理问题,既在游戏过程中对鼠标事件应如何做出反应。
经过四年的大学学习,我对理论知识已经有了一定的了解与认知,本次的毕业设计便是将书本上所学的理论知识与实际相结合,同时也是对所学知识的一种检查,希望通过本次的毕业设计使自己在程序的开发和设计上有新的认识并能有所提高。
本次毕业设计既锻炼了我们的实际动手能力,又在老师的指导下进行了一次模拟实际产品的开发,对于我们以后工作能力的培养具有重要意义。
1.2开发工具的选用及介绍
VisualBasic(VB)是一种由微软公司开发的包含协助开发环境的事件驱动编程语言。
从任何标准来说,VB都是世界上使用人数最多的语言——不仅是盛赞VB的开发者还是抱怨VB的开发者的数量。
它源自于BASIC编程语言。
VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。
程序员可以轻松的使用VB提供的组件快速建立一个应用程序。
1991年,微软公司推出了VisualBasic1.0版。
这在当时引起了很大的轰动。
这个连接编程语言和用户界面的进步被称为Tripod(有些时候叫做Ruby),最初的设计是由阿兰·库珀(AlanCooper)完成的。
许多专家把VB的出现当做是软件开发史上的一个具有划时代意义的事件。
其实,以我们现在的目光来看,VB1.0的功能实在是太弱了;(不过最近VB6.0,VB.NET的功能相当大!
)。
但在当时,它是第一个“可视”的编程软件。
这使得程序员欣喜之极,都尝试在VB的平台上进行软件创作。
微软也不失时机地在四年内接连推出VB2.0,VB3.0,4.0三个版本。
并且从VB3开始,微软将ACCESS的数据库驱动集成到了VB中,这使得VB的数据库编程能力大大提高。
从VB4开始,VB也引入了面向对象的程序设计思想。
VB功能强大,学习简单。
而且,VB还引入了“控件”的概念,使得大量已经编好的VB程序可以被我们直接拿来使用。
VB1.0的DOS版本VB1.0于1991年发布。
这个连接编程语言和用户界面的进步被称为Tripod(有些时候叫做Ruby),最初的设计是由阿兰·库珀(AlanCooper)完成的。
VB2005的“显著”优点是,可以直接编写出XP风格的按钮,以及其他的控件。
但是其编写的小程序占用近10MB的内存。
通过几年的发展,它已成为一种专业化的开发语言和环境。
用户可用VisualBasic快速创建Windows程序,现在还可以编写企业水平的客户端/服务器程序及强大的数据库应用程序。
VB会吸引更多的赞誉和批评,也会继续为广大的用户和程序员使用。
它非常适合用来开发拥有友好界面的程序(比如针对终端的数据),但是不适合开发其它程序(比如联合计算程序)。
一个典型的VB进程VB的中心思想就是要便于程序员使用,无论是新手或者专家。
VB使用了可以简单建立应用程序的GUI系统,但是又可以开发相当复杂的程序。
VB的程序是一种基于窗体的可视化组件安排的联合,并且增加代码来指定组建的属性和方法。
因为默认的属性和方法已经有一部分定义在了组件内,所以程序员不用写多少代码就可以完成一个简单的程序。
过去的版本里面VB程序的性能问题一直被放在了桌面上,但是随着计算机速度的飞速增加,关于性能的争论已经越来越少。
窗体控件的增加和改变可以用拖放技术实现。
一个排列满控件的工具箱用来显示可用控件(比如文本框或者按钮]]。
每个控件都有自己的属性和事件。
默认的属性值会在控件创建的时候提供,但是程序员也可以进行更改。
很多的属性值可以在运行时候随着用户的动作和修改进行改动,这样就形成了一个动态的程序。
举个例子来说:
窗体的大小改变事件中加入了可以改变控件位置的代码,在运行时候每当用户更改窗口大小,控件也会随之改变位置。
在文本框中的文字改变事件中加入相应的代码,程序就能够在文字输入的时候自动翻译或者阻止某些字符的输入。
VB的程序可以包含一个或多个窗体,或者是一个主窗体和多个子窗体,类似于操作系统的样子。
有很少功能的对话框窗口(比如没有最大化和最小化按钮的窗体)可以用来提供弹出功能。
VB的组件既可以拥有用户界面,也可以没有。
这样一来服务器端程序就可以处理增加的模块。
VB使用参数计算的方法来进行垃圾收集,这个方法中包含有大量的对象,提供基本的面向对象支持。
因为越来越多组建的出现,程序员可以选用自己需要的扩展库。
和有些语言不一样,VB对大小写不敏感,但是能自动转换关键词到标准的大小写状态,以及强制使得符号表入口的实体的变量名称遵循书写规则。
默认情况下字符串的比较是对大小写敏感的,但是可以关闭这个功能。
VB使得大量的外界控件有了自己的生存空间。
大量的第三方控件针对VB提供。
VB也提供了建立、使用和重用这些控件的方法,但是由于语言问题,从一个应用程序创建另外一个并不简单。
在讨论VisualBasic时,经常可以听到以下这些术语,因此对这些术语的基本理解十分有帮助。
控件——简单的说,控件就是构成或者说建造VisualBasic应用程序的图形化工具,包括窗体、按钮、复选框、列表框、数据控件、表格控件和图片控件等等...。
事件——由用户或操作系统引发的动作。
事件的示例有击键、单击鼠标(Click)、双击鼠标(DblClick)、一段时间的限制,或从端口接收数据。
方法——嵌入在对象定义中的程序代码,它定义对象怎样处理信息并响应某事件。
例如,数据库对象有打开纪录集并从一个记录移动到另一个记录的方法程序的基本元素,它含有定义其特征的属性,定义其任务和识别它可以响应的事件的方法。
控件和窗体是VisualBasic中所有对象的示例。
对象——一个控件、窗体等都可被看作一个对象。
过程——为完成某些特定的任务而编写的代码段,过程通常用于响应特定的事件,也可以当作应用程序的用户自定义函数来使用。
属性——属性是组成用户界面的各对象的性质的具体描述。
例如上述“对象”中所提到的尺寸、位置、颜色、宽度、高度等等都称为控件的属性。
属性决定对象的外观,有时也决定对象的行为。
对象的属性绝大部分是VB中已经事先定义好的,但也有的属性是需要在应用过程中才去定义的。
属性即可为对象提供数据,也能从对象取回信息。
随着Intemet的迅猛发展,Microsoft的ActiveX技术出现了,并被不失时机地加入到VisualBasic5.0版本中(1997年)。
在1998年,Microsoft推出了VisualBasic6.0版本,这一版本使VB得到了很大的扩充和增强。
它还引入了使用部件编程的概念,实际上这是对面向对象编程思想的扩展。
迄今为止,VisualBasic已经发展成为快速应用程序开发(RAD,RapidApplicationDevelopment)工具的代表。
2游戏的总体分析与设计
2.1设计构想
相信大多数使用Windows操作系统的使用者,对这款游戏都不陌生。
这款游戏不止操作简单,规则也不难,再加上游戏速度的控制机制得宜,让整个游戏在操作过程中充满了快乐与紧张的气氛。
除了游乐当中能带给使用者快乐之外,游戏的设计内容无形中也不断训练使用者的逻辑思考能力,对于依靠高度脑力工作的现代人,都可以通过这个游戏,不时的检验一下自己,所以我们不难发现,在各种可携带的电子产品上都有这款游戏的踪影。
在设计之前,我们先来了解这款游戏的规则。
在不掀开任何藏有地雷的方块情况下,以最快的速度找出所有的地雷。
如果在掀开方块的过程中,不小心翻开(踩到)藏有地雷的方块,则宣告失败(游戏结束),惟有将所有不含地雷的方块掀开,游戏才算成功。
游戏的操作方面主要以鼠标为主,当鼠标指针对准未翻开的方块按下左键时即表示翻开方块,当鼠标指针对准未翻开的方块按下右键时即表示标示或疑示地雷,反复按下右键则方块会以未标示→标示→疑似三者关系不断循环。
游戏者可以通过地雷区内的数字提示了解以数字为中心的其周边八个方格内所含的地雷数,假若翻开的方块显示数字“3”,则表示以其为中心的周边方块内藏有3个地雷。
当按下的方块不是地雷,且周边八个方块也都没有地雷时,方块会以被翻开方块的八个方向将空白方块翻开。
2.2流程规划
流程规划大致上可以分为三个部分,分别为:
画面初始、游戏者按下第一个方块和为非地雷方块时展开。
画面初始时,以游戏者最后一次设定的地雷区大小为范围画出地雷区,但此时并未产生地雷。
当游戏者按下第一个方块时产生地雷资料并启动定时器,为何在游戏者按下第一个方块才产生地雷资料呢?
其主要的用意在于不要让游戏者第一次就踩到地雷,这样在某种程度上可以提高游戏者游玩的气氛。
接着就是如何判断按下的方块是非地雷时的处理,这也是整个游戏的技术核心,我们可以通过递归的观念来检查周边的方块是否含有地雷及是否继续往外翻开。
流程规划如图1所示:
图1整体流程规划图
2.3画面规划
画面规划如图2所示:
图2规划样图
说明如下:
①:
游戏窗口(Form)。
为了避免因改变窗口大小而造成画面呈现不美观,在这里将BorderStyle属性设定为3(双线固定对话框),即无法以窗口边缘进行窗口大小调整。
②:
地雷数显示区(PictureBox)。
③:
游戏状态(Image)。
④:
游戏时间显示区(PictureBox)。
⑤:
计数及状态区(PictureBox)。
⑥:
地图区图样(Image)。
⑦:
地雷区(PictureBox)。
⑧:
存储图片的组件,包括游戏状态图片、地雷区图片、地雷数及秒数数字图片(Imagelist)。
⑨:
秒数控制(Timer)。
3游戏的详细设计
3.1游戏初始化
当玩家开始游戏时,游戏画面如图3所示:
图3游戏初始画面
我们可以清楚的看到,游戏界面主要分为两个主要部分:
1.计数及状态区;2.地雷区。
首先我利用PictureBox组件,PictureBox为容器类型的组件,因此可以加入其他组件在其内。
在游戏中我利用了PictureBox组件的两个特性,分别为容器特性及立体框线,具体如下:
(1)容器特性:
只要容器本身显示的行为改变,在容器内的组件也会跟着改变。
当游戏初始时,地雷区的显示组件会循环执行,逐一布置在画面上,但由于执行循环时多个Image组件要显示图形,造成分时系统执行频率显示上会出现不流畅的情形,若在循环执行前,先将容器本身的Visable属性设为False,在循环执行完成后再将Visable属性设为Ture,则显示就会变得流畅许多。
(2)立体框线:
通过组件本身立体框线的属性设定,可以为游戏画面的显示上营造出层次感。
然后再利用ImageList组件来存储游戏中将要使用的图片,我们可以将组件布置于窗体后编辑组件属性,如图4所示:
图4
通过InsertPicture和RemovePicture按钮即可编辑组件所存放的图片。
利用ImageList集合对象的Picture方法,即可将ImageList组件内的图片指定给图形显示组件,语法如下:
Set图形组件.Picture=ImageList.ImageList(图片索引).Picture
因为一个ImageList组件内必须存储大小相同的图片,所以在游戏中显示的图片共分为三个部分:
1.数字计数图形;2.游戏状态图形;3.地雷区表示图形。
所以我们使用了三个ImageList组件来存储不同大小的图片。
接着便是对地雷区的初始化,这里我们利用Load及UnLoad指令,动态新增及删除组件。
在游戏的地雷区,我们依照游戏者自定义的地图类型,来布置未探测地雷方块。
假如设定的地图大小为20×30时,我们可以通过双循环For…Next及Load指令在程序执行阶段动态加载表示方块的组件,程序片段如下:
‘加载表示地图资料的图片
Fory=0To20‘地雷区高
Forx=0To30‘地雷区宽
Load表示方块组件(index)
‘设定组件位置……
Nextx
Nexty
经过双循环的运算,程序就会产生20×30=600个组件,试想如果在程序设计阶段,就把600个组件布置在窗体上,那将是多么没有效率的事情,况且组件数量的多少,还要取决于游戏玩家设定的地雷区大小,所以利用Load指令对于大量加载同一组件的动作将有莫大的帮助。
加载组件后必须将组件做适当的布置,我们可以通过Image组件的Move属性,将组件布置于预定的位置,Move函数的原型如下:
组件.MoveX坐标,[Y坐标],[组件宽度],[组件高度]
(其中括号内表示可以省略)
再配合双循环的变量值,可以控制组件布置于窗体的方向及方式,例如以下程序片段:
Fory=0To20‘地雷区高
Forx=0To30‘地雷区宽
Load表示方块组件(index)
‘设定组件位置……
组件(index).Movex*组件宽度,y*组件高度
Nextx
Nexty
组件将呈现先由左至右,再由上至下布置。
若将内循环改为y值,同样的Move指令,组件的布置方向将由上而下再由左至右。
布置方向的不同,会关联到组件内含的索引值不同,相对在程序执行阶段存取组件时,所定义的组件索引值就必须考虑组件不止的方向,这样才不会造成组件存取的错误。
以由左至右再由上而下的布置方式为例,我们可以利用以下公式,求得组件索引值:
组件索引值=(X坐标+Y坐标*数组宽度)
这样,游戏界面的初始化工作就基本完成了,下面就是地雷的随机产生。
3.2雷区的布置
当游戏界面初始化完成后,这时在地雷区中并未产生地雷,只有当玩家在地雷区中第一次点下左键后,才会在地雷区中随机的布置当前游戏难度下应该产生的地雷总数,其主要用意在于不让玩家第一次就踩到地雷,这样在某种程度上可以提高玩家游戏的气愤。
具体实现如下所示:
'判断地雷区是否处于可动作状态
IfisDie=FalseAndisFinal=FalseThen
xxx=indexModMAP_X'标示动作图片的坐标
yyy=index\MAP_X
'判断为左键且该方块为未探测状态
IfButton=1AndmapFaceArr(xxx,yyy)=1Then
'判断游戏是否等待启动
IfisStart=FalseThen
cMINE_NUM=MINE_NUM
isStart=True
Timer1.Enabled=True
'布置地雷
DoWhilecMINE_NUM>0
rX=Rnd()*(MAP_X-1)
rY=Rnd()*(MAP_Y-1)
'判断数组中(rX,rY)为非地雷及
'非点选的方块坐标时
IfmapArr(rX,rY)<>9And_
Not(rX=xxxAndrY=yyy)Then
cMINE_NUM=cMINE_NUM-1
mapArr(rX,rY)=9
'地雷外围数字各加一
Forxx=rX-1TorX+1
Foryy=rY-1TorY+1
Ifxx>=0Andxx<=MAP_XAnd_
yy>=0Andyy<=MAP_YThen
IfmapArr(xx,yy)<>9And_
Not(xx=rXAndyy=rY)Then
mapArr(xx,yy)=mapArr(xx,yy)+1
EndIf
EndIf
Nextyy
Nextxx
EndIf
Loop
EndIf
3.3游戏中主要模块的介绍与使用
3.3.1鼠标事件
在游戏过程中,我们利用鼠标所发出的信息了解游戏者的意图,进而作出相对应的动作。
在MouseDown与MouseUp事件中,可以捕捉鼠标所按下或放开的按键为何、鼠标光标在该组件上的坐标及是否同时按下辅助键等。
函数原型如下:
组件名称_MouseDown(indexAsInteger,_ButtonAsInteger,_ShiftAsInteger,_xAsSingle,_yAsSingle)
组件名称_MouseUp(indexAsInteger,_ButtonAsInteger,_ShiftAsInteger,_xAsSingle,_yAsSingle)
在参数列中,Button参数值表示鼠标上的按狃数值。
其意义如下:
1:
左键2:
右键
倘若同时按下不止一个按键时,则传回数值为按键数值相加,例如同时按下左键及右键,则Button值为1+2=3
在本游戏中,我们利用右键的MouseDown事件来标示“已标示”方块,利用左键的MouseDown事件,来标示游戏者准备按下的方块,再利用左键的MouseUp事件来确定翻开的方块。
这样的用意在于,假如游戏者发现按下的方块是错误的,此时只要不松开左键,同时按下右键,该方块就会被标示为“已标示”方块,若再松开左键,则该方块因为已成为“已标示”方块,所以就无法翻开。
在窗口的软件中,鼠标的应用是不可或缺的,但鼠标固然好用,如果程序设计不当,也可能造成使用者的不便。
通常鼠标在软件的应用上经常使用MouseUp事件来作为确定使用者的操作意图,而只把MouseDown事件当做标示的用途(用意就如同前面所提),只是为给使用者一个反悔的机会。
游戏的操作方面主要以鼠标为主,当鼠标指针对准未翻开的方块按下左键时即表示翻开方块:
IfButton=