六、
代码之旅(4)---给控件加代码,完全控制程序
相信很多人已经迫不及待想玩游戏验证全面的代码了,这就需要给窗体里各控件增加控制用的代码,我们要在Frame1(图片移动范围框)的MouseDown事件加代码,完成鼠标左右键点击的处理,在Command1(重玩)、Command2(后退)、Command3(前进)、Command4(演示)的Click事件里加相应代码以完成相应功能,在Form(主窗口)的Load事件里完成相应初始化功能,请将原来调试时Form_Load全部删除,所有控件相应事件代码见下面。
'*************下面代码可复制***************
Private Sub Command1_Click()
Dim i As Integer, b() As String
'重玩的处理代码
initSize 120
b = Split(Card1, ",")
For i = 0 To UBound(b)
'排列好默认关卡图片
putAImg Val(Left(b(i), 1)), Val(Right(b(i), 2))
Next
End Sub
Private Sub Command2_Click()
'后退一步的操作
Dim a As String, i As Integer, j As Integer
If iStepCount = 0 Then Exit Sub
'如果步数为0则不能再进行后退一步的操作
a = Mid(iStep, (iStepCount - 1) * 5 + 1, 5)
'获取后退一步的操作数据
If a <> "" Then
imgSel = Val(Mid(a, 1, 1))
'第一个字符是图象编号
i = Val(Mid(a, 2, 2))
j = Val(Mid(a, 4, 2))
If moveAImg(imgSel, i) Then
'回溯成功
If 4 * Img(imgSel).Top / bSize + Img(imgSel).Left / bSize + 1 <> i Then moveAImg imgSel, i '如果未到位就再移动一次
iStepCount = iStepCount - 1
Label2.Caption = Str(iStepCount)
Command3.Enabled = True
End If
End If
End Sub
Private Sub Command3_Click()
'处理向前一步的操作,前提是有历史记录
Dim a As String, i As Integer, j As Integer
If iStepCount * 5 >= Len(iStep) Then
'如果操作步数记录结束在不能再前进
If Command4.Caption = "停止" Then Command4_Click '如果处于演示状态将停止演示
Command3.Enabled = False
Exit Sub
End If
a = Mid(iStep, iStepCount * 5 + 1, 5)
If a <> "" Then
imgSel = Val(Mid(a, 1, 1))
i = Val(Mid(a, 2, 2))
j = Val(Mid(a, 4, 2))
If moveAImg(imgSel, j) Then
'向前一步成功
If 4 * Img(imgSel).Top / bSize + Img(imgSel).Left / bSize + 1 <> j Then moveAImg imgSel, j '如果未到位就再移动一次
iStepCount = iStepCount + 1
Label2.Caption = Str(iStepCount)
End If
End If
End Sub
Private Sub Command4_Click()
'演示的代码
Dim a As String
If Command4.Caption = "演示" Then
If iStep = "" Then Exit Sub
'如果根本没有移动历史记录则不需要演示
a = iStep
'保存移动步数记录
Command1_Click
'复位所有数据
Command1.Enabled = False
Command2.Enabled = False
Command3.Enabled = False
'处于演示状态这些按钮不能操作
Frame1.Enabled = False
'也不能对图片进行操作
iStep = a
'还原移动步数记录作为演示的数据
Command4.Caption = "停止"
TimerAuto.Interval = 500
'设置计时器每半秒演示一步
Else
Command1.Enabled = True
Command2.Enabled = True
Command3.Enabled = True
Command4.Caption = "演示"
Frame1.Enabled = True
TimerAuto.Interval = 0
'取消演示状态,恢复所有可操作的按钮,计时器停止
End If
End Sub
Private Sub Form_Load()
'第一次启动窗口的代码
Command1_Click
Me.Top = 300
Me.Left = 300
'设置初始窗口位置
End Sub
Private Sub Frame1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
'在图片移动框里点击鼠标的处理
Dim i As Integer, j As Integer, b() As String, a As String
If Button = 1 Then
'如果按下鼠标左键的处理,主要是判断能否移动,记录移动步数及移动历史记录
i = 4 * Int(Y / bSize) + Int(X / bSize) + 1 '根据鼠标坐标获取要到达的位置编号
If imgSel >= 0 Then
'如果有图片被选中,则进行移动判断,记录移动步数及移动历史记录
j = 4 * Img(imgSel).Top / bSize + Img(imgSel).Left / bSize + 1 '获取当前图片所在位置的编号
If moveAImg(imgSel, i) Then
'移动成功则记录步数
i = 4 * Img(imgSel).Top / bSize + Img(imgSel).Left / bSize + 1 '获取移动成功后图片所在位置的编号
Command3.Enabled = False
'不允许前进操作,因为正常移动不会有未来的数据
a = Trim(imgSel)
'图片编号
If j < 10 Then
a = a & "0" & Trim(j)
Else
a = a & Trim(j)
End If
'移动开始位置编号
If i < 10 Then
a = a & "0" & Trim(i)
Else
a = a & Trim(i)
End If
'移动目标位置编号
'及移动历史记录的格式为:1位图片编号+2位开始位置编号+2位目标位置编号
If Len(iStep) > iStepCount * 5 Then
If iStepCount > 0 Then
iStep = Left(iStep, iStepCount * 5)
Else
iStep = ""
End If
End If
iStep = iStep & a
iStepCount = iStepCount + 1
Label2.Caption = Str(iStepCount)
If 4 * Img(imgSel).Top / bSize + Img(imgSel).Left / bSize = 13 And imgSel = 4 Then
MsgBox "恭喜你,曹操成功从华容道逃跑!"
imgSel = -1
Frame1.Enabled = False
End If
End If
End If
End If
If Button = 2 Then
If imgSel >= 0 Then Img(imgSel).BorderStyle = 1
imgSel = -1
End If
End Sub
Private Sub Img_Click(index As Integer)
'在图片上点击鼠标的处理
If imgSel >= 0 Then Img(imgSel).BorderStyle = 1
imgSel = index
End Sub
Private Sub TimerAuto_Timer()
'自动演示计时器代码,它调用的是向前一步的代码
Command3_Click
End Sub