扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
本文以一个拼图益智小游戏的原形为实例,介绍VB编程的一些技巧。
游戏介绍:
这是一个简单的益智拼图游戏。如图一所示,窗体上有顺序排列有九张图片,图片1-8显示数字1-8,第九张为空白图片。点击“开局”按钮后,程序随机排列九张图片(如图二),游戏者单击与空白图片相邻的图片可以交换该图片与空白图片的位置。游戏者需要开动脑筋,移动并重新排列九张图片的位置,直至恢复出开局前所示的排列顺序为赢。
(图一)
(图二)
准备工作:
用Photoshop或其它图像处理软件制作九个图像文件P1.jpg,P2.jpg……P9.jpg,除一张为空白外,图片上依次显示1-8个数字。
程序编写:
1、新建一Project,在Form1上放置CommandButton类型的控件Command1,将Caption属性设置为“开局”。
2、在窗体中放置一PictureBox控件,Name为Picture1。在该控件有焦点时,从Edit菜单中选择Copy。然后,再从Edit菜单中,选择Paste。这时,VB会显示一个对话框,确认是否要创建一个控件数组,显示Yes以确认该动作。此时控件被赋予的索引值为1。此前画的第一个PictureBox控件的索引值为0。重复此过程放置其余七个控件数组成员。
将PictureBox1(0)—PictureBox1(8)的Picture属性依次设为P1.jpg、P2.jpg……P9.jpg。
技巧提示: 用控件数组增加控件比单纯将多个同类型的控件加到窗体上占用更少的资源。如果想让几个控件共享代码,控件数组也很有用。每个新的数组元素的索引值都对应于该元素加入控件数组时的顺序。当控件以这种方式加入时,大多数直观的属性(如高度、宽度和颜色)都被从控件数组的第一个控件中复制到新控件中。
显然,在程序中我们需要记录这样一些数据:每次移动某一图片后所有图片的排列顺序、本次被点击的图片位置、空白图片的位置、移动次数等。因此,在程序声明部份定义:
Option Explicit
Dim ImageID(8) As Integer ’记录图片排列顺序的数组
Dim Position As Integer ’被点击的图片位置
Dim XPosition As Integer ’空图片的位置
Dim MoveTimes As Integer ’记录移动次数
Dim CalPosition As Integer ’用于计算位置
Dim Started As Boolean
Dim Win As Boolean
Dim pic(8) As Picture
双击Form1,加入代码:
Private Sub Form_Load()
Dim i As Integer
For i = 0 To 8
Set pic(i) = Picture1(i).Picture
Next
End Sub
技巧提示:将位图、图标、元文件、增强元文件、GIF 和 JPEG 等各类图像赋值给具有 Picture 属性的对象,可以用 Picture 对象来操纵它们。
“开局” 按钮被点击后,要随机重排九张图片的位置。双击“开局”按钮,加入代码:
Private Sub Command1_Click()
Dim i As Integer
Dim Temp(8) As Integer
Dim ChosenNumber As Integer
For i = 0 To 8
Temp(i) = i
Next
Randomize (Timer)
For i = 8 To 0 Step -1
ChosenNumber = Int(i * Rnd)
ImageID(8 - i) = Temp(ChosenNumber)
Temp(ChosenNumber) = Temp(i)
Next
For i = 0 To 8
Picture1(i).Picture = pic(ImageID(i))
If ImageID(i) = 8 Then XPosition = i
Next
Started = True
MoveTimes = 0
End Sub
技巧提示:本段的核心是无重复随机数列的产生。这一技巧在编程中十分有用:比如说纸牌游戏中的洗牌过程、图像处理中图像的淡化、软件中常用到的每日一帖等都可用到此技巧。
最后,是游戏中对图片点击事件的处理:根据游戏者点击的位置判断是否要重画图片,是否已经成功重排所有图片:
Private Sub Picture1_Click(Index As Integer)
Dim i As Integer
Dim Response As Integer
Position = Index
If Started = False Then Exit Sub
If ((Position <> 0) And (Position <> 3) And (Position <> 6)) Then
CalPosition = Position - 1
If (CalPosition = XPosition) Then CVale
End If
If ((Position <> 2) And (Position <> 5) And (Position <> 8)) Then
CalPosition = Position + 1
If (CalPosition = XPosition) Then CVale
End If
If (Position >= 3) Then
CalPosition = Position - 3
If (CalPosition = XPosition) Then CVale
End If
If (Position <= 5) Then
CalPosition = Position + 3
If (CalPosition = XPosition) Then CVale
End If
Win = True
For i = 0 To 7
If (ImageID(i) <> i) Then Win = False
If Win = False Then Exit For
Next
If (Win = True) Then
MsgBox "恭喜恭喜!你很聪明。" & vbCrLf & "(共移动" & MoveTimes & "次)", vbOKOnly, "恭喜!"
Started = False
End If
End Sub
在程序声明部分加入代码:
Sub CVale()
Picture1(CalPosition).Picture = Picture1(Position).Picture
ImageID(CalPosition) = ImageID(Position)
Picture1(Position).Picture = pic(8)
ImageID(Position) = 8
XPosition = Position
MoveTimes = MoveTimes + 1
End Sub
Cvalue过程重新排列图片,并记录新的图片排列顺序。
技巧提示:这是程序的核心部分。但是其原理却是非常简单的:单击图片后,程序根据被点击PictureBox对象的位置和空白图片的位置,判断、交换图片的位置,然后将新的位置记录到ImageID数组中。根据ImageID数组中记录的顺序即可判断游戏者是否取得成功。
至此,我们已经可以按F5键运行这个程序来试试自己的聪明才智究竟如何了。
当然,我们这里介绍的只是这个益智小游戏的原型。有兴趣的网友,只需简单改动,就可将其变为一个N X M (N,M 不小于3)图片的形式。如果再加上点“英雄榜”之类的功能,就能DIY出一个象模象样的小游戏了。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者