




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目 录1引言12 Visual Basic概况22.1 VB简介22.2 本设计运用的技术23可行性分析64总体设计74.1设计构想74.2流程规划75详细设计95.1画面规划95.2 设计过程105.2.1 添加菜单105.2.2 自定义窗体设计105.2.3 关于窗体设计115.4 运行界面126系统测试13结束语14参考文献16附录17 1引言本论文研究的是以Visual Basic 6.0为开发环境,设计并开发一款扫雷游戏,其功能类似于Windows操作系统自带的扫雷游戏论文首先介绍了制作游戏的整体思路及整个游戏设计的流程规划,然后介绍了雷区的布置及地雷随机产生的实现方法;重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最为重要,鼠标事件是利用鼠标所发出的信息了解使用者的意图,进而做出相对应的动作,而清除未靠近地雷区方块由于引进了“递归”这个概念而使其简单化扫雷游戏是WINDOWS系统自带的一个娱乐性的小游戏,在玩扫雷游戏的过程中也可以很好的培养耐心和细心,同时在无聊得时候可以用以休闲娱乐,如果我们自己也能动手做一个小程序来实现这个功能,自然能乐在其中。本次设计只是完成了扫雷游戏的基本功能,在细节方面仍有待完善2 Visual Basic概况2.1 VB简介VISUAL BASIC是微软公司出品的一个快速可视化程序开发工具软件。借助微软在操作系统和办公自动化软件的垄断地位,VB在短短的几年内风靡全球。VB是极具特色和功能强大的软件,主要表现:所见即所得的界面设计,基于对象的设计方法,极短的软件开发周期,较易维护的代码。同时众多的ACTIVE控件,提高了软件的使用效率。可以用于可以开发多媒体、数据库、网络、图形等方面的应用程序。 VB应用程序语言的基本特点1: 1 可视化界面设计 VB为用户提供大量的界面元素(在VB中称为控件对象),这些控件对象对于熟悉WINDOWS应用程序的用户来说是一点也不陌生,如“窗体”,“菜单”,“命令按扭”,“工具按扭”,“检查框”等等,用户只要利用鼠标、键盘把这些控件对象拖动到合适的位置,设置其大小、形状、属性等,就可以设计出所需的应用程序界面。 2 事件驱动编程 在使用VB设计应用程序是,必须首先确定应用程序如何同用户进行交互。例如发生鼠标单击、键盘输入等事件是,由用户编写代码控制这些事件的响应,这就是所谓的事件驱动编程。3 与数据库的连接性 VISUAL BASIC提供了与底层数据库系统紧密的连接。 VISUAL BASIC支持不同的关系数据库管理系统并充分发挥每一个数据库的特长。开发人员和利用内置的高性能数据库引擎JET生成独立应用或脱离服务器运行的服务以上的应用。 2.2 本设计运用的技术这个游戏里运用了VB里的组件及语法作为游戏运算和显示,其相关语法及组件如下表1所示:表1 使用的语法及组件组件及语法说明For.Next利用循环布置地雷区、按下时检查非地雷方块Load(Unload)动态加载或删除指令产生表示地雷方块图案的Image组件Mousedown与Mouseup事件判断按下或放开方块时的按键为左键或右键Imagelist组件存储游戏过程中所需的图案Image组件利用此显示地雷方块Timer组件设定触发时间,来控制方块游戏时间PictureBox组件利用此组件作为地雷方块的布置区域递归利用递归展开非地雷的方块 详细说明如下:1. For.Next循环应用在游戏设计上,利用了两个二维数组分别记录地雷的分布状况及地雷区及表面探测情形。利用数据循环的对比,不但速度快,而且在设计阶段,程序的架构比较清楚。2.Load及Unload动态增加或删除组件利用Load及Unload指令,可动态新增及删除组件。在游戏的雷区,依照使用者自定义的地图类型,布置未探测的地雷方块。加载组件后,通过Image组件的Move属性,将组件布置于预定的位置。Move函数的原型如下:组件. Move X坐标,Y坐标,组件宽度组件高度 再配合双循环的变量值,可以控制组件布置于窗体的方向及方式。3.MouseDown与MouseUp事件在游戏过程中,利用鼠标所发出的信息了解使用者的意图,进而做出相应的动作。在MouseDown与MouseUp事件中,可以捕捉鼠标所按下或放开的按键为何、鼠标光标在该组件上的坐标及是否同时按下辅助键等。用Button参数值表示鼠标上的按钮数值。其意义如下:1:左键2:右键4:中央键若同时按下不止一个按键时,则传回数值为按键数相加。例如同时按下左键及右键,则Button值为1+2=3.在本游戏中,利用右键的MouseDown事件标示“已标示”方块,利用左键的MouseDown事件,标示使用者准备按下的方块,利用左键的MouseUp事件确定翻开的方块。4. ImageList组件利用Imagelist可以存储显示方块的图形2。将组件布置于窗体上后编辑组件属性,通过【插入图片】按钮和【删除图片】按钮即可编辑组件内所存放的图片。如图1所示。因为一个Imagelist组件内必须存储大小相同的图片,所在这款游戏设计中,显示的图片共分为三个部分:游戏状态图形、数字计数图形和地雷区标示图形。图1 ImageList组件属性利用ListImage集合对象的Picture方法,即可将ListImage组件内的图片指定给图形显示组件,语法如下:Set 图形组件. Picture=Imagelist. ListImage(图片索引). Picture5.Image组件利用Image组件作为游戏执行阶段所有图形的显示。在游戏画面中,计数数字、游戏状态表情及地雷区方块图形等,都利用Image组件作为显示组件,再搭配ImageList组件所存储的图形,便可在执行阶段在同一个Image组件上变换不同的图片。6.Timer组件在游戏中,地雷引爆的可能有2中,第一种为使用者翻开(踩到)地雷方块,第二种为设定时间内未探测完所有地雷而引爆。其中第二种的行为,可以通过Timer组件来加以控制。利用Timer组件在固定时间即会触发事件的特性,在事件触发时便将计数值加1,直到判断计数值超过限定值时,即引爆地雷。7. PictureBox组件PictureBox为容器类型的组件,可以加入其它组件在内3。在游戏中利用了PictureBox的两个特性:容器特性和立体框架。分述如下:容器特性:只要容器本身显示的行为改变,在容器内的组件也会跟着改变。当游戏初始时,地雷区的显示组件会循环执行,逐一布置在画面上,但由于执行循环时多个Image组件要显示图形,造成分时系统执行频率显示上会出现不流畅的情形,若在循环之前,先将容器本身的Visible属性设为False,在循环执行完成后再将Visible属性设为True,则显示就会变得流畅许多。立体框架:通过组件本身立体框线的属性设定,可以为游戏画面的显示上营造出层次感。8.递归递归就是一个程序能被自己所定义的语句调用。在游戏过程中,当使用者按下非地雷方块时,方块会沿四周八个方向向外翻开非地雷的方块。程序执行时必须判断:以按下方块为中心。检查周围八个方块是否为非地雷方块,若其中一个方块是非地雷方块时,则又以其为中心,向外检查周围八个方块是否为非地雷方块,如此反复的行为即构成了递归的使用条件。当判断方块内容为数字时(即在非地雷方块周围),即停止递归执行。3可行性分析可行性研究的目的是用最小的代价在尽可能短的时间内确定问题是否能够解决。也就是说可行性研究的目的不是解决问题,而是确定问题是否值得去解,研究在当前的具体条件下,是否具备必要的资源和其它条件。一般说来,应从经济可行性、技术可行性、运行可行性、和开发方案可行性等方面研究可行性。可行性分析:1. 对于当前条件下,完全可以达到该系统功能目标;2. 该系统功能在现有技术下,完全可以实现;3目标: 实现游戏的各类功能,如:初、中、高(自定义)各个游戏等级.4 用户的特点;都是对扫雷游戏的喜好者.4总体设计4.1设计构想本游戏的功能类似于Windows操作系统自带扫雷游戏,设计之前,先了解这款游戏的规则。在不掀开任何的情况下,以最快的速度找出所有的地雷。如果在掀开方块的过程中,不小心翻开(踩到)藏有地雷的方块,则宣告失败(死亡),惟有将所有不含地雷的方块掀开,游戏才算成功(存活)。游戏的操作方面主要以鼠标为主,当鼠标指针对准未翻开的方块按下左键时即表示翻开方块,当鼠标指针对准未翻开的方块按下右键时即表示标示或疑似地雷,反复按下右键则方块会依未标示标示疑似三者关系不断循环。使用者可以通过地雷区内的数表示以其为中心的周边八个方块内所含的地雷数。当按下的方块不是地雷,且周边也没有地雷时,方块会以被翻开的八个方向将空白方块翻开。4.2流程规划流程规划分为三个部分,分别为:画面初始、使用者按下第一个方块和为非地雷方块时展开。画面初始时,以使用者最后一次设定的地雷区大小为范围画出地雷区,但此时并未产生地雷。当使用者按下第一个方块时产生地雷并启动定时器,主要为了不让使用者第一次就踩到地雷,这样在某种程度上提高了游玩的气氛。接着就是如何判断按下的方块为非地雷时的处理,这也是整个游戏的技术核心,可以通过递归的观念来检查周边是否含有地雷及是否继续往外翻开。流程规划如图2所示:开始依照使用者设定初始等待按键右键?第一次按下方块?显示方块1.布置地图2.启动定时器按下方块是否为地图左键?显示分数是否再玩结束计时器时间到?延按下方块周围展开非地雷方块是是是否否否否否是否 图2 流程规划图5详细设计5.1画面规划画面规划如图3所示:17786121011130516015014049321图3 画面规划图说明如下:游戏窗口(Form)。为了避免因改变窗口大小而造成画面呈现不美观,将BorderStyle属性值设定为3(双线固定对话框),即无法以窗口边缘进行窗口大小调整。:计数区(PictureBox)。:地雷数显示区(PictureBox)。:游戏时间显示区(PictureBox)。:地雷区(PictureBox)。:地雷数(Image)。:游戏状态(Image)。:经过秒数(Image)。:地雷区图样(Image)。:游戏状态图片(ImageList)。:地雷区图片(ImageList)。:地雷数及秒数数字图片(ImageList)。:秒数控制(Timer)。5.2 设计过程5.2.1 添加菜单使用菜单编辑器编辑游戏的主菜单,点击“工具”菜单上的“菜单编辑器”命令选项,即可打开菜单编辑器。菜单控件在列表框中的位置决定了该控件是菜单标题、菜单项、子菜单标题,还是子菜单项。对于一些常用的菜单命令,可以设置“Alt+快捷键”组合来快速打开菜单。方法是在菜单编辑器中的Caption后面添加“(R)”就可以了。图4 菜单编辑器5.2.2 自定义窗体设计打开主菜单游戏自定义,可以显示窗体,如图5所示。通过这个窗体使用者可以自己设定行数、列数和地雷数。图5 自定义窗体设置参数Private Sub Command1_Click() If tHeight.Text 50 Or tHeight.Text 50 Or tWidth.Text (tHeight.Text * tWidth.Text) Or tMines.Text 0 rX = Rnd() * (MAP_X - 1) rY = Rnd() * (MAP_Y - 1) 判断数组中(rX,rY)为非地雷及 非点选的方块坐标时 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 = 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 将该方块坐标值设为0,表示为翻开状态 mapFaceArr(xxx, yyy) = 0 选择地雷区数组判断该坐标 Select Case mapArr(xxx, yyy) Case 0 空白 Call doClear(xxx, yyy, index) Call setMineImage(index, 10) Case 1 To 8 数字 MINE_NUM_CLEAR = MINE_NUM_CLEAR + 1 Call setMineImage(index, mapArr(xxx, yyy) Case 9 地雷 isDie = True Timer1.Enabled = False Call showMine Call setMineImage(index, 12) End Select 检查是否只剩下地雷未探测 If MAP_X * MAP_Y - MINE_NUM_CLEAR = MINE_NUM Then isFinal = True End If End If 设定状态图示 Call setStateImage End IfEnd Sub清除未靠近地雷的区块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 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 xxEnd Sub按下表情图案时Private Sub iState_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) If Button = 1 Then Set iState.Picture = ilSmile.ListImages(2).Picture End IfEnd Sub松开表情图案时Private Sub iState_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single) If Button = 1 Then Set iState.Picture = ilSmile.ListImages(1).Picture Form_Load End IfEnd Sub设定状态图示Private Sub setStateImage() 状态判断 If isDie = False Then If isFinal = True Then Set iState.Picture = ilSmile.ListImages(5).Picture Call showFinal 显示过关 Else Set iState.Picture = ilSmile.ListImages(1).Picture End If Else Set iState.Picture = ilSmile.ListImages(4).Picture End IfEnd Sub设定方块图片Private Sub setMineImage(m_index As Integer, il_index As Integer) Set iMine(m_index).Picture = ilMap.ListImages(il_index).PictureEnd Sub初始设定Private Sub setInit(index As Integer) isStart = False isFinal = False isDie = False Timer1.Enabled = False TIME_COUNTER = 0 MINE_NUM_LABEL = 0 MINE_NUM_CLEAR = 0 Select Case index Case 0 MAP_X = 9 MAP_Y = 9 MINE_NUM = 10 Case 1 MAP_X = 16 MAP_Y = 16 MINE_NUM = 40 Case 2 MAP_X = 30 MAP_Y = 16 MINE_NUM = 99 Case 3 MAP_X = GetSetting(Mine, SET, 1, 30) MAP_Y = GetSetting(Mine, SET, 2, 24) MINE_NUM = GetSetting(Mine, SET, 3, 50) End Select For i = 0 To 3 muGame_Level(i).Checked = False Next i muGame_Level(index).Checked = True SaveSetting Mine, Level, 1, index 储存选择End Sub计数区初始化Private Sub setCounterInit() Dim wid As Integer Dim hig As Integer 地雷计数显示 Call setNowMines 显示现在地雷数 iMC1.Move 0, 0 iMC2.Move iMC1.Left + iMC1.Width, 0 iMC3.Move iMC2.Left + iMC2.Width, 0 设定地雷计数框大小 wid = pMC.Width - pMC.ScaleWidth hig = pMC.Height - pMC.ScaleHeight pMC.Width = iMC1.Width * 3 + wid pMC.Height = iMC1.Height + hig 时间计数显示 Call setNowTimer iTC1.Move 0, 0 iTC2.Move iTC1.Left + iTC1.Width, 0 iTC3.Move iTC2.Left + iTC2.Width, 0 设定时间计数框大小 wid = pTC.Width - pTC.ScaleWidth hig = pTC.Height - pTC.ScaleHeight pTC.Width = iTC1.Width * 3 + wid pTC.Height = iTC1.Height + hig 计数区配置 wid = pCounter.Width - pCounter.ScaleWidth hig = pCounter.Height - pCounter.ScaleHeightpCounter.Move 150, _150, _iMine(0).Width * MAP_X + wid, _pMC.Height + 300 + hig 设定组件位置 Set iState.Picture = ilSmile.ListImages(1).Picture iState.Move (pCounter.ScaleWidth - iState.Width) / 2, 150 pMC.Move 150, 150 pTC.Move pCounter.ScaleWidth - 150 - pTC.Width, 150End Sub地图初始化Private Sub setMapInit() pMap.Visible = False 重新定义地图数组大小 ReDim mapArr(MAP_X, MAP_Y) ReDim mapFaceArr(MAP_X, MAP_Y) 地图中小方块长宽 Dim iWid As Integer Dim iHig As Integer iWid = iMine(0).Width iHig = iMine(0).Height 设定地图数组数据 并加载表示地图数据之图片 For y = 0 To MAP_Y - 1 For x = 0 To MAP_X - 1 mapArr(x, y) = 0 mapFaceArr(x, y) = 1 Call setMineImage(y * MAP_X + x, 9) iMine(y * MAP_X + x).Move x * iWid, y * iHig iMine(y * MAP_X + x).Visible = True iMine(y * MAP_X + x).ZOrder If iMine.Count (MAP_X * MAP_Y) Then Load iMine(iMine.Count) End If Next x Next y 设定地图区大小位置 Dim wid As Integer Dim hig As Integer wid = pMap.Width - pMap.ScaleWidth hig = pMap.Height - pMap.ScaleHeight pMap.Move 150, _ pCounter.Height + 300, _ MAP_X * iWid + wid, _ MAP_Y * iHig + hig pMap.Visible = TrueEnd Sub设定窗体大小Private Sub setFormSize() Dim wid As Integer Dim hig As Integer wid = Me.Width - Me.ScaleWidth hig = Me.Height - Me.ScaleHeight Me.Width = pMap.Width + 300 + wid Me.Height = pMap.Height + pCounter.Height + 450 + higEnd Sub显示现在地雷数Private Sub setNowMines() Dim intNM As Integer intNM = MINE_NUM - MINE_NUM_LABEL If intNM 0 Then intNM = 0 Set iMC1.Picture = _ ilCounter.ListImages(intNM Mod 1000) 100 + 1).Picture Set iMC2.Picture = _ ilCounter.ListImages(intNM Mod 100) 10 + 1).Picture Set iMC3.Picture = _ ilCounter.ListImages(intNM Mod 10) + 1).PictureEnd Sub显示现在经过秒数Private Sub setNowTimer() Set iTC1.Picture = _ ilCounter.ListImages(TIME_COUNTER Mod 1000) 100 + 1).Picture Set iTC2.Picture = _ ilCounter.ListImages(TIME_COUNTER Mod 100) 10 + 1).Picture Set iTC3.Picture = _ ilCounter.ListImages(TIME_COUNTER Mod 10) + 1).PictureEnd Sub显示地雷Private Sub showMine() For i = 0 To MAP_X For j = 0 To MAP_Y 显示所有地雷 If mapArr(i, j) = 9 Then Call setMineImage(j * M
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 办公自动化系统合同
- 2025年新能源储能系统关键技术专利分析报告
- 八年级英语上册 Unit 8 How do you make a banana milk shake Section A(1a-1c)说课稿 (新版)人教新目标版
- 2025年农村地区光伏储能系统应用前景及效益评估报告
- 新能源电动货车在2025年海鲜冷链物流市场的应用场景及市场前景报告
- 110变电站施工方案
- 武汉营销方案
- 2025年新能源汽车内饰智能化设计对残障人士的便利性研究报告
- 电视百宝箱说课稿小学综合实践活动安徽大学版四年级下册-安徽大学版
- 搜狐营销方案
- 锯床操作规程
- 服刑人员出监适应性教育
- 一故事一音标课件
- 2025年煤矿安全规程试题及答案
- 肌动蛋白结合蛋白筛选技术-深度研究
- 六年级数学口算与解决问题
- 住宅厨房卫生间排烟气系统建筑构造L18J905
- FZ∕T 61002-2019 化纤仿毛毛毯
- 乡村医生年度个人述职报告(2篇)
- 读后续写+小狗Deedo被留下陪伴小主人+讲义 高三英语二轮复习
- 加油站新进员工培训计划方案
评论
0/150
提交评论