献给初学编程的礼物(实例) VB语言
献给初学编程的礼物(实例) VB语言
rosesnow 2000-4-9
C语言系列的所有文章现已做成html上载在我的主页上,请从以下站点查找:
rosesnow.533.net
rosesnow.heha.net(国外)
go.163.com/~rosesnow
www.homcn.com/rosesnow
请先择相对快的站点下载,同时本系列的实例程序及源程序都有下载。
现在我们来看这个才写好的实例吧。
★ 该应用程序是一个真正的软件程序.对于初学者来说可能分析起来比较难.在下面所讲的都
是这个应用程序中最简单的简化的部分,并且最好下载源程序及实例软件一块来看.更简单的
VB我将在另一个专题中讲.★
------------
这个软件的名称叫《卡通拼图》。属自由软件,可以自由传播,但代码部分是不允许修
改的。
需求分析:允许选择不同的图片,确定开始后将图片拆成规定的小图片,如4*4等,将顺
序打散。让用户点击图片时,图片自动移到空栏处直到检测出图片都按序拼好为止。(请参
阅网站上的实例程序)
可能这个程序是复杂了点。但做为一个正真实用的软件开发来说,这是一个简单的程序
。
首先我们要来设计这个程序的主界面。
我做的是一个类似于电视机一样的界面。你可以去创意这个界面。一个好的界面是一个
程序的核心!
技巧:label,line,shape都是设计界面的最好控件,它们占用资源少速度快。用它们可
以组成简单的凸凹的立体效果。在本例中并没有用任何界面图形来定制界面,都是由这些组
成的。如果你真要用图形,请选用image控件而不是picturebox控件。图形的制作可以用画笔
来完成。画笔?这个简单的工具其实是最有效的制作软件。你可以从材质库(自己找)中选
择合适的图片来剪载。可以用photoshop之类的软件来作一些效果。
在该程序中我准备了五张卡通来做执行对像,放在image\目录下,并依次取名为angle1
....angle2.
界面的制作过程就讲这么多,请参阅实例。
在界面上放两个按钮,用来决定选择的图片具体程序如下:
---------
Picmunber = Picmunber + 1
If Picmunber > Picmunindex Then Picmunber = 1
'imgnext.Left = 7150
'imgnext.Top = 5890
Picture3.Picture = LoadPicture(App.Path & "\image\angle" & Picmunber & ".jpg")
'PlaySound App.Path & "\move.wav"
----------
picmunber是一个全局变量,用来记录先择的图片是第几张,初始化时在form_load()中
设置为1.
当点击一下,picmunber加 1,到了第五张,又回转。
实例中用的是image而不是button,现在用引号注示了。
将图片引导至picture中用loadpicture方法. app.path是指应该程序目录
整个参数的含义是应用程序目录下的image目录下的angle1...angle2.jpg中的图片.
playsound是一个自编的API播放wav函数.
再设一个按钮用来选择是几乘几的分格.
Select Case Misize
Case 3
Misize = 4
labchage = "难易度:中级"
Case 4
Misize = 5
labchage = "难易度:高级"
Case 5
Misize = 6
labchage = "难易度:特级"
Case 6
Misize = 3
labchage = "难易度:初级"
End Select
PlaySound App.Path & "\move.wav"
misize是一个全局变量,用来告诉程序是几乘几的.
现在要把这个图拆成misize*misize.
VB中有一个现成的控件叫做pictureclip.在添加部件中选择microsoft pictureclip control 6.0.
设misize^2 个image数组用来显示这些小图片调用如下picbox(i).Picture = PicClip
.GraphicCell(Picarray(i)).
程序中采用动态添加image
方法为 load image(i)
将这些image打散.这里只介绐随机打散,在实例程序中保证了都有解的情况,并未采用这个方
法.因为程序上比较难就不列出来了
随机:
for i=0 to misize^2-1
a(i)=i
next i
for i=0 to 400
j1=int(rnd*misize^2)
j2=int(rnd*misize^2)
j=a(j1)
a(j1)=a(j2)
a(j2)=j
next i
这样就可以把一个按0到misize^2-1顺序数组打乱了,这个算法在扑克牌中用的比较多,在
这只做一个参考.
真正合适的算法:
Private Sub wash()
Dim Bmove As BooleanDim i%, xcoord%, ycoord%, iRand%, j%
Miemptyindex = Misize ^ 2 - 1PicClip.Rows = MisizePicClip.Cols = MisizeFor i = 0 To Misize ^ 2 - 1Picarray(i) = iNext ixcoord = Miemptyindex Mod Misizeycoord = Miemptyindex \ Misizei = 0While i < Misize ^ 4
Bmove = False
iRand = Int(4 * Rnd)
If (iRand = 0) And (xcoord > 0) Then
xcoord = xcoord - 1
Bmove = True
ElseIf (iRand = 1) And (xcoord < Misize - 1) Then
xcoord = xcoord + 1
Bmove = True
ElseIf (iRand = 2) And (ycoord > 0) Then
ycoord = ycoord - 1
Bmove = True
ElseIf (iRand = 3) And (ycoord < Misize - 1) Then
ycoord = ycoord + 1
Bmove = True
End If
If Bmove Then
j = Picarray(Miemptyindex)
Picarray(Miemptyindex) = Picarray(Misize * ycoord + xcoord)
Picarray(Misize * ycoord + xcoord) = j
Miemptyindex = Misize * ycoord + xcoord
i = i + 1
End IfWendRestartflag = MiemptyindexEnd Sub
---------
接下来再将图片显示出来
Private Sub show_bmp()
Dim i%
Miemptyindex = RestartflagFor i = 0 To 35picbox(i).Visible = FalseNext iFor i = 0 To Misize ^ 2 - 1If i <> Restartflag Thenpicbox(i).Picture = PicClip.GraphicCell(Picarray(i))
picbox(i).Visible = TrueElsepicbox(i).Picture = PicClip.GraphicCell(Misize ^ 2 - 1)
End IfNext iFor i = 0 To Misize ^ 2 - 1Picarrayb(i) = Picarray(i)
Next iFor i = 0 To Misize ^ 2 - 1picbox(i).Left = 120 + (picbox(0).Width - 20) * (i Mod Misize)
picbox(i).Top = 170 + (picbox(0).Height - 20) * (i \ Misize)
Next iEnd Sub
-----------
图片显示出来以后
当用户点击时做出反映.
Private Sub picbox_MouseDown(Index As Integer, Button As Integer, Shift As Integer, x As Single, Y As Single)
Dim xEmpty%, yEmpty%, yClicked%, xClicked%, j%
If Button = 1 ThenxEmpty = Miemptyindex Mod MisizeyEmpty = Miemptyindex \ MisizexClicked = Index Mod MisizeyClicked = Index \ Misize
If (xClicked = xEmpty + 1 And yClicked = yEmpty) Or _
(xClicked = xEmpty - 1 And yClicked = yEmpty) Or _
(yClicked = yEmpty + 1 And xClicked = xEmpty) Or _
(yClicked = yEmpty - 1 And xClicked = xEmpty) Then
j = Picarrayb(Miemptyindex)
Picarrayb(Miemptyindex) = Picarrayb(Index)
Picarrayb(Index) = j
picbox(Miemptyindex).Picture = picbox(Index).Picture
picbox(Miemptyindex).Visible = True
Miemptyindex = Index
picbox(Miemptyindex).Visible = False
PlaySound App.Path & "\move.wav"
End If
For j = 0 To Misize ^ 2 - 1
If Picarrayb(j) <> j Then
Exit Sub
End If
Next j
E_game.Enabled = True
E_restart.Enabled = False
imgnext.Enabled = True
imgprev.Enabled = True
imgchage.Enabled = True
For j = 0 To Misize ^ 2 - 1
picbox(j).Visible = False
Next j
Picture3.Visible = True
patfade.FadeOut (100)
Picture3.Picture = LoadPicture(App.Path & "\image\angle" & Picmunber & ".jpg
")
ElsePopupMenu E_gamesEnd IfEnd Sub
整个程序的制作就是如此了.
在程序中还应用了淡入淡出效果这些都是由API来完成的.
该实例在我的主页有下载.