扫雷游戏的设计与开发.docx
- 文档编号:25099276
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:21
- 大小:76.06KB
扫雷游戏的设计与开发.docx
《扫雷游戏的设计与开发.docx》由会员分享,可在线阅读,更多相关《扫雷游戏的设计与开发.docx(21页珍藏版)》请在冰豆网上搜索。
扫雷游戏的设计与开发
扫雷游戏的设计与开发
摘要
本论文研究的是一款扫雷游戏,其功能类似于操作系统自带的扫雷游戏。
论文首先介绍了制作游戏的整体思路与整个游戏设计的流程规划,然后介绍了雷区的布置与地雷随机产生的实现方法;重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最为最要,鼠标事件是利用鼠标所发出的信息了解使用者的意图,进而做出相对应的动作,而清除未靠近地雷区方块由于引进了“递归”这个概念而使其简单化。
本次设计只是完成了扫雷游戏的基本功能,在细节方面仍有待以后完善。
关键词:
扫雷
6.0,a.6.0;.’t.
..
:
6.0,,
论文总页数:
18页
1引言1
1.1课题背景与意义1
1.2开发工具的选用与介绍1
2游戏的总体分析与设计3
2.1设计构想3
2.2流程规划4
2.3画面规划5
3游戏的详细设计6
3.1游戏初始化6
3.2雷区的布置9
3.3游戏中主要模块的介绍与使用10
3.3.1鼠标事件10
3.3.2地雷与雷区表面探测情况12
3.3.3清除未靠近地雷的方块12
3.3.4游戏难度的选择14
3.4游戏的判断14
3.4.1游戏成功完成14
3.4.2游戏失败14
4游戏测试结果15
结论15
参考文献16
H:
\施工\4\169425485
H:
\施工\4\169425486
1引言
1.1课题背景与意义
在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生的一部分,越来越多的人使用计算机办公、娱乐等等。
扫雷游戏是操作系统自带的一款小游戏,在过去的几年里,操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。
本次的毕业设计我将利用6.0作为开发工具,开发一款类似的“扫雷游戏”。
通过研究操作系统自带的扫雷游戏,我们可以发现在这个游戏中主要有以下两个关键的地方:
第一个是初始化问题,包括随机产生本局游戏中雷的总数,雷的分布对于每一个小区域如何获取周围地区分布的雷数等等。
第二就是对鼠标事件的处理问题,既在游戏过程中对鼠标事件应如何做出反应。
经过四年的大学学习,我对理论知识已经有了一定的了解与认知,本次的毕业设计便是将书本上所学的理论知识与实际相结合,同时也是对所学知识的一种检查,希望通过本次的毕业设计使自己在程序的开发和设计上有新的认识并能有所提高。
本次毕业设计既锻炼了我们的实际动手能力,又在老师的指导下进行了一次模拟实际产品的开发,对于我们以后工作能力的培养具有重要意义。
1.2开发工具的选用与介绍
()是一种由微软公司开发的包含协助开发环境的事件驱动编程语言。
从任何标准来说,都是世界上使用人数最多的语言——不仅是盛赞的开发者还是抱怨的开发者的数量。
它源自于编程语言。
拥有图形用户界面()和快速应用程序开发()系统,可以轻易的使用、、连接数据库,或者轻松的创建控件。
程序员可以轻松的使用提供的组件快速建立一个应用程序。
1991年,微软公司推出了1.0版。
这在当时引起了很大的轰动。
这个连接编程语言和用户界面的进步被称为(有些时候叫做),最初的设计是由阿兰·库珀()完成的。
许多专家把的出现当做是软件开发史上的一个具有划时代意义的事件。
其实,以我们现在的目光来看,1.0的功能实在是太弱了;(不过最近6.0,的功能相当大!
)。
但在当时,它是第一个“可视”的编程软件。
这使得程序员欣喜之极,都尝试在的平台上进行软件创作。
微软也不失时机地在四年内接连推出2.0,3.0,4.0三个版本。
并且从3开始,微软将的数据库驱动集成到了中,这使得的数据库编程能力大大提高。
从4开始,也引入了面向对象的程序设计思想。
功能强大,学习简单。
而且,还引入了“控件”的概念,使得大量已经编好的程序可以被我们直接拿来使用。
1.0的版本1.0于1991年发布。
这个连接编程语言和用户界面的进步被称为(有些时候叫做),最初的设计是由阿兰·库珀()完成的。
2005的“显著”优点是,可以直接编写出风格的按钮,以与其他的控件。
但是其编写的小程序占用近10的内存。
通过几年的发展,它已成为一种专业化的开发语言和环境。
用户可用快速创建程序,现在还可以编写企业水平的客户端/服务器程序与强大的数据库应用程序。
会吸引更多的赞誉和批评,也会继续为广大的用户和程序员使用。
它非常适合用来开发拥有友好界面的程序(比如针对终端的数据),但是不适合开发其它程序(比如联合计算程序)。
一个典型的进程的中心思想就是要便于程序员使用,无论是新手或者专家。
使用了可以简单建立应用程序的系统,但是又可以开发相当复杂的程序。
的程序是一种基于窗体的可视化组件安排的联合,并且增加代码来指定组建的属性和方法。
因为默认的属性和方法已经有一部分定义在了组件内,所以程序员不用写多少代码就可以完成一个简单的程序。
过去的版本里面程序的性能问题一直被放在了桌面上,但是随着计算机速度的飞速增加,关于性能的争论已经越来越少。
窗体控件的增加和改变可以用拖放技术实现。
一个排列满控件的工具箱用来显示可用控件(比如文本框或者按钮]]。
每个控件都有自己的属性和事件。
默认的属性值会在控件创建的时候提供,但是程序员也可以进行更改。
很多的属性值可以在运行时候随着用户的动作和修改进行改动,这样就形成了一个动态的程序。
举个例子来说:
窗体的大小改变事件中加入了可以改变控件位置的代码,在运行时候每当用户更改窗口大小,控件也会随之改变位置。
在文本框中的文字改变事件中加入相应的代码,程序就能够在文字输入的时候自动翻译或者阻止某些字符的输入。
的程序可以包含一个或多个窗体,或者是一个主窗体和多个子窗体,类似于操作系统的样子。
有很少功能的对话框窗口(比如没有最大化和最小化按钮的窗体)可以用来提供弹出功能。
的组件既可以拥有用户界面,也可以没有。
这样一来服务器端程序就可以处理增加的模块。
使用参数计算的方法来进行垃圾收集,这个方法中包含有大量的对象,提供基本的面向对象支持。
因为越来越多组建的出现,程序员可以选用自己需要的扩展库。
和有些语言不一样,对大小写不敏感,但是能自动转换关键词到标准的大小写状态,以与强制使得符号表入口的实体的变量名称遵循书写规则。
默认情况下字符串的比较是对大小写敏感的,但是可以关闭这个功能。
使得大量的外界控件有了自己的生存空间。
大量的第三方控件针对提供。
也提供了建立、使用和重用这些控件的方法,但是由于语言问题,从一个应用程序创建另外一个并不简单。
在讨论时,经常可以听到以下这些术语,因此对这些术语的基本理解十分有帮助。
控件——简单的说,控件就是构成或者说建造应用程序的图形化工具,包括窗体、按钮、复选框、列表框、数据控件、表格控件和图片控件等等...。
事件——由用户或操作系统引发的动作。
事件的示例有击键、单击鼠标()、双击鼠标()、一段时间的限制,或从端口接收数据。
方法——嵌入在对象定义中的程序代码,它定义对象怎样处理信息并响应某事件。
例如,数据库对象有打开纪录集并从一个记录移动到另一个记录的方法程序的基本元素,它含有定义其特征的属性,定义其任务和识别它可以响应的事件的方法。
控件和窗体是中所有对象的示例。
对象——一个控件、窗体等都可被看作一个对象。
过程——为完成某些特定的任务而编写的代码段,过程通常用于响应特定的事件,也可以当作应用程序的用户自定义函数来使用。
属性——属性是组成用户界面的各对象的性质的具体描述。
例如上述“对象”中所提到的尺寸、位置、颜色、宽度、高度等等都称为控件的属性。
属性决定对象的外观,有时也决定对象的行为。
对象的属性绝大部分是中已经事先定义好的,但也有的属性是需要在应用过程中才去定义的。
属性即可为对象提供数据,也能从对象取回信息。
随着的迅猛发展,的技术出现了,并被不失时机地加入到5.0版本中(1997年)。
在1998年,推出了6.0版本,这一版本使得到了很大的扩充和增强。
它还引入了使用部件编程的概念,实际上这是对面向对象编程思想的扩展。
迄今为止,已经发展成为快速应用程序开发(,)工具的代表。
2游戏的总体分析与设计
2.1设计构想
相信大多数使用操作系统的使用者,对这款游戏都不陌生。
这款游戏不止操作简单,规则也不难,再加上游戏速度的控制机制得宜,让整个游戏在操作过程中充满了快乐与紧张的气氛。
除了游乐当中能带给使用者快乐之外,游戏的设计内容无形中也不断训练使用者的逻辑思考能力,对于依靠高度脑力工作的现代人,都可以通过这个游戏,不时的检验一下自己,所以我们不难发现,在各种可携带的电子产品上都有这款游戏的踪影。
在设计之前,我们先来了解这款游戏的规则。
在不掀开任何藏有地雷的方块情况下,以最快的速度找出所有的地雷。
如果在掀开方块的过程中,不小心翻开(踩到)藏有地雷的方块,则宣告失败(游戏结束),惟有将所有不含地雷的方块掀开,游戏才算成功。
游戏的操作方面主要以鼠标为主,当鼠标指针对准未翻开的方块按下左键时即表示翻开方块,当鼠标指针对准未翻开的方块按下右键时即表示标示或疑示地雷,反复按下右键则方块会以未标示→标示→疑似三者关系不断循环。
游戏者可以通过地雷区内的数字提示了解以数字为中心的其周边八个方格内所含的地雷数,假若翻开的方块显示数字“3”,则表示以其为中心的周边方块内藏有3个地雷。
当按下的方块不是地雷,且周边八个方块也都没有地雷时,方块会以被翻开方块的八个方向将空白方块翻开。
2.2流程规划
流程规划大致上可以分为三个部分,分别为:
画面初始、游戏者按下第一个方块和为非地雷方块时展开。
画面初始时,以游戏者最后一次设定的地雷区大小为范围画出地雷区,但此时并未产生地雷。
当游戏者按下第一个方块时产生地雷资料并启动定时器,为何在游戏者按下第一个方块才产生地雷资料呢?
其主要的用意在于不要让游戏者第一次就踩到地雷,这样在某种程度上可以提高游戏者游玩的气氛。
接着就是如何判断按下的方块是非地雷时的处理,这也是整个游戏的技术核心,我们可以通过递归的观念来检查周边的方块是否含有地雷与是否继续往外翻开。
流程规划如图1所示:
图1整体流程规划图
2.3画面规划
画面规划如图2所示:
图2规划样图
说明如下:
①:
游戏窗口()。
为了避免因改变窗口大小而造成画面呈现不美观,在这里将属性设定为3(双线固定对话框),即无法以窗口边缘进行窗口大小调整。
②:
地雷数显示区()。
③:
游戏状态()。
④:
游戏时间显示区()。
⑤:
计数与状态区()。
⑥:
地图区图样()。
⑦:
地雷区()。
⑧:
存储图片的组件,包括游戏状态图片、地雷区图片、地雷数与秒数数字图片()。
⑨:
秒数控制()。
3游戏的详细设计
3.1游戏初始化
当玩家开始游戏时,游戏画面如图3所示:
图3游戏初始画面
我们可以清楚的看到,游戏界面主要分为两个主要部分:
1.计数与状态区;2.地雷区。
首先我利用组件,为容器类型的组件,因此可以加入其他组件在其内。
在游戏中我利用了组件的两个特性,分别为容器特性与立体框线,具体如下:
(1)容器特性:
只要容器本身显示的行为改变,在容器内的组件也会跟着改变。
当游戏初始时,地雷区的显示组件会循环执行,逐一布置在画面上,但由于执行循环时多个组件要显示图形,造成分时系统执行频率显示上会出现不流畅的情形,若在循环执行前,先将容器本身的属性设为,在循环执行完成后再将属性设为,则显示就会变得流畅许多。
(2)立体框线:
通过组件本身立体框线的属性设定,可以为游戏画面的显示上营造出层次感。
然后再利用组件来存储游戏中将要使用的图片,我们可以将组件布置于窗体后编辑组件属性,如图4所示:
图4
通过和按钮即可编辑组件所存放的图片。
利用集合对象的方法,即可将组件内的图片指定给图形显示组件,语法如下:
图形组件..(图片索引).
因为一个组件内必须存储大小相同的图片,所以在游戏中显示的图片共分为三个部分:
1.数字计数图形;2.游戏状态图形;3.地雷区表示图形。
所以我们使用了三个组件来存储不同大小的图片。
接着便是对地雷区的初始化,这里我们利用与指令,动态新增与删除组件。
在游戏的地雷区,我们依照游戏者自定义的地图类型,来布置未探测地雷方块。
假如设定的地图大小为20×30时,我们可以通过双循环…与指令在程序执行阶段动态加载表示方块的组件,程序片段如下:
‘加载表示地图资料的图片
y=020‘地雷区高
x=030‘地雷区宽
表示方块组件()
‘设定组件位置……
x
y
经过双循环的运算,程序就会产生20×30=600个组件,试想如果在程序设计阶段,就把600个组件布置在窗体上,那将是多么没有效率的事情,况且组件数量的多少,还要取决于游戏玩家设定的地雷区大小,所以利用指令对于大量加载同一组件的动作将有莫大的帮助。
加载组件后必须将组件做适当的布置,我们可以通过组件的属性,将组件布置于预定的位置,函数的原型如下:
组件X坐标,[Y坐标],[组件宽度],[组件高度]
(其中括号内表示可以省略)
再配合双循环的变量值,可以控制组件布置于窗体的方向与方式,例如以下程序片段:
y=020‘地雷区高
x=030‘地雷区宽
表示方块组件()
‘设定组件位置……
组件()x*组件宽度,y*组件高度
x
y
组件将呈现先由左至右,再由上至下布置。
若将内循环改为y值,同样的指令,组件的布置方向将由上而下再由左至右。
布置方向的不同,会关联到组件内含的索引值不同,相对在程序执行阶段存取组件时,所定义的组件索引值就必须考虑组件不止的方向,这样才不会造成组件存取的错误。
以由左至右再由上而下的布置方式为例,我们可以利用以下公式,求得组件索引值:
组件索引值=(X坐标坐标*数组宽度)
这样,游戏界面的初始化工作就基本完成了,下面就是地雷的随机产生。
3.2雷区的布置
当游戏界面初始化完成后,这时在地雷区中并未产生地雷,只有当玩家在地雷区中第一次点下左键后,才会在地雷区中随机的布置当前游戏难度下应该产生的地雷总数,其主要用意在于不让玩家第一次就踩到地雷,这样在某种程度上可以提高玩家游戏的气愤。
具体实现如下所示:
'判断地雷区是否处于可动作状态
==
='标示动作图片的坐标
=\
'判断为左键且该方块为未探测状态
=1(,)=1
'判断游戏是否等待启动
=
=
=
1=
'布置地雷
>0
=()*(-1)
=()*(-1)
'判断数组中()为非地雷与
'非点选的方块坐标时
(,)<>9_
(==)
=-1
(,)=9
'地雷外围数字各加一
=-1+1
=-1+1
>=0<=_
>=0<=
(,)<>9_
(==)
(,)=(,)+1
Loop
3.3游戏中主要模块的介绍与使用
3.3.1鼠标事件
在游戏过程中,我们利用鼠标所发出的信息了解游戏者的意图,进而作出相对应的动作。
在与事件中,可以捕捉鼠标所按下或放开的按键为何、鼠标光标在该组件上的坐标与是否同时按下辅助键等。
函数原型如下:
组件名称(,,,_x,)
组件名称(,,,_x,)
在参数列中,参数值表示鼠标上的按狃数值。
其意义如下:
1:
左键2:
右键
倘若同时按下不止一个按键时,则传回数值为按键数值相加,例如同时按下左键与右键,则值为1+2=3
在本游戏中,我们利用右键的事件来标示“已标示”方块,利用左键的事件,来标示游戏者准备按下的方块,再利用左键的事件来确定翻开的方块。
这样的用意在于,假如游戏者发现按下的方块是错误的,此时只要不松开左键,同时按下右键,该方块就会被标示为“已标示”方块,若再松开左键,则该方块因为已成为“已标示”方块,所以就无法翻开。
在窗口的软件中,鼠标的应用是不可或缺的,但鼠标固然好用,如果程序设计不当,也可能造成使用者的不便。
通常鼠标在软件的应用上经常使用事件来作为确定使用者的操作意图,而只把事件当做标示的用途(用意就如同前面所提),只是为给使用者一个反悔的机会。
游戏的操作方面主要以鼠标为主,当鼠标指针对准未翻开的方块按下左键时即表示翻开方块:
=1'鼠标左键
(,)=1
(,10)
=(3)
当鼠标指针对准未翻开的方块按下右键时即表示标示或疑示地雷,反复按下右键则方块会以“未标示”→“标示”→“疑似”三者关系不断循环:
=2'鼠标右键
(,)=1'未探测
(,)=2
=+1
(,13)
(,)=2'标示
(,)=3
=-1
(,14)
(,)=3'疑似
(,)=1
(,9)
3.3.2地雷与雷区表面探测情况
在游戏设计上,我利用了两个二维数组分别记录地雷的分布情况与雷区表面探测情形,如图5和图6所示:
图5标示地雷分布情况
图6标示地雷探测情况
因为两个数组维数皆为2,所以我们通过双循环做数据的对比工作。
另外,当游戏玩家按下非地雷的方块时,程序必须自动将周边非地雷的方块翻开,这个动作我们也可以通过双循环的方式检查以按下的方块为中心与周边的8个方块所形成的3*3的二维数组,鼠标指针所指即是代表按下的方块,利用双循环作数据的对比,不但速度快,而且在设计阶段,程序的架构也比较清楚。
程序设计时双循环常常搭配二维数组使用。
3.3.3清除未靠近地雷的方块
这里先引入一个“递归”的概念,“递归”()简单的说,就是一个程序能被自己所定义的语句调用。
递归在程序设计上是一种重要的数据结构形态,通过递归程序的编写,在程序代码上会变得相当简洁,不过如果设计不当,会造成无穷循环或堆迭溢满的情形,所以递归的程序中心必须含有…或等设计,以终止递归执行。
在游戏过程中,当游戏者按下非地雷方块时,方块会沿四周八个方向向外翻开非地雷的方块。
程序的执行方面必须判断:
以按下方块为中心,检查周围八个方块是否为非地雷方块,若其中有一个方块是非地雷方块时,则又以其为中心,向外检查周围八个方块是否为非地雷方块,如此反复的执行即构成递归的使用条件。
前面已经提到,递归必须设计终止的条件判断,在本游戏的递归架构中,当判断方块的内容为数字时(即在非地雷方块周围),即立即停止递归程序。
递归其实也不是万能的,以本游戏做测试,当地雷区范围越大,且地雷数目不多时(一翻开非地雷方块,几乎全部方块都会翻开),执行递归就会变的非常缓慢,甚至造成堆迭溢满(不足)的情形,所以在游戏设计上必须考虑地雷区的大小,以免造成执行时错误中断的情况发生。
代码部分如下所示:
(x,_
y,_
)
=+1
=x-1x+1
=y-1y+1
>=0<=_
>=0<=
(=x=y)
(,)=1_
(,)>=0_
(,)<=8
(,)=0
(,)
0
((*+),10)
(,,(*+))
18
=+1
((*+),(,))
3.3.4游戏难度的选择
这里我设置了“初级”,“中级”,“高级”以与“自定义”四个不同的难度级别,“初级”,“中级”,“高级”中的雷区大小和地雷总数是已经设计好了的,如果玩家想要自己设置这些参数,可单击“游戏”→“自定义”,然后在“设置”中输入行数,列数与地雷数,在这里我对行数与列数做出了一个限定,与行数和列数的最大值分别为24和30,当在设置地雷数的时候,如果地雷数大于或等于行数和列数的乘积,或者地雷数小于零,地雷数都将自动的转换为:
地雷数=(行数-1)×(列数-1)。
3.4游戏的判断
3.4.1游戏成功完成
当在规定的时间内将所有的雷都正确的标示出来,游戏就会有一个弹出框提示你在多长时间内完成当前难度下的游戏。
还有一种情况便是当只剩下地雷未探测的时候,与雷区方块总数-已清除的方块数=地雷总数的话,游戏也将成功完成。
3.4.2游戏失败
当鼠标左键按下的方块为地雷方块事,地雷将会被引爆,游戏立即结束。
当在设定时间内未探测完所有的地雷,地雷也将会引爆,对于这第二种行为,我们可以通过组件来加以控制。
利用组件在固定时间即会触发时间的特性,在事件触发时便将计数值加一,直到判断计数值超过限定值时,即地雷引爆。
具体代码如下所示:
'定时器
1()
=+1
'时间计数显示
'设定状态图示
=999
=
1=
(,)=0
'设定状态图示
"您探测地雷的时间已超过,地雷已引爆。
",,"超时"
4游戏测试结果
在程序代码基本完成后,经过不断的调试与修改,最后测试本次所设计的扫雷游戏能够正常运行,在基本功能与画面上与自带的扫雷游戏没有太大差别,没有出现明显的错误和漏洞,但是在一些细节方面仍然需要完善,比如在游戏中可以加入一些声音的提示,在游戏完成和失败的时候可以弹出一些小的动画,还有就是可以加入一个扫雷英雄榜等等。
总的来说本次设计在功能上已经基本达到要求,其他细节方面有待以后完善。
结论
毕业设计是本科学习阶段一次非常难得的理论与实际相结合的机会,通过这次比较完整的一个程序的设计,我摆脱了单纯的理论知识学习状态,和实际设计的结合锻炼了我的综合运用所学的专业基础知识,解决实际问题的能力,同时也提高我查阅文献资料、对程序整体的把握等其他能力水平,而且通过对整体的掌控,对局部的取舍,以与对细节的斟酌处理,都使我的能力得到了锻炼,经验得到了丰富。
这是我们都希望看到的也正是我们进行毕业设计的目的所在。
虽然毕业设计内容繁多,过程繁琐但我的收获却更加丰富。
各种组件的运用,各种算法的应用,各种控件的利用我都是随着设计的不断深入而不断熟悉并逐步掌握的。
和老师以与同学的沟通交流更使我对程序整体的规划与设计有了新的认识也对自己提出了新的要求。
提高是有限的但提高也是全面的,正是这一次设计让我积累了许多实际经验,也必然会让我在未来的工作学习中表现出更高的应变能力和理解力。
顺利如期的完成本次毕业设计给了我很大的信心,但是也让我看到了自己许多不足的地方,学习其实就是一个不断完善的过程,正视自己的不足之处,在以后的工作和学习中不断的弥补这些不足之处,在以后的生活中也要保持同样的态度,不断的完善自己。
参考文献
[1]唐任仲.工程应用软件开发技术[M].北京:
化学工业出版社,1999。
[2]李怀明6.0中文版参考详解[M].北京:
清华大学出版社,1999。
[3]李善茂6.0高级编程技巧[M].西安:
电子工业出版社,1999。
[4]谭浩强6.0中文版提高与应用[M].西安:
电子工业出版社,1999。
[5]冯锋,王运坚程序设计基础教程[M].西安:
电子工业出版社,1999。
[6]何斌,刘醒6.0应用指南[M].成都:
四川大学出版社,1998。
[7]伍俊良课程设计与系统开发案例[M].北京:
清华大学出版社,2002。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 扫雷 游戏 设计 开发