用Image数组实现图片打乱效果

技术与开发

51-技5.jpg

读者:我想做一个拼图的小游戏(见上图),可不知道怎么设计,能帮帮我吗?

小编:我们可以用VB中能灵活处理图片位置的Image数组来设计这个拼图游戏,具体操作如下。

在VB环境下,如果我们要操作多张图片,使用Image数组无疑是最方便最快捷的。Image数组的元素中有一个Picture属性,可以加载一张图片,Image数组元素的个数决定了这个数组能控制图片的张数,通过设置Image数组中每一个元素的属性就能够操作每一张图片,比如改变图片的大小、在界面中的坐标。

设计思路:在窗体中显示一张图片,5秒后图片隐藏,随即显示上图的窗体。此窗体是把原图分割成20张大小相同的小图并打乱显示出来(窗体最下方)。玩家点击一张小图,再在空白的区域点击一下,如果点击的小图正好是所点击的空白区域的缩略图,小图消失,显示相应的大图。如果点击错误,必须重新再次点击小图后才能点击空白区域。必须在90秒内把图复原才算获胜(图2)。

51-技4.jpg

打乱图片位置原理:改变图片在界面中的位置(打乱图片)只需要一个简单的算法来打乱Image数组各个元素的位置,并依次显示各个元素的Picture就可以了。如下图,互换Image数组的各个元素的位置,图片在界面中的位置也就打乱了。互换图片采用随机互换2个数组的元素进行。Image数组元素经过多次互换位置后,图片位置就彻底打乱了。

拼图游戏的开发步骤

第一步:前期准备。首先要找一张稍微大点的背景图。然后制作素材,即把图片切割成20张大小相同的小图片,分别命名为b11、b12、b13、b14、b15、b21……b45。在上图的空白区域就显示b11、b12……b45。分别把b11、b12、b13、b14、b15、b21……b45缩小40%保存为l11、l12、l13、l14、l15、l21……l45。在上图的最下方显示打乱的小图就是l11、l12……l45。

第二步:启动VB,新建一工程,把启动窗体命名为startup,添加一个主窗体,命名为main。制作Statrup窗体:添加1个image,2个command,1个text,1个label,1个timer。给玩家5秒时间显示整个风景图后关闭并显示Main窗体。这一步编写代码简单,不再提供代码。

51-技3.jpg

第三步:制作main窗口:添加1个Picture 、2个image(Picture、image都为数组控件),布置好其相对位置(如上图)。添加text1、text22、text23做辅助控件,设置在运行时为不可见。本文中代码没有定义的变量均为全局变量。

如何打乱小图片并显示出来的代码为:

For i = 0 To 20 Step 1 //设置打乱次数为20,如果增加难度的话可以把值加大,比如循环50次。

Pos1 = Rnd(1) * 19

Pos2 = Rnd(1) * 19

Tmp = PosArr(Pos1)

PosArr(Pos1) = PosArr(Pos2)

PosArr(Pos2) = Tmp

Next i

//把PicArr(0)-PicArr(5)分别赋值为l11、l12、l13、l14、l15

//把PicArr(6)-PicArr(10)分别赋值为l21、l22、l23、l24、l25

//把PicArr(11)-PicArr(15)分别赋值为l31、l32、l33、l34、l35

//把PicArr(16)-PicArr(20)分别赋值为l41、l42、l43、l44、l45

For i = 0 To 4 Step 1

PicArr(i) = "l1" + CStr(i + 1)

PicArr(i + 5) = "l2" + CStr(i + 1)

PicArr(i + 10) = "l3" + CStr(i + 1)

PicArr(i + 15) = "l4" + CStr(i + 1)

Next i

// 下面给Image数组装载打乱的小图片

For i = 0 To 19 Step 1

t = i

Text1.Text = PosArr(i) + 1

Call display(PosArr(i))

Next i

SelSmall = -1

SelIndex = -1

'***********************************

End Sub

Private Sub display(n As Integer)

Image10(t).Picture = LoadPicture(App.Path + "\pic\" + PicArr(n) + ".jpg")

//把PosArr()传递给n,如果PosArr(0)=15, 那么Image(0)就是Image10(0)装载的图片就是l15.jpg

End Sub

第四步:小图片打乱后就是程序与玩家的互动了,选择的小图是否是点击的空白区域的缩略图,如果是则把小图隐藏并在所点击的空白区域显示相应的大图,如果不是则需要重新选择小图。这里的难点就是flag变量的使用,只有点击小图后才能点击空白区域,因此当点击小图片后flag赋值为“真”,再点击空白区域后flag赋值为“假”,小图片点击代码如下:

Private Sub Image10_Click(Index As Integer)

flag = True

If (Index >= 0 And Index < 20) Then

Text23.Text = PosArr(Index)

SelSmall = PosArr(Index)

SelIndex = Index

End If

End Sub

Private Sub disappear(m As Integer)//判断选择的小图是否是点击的空白区域的缩略图

Text22.Text = m

If (flag = True) Then

If SelSmall = m Then

Image1(m).Visible = True

Image10(SelIndex).Visible = False

End If

End If

SelSmall = -1

flag = False

End Sub

空白区域点击代码

Private Sub Picture1_Click(Index As Integer)

Call disappear(Index)

End Sub

总结

本程序的难点是使用Image数组来随机打乱并显示小图片,本文采用的方法是通过不断交换图片的位置来实现的,当然也可以采用其他算法,读者可自行研究更高效率的算法。另外本程序在图片处理上使用了Image数组和Picture数组,在Borland C++ Bulider 和Delphi中都没有图片数组功能,灵活使用VB的Image数组对于在设计程序中提高编程效率相当有用,这也是VB优于Delphi和BCB的地方之一。