VB扫雷游戏设计论文
发布时间:2024-10-12
发布时间:2024-10-12
VB扫雷游戏设计论文,一篇比较实用的论文。
VB扫雷游戏设计论文
摘 要
本论文研究的是以Visual Basic 6.0为开发环境,设计并开发一款扫雷游戏,其功能类似于Windows操作系统自带的扫雷游戏。论文首先介绍了制作游戏的整体思路及整个游戏设计的流程规划,然后介绍了雷区的布置及地雷随机产生的实现方法;重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最为最要,鼠标事件是利用鼠标所发出的信息了解使用者的意图,进而做出相对应的动作,而清除未靠近地雷区方块由于引进了“递归”这个概念而使其简单化。
本次设计只是完成了扫雷游戏的基本功能,在细节方面仍有待以后完善。
关键词:扫雷;Visual Basic 6.0;事件;递归
VB扫雷游戏设计论文,一篇比较实用的论文。
目 录
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
VB扫雷游戏设计论文,一篇比较实用的论文。
1引言
1.1 课题背景及意义
在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生的一部分,越来越多的人使用计算机办公、娱乐等等。
扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。本次的课程设计我将利用Visual Basic6.0作为开发工具,开发一款类似的“扫雷游戏”。
通过研究Windows操作系统自带的扫雷游戏,我们可以发现在这个游戏中主要有以下两个关键的地方:
第一个是初始化问题,包括随机产生本局游戏中雷的总数,雷的分布对于每一个小区域如何获取周围地区分布的雷数等等。
第二就是对鼠标事件的处理问题,既在游戏过程中对鼠标事件应如何做出反应。
经过学习,我对理论知识已经有了一定的了解与认知,本次的课程设计便是将书本上所学的理论知识与实际相结合,同时也是对所学知识的一种检查,希望通过本次的课程设计使自己在程序的开发和设计上有新的认识并能有所提高。本次课程设计既锻炼了我们的实际动手能力,又在老师的指导下进行了一次模拟实际产品的开发,对于我们以后工作能力的培养具有重要意义。
2 游戏的总体分析与设计
2.1 设计构想
相信大多数使用Windows操作系统的使用者,对这款游戏都不陌生。这款游戏不止操作简单,规则也不难,再加上游戏速度的控制机制得宜,让整个游戏在操作过程中充满了快乐与紧张的气氛。除了游乐当中能带给使用者快乐之外,游戏的设计内容无形中也不断训练使用者的逻辑思考能力,对于依靠高度脑力工作的现代人,都可以通过这个游戏,不时的检验一下自己,所以我们不难发现,在各种可携带的电子产品上都有这款游戏的踪影。
在设计之前,我们先来了解这款游戏的规则。
在不掀开任何藏有地雷的方块情况下,以最快的速度找出所有的地雷。如果在掀开方块的过程中,不小心翻开(踩到)藏有地雷的方块,则宣告失败(游戏结束),惟有将所有不含地雷的方块掀开,游戏才算成功。
游戏的操作方面主要以鼠标为主,当鼠标指针对准未翻开的方块按下左键时即表示翻开方块,当鼠标指针对准未翻开的方块按下右键时即表示标示或疑示地
VB扫雷游戏设计论文,一篇比较实用的论文。
雷,反复按下右键则方块会以未标示→标示→疑似三者关系不断循环。游戏者可以通过地雷区内的数字提示了解以数字为中心的其周边八个方格内所含的地雷数,假若翻开的方块显示数字“3”,则表示以其为中心的周边方块内藏有3个地雷。
当按下的方块不是地雷,且周边八个方块也都没有地雷时,方块会以被翻开方块的八个方向将空白方块翻开。
2.2 流程规划
流程规划大致上可以分为三个部分,分别为:画面初始、游戏者按下第一个方块和为非地雷方块时展开。
画面初始时,以游戏者最后一次设定的地雷区大小为范围画出地雷区,但此时并未产生地雷。当游戏者按下第一个方块时产生地雷资料并启动定时器,为何在游戏者按下第一个方块才产生地雷资料呢?其主要的用意在于不要让游戏者第一次就踩到地雷,这样在某种程度上可以提高游戏者游玩的气氛。接着就是如何判断按下的方块是非地雷时的处理,这也是整个游戏的技术核心,我们可以通过递归的观念来检查周边的方块是否含有地雷及是否继续往外翻开。
流程规划如图1所示:
VB扫雷游戏设计论文,一篇比较实用的论文。
图1整体流程规划图
2.3画面规划
画面规划如图2所示:
VB扫雷游戏设计论文,一篇比较实用的论文。
说明如下:
①:游戏窗口(Form)。为了避免因改变窗口大小而造成画面呈现不美观,在这里将BorderStyle属性设定为3(双线固定对话框),即无法以窗口边缘进行窗口大小调整。
②:地雷数显示区(PictureBox)。
③:游戏状态(Image)。
④:游戏时间显示区(PictureBox)。
⑤:计数及状态区(PictureBox)。
⑥:地图区图样(Image)。
⑦:地雷区(PictureBox)。
⑧:存储图片的组件,包括游戏状态图片、地雷区图片、地雷数及秒数数字图片(Imagelist)。
⑨:秒数控制(Timer)。 图23 游戏的详细设计
3.1 游戏初始化
当玩家开始游戏时,游戏画面如图3所示:
VB扫雷游戏设计论文,一篇比较实用的论文。
图3游戏初始画面
我们可以清楚的看到,游戏界面主要分为两个主要部分:1. 计数及状态区;
2.地雷区。
首先我利用PictureBox组件,PictureBox为容器类型的组件,因此可以加入其他组件在其内。在游戏中我利用了PictureBox组件的两个特性,分别为容器特性及立体框线,具体如下:
(1)容器特性:只要容器本身显示的行为改变,在容器内的组件也会跟着改变。当游戏初始时,地雷区的显示组件会循环执行,逐一布置在画面上,但由于执行循环时多个Image组件要显示图形,造成分时系统执行频率显示上会出现不流畅的情形,若在循环执行前,先将容器本身的Visable属性设为False,在循环执行完成后再将Visable属性设为Ture,则显示就会变得流畅许多。
(2)立体框线:通过组件本身立体框线的属性设定,可以为游戏画面的显示上营造出层次感。
然后再利用ImageList组件来存储游戏中将要使用的图片,我们可以将组件布置于窗体后编辑组件属性,如图4所示:
图4
通过InsertPicture和RemovePicture按钮即可编辑组件所存放的图片。
VB扫雷游戏设计论文,一篇比较实用的论文。
利用ImageList集合对象的Picture方法,即可将ImageList组件内的图片指定给图形显示组件,语法如下:
Set 图形组件. Picture=ImageList. ImageList(图片索引). Picture
因为一个ImageList组件内必须存储大小相同的图片,所以在游戏中显示的图片共分为三个部分:1.数字计数图形;2.游戏状态图形;3.地雷区表示图形。
所以我们使用了三个ImageList组件来存储不同大小的图片。
接着便是对地雷区的初始化,这里我们利用Load及UnLoad指令,动态新增及删除组件。在游戏的地雷区,我们依照游戏者自定义的地图类型,来布置未探测地雷方块。假如设定的地图大小为20×30时,我们可以通过双循环For…Next及Load指令在程序执行阶段动态加载表示方块的组件,程序片段如下:
‘加载表示地图资料的图片
For y = 0 To 20 ‘地雷区高
For x = 0 To 30 ‘地雷区宽
Load 表示方块组件(index)
‘设定组件位置……
Next x
Next y
经过双循环的运算,程序就会产生20×30=600个组件,试想如果在程序设计阶段,就把600个组件布置在窗体上,那将是多么没有效率的事情,况且组件数量的多少,还要取决于游戏玩家设定的地雷区大小,所以利用Load指令对于大量加载同一组件的动作将有莫大的帮助。
加载组件后必须将组件做适当的布置,我们可以通过Image组件的Move属性,将组件布置于预定的位置,Move函数的原型如下:
组件.Move X坐标,[Y坐标],[组件宽度],[组件高度]
(其中括号内表示可以省略)
再配合双循环的变量值,可以控制组件布置于窗体的方向及方式,例如以下程序片段:
For y = 0 To 20 ‘地雷区高
For x = 0 To 30 ‘地雷区宽
Load 表示方块组件(index)
‘设定组件位置……
组件(index).Move x *组件宽度,y *组件高度
Next x
VB扫雷游戏设计论文,一篇比较实用的论文。
Next y
组件将呈现先由左至右,再由上至下布置。
若将内循环改为y值,同样的Move指令,组件的布置方向将由上而下再由左至右。布置方向的不同,会关联到组件内含的索引值不同,相对在程序执行阶段存取组件时,所定义的组件索引值就必须考虑组件不止的方向,这样才不会造成组件存取的错误。以由左至右再由上而下的布置方式为例,我们可以利用以下公式,求得组件索引值:组件索引值=(X坐标+Y坐标*数组宽度)
这样,游戏界面的初始化工作就基本完成了,下面就是地雷的随机产生。
3.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)
'判断数组中(rX,rY)为非地雷及
'非点选的方块坐标时
VB扫雷游戏设计论文,一篇比较实用的论文。
If mapArr(rX, rY) <> 9 And _
Not (rX = xxx And rY = yyy) Then
cMINE_NUM = cMINE_NUM - 1
mapArr(rX, rY) = 9
'地雷外围数字各加一
For xx = rX - 1 To rX + 1
For yy = rY - 1 To rY + 1
If xx >= 0 And xx <= MAP_X And _ yy >= 0 And yy <= MAP_Y Then If mapArr(xx, 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.3游戏中主要模块的介绍与使用
3.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:右键
倘若同时按下不止一个按键时,则传回数值为按键数值相加,例如同时按下左键及右键,则Button值为1+2=3
VB扫雷游戏设计论文,一篇比较实用的论文。
在本游戏中,我们利用右键的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
ElseIf mapFaceArr(xxx, yyy) = 3 Then '疑似
mapFaceArr(xxx, yyy) = 1
Call setMineImage(index, 9)
VB扫雷游戏设计论文,一篇比较实用的论文。
End If
3.3.2地雷及雷区表面探测情况
在游戏设计上,我利用了两个二维数组分别记录地雷的分布情况及雷区表面探测情形,如图5和图6所示:
图5标示地雷分布情况
图6标示地雷探测情况
因为两个数组维数皆为2,所以我们通过双循环做数据的对比工作。另外,当游戏玩家按下非地雷的方块时,程序必须自动将周边非地雷的方块翻开,这个动作我们也可以通过双循环的方式检查以按下的方块为中心与周边的8个方块所形成的3*3的二维数组,鼠标指针所指即是代表按下的方块,利用双循环作数据的对比,不但速度快,而且在设计阶段,程序的架构也比较清楚。程序设计时双循环常常搭配二维数组使用。
3.3.3清除未靠近地雷的方块
这里先引入一个“递归”的概念,“递归”(Recursion)简单的说,就是一个程序能被自己所定义的语句调用。递归在程序设计上是一种重要的数据结构形态,通过递归程序的编写,在程序代码上会变得相当简洁,不过如果设计不当,
VB扫雷游戏设计论文,一篇比较实用的论文。
会造成无穷循环或堆迭溢满的情形,所以递归的程序中心必须含有if…then或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 <= MAP_X And _
yy >= 0 And yy <= MAP_Y Then
If Not (xx = x And yy = y) Then
If mapFaceArr(xx, yy) = 1 And _
mapArr(xx, yy) >= 0 And _
mapArr(xx, yy) <= 8 Then
mapFaceArr(xx, yy) = 0
Select Case mapArr(xx, yy)
Case 0
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
VB扫雷游戏设计论文,一篇比较实用的论文。
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.4游戏难度的选择
这里我设置了“初级”,“中级”,“高级”以及“自定义”四个不同的难度级别,“初级”,“中级”,“高级”中的雷区大小和地雷总数是已经设计好了的,如果玩家想要自己设置这些参数,可单击“游戏”→“自定义”,然后在“设置”中输入行数,列数及地雷数,在这里我对行数及列数做出了一个限定,及行数和列数的最大值分别为24和30,当在设置地雷数的时候,如果地雷数大于或等于行数和列数的乘积,或者地雷数小于零,地雷数都将自动的转换为:地雷数=(行数-1)×(列数-1)。
3.4游戏的判断
3.4.1游戏成功完成
当在规定的时间内将所有的雷都正确的标示出来,游戏就会有一个弹出框提示你在多长时间内完成当前难度下的游戏。
还有一种情况便是当只剩下地雷未探测的时候,及雷区方块总数-已清除的方块数=地雷总数的话,游戏也将成功完成。
3.4.2游戏失败
当鼠标左键按下的方块为地雷方块事,地雷将会被引爆,游戏立即结束。 当在设定时间内未探测完所有的地雷,地雷也将会引爆,对于这第二种行为,我们可以通过Timer组件来加以控制。利用Timer组件在固定时间即会触发时间的特性,在事件触发时便将计数值加一,直到判断计数值超过限定值时,即地雷引爆。具体代码如下所示:
'定时器
Private Sub Timer1_Timer()
TIME_COUNTER = TIME_COUNTER + 1
'时间计数显示
VB扫雷游戏设计论文,一篇比较实用的论文。
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 游戏测试结果
在程序代码基本完成后,经过不断的调试与修改,最后测试本次所设计的扫雷游戏能够正常运行,在基本功能与画面上与Windows自带的扫雷游戏没有太大差别,没有出现明显的错误和漏洞,但是在一些细节方面仍然需要完善,比如在游戏中可以加入一些声音的提示,在游戏完成和失败的时候可以弹出一些小的Flash动画,还有就是可以加入一个扫雷英雄榜等等。总的来说本次设计在功能上已经基本达到要求,其他细节方面有待以后完善。
结 论
课程设计是本科学习阶段一次非常难得的理论与实际相结合的机会,通过这次比较完整的一个程序的设计,我摆脱了单纯的理论知识学习状态,和实际设计的结合锻炼了我的综合运用所学的基础知识,解决实际问题的能力,同时也提高我查阅文献资料、对程序整体的把握等其他能力水平,而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,经验得到了丰富。这是我们都希望看到的也正是我们进行课程设计的目的所在。
虽然设计内容繁多,过程繁琐但我的收获却更加丰富。各种组件的运用,各种算法的应用,各种控件的利用我都是随着设计的不断深入而不断熟悉并逐步掌握的。和老师以及同学的沟通交流更使我对程序整体的规划与设计有了新的认识也对自己提出了新的要求。
提高是有限的但提高也是全面的,正是这一次设计让我积累了许多实际经验,也必然会让我在未来的工作学习中表现出更高的应变能力和理解力。
顺利如期的完成本次课程设计给了我很大的信心,但是也让多不足的地方,
VB扫雷游戏设计论文,一篇比较实用的论文。
学习其实就是一个不断完善的过程,正视自己的不足之处,在以后的工作和学习中不断的弥补这些不足之处,在以后的生活中也要保持同样的态度,不断的完善自己。
参考文献
[1] 唐任仲.工程应用软件开发技术[M].北京:化学工业出版社,1999。
[2] 李怀明.Visual Basic 6.0 中文版 参考详解[M].北京:清华大学出版社,1999。
[3] 李善茂.Visual Basic 6.0 高级编程技巧[M].西安:电子工业出版社,1999。
[4] 谭浩强.Visual Basic 6.0 中文版 提高与应用[M].西安:电子工业出版社,1999。
[5] 冯锋,王运坚.Visual Basic 程序设计基础教程[M].西安:电子工业出版社,1999。
[6] 何斌,刘醒.Visual Basic 6.0 应用指南[M].成都:四川大学出版社,1998。
[7] 伍俊良.VB课程设计与系统开发案例[M].北京:清华大学出版社,2002。