您的当前位置:首页正文

扫雷游戏的设计与开发毕业设计毕业论文

2023-01-29 来源:易榕旅网


扫雷游戏的设计与开发

论文作者姓名: 申请学位专业: 申请学位类别: 指导教师姓名(职称): 论文提交日期:

扫雷游戏的设计与开发

摘 要

扫雷是一款玩法相当简单的大众化的小游戏,游戏的胜利条件是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时要避免踩到雷。随着社会的不断进步,人们的压力也不断的提高,人们的生活节奏不断加快,在游戏层出不穷的时刻,人们对游戏的需求也不断提高,而扫雷游戏任然受到不少人的青睐,其本身的性质,决定了人们对它的喜爱的程度,不需要特殊的技巧,不需要不断的升级,还不需要太多的时间进行熟悉,简简单单却趣味无穷.人们长时间的面对计算机难免会有倦怠的情绪,而扫雷这款小游戏不会花太多时间,同时把玩家得思维带动起来,达到一举多得得效果。扫雷游戏的基本功能:点击鼠标左键于未知区域,如果未知区域有雷,游戏停止,显示所有的地雷。如果没雷,则显示周围雷数,如果周围没雷,则再查看周围八个区域是否有雷直到有雷为止并显示,玩家需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷。本次设计的主要目的是为了通过扫雷游戏来加深对Java语言的掌握,提高自己的编程水平.

关键字:扫雷游戏,算法设计,事件,JAVA

Java version of Minesweeper design and implementation Abstract

Minesweeper is a play of fairly simple popular small game, game winning conditions in the shortest period of time according to the number that appears click the grid to identify all non ray lattice, while avoiding stepped on a mine. With the progress of society, constantly improve people’s pressure, the accelerating pace of life of people in the game, thedemand for constantly emerge in an endless stream, the game is also rising, and theMinesweeper still attract many people of all ages, of its own nature, determines the extent of people love it, do not need to special skills, do not need to constantly upgrade, also do not need too much time to familiar, simple but fun. The computer in the face of people for a long time will have a tired mood, and mine the game will not spend too much time at the same time, the game player to drive up thinking, to have multiple effects。 The basic function of mine game: click the left mouse button in the unknown area, if the unknown area there is thunder, game stop, display all the mines. If there is no ray, is displayedaround the number of mine, if not around mine, then check whether there is thunderaround the eight areas until there is thunder now and show, game player needs to find outall the minefield not mine the box as soon as possible, but not stepped on landmines. The main purpose of this design is to pass the Minesweeper to deepen their understanding of Java language learning, improve their level of programming. Key words: minesweeper, algorithm design, event, JAVA

目 录

论文总页数: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 游戏测试结果 ............................................. 错误!未定义书签。 结 论 ..................................................... 错误!未定义书签。 参考文献 ..................................................... 错误!未定义书签。 致 谢 ..................................................... 错误!未定义书签。 声 明 ..................................................... 错误!未定义书签。

1 引言

1.1 课题背景及意义

在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生的一部分,越来越多的人使用计算机办公、娱乐等等。

扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。本次的毕业设计我将利用Visual Basic6。0作为开发工具,开发一款类似的“扫雷游戏”。

通过研究Windows操作系统自带的扫雷游戏,我们可以发现在这个游戏中主要有以下两个关键的地方:

第一个是初始化问题,包括随机产生本局游戏中雷的总数,雷的分布对于每一个小区域如何获取周围地区分布的雷数等等.

第二就是对鼠标事件的处理问题,既在游戏过程中对鼠标事件应如何做出反应.

经过四年的大学学习,我对理论知识已经有了一定的了解与认知,本次的毕业设计便是将书本上所学的理论知识与实际相结合,同时也是对所学知识的一种检查,希望通过本次的毕业设计使自己在程序的开发和设计上有新的认识并能有所提高。本次毕业设计既锻炼了我们的实际动手能力,又在老师的指导下进行了一次模拟实际产品的开发,对于我们以后工作能力的培养具有重要意义。

1.2 开发工具的选用及介绍

Visual Basic(VB)是一种由微软公司开发的包含协助开发环境的事件驱动编程语言。从任何标准来说,VB都是世界上使用人数最多的语言——不仅是盛赞VB的开发者还是抱怨VB的开发者的数量。它源自于BASIC编程语言.VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。

1991年,微软公司推出了Visual Basic 1.0版.这在当时引起了很大的轰动。这个连接编程语言和用户界面的进步被称为Tripod(有些时候叫做Ruby),最初的设计是由阿兰·库珀(Alan Cooper)完成的.许多专家把VB的出现当做是软件开发史上的一个具有划时代意义的事件。其实,以我们现在的目光来看,VB1.0的功能实在是太弱了;(不过最近VB6。0, VB.NET的功能相当大!)。但在当时,它是第一个“可视”的编程软件。这使得程序员欣喜之极,都尝试在VB的平台上进行软件创作。微软也不失时机地在四年内接连推出VB2.0,VB3。0,4.0

第 1 页 共 18 页

三个版本.并且从VB3开始,微软将ACCESS的数据库驱动集成到了VB中,这使得VB的数据库编程能力大大提高。从VB4开始,VB也引入了面向对象的程序设计思想.VB功能强大,学习简单。而且,VB还引入了“控件\"的概念,使得大量已经编好的VB程序可以被我们直接拿来使用。VB1.0的DOS版本VB1。0于1991年发布.这个连接编程语言和用户界面的进步被称为Tripod(有些时候叫做Ruby),最初的设计是由阿兰·库珀(Alan Cooper)完成的。

VB 2005的“显著”优点是,可以直接编写出XP风格的按钮,以及其他的控件。但是其编写的小程序占用近10MB的内存。通过几年的发展,它已成为一种专业化的开发语言和环境。用户可用Visual Basic快速创建Windows程序,现在还可以编写企业水平的客户端/服务器程序及强大的数据库应用程序。VB会吸引更多的赞誉和批评,也会继续为广大的用户和程序员使用。它非常适合用来开发拥有友好界面的程序(比如针对终端的数据),但是不适合开发其它程序(比如联合计算程序).

一个典型的VB进程VB的中心思想就是要便于程序员使用,无论是新手或者专家。VB使用了可以简单建立应用程序的GUI系统,但是又可以开发相当复杂的程序.VB的程序是一种基于窗体的可视化组件安排的联合,并且增加代码来指定组建的属性和方法。因为默认的属性和方法已经有一部分定义在了组件内,所以程序员不用写多少代码就可以完成一个简单的程序。过去的版本里面VB程序的性能问题一直被放在了桌面上,但是随着计算机速度的飞速增加,关于性能的争论已经越来越少.

窗体控件的增加和改变可以用拖放技术实现.一个排列满控件的工具箱用来显示可用控件(比如文本框或者按钮]]。每个控件都有自己的属性和事件。默认的属性值会在控件创建的时候提供,但是程序员也可以进行更改。很多的属性值可以在运行时候随着用户的动作和修改进行改动,这样就形成了一个动态的程序。举个例子来说:窗体的大小改变事件中加入了可以改变控件位置的代码,在运行时候每当用户更改窗口大小,控件也会随之改变位置。在文本框中的文字改变事件中加入相应的代码,程序就能够在文字输入的时候自动翻译或者阻止某些字符的输入。VB的程序可以包含一个或多个窗体,或者是一个主窗体和多个子窗体,类似于操作系统的样子.有很少功能的对话框窗口(比如没有最大化和最小化按钮的窗体)可以用来提供弹出功能. VB的组件既可以拥有用户界面,也可以没有。这样一来服务器端程序就可以处理增加的模块。

VB使用参数计算的方法来进行垃圾收集,这个方法中包含有大量的对象,提供基本的面向对象支持。因为越来越多组建的出现,程序员可以选用自己需要的扩展库。和有些语言不一样,VB对大小写不敏感,但是能自动转换关键词到标

第 2 页 共 18 页

准的大小写状态,以及强制使得符号表入口的实体的变量名称遵循书写规则。默认情况下字符串的比较是对大小写敏感的,但是可以关闭这个功能。 VB使得大量的外界控件有了自己的生存空间。大量的第三方控件针对VB提供.VB也提供了建立、使用和重用这些控件的方法,但是由于语言问题,从一个应用程序创建另外一个并不简单。

在讨论Visual Basic时,经常可以听到以下这些术语,因此对这些术语的基本理解十分有帮助.

控件—-简单的说,控件就是构成或者说建造Visual Basic应用程序的图形化工具,包括窗体、按钮、复选框、列表框、数据控件、表格控件和图片控件等等。.。。

事件-—由用户或操作系统引发的动作.事件的示例有击键、单击鼠标(Click)、双击鼠标(DblClick)、一段时间的限制,或从端口接收数据。

方法—-嵌入在对象定义中的程序代码,它定义对象怎样处理信息并响应某事件.例如,数据库对象有打开纪录集并从一个记录移动到另一个记录的方法程序的基本元素,它含有定义其特征的属性,定义其任务和识别它可以响应的事件的方法.控件和窗体是Visual Basic中所有对象的示例。

对象——一个控件、窗体等都可被看作一个对象。

过程——为完成某些特定的任务而编写的代码段,过程通常用于响应特定的事件,也可以当作应用程序的用户自定义函数来使用。

属性-—属性是组成用户界面的各对象的性质的具体描述。例如上述“对象”中所提到的尺寸、位置、颜色、宽度、高度等等都称为控件的 属性。属性决定对象的外观,有时也决定对象的行为。对象的属性绝大部分是VB中已经事先定义好的,但也有的属性是需要在应用 过程中才去定义的。属性即可为对象提供数据,也能从对象取回信息.

随着Intemet的迅猛发展,Microsoft的ActiveX技术出现了,并被不失时机地加入到 Visual Basic 5.0版本中(1997年).在1998年,Microsoft推出了Visual Basic 6.0版本,这一版本使VB得到了很大的扩充和增强。它还引入了使用部件编程的概念,实际上这是对面向对象编程思想的扩展。迄今为止,Visual Basic已经发展成为快速应用程序开发(RAD,Rapid Application Development)工具的代表.

2 游戏的总体分析与设计

2.1 设计构想

相信大多数使用Windows操作系统的使用者,对这款游戏都不陌生.这款游戏不止操作简单,规则也不难,再加上游戏速度的控制机制得宜,让整个游戏在

第 3 页 共 18 页

操作过程中充满了快乐与紧张的气氛。除了游乐当中能带给使用者快乐之外,游戏的设计内容无形中也不断训练使用者的逻辑思考能力,对于依靠高度脑力工作的现代人,都可以通过这个游戏,不时的检验一下自己,所以我们不难发现,在各种可携带的电子产品上都有这款游戏的踪影。

在设计之前,我们先来了解这款游戏的规则。

在不掀开任何藏有地雷的方块情况下,以最快的速度找出所有的地雷。如果在掀开方块的过程中,不小心翻开(踩到)藏有地雷的方块,则宣告失败(游戏结束),惟有将所有不含地雷的方块掀开,游戏才算成功。

游戏的操作方面主要以鼠标为主,当鼠标指针对准未翻开的方块按下左键时即表示翻开方块,当鼠标指针对准未翻开的方块按下右键时即表示标示或疑示地雷,反复按下右键则方块会以未标示→标示→疑似三者关系不断循环。游戏者可以通过地雷区内的数字提示了解以数字为中心的其周边八个方格内所含的地雷数,假若翻开的方块显示数字“3”,则表示以其为中心的周边方块内藏有3个地雷。

当按下的方块不是地雷,且周边八个方块也都没有地雷时,方块会以被翻开方块的八个方向将空白方块翻开.

2.2 流程规划

流程规划大致上可以分为三个部分,分别为:画面初始、游戏者按下第一个方块和为非地雷方块时展开.

画面初始时,以游戏者最后一次设定的地雷区大小为范围画出地雷区,但此时并未产生地雷。当游戏者按下第一个方块时产生地雷资料并启动定时器,为何在游戏者按下第一个方块才产生地雷资料呢?其主要的用意在于不要让游戏者第一次就踩到地雷,这样在某种程度上可以提高游戏者游玩的气氛.接着就是如何判断按下的方块是非地雷时的处理,这也是整个游戏的技术核心,我们可以通过递归的观念来检查周边的方块是否含有地雷及是否继续往外翻开。

流程规划如图1所示:

第 4 页 共 18 页

开始 依照使用者初始设定 否 等待按键 否 左键是 第一次按下 第一次按下 否 是 1. 布置地图 延按下方块周围展开非地雷方块 按下方块是否为地图 是 显示分数 是 是否再玩 否 结束 2. 启动计时器 右键 是 显示方块

图1整体流程规划图

2。3画面规划

画面规划如图2所示:

第 5 页 共 18 页

① ④ ② ⑥ ③ ⑤ ⑦

说明如下:

①:游戏窗口(Form)。为了避免因改变窗口大小而造成画面呈现不美观,在这里将BorderStyle属性设定为3(双线固定对话框),即无法以窗口边缘进行窗口大小调整.

②:地雷数显示区(PictureBox)。 ③:游戏状态(Image)。

④:游戏时间显示区(PictureBox)。 ⑤:计数及状态区(PictureBox)。 ⑥:地图区图样(Image)。 ⑦:地雷区(PictureBox)。

⑧:存储图片的组件,包括游戏状态图片、地雷区图片、地雷数及秒数数字图片(Imagelist)。

⑨:秒数控制(Timer)。

⑧ 图2规划样图 ⑨ 3 游戏的详细设计

3.1 游戏初始化

当玩家开始游戏时,游戏画面如图3所示:

第 6 页 共 18 页

计数及状态区 地雷区

图3游戏初始画面

我们可以清楚的看到,游戏界面主要分为两个主要部分:1。 计数及状态区;2.地雷区。

首先我利用PictureBox组件,PictureBox为容器类型的组件,因此可以加入其他组件在其内。在游戏中我利用了PictureBox组件的两个特性,分别为容器特性及立体框线,具体如下:

(1)容器特性:只要容器本身显示的行为改变,在容器内的组件也会跟着改变。当游戏初始时,地雷区的显示组件会循环执行,逐一布置在画面上,但由于执行循环时多个Image组件要显示图形,造成分时系统执行频率显示上会出现不流畅的情形,若在循环执行前,先将容器本身的Visable属性设为False,在循环执行完成后再将Visable属性设为Ture,则显示就会变得流畅许多。

(2)立体框线:通过组件本身立体框线的属性设定,可以为游戏画面的显示上营造出层次感。

然后再利用ImageList组件来存储游戏中将要使用的图片,我们可以将组件布置于窗体后编辑组件属性,如图4所示:

图4

通过InsertPicture和RemovePicture按钮即可编辑组件所存放的图片。

第 7 页 共 18 页

利用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 Next y

第 8 页 共 18 页

组件将呈现先由左至右,再由上至下布置。

若将内循环改为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)为非地雷及 ’非点选的方块坐标时

If mapArr(rX, rY) 〈> 9 And _

第 9 页 共 18 页

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

在本游戏中,我们利用右键的MouseDown事件来标示“已标示”方块,利用

第 10 页 共 18 页

左键的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) End If

第 11 页 共 18 页

3。3。2地雷及雷区表面探测情况

在游戏设计上,我利用了两个二维数组分别记录地雷的分布情况及雷区表面探测情形,如图5和图6所示:

图5标示地雷分布情况

图6标示地雷探测情况

因为两个数组维数皆为2,所以我们通过双循环做数据的对比工作。另外,当游戏玩家按下非地雷的方块时,程序必须自动将周边非地雷的方块翻开,这个动作我们也可以通过双循环的方式检查以按下的方块为中心与周边的8个方块所形成的3*3的二维数组,鼠标指针所指即是代表按下的方块,利用双循环作数据的对比,不但速度快,而且在设计阶段,程序的架构也比较清楚。程序设计时双循环常常搭配二维数组使用。

3.3.3清除未靠近地雷的方块

这里先引入一个“递归”的概念,“递归”(Recursion)简单的说,就是一个程序能被自己所定义的语句调用。递归在程序设计上是一种重要的数据结构形态,通过递归程序的编写,在程序代码上会变得相当简洁,不过如果设计不当,会造成无穷循环或堆迭溢满的情形,所以递归的程序中心必须含有if…then或Select

第 12 页 共 18 页

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

第 13 页 共 18 页

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

第 14 页 共 18 页

'时间计数显示 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

第 15 页 共 18 页

, ”超时”

因篇幅问题不能全部显示,请点此查看更多更全内容