admin 管理员组

文章数量: 1086019


2024年4月30日发(作者:defence与defend)

维普资讯

S 

∞ 

一 

囊 。 

3 

。 一 察甩|_曩一, 一■毒曩 

二 。 。 - 一 l 葛 薯≯ 

图形图像处理与游戏编程 

GRAP}~{lCS&GA M PROGRAM 

利用VB开发扫雷游戏 

徐勇 

摘要本文介绍在Windows环境下利用VB6,0开发一个简单的扫雷游戏的方法。 

扫雷,VB6.0,控件 关键词

扫雷游戏是Windows操作系统自带的一个小游戏,过去的 

几年里Windows操作系统历经数次换代,变得越来越庞大、复 

控件的caption属性为I)qzls(=sjzls),随着玩家每挖出一个雷 

(单击鼠标右键,在相应区域的command控件上插上一面小红 

旗),bqzls的值减少l; 

杂,但这个可爱的小游戏却依然保持原来的面容,我们也可以 

尝试着开发一个类似的“扫雷游戏”,下面就将笔者在教学过 

4.用一个command控件表示游戏进行的状态(初始化按 

钮),初始状态该command控件的picture属性为图:平静的 

脸,当玩家挖出所有的雷时,picture属性变为图:大笑脸,当 

玩家踩到雷时,picture属性变为图:哭脸。 

程中利用Visual Basic6.0作为工具开发一个简单扫雷游戏的 

方法介绍给读者朋友。 

通过研究Windows操作系统自带的扫雷游戏,我们可以发 

现在这个游戏中主要有以下二个关键的地方: 

初始化部分的部分源代码如下: 

● ● ● ● ● ● 

第一是初始化问题,包括随机产生本局游戏中雷的总数、 

雷的分布、对于每一个小区域如何获取周围地区分布的雷数 

等。 

For i=1 To36 P用于表示按钮当前显示的是什么图形 

P(i)=0 

第二是对鼠标事件的处理问题,即在玩游戏的过程中对鼠 

标事件应如何做出反应。 

下面将详细介绍本程序对这两个关键问题的分析与解决思 

路。 

P(index)值为O表示什么也没有,1表示红旗,2是问号

Nextl 

. 

For i=1 To 36 

Nextl 

恢复按钮 

Form1,Command1(i).Visible=True 

初始化 

1.在本程序中,设置程序界面为6 X 6共36个子区域, 

Fori=1 To36 

Randomize 

初始化雷的个数 

IfInt(10 Rnd+1)>8Then 

每一个区域i(按从左至右,从上至下标记)有labell(i)和con— 

arr(1)=1 

Else 

mand1(i)两个控件,并有一个下标变量arr(i)与之相对应。 

(注:为了在程序中能更清楚地标识每一个区域,我们将每一 

个command(i)控件的caption属性设置为i值。) 

2.随机产生总雷数。在程序的Form_Load()模块中,我们 

利用随机函数来确定每个下标变量a/T(i)的值为1还是为0, 

而正是arr(i)的值决定了第i个区域是否为雷区;接下来我们 

用labell(i).caption来标识周边地区的雷数。用整形变量sjzls 

● 

arr(i)=0 

End If 

Nexti 

 .

获得label1 l1).caption的值,用于标识周边地区的雷的 

个数 

Form1.Label1(1).Caption=arr(2)+arr(7)+arr《8) 

● ● ● ● ● 

保存实际总雷数,实际总雷数来自对每一个区域是否为雷区的 

判断;用bqzls表示显示在界面上的总雷数,初始状态sjzls= 

bqzls。 

For i=2 To 5 

Form1.Label1(i).Caption=arr(i一1)+arr(i+1) 

+arr(i+5)~+arr(i+6)+arr(i+7) 

Nextj 

3.用一个label控件来显示雷数,在刚进入程序时该label 

;tl 

维普资讯

tlI

 

: 

∞ 

。。 。樾罄霪 豢 

GRAPHlCS&GAME PROGRAM 

● ● ● ● ● ● 

统计总的雷数 

● ● ● ● ● ● 

End Sub 

二、事件处理 

1.对单击鼠标左键事件的处理。分二种情况: 

(1)当相应区域不是雷区时,挖开该区域(将该区域对应 

的command控件的visible属性变为:false),并且若能据此判断 

出周围区域也不是雷区则将周围相应的区域也挖开; 

(2)当相应区域是雷区时,则界面中所有的雷区同时 

“炸开”:第一步先显示一个提示框,第二步当提示框关闭 

时,所有的非雷区的command.visible属性值设为false,而雷区 

的command。visible属性值设为true,并且踩中的雷区的COB— 

mand.picture为一个红色的雷,而其它雷区为picture为一个黑 

色的雷。 

2。对单击鼠标右键事件的处理。 

(1)第一次用右键单击某个command(i)控件时,该控件 

上插上一面小红旗,第二次(即对有小红旗的某个command(i) 

控件)单击该command控件时标记一个问号,第三次用右键单 

击时恢复原状(即:既没有标记红旗也没有标记问号)。事件处 

理功能模块的部分源代码如下: 

Private Sub Command1 Click{Index As Integer) 

首先判断有没有踩到雷 

If arr{Index)=1 Then 踩到雷了 

Set Form 1.Command 1{0).Picture=LoadPicture 

{App.Path+ \cwface。bmp ) 

m=MsgBox{ 你真笨! &Chr{13)&Chr{1O)& 你 

完蛋了! .16, 哈哈 ) 

Set Form 1.Command 1{Index).Picture=LoadPicture 

{App.Path+ \hlei.bmp ) ’ 

For i=1 To 36 

Form1.Command1….Caption=~ 

lf i<>IndexThen 

If arr{.)=1 Then ’ 

Set Form1.Command 1{i).Picture=LoadPicture 

{App.Path+ \lei.bmp ) 

Else 

Form1.Command1{i).Visible=False 

End毓 

End If 

Nextj 

Else 

没有踩到雷.当按钮下不是雷时,将按钮打开 

If Index=0 Then 

≤ 

j 

《 毽 

翘冀 

t 

当按下初始化按钮时,初始化过程,功能等同于 

f0rm1Joad过程 

● ● ● ● ● ● 

Else 

当按下普通按钮时 

Form1.Command1(Index).Visible=False 

当周边地区没有雷时,将周边地区也同时打开 . 

If Val(Form1.Label1(Index).Caption)=0 Then 

Form1。Label1(Index)。Caption=~ 

Select Case I ndex 

Case 1 

Form1.Command1(2).Visible:False 

Form1 Command1(7).Visible=False 

Form1。Command1(8)。Visible=False 

● ● ● ● ● ● 

End Select 

End If 

End If 

End If 

End Sub 

Private Sub Command 1 ouseUp(I ndex As I nteger.B ut— 

ton As Integer.Shift As Integer.X As Single,Y As Single) 

接受鼠标右键 

当对初始化按钮单击鼠标右键时,不执行任何动作 

If Index<>0 Then 

当对其它非初始化按钮单击鼠标右键时 

If arr(Index)<>1 Then 

Set Form1.Command1(O) .Picture=LoadPicture 

(App.Path+ \xiaonian。bmp ) 

End If 

If Button=2 Or Button=vb只ightButton Then 

Select Case P(Index) 

Case2 

Set Form1.Command1(Index)。Picture:LoadPicture{~) 

PIIndex)=0 

Form1.Command1(Index).Caption=Index 

Case 1 

Set Form 1.Command 1(1 ndex).Picture=LoadPicture 

(App.Path+ \wh.bmp ) 

bqzls=bqzls+1 

Form1.Label1(O).Caption=bqzls 

P{Index)=2 

If arr{Index)=1 Then sjzls=sjzls+1 

Case 0 

Form1.Command1(Index).Caption=一 

Set Form1.Command1(Index).Picture=LoadPic. 

ture{App.Path+ \hq.bmp ) 

维普资讯

Stt |u_j6iD.黻 i~ 

一 

L 

0 ‘ 胃≯ mmm。霉III 

痢一 。 

赣秦 晶 

图形图像处理与游戏编程 

GRAPHlCS&(jAM E PROGRAM 

bqzls=bqzls一1 

End If 

End Sub 

FOrm1.Label1(0).Caption=bqzls 

P(Index)=1 

3.用鼠标左键单击初始化按钮时,执行初始化部分完成 

相应任务,鼠标右键(对于初始化按钮)暂时被封锁,不执行任 

何操作。 

If arr(Index)=1 Then sjzls=sjzls一1 

‘ End Select 

End If 

笔者在给非计算机专业本科学生上程序设计课时,利用这 

个简单的小程序向学生介绍了开发简单程序的基本方法,极大 

地激发了同学们的学习兴趣,取得了良好的教学效果。 

If bqzls=0Then 

If sjzls=0Then 

m=MsgBox( 你已经成为第一高手! ,0, 恭喜恭喜 ) 

Set Form1.Command1(O).Picture=LoadPicture 

本程序的实验环境为:WindowsXP,Visual Basic6.0。 

(App,Path+ \daxiaonian bmp ) 

当挖开所有的雷时,如果还有没有翻开的区域,将其翻开 

For i=1 TO 36 

参考文献 

1.邱仲潘等译.Visual Basic 6从入门到精通.北京电子 

工业出版社,1999 

Form1.Command1(i)。Visible:False 

Nexti 

2.刘圣才、李春葆编著。Visual Basic 6程序设计导学。 

北京清华大学出版社,2002 

Else 

m=MsgBox( 你的红旗是否插的太多7 7 7 ,0, 

疑问 ) 

End If 

End If 

业 坐 

3。李怀明、骆原、王育新编著。Visual Basic 6。0参考详 

解.北京清华大学出版社,1999 

‘ 

(收稿日期:2006年1月20日) 

坐 坐 

(上接第74页) 

3 实验结果 

从上面的图像可以看出采用拉普拉斯高斯算子进行的边缘 

检测效果比较突出,Sobel和Prewitt算子都是3×3模板,比 

较简单,不太适合对比较复杂的图像进行边缘检测。而拉普拉 

下面的图像是分别采用Sobel算子和Gauss—Laplace算子 

进行边缘检测处理的结果。原图是lena的8位灰度图像。 

斯高斯算子能精确地检测具有灰度渐变和噪声较多的灰度图 

像。 

三、结论 

由于拉普拉斯高斯算子优越性,在图像处理和模式识别领 

域得到了广泛的应用。本文给出了一种用Delphi 6开发平台 

实现拉普拉斯高斯边缘检测算法的应用程序,并将处理结果与 

其他的边缘检测算子进行了比较,从实际应用中检验了拉普拉 

斯算子,并大大增加了算法的可移植性。 

(a)lena原图 (b)Sobel算子 

参考文献 

1 田村秀行 计算机图像处理 北京科学出版社,2004 

2 边肇祺等编著.模式识别 北京清华大学出版社, 

l988 

3 王金鹤、欧宗瑛、夏晓东。工程扫描图像直线整体识 

别算法.中国图像图形学报,1998,3(11);912—917 

4 佘新平、朱力.一种具有抗噪声干扰的图像边缘提取 

算法的研究 电子技术应用,1999,25(1):9一lO 

c)Prewitt算子 (d)Gauss—Laplace算子 

(收稿日期:2006年2月6日) 


本文标签: 游戏 区域 雷数 图像