VB扫雷游戏设计论文_第1页
VB扫雷游戏设计论文_第2页
VB扫雷游戏设计论文_第3页
VB扫雷游戏设计论文_第4页
VB扫雷游戏设计论文_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

毕业设计课程定做 QQ1714879127 毕业设计课程定做 QQ1714879127 VB 扫雷游戏设计论文扫雷游戏设计论文 摘摘 要要 本论文研究的是以 Visual Basic 6.0 为开发环境,设计并开发一款扫雷游戏, 其功能类似于 Windows 操作系统自带的扫雷游戏。论文首先介绍了制作游戏的 整体思路及整个游戏设计的流程规划,然后介绍了雷区的布置及地雷随机产生 的实现方法;重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清 除未靠近地雷区方块这两方面最为最要,鼠标事件是利用鼠标所发出的信息了 解使用者的意图,进而做出相对应的动作,而清除未靠近地雷区方块由于引进 了“递归”这个概念而使其简单化。 本次设计只是完成了扫雷游戏的基本功能,在细节方面仍有待以后完善。 关键词关键词:扫雷;Visual Basic 6.0;事件;递归 毕业设计课程定做 QQ1714879127 毕业设计课程定做 QQ1714879127 目目 录录 1引言.3 1.1 课题背景及意义3 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 清除未靠近地雷的方块.13 3.3.4 游戏难度的选择.14 3.4 游戏的判断.14 3.4.1 游戏成功完成.14 3.4.2 游戏失败.14 4游戏测试结果15 结 论.15 参考文献.16 致 谢.17 声 明.18 毕业设计课程定做 QQ1714879127 毕业设计课程定做 QQ1714879127 1 1 引言引言 1.11.1 课题背景课题背景及意义及意义 在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生 的一部分,越来越多的人使用计算机办公、娱乐等等。 扫雷游戏是 Windows 操作系统自带的一款小游戏,在过去的几年里, Windows 操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越 强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人 的喜爱。本次的课程设计我将利用 Visual Basic6.0 作为开发工具,开发一款类 似的“扫雷游戏” 。 通过研究 Windows 操作系统自带的扫雷游戏,我们可以发现在这个游戏中 主要有以下两个关键的地方: 第一个是初始化问题,包括随机产生本局游戏中雷的总数,雷的分布对于 每一个小区域如何获取周围地区分布的雷数等等。 第二就是对鼠标事件的处理问题,既在游戏过程中对鼠标事件应如何做出 反应。 经过学习,我对理论知识已经有了一定的了解与认知,本次的课程设计便 是将书本上所学的理论知识与实际相结合,同时也是对所学知识的一种检查, 希望通过本次的课程设计使自己在程序的开发和设计上有新的认识并能有所提 高。本次课程设计既锻炼了我们的实际动手能力,又在老师的指导下进行了一 次模拟实际产品的开发,对于我们以后工作能力的培养具有重要意义。 2 2游戏的总体分析与设计游戏的总体分析与设计 2.12.1 设计构想设计构想 相信大多数使用 Windows 操作系统的使用者,对这款游戏都不陌生。这款 游戏不止操作简单,规则也不难,再加上游戏速度的控制机制得宜,让整个游 戏在操作过程中充满了快乐与紧张的气氛。除了游乐当中能带给使用者快乐之 外,游戏的设计内容无形中也不断训练使用者的逻辑思考能力,对于依靠高度 脑力工作的现代人,都可以通过这个游戏,不时的检验一下自己,所以我们不 难发现,在各种可携带的电子产品上都有这款游戏的踪影。 在设计之前,我们先来了解这款游戏的规则。 在不掀开任何藏有地雷的方块情况下,以最快的速度找出所有的地雷。如 果在掀开方块的过程中,不小心翻开(踩到)藏有地雷的方块,则宣告失败 (游戏结束) ,惟有将所有不含地雷的方块掀开,游戏才算成功。 游戏的操作方面主要以鼠标为主,当鼠标指针对准未翻开的方块按下左键 时即表示翻开方块,当鼠标指针对准未翻开的方块按下右键时即表示标示或疑 毕业设计课程定做 QQ1714879127 毕业设计课程定做 QQ1714879127 示地雷,反复按下右键则方块会以未标示标示疑似三者关系不断循环。游 戏者可以通过地雷区内的数字提示了解以数字为中心的其周边八个方格内所含 的地雷数,假若翻开的方块显示数字“3” ,则表示以其为中心的周边方块内藏 有 3 个地雷。 当按下的方块不是地雷,且周边八个方块也都没有地雷时,方块会以被翻 开方块的八个方向将空白方块翻开。 2.22.2 流程规划流程规划 流程规划大致上可以分为三个部分,分别为:画面初始、游戏者按下第一 个方块和为非地雷方块时展开。 画面初始时,以游戏者最后一次设定的地雷区大小为范围画出地雷区,但 此时并未产生地雷。当游戏者按下第一个方块时产生地雷资料并启动定时器, 为何在游戏者按下第一个方块才产生地雷资料呢?其主要的用意在于不要让游 戏者第一次就踩到地雷,这样在某种程度上可以提高游戏者游玩的气氛。接着 就是如何判断按下的方块是非地雷时的处理,这也是整个游戏的技术核心,我 们可以通过递归的观念来检查周边的方块是否含有地雷及是否继续往外翻开。 流程规划如图 1 所示: 毕业设计课程定做 QQ1714879127 毕业设计课程定做 QQ1714879127 是 是 开始 依照使用者初始设定 等待按键 左键 键 右键 显示方块 1 布置地图 2 启动计时器 显示分数 结束 延按 下方 块周 围展 开非 地雷 方块 否 否 是是 否 是 否 第一次按下 按下方块是否 为地图 第一次按下 是否再玩 图 1 整体流程规划图 2.32.3 画面规划画面规划 画面规划如图 2 所示: 毕业设计课程定做 QQ1714879127 毕业设计课程定做 QQ1714879127 图 2 规划样图 说明如下: :游戏窗口(Form) 。为了避免因改变窗口大小而造成画面呈现不美观, 在这里将 BorderStyle 属性设定为 3(双线固定对话框) ,即无法以窗口边缘进行 窗口大小调整。 :地雷数显示区(PictureBox) 。 :游戏状态(Image)。 :游戏时间显示区(PictureBox)。 :计数及状态区(PictureBox)。 :地图区图样(Image)。 :地雷区(PictureBox)。 :存储图片的组件,包括游戏状态图片、地雷区图片、地雷数及秒数数 字图片(Imagelist)。 :秒数控制(Timer)。 3 3游戏的详细设计游戏的详细设计 3.13.1 游戏初始化游戏初始化 当玩家开始游戏时,游戏画面如图 3 所示: 毕业设计课程定做 QQ1714879127 毕业设计课程定做 QQ1714879127 图 3 游戏初始画面 我们可以清楚的看到,游戏界面主要分为两个主要部分:1. 计数及状态区; 2.地雷区。 首先我利用 PictureBox 组件,PictureBox 为容器类型的组件,因此可以加 入其他组件在其内。在游戏中我利用了 PictureBox 组件的两个特性,分别为容 器特性及立体框线,具体如下: (1)容器特性:只要容器本身显示的行为改变,在容器内的组件也会跟着改 变。当游戏初始时,地雷区的显示组件会循环执行,逐一布置在画面上,但由 于执行循环时多个 Image 组件要显示图形,造成分时系统执行频率显示上会出 现不流畅的情形,若在循环执行前,先将容器本身的 Visable 属性设为 False,在循环执行完成后再将 Visable 属性设为 Ture,则显示就会变得流畅 许多。 (2)立体框线:通过组件本身立体框线的属性设定,可以为游戏画面的显示 上营造出层次感。 然后再利用 ImageList 组件来存储游戏中将要使用的图片,我们可以将组件 布置于窗体后编辑组件属性,如图 4 所示: 图 4 计数及状态区 地雷区 毕业设计课程定做 QQ1714879127 毕业设计课程定做 QQ1714879127 通过 InsertPicture 和 RemovePicture 按钮即可编辑组件所存放的图片。 利用 ImageList 集合对象的 Picture 方法,即可将 ImageList 组件内的图片指 定给图形显示组件,语法如下: Set 图形组件. Picture=ImageList. ImageList(图片索引). Picture 因为一个 ImageList 组件内必须存储大小相同的图片,所以在游戏中显示的 图片共分为三个部分:1.数字计数图形;2.游戏状态图形;3.地雷区表示图形。 所以我们使用了三个 ImageList 组件来存储不同大小的图片。 接着便是对地雷区的初始化,这里我们利用 Load 及 UnLoad 指令,动态新 增及删除组件。在游戏的地雷区,我们依照游戏者自定义的地图类型,来布置 未探测地雷方块。假如设定的地图大小为 2030 时,我们可以通过双循环 ForNext 及 Load 指令在程序执行阶段动态加载表示方块的组件,程序片段如 下: 加载表示地图资料的图片 For y = 0 To 20 地雷区高 For x = 0 To 30 地雷区宽 Load 表示方块组件(index) 设定组件位置 Next x Next y 经过双循环的运算,程序就会产生 2030=600 个组件,试想如果在程序设 计阶段,就把 600 个组件布置在窗体上,那将是多么没有效率的事情,况且组 件数量的多少,还要取决于游戏玩家设定的地雷区大小,所以利用 Load 指令对 于大量加载同一组件的动作将有莫大的帮助。 加载组件后必须将组件做适当的布置,我们可以通过 Image 组件的 Move 属性,将组件布置于预定的位置,Move 函数的原型如下: 组件.Move X 坐标,Y 坐标,组件宽度,组件高度 (其中括号内表示可以省略) 再配合双循环的变量值,可以控制组件布置于窗体的方向及方式,例如以 下程序片段: For y = 0 To 20 地雷区高 For x = 0 To 30 地雷区宽 Load 表示方块组件(index) 设定组件位置 毕业设计课程定做 QQ1714879127 毕业设计课程定做 QQ1714879127 组件(index).Move x *组件宽度,y *组件高度 Next x Next y 组件将呈现先由左至右,再由上至下布置。 若将内循环改为 y 值,同样的 Move 指令,组件的布置方向将由上而下再 由左至右。布置方向的不同,会关联到组件内含的索引值不同,相对在程序执 行阶段存取组件时,所定义的组件索引值就必须考虑组件不止的方向,这样才 不会造成组件存取的错误。以由左至右再由上而下的布置方式为例,我们可以 利用以下公式,求得组件索引值:组件索引值=(X 坐标+Y 坐标*数组宽度) 这样,游戏界面的初始化工作就基本完成了,下面就是地雷的随机产生。 3.23.2 雷区的布置雷区的布置 当游戏界面初始化完成后,这时在地雷区中并未产生地雷,只有当玩家在 地雷区中第一次点下左键后,才会在地雷区中随机的布置当前游戏难度下应该 产生的地雷总数,其主要用意在于不让玩家第一次就踩到地雷,这样在某种程 度上可以提高玩家游戏的气愤。具体实现如下所示: 判断地雷区是否处于可动作状态 If isDie = False And isFinal = False Then xxx = index Mod MAP_X 标示动作图片的坐标 yyy = index MAP_X 判断为左键且该方块为未探测状态 If Button = 1 And mapFaceArr(xxx, yyy) = 1 Then 判断游戏是否等待启动 If isStart = False Then cMINE_NUM = MINE_NUM isStart = True Timer1.Enabled = True 布置地雷 Do While cMINE_NUM 0 rX = Rnd() * (MAP_X - 1) rY = Rnd() * (MAP_Y - 1) 毕业设计课程定做 QQ1714879127 毕业设计课程定做 QQ1714879127 判断数组中(rX,rY)为非地雷及 非点选的方块坐标时 If mapArr(rX, rY) = 0 And xx = 0 And yy 9 And _ Not (xx = rX And yy = rY) Then mapArr(xx, yy) = mapArr(xx, yy) + 1 End If End If Next yy Next xx End If Loop End If 3.33.3 游戏游戏中主要模块的介绍与使用中主要模块的介绍与使用 3.3.13.3.1 鼠标事件鼠标事件 在游戏过程中,我们利用鼠标所发出的信息了解游戏者的意图,进而作出 相对应的动作。 在 MouseDown 与 MouseUp 事件中,可以捕捉鼠标所按下或放开的按键为何、 鼠标光标在该组件上的坐标及是否同时按下辅助键等。函数原型如下: 组件名称_MouseDown(index As Integer, _Button As Integer, _Shift As Integer, _ x As Single, _y As Single) 组件名称_MouseUp(index As Integer, _Button As Integer, _Shift As Integer, _ x As Single, _y As Single) 在参数列中,Button 参数值表示鼠标上的按狃数值。其意义如下: 1:左键 2:右键 毕业设计课程定做 QQ1714879127 毕业设计课程定做 QQ1714879127 倘若同时按下不止一个按键时,则传回数值为按键数值相加,例如同时按 下左键及右键,则 Button 值为 1+2=3 在本游戏中,我们利用右键的 MouseDown 事件来标示“已标示”方块,利 用左键的 MouseDown 事件,来标示游戏者准备按下的方块,再利用左键的 MouseUp 事件来确定翻开的方块。这样的用意在于,假如游戏者发现按下的方 块是错误的,此时只要不松开左键,同时按下右键,该方块就会被标示为“已 标示”方块,若再松开左键,则该方块因为已成为“已标示”方块,所以就无 法翻开。 在窗口的软件中,鼠标的应用是不可或缺的,但鼠标固然好用,如果程序 设计不当,也可能造成使用者的不便。通常鼠标在软件的应用上经常使用 MouseUp 事件来作为确定使用者的操作意图,而只把 MouseDown 事件当做标示 的用途(用意就如同前面所提) ,只是为给使用者一个反悔的机会。 游戏的操作方面主要以鼠标为主,当鼠标指针对准未翻开的方块按下左键 时即表示翻开方块: If Button = 1 Then 鼠标左键 If mapFaceArr(xxx, yyy) = 1 Then Call setMineImage(index, 10) Set iState.Picture = ilSmile.ListImages(3).Picture End If 当鼠标指针对准未翻开的方块按下右键时即表示标示或疑示地雷,反复按 下右键则方块会以“未标示”“标示”“疑似”三者关系不断循环: If Button = 2 Then 鼠标右键 If mapFaceArr(xxx, yyy) = 1 Then 未探测 mapFaceArr(xxx, yyy) = 2 MINE_NUM_LABEL = MINE_NUM_LABEL + 1 Call setMineImage(index, 13) Call setNowMines ElseIf mapFaceArr(xxx, yyy) = 2 Then 标示 mapFaceArr(xxx, yyy) = 3 MINE_NUM_LABEL = MINE_NUM_LABEL - 1 Call setMineImage(index, 14) Call setNowMines 毕业设计课程定做 QQ1714879127 毕业设计课程定做 QQ1714879127 ElseIf mapFaceArr(xxx, yyy) = 3 Then 疑似 mapFaceArr(xxx, yyy) = 1 Call setMineImage(index, 9) End If 3.3.23.3.2 地雷及雷区表面探测情况地雷及雷区表面探测情况 在游戏设计上,我利用了两个二维数组分别记录地雷的分布情况及雷区表 面探测情形,如图 5 和图 6 所示: 图 5 标示地雷分布情况 图 6 标示地雷探测情况 因为两个数组维数皆为 2,所以我们通过双循环做数据的对比工作。另外, 当游戏玩家按下非地雷的方块时,程序必须自动将周边非地雷的方块翻开,这 个动作我们也可以通过双循环的方式检查以按下的方块为中心与周边的 8 个方 块所形成的 3*3 的二维数组,鼠标指针所指即是代表按下的方块,利用双循环 作数据的对比,不但速度快,而且在设计阶段,程序的架构也比较清楚。程序 设计时双循环常常搭配二维数组使用。 毕业设计课程定做 QQ1714879127 毕业设计课程定做 QQ1714879127 3.3.33.3.3 清除未靠近地雷的方块清除未靠近地雷的方块 这里先引入一个“递归”的概念, “递归”(Recursion)简单的说,就是一个 程序能被自己所定义的语句调用。递归在程序设计上是一种重要的数据结构形 态,通过递归程序的编写,在程序代码上会变得相当简洁,不过如果设计不当, 会造成无穷循环或堆迭溢满的情形,所以递归的程序中心必须含有 ifthen 或 Select Case 等设计,以终止递归执行。 在游戏过程中,当游戏者按下非地雷方块时,方块会沿四周八个方向向外 翻开非地雷的方块。 程序的执行方面必须判断:以按下方块为中心,检查周围八个方块是否为 非地雷方块,若其中有一个方块是非地雷方块时,则又以其为中心,向外检查 周围八个方块是否为非地雷方块,如此反复的执行即构成递归的使用条件。 前面已经提到,递归必须设计终止的条件判断,在本游戏的递归架构中, 当判断方块的内容为数字时(即在非地雷方块周围) ,即立即停止递归程序。 递归其实也不是万能的,以本游戏做测试,当地雷区范围越大,且地雷数 目不多时(一翻开非地雷方块,几乎全部方块都会翻开) ,执行递归就会变的非 常缓慢,甚至造成堆迭溢满(不足)的情形,所以在游戏设计上必须考虑地雷 区的大小,以免造成执行时错误中断的情况发生。 代码部分如下所示: Private Sub doClear(ByVal x As Integer, _ ByVal y As Integer, _ ByVal index As Integer) MINE_NUM_CLEAR = MINE_NUM_CLEAR + 1 For xx = x - 1 To x + 1 For yy = y - 1 To y + 1 If xx = 0 And xx = 0 And yy = 0 And _ mapArr(xx, yy) = 8 Then mapFaceArr(xx, yy) = 0 Select Case mapArr(xx, yy) Case 0 毕业设计课程定做 QQ1714879127 毕业设计课程定做 QQ1714879127 Call setMineImage(yy * MAP_X + xx), 10) Call doClear(xx, yy, (yy * MAP_X + xx) Case 1 To 8 MINE_NUM_CLEAR = MINE_NUM_CLEAR + 1 Call setMineImage(yy * MAP_X + xx), mapArr(xx, yy) End Select End If End If End If Next yy Next xx End Sub 3.3.43.3.4 游戏难度的选择游戏难度的选择 这里我设置了“初级” , “中级” , “高级”以及“自定义”四个不同的难度 级别, “初级” , “中级” , “高级”中的雷区大小和地雷总数是已经设计好了的, 如果玩家想要自己设置这些参数,可单击“游戏”“自定义” ,然后在“设置” 中输入行数,列数及地雷数,在这里我对行数及列数做出了一个限定,及行数 和列数的最大值分别为 24 和 30,当在设置地雷数的时候,如果地雷数大于或 等于行数和列数的乘积,或者地雷数小于零,地雷数都将自动的转换为:地雷 数=(行数-1)(列数-1) 。 3.43.4 游戏的判断游戏的判断 3.4.13.4.1 游戏成功完成游戏成功完成 当在规定的时间内将所有的雷都正确的标示出来,游戏就会有一个弹出框 提示你在多长时间内完成当前难度下的游戏。 还有一种情况便是当只剩下地雷未探测的时候,及雷区方块总数-已清除的 方块数=地雷总数的话,游戏也将成功完成。 3.4.23.4.2 游戏失败游戏失败 当鼠标左键按下的方块为地雷方块事,地雷将会被引爆,游戏立即结束。 当在设定时间内未探测完所有的地雷,地雷也将会引爆,对于这第二种行 为,我们可以通过 Timer 组件来加以控制。利用 Timer 组件在固定时间即会触 发时间的特性,在事件触发时便将计数值加一,直到判断计数值超过限定值时, 即地雷引爆。具体代码如下所示: 毕业设计课程定做 QQ1714879127 毕业设计课程定做 QQ1714879127 定时器 Private Sub Timer1_Timer() TIME_COUNTER = TIME_COUNTER + 1 时间计数显示 Call setNowTimer 设定状态图示 If TIME_COUNTER = 999 Then isDie = True Timer1.Enabled = False mapFaceArr(xxx, yyy) = 0 Call showMine 设定状态图示 Call setStateImage MsgBox “您探测地雷的时间已超过,地雷已引爆。“, , “超时“ End If End Sub 4 4 游戏测试结果游戏测试结果 在程序代码基本完成后,经过不断的调试与修改,最后测试本次所设计的 扫雷游戏能够正常运行,在基本功能与画面上与 Windows 自带的扫雷游戏没有 太大差别,没有出现明显的错误和漏洞,但是在一些细节方面仍然需要完善, 比如在游戏中可以加入一些声音的提示,在游戏完成和失败的时候可以弹出一 些小的 Flash 动画,还有就是可以加入一个扫雷英雄榜等等。总的来说本次设 计在功能上已经基本达到要求,其他细节方面有待以后完善。 结结 论论 课程设计是本科学习阶段一次非常难得的理论与实际相结合的机会,通过 这次比较完整的一个程序的设计,我摆脱了单纯的理论知识学习状态,和实际 设计的结合锻炼了我的综合运用所学的基础知识,解决实际问题的能力,同时 也提高我查阅文献资料、对程序整体的把握等其他能力水平,而且通过对整体 的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼, 经验得到了丰富。这是我们都希望看到的也正是我们进行课程设计

温馨提示

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

评论

0/150

提交评论