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日)
版权声明:本文标题:利用VB开发扫雷游戏 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1714454880a680821.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论