当前位置:编程学习 > VB >>

求一个关于下面这个 拼图游戏 的关键代码的说明

这是整个程序的开始程序:
Private Sub Timer1_Timer()
 Static a As Integer
 If a < 100 Then
   PICG.Show
 End If
 If a > 1 Then
 Unload STUP
 End If
 a = a + 1
End Sub


下面是主体:
Public PHidL, PHidT, Mov, Nub, Dif, SS, MM As Integer
Public ImH, ImW As Integer
Public PicN As String
Private PL(15) As Integer
Private PT(15) As Integer
Public PHid As Integer
Public ST, MT As String
Public Hig As Integer
Public GTiM, GTiS As Integer
'GTim,GTis是设置游戏时间的变量。
'设置变量 PHidL(隐藏图片的Left), PHidT(隐藏图片的Top), _
 Mov(用以确定Start是否按下), Nub(图片数量), _
 Dif(难度变量), SS(秒), MM(分)
'PicN(图片名), _
 PL(15)图片数组的Left,PT(15)图片数组的Top , _
 PHid (隐藏图片的序号)

Private Sub difficulty_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
 If Button = 2 Then
  SetTime.Show           '启动游戏时间设置窗口
 End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
 End
End Sub

Private Sub showpic_Click()
  If Image1.Visible = False And Hig = 0 Then    '判断是否处于高难状态
    Renew  '恢复图片控件的位置
  End If
End Sub
Private Sub difficulty_Click()
'难度按键
PICG.Hide
 Dim a, b As Integer
 If Nub = 8 Then   '调整为16张图片的组合
   difficulty.Caption = "简单"
   Nub = 15: Image2.Top = 3720 '调整图像控件的位置
   Dif = 1: Image3.Width = 3900
   Image3.Left = 120
   For I = 0 To 15
    PIC(I).Visible = True  '将隐藏图片复原
   Next
   If Hig = 0 Then
     GTiM = 3: GTiS = 0
   End If
 Else
   difficulty.Caption = "困难"  '同上原理
   Nub = 8: Image2.Top = 3200
   Dif = 0: Image3.Width = 2100
   Image3.Left = 900
   For I = 0 To 8
     PIC(I).Visible = True
   Next
   For I = 9 To 15
     PIC(I).Visible = False
   Next
   If Hig = 0 Then
     GTiM = 1: GTiS = 30
   End If
 End If
 NEWPIC          '调整各图片数组控件的位置及重画图像
  a = PIC(Nub).Left: b = PIC(Nub).Top   '调整各控件及窗体的位置
  PICG.Width = a + 1500
  PICG.Height = b + 2600
  Watch.Left = a - 100: Watch.Top = b + 1700
  Image3.Top = b + 1700
PICG.Show
If Hig = 1 Then          '判断高难状态为真
  start = True
End If
End Sub
Private Sub exit_Click()
  End '退出
End Sub
Private Sub picopen_Click()
  CommonDialog1.Copies = &H2000
  '打开文件
  Dim CA As Integer          '取消变量
  CA = Mov
  Mov = 0                    '停止计时
  CommonDialog1.CancelError = True  '取消为真
  On Error GoTo HANDLER
  CommonDialog1.Filter = _
   "JPG图像,位图(*.jpg,*.bmp,*.gif)|*.jpg;*.bmp;*.gif|"
   CommonDialog1.ShowOpen
   '设置打开文件类型
On Error GoTo HANDLER
 If PICG.PicN <> CommonDialog1.FileName Then
     PICG.PicN = CommonDialog1.FileName  '载入图片
     Image1.Picture = LoadPicture("")
     Image1.Picture = LoadPicture(PICG.PicN)
 Else
   GoTo HANDLER
 End If
   PICG.Mov = 0  '不能移动PIC数组控件
   NEWPIC       '调整各图片数组控件的位置及重画图像
If Hig = 1 Then      '判断高难状态为真
  start = True
  Exit Sub
End If
HANDLER:
  '按取消按钮
Mov = CA          '恢复计时
End Sub
Private Sub NEWPIC()
'重画各PIC数组控件的图像
Renew  '将PIC数组控件的位置复原
If Image1.Picture = LoadPicture("") Then
  PICG.Mov = 0      '没有图片不动作
  WINER             '没图片时将PIC数组控件隐藏显示Image的边框
Else
  Dim C As Integer
  If Dif = 1 Then  '分割图像的大小
    C = 4
  Else
    C = 3
  End If
  For k = 0 To Nub
    PIC(k).PaintPicture Image1.Picture, 0, 0, _
    PIC(k).ScaleWidth, PIC(k).ScaleHeight, _
    (PIC(k).Left - PIC(0).Left) / 1200 * PICG.ImW / C, _
    (PIC(k).Top - PIC(0).Top) / 1600 * PICG.ImH / C, _
    PICG.ImW / C, PICG.ImH / C, _
    vbSrcCopy
  Next
  '将分割得到的图像画如各PIC数组控件
End If
End Sub
Private Sub start_Click()
'移动PIC数组控件的位置得到要拼的图
If start.Caption = "Anew" Then
   If PicN = "" Then
     PICG.PicN = CommonDialog1.FileName  '载入图片
   End If
   Image1.Picture = LoadPicture("")
   Image1.Picture = LoadPicture(PICG.PicN)
   start.Caption = "Start"
End If
If Image1.Picture <> LoadPicture("") Then  '判断是否有图片载入
 MM = 0: SS = 0   '时间置零
 Renew        '将PIC数组控件的位置复原
  Dim a, b, C As Integer   '移动图片的交换变量
  PHid = Int((Nub + 1) * Rnd + 0)  '随机取隐藏的PIC数组控件序号
  For I = 1 To 50   '交换移动50次
    For l = 0 To Nub
      a = PIC(PHid).Left: b = PIC(PHid).Top
      If PIC(l).Left = a + 1200 Or _
        PIC(l).Left = a - 1200 Then    '将左右PIC控件与之相移
        If PIC(l).Top = b Then         '将上下PIC控件与之相移
          PIC(PHid).Left = PIC(l).Left
          PIC(l).Left = a
        End If
      End If
      If PIC(l).Top = b + 1600 Or _
        PIC(l).Top = b - 1600 Then        '同上
        If PIC(l).Left = a Then
          PIC(PHid).Top = PIC(l).Top
          PIC(l).Top = b
        End If
      End If
    Next
  Next
  PIC(PHid).Visible = False      '隐藏该PIC控件
  PHidL = PIC(PHid).Left: PHidT = PIC(PHid).Top
  '得到不可见PIC控件的位置数据
  PIC(PHid).Left = PL(PHid)   '将其先放回原位置
  PIC(PHid).Top = PT(PHid)
  PICG.Mov = 1                '可移动变量
End If
End Sub
Private Sub Rude()
For l = 0 To Nub     '得到原始的各PIC数组控件的位置数据
  PL(l) = PIC(l).Left
  PT(l) = PIC(l).Top
Next
PIC(PHid).Visible = True   '隐藏PIC控件可见
End Sub
Private Sub Renew()
Watch.Text = "Time 00:00"  '计时重画
For I = 0 To Nub           '载入PIC数组控件的原始位置数据
  PIC(I).Left = PL(I)
  PIC(I).Top = PT(I)
Next
  PICG.Mov = 0              '不能操作拼图
If Nub = 15 Then            '隐藏PIC控件看情况置可见与否与否
  PIC(PHid).Visible = True
Else
  If PHid < 9 Then
    PIC(PHid).Visible = True
  End If
End If
Image1.Stretch = False
Image1.Visible = False
Image1.BorderStyle = 0    '调整Image1的边框样式得到图像的原始大小
PICG.ImH = Image1.Height  '得到图像的大小尺寸
PICG.ImW = Image1.Width
For I = 0 To Nub
  PIC(I).Visible = True   '置各PIC控件于可见
Next
End Sub
Private Sub Form_Load()
Dim path As String
'PICG.Left = 10240 / 2 - PICG.Width / 2 '居中
'PICG.Top = 7680 / 2 - PICG.Height / 2
'在注册表中 HKEY_CURRENT_CONFIG_\ _
DISPLAY\SETTINGS\RSOLUTION "1024,768"
'从该键值里可知显示的分辨率
Nub = 15: Dif = 1    '控件数,难度为1
Watch.Text = "Time 00:00"
Rude  '保存各PIC的原始位置数据
PicN = App.path & "\" & "pic01.jpg"   '路径及图片
On Error GoTo EXSU
  Image1.Picture = LoadPicture(PicN)
EXSU:
  '无此文件
If Image1.Picture = LoadPicture("") Then
  PICG.Mov = 0
Else
  NEWPIC       '调整各图片数组控件的位置及重画图像
End If
GTiM = 3
difficulty = True
End Sub
Private Sub pic_Click(Index As Integer)
Static a As Integer
Static b As Integer
'设置交换变量
If PICG.Mov = 1 Then         '从隐藏的PIC控件处开始
  '空白附近的PIC控件才可移动
  If PIC(Index).Left = PHidL + 1200 _
    Or PIC(Index).Left = PHidL - 1200 Then   '水平移动
    If PIC(Index).Top = PHidT Then
      a = PIC(Index).Left
      PIC(Index).Left = PHidL: PIC(Index).Top = PHidT
      PHidL = a
    End If
  End If
  If PIC(Index).Top = PHidT + 1600 Or _
    PIC(Index).Top = PHidT - 1600 Then        '上下移动
    If PIC(Index).Left = PHidL Then
      b = PIC(Index).Top
      PIC(Index).Left = PHidL: PIC(Index).Top = PHidT
      PHidT = b
    End If
  End If
  WINER   '判断是否胜利
End If
End Sub
Private Sub WINER()
For I = 0 To Nub
  '通过PIC各数组控件位置数据的比较做出判断
  If PIC(I).Left <> PL(I) Or PIC(I).Top <> PT(I) Then
    Exit Sub
  End If
Next I
For I = 0 To Nub
  PIC(I).Visible = False       '隐藏全部PIC控件
Next
 If Nub > 8 Then              '调整Image1的位置大小
  Image1.Height = 6380: Image1.Width = 4800
Else
  Image1.Height = 4780: Image1.Width = 3600
End If
Image1.Stretch = True
Image1.Visible = True
Image1.BorderStyle = 1         '显示边框
If Mov <> 0 Then               '判断是过关调用还是高难过程调用
  WIN.Show   '过关
End If
Mov = 0
End Sub
Private Sub Timer1_Timer()
 '计时器
 If Mov = 0 Then             '没进行拼图则退出
  Exit Sub
 End If
 If SS > 59 Then             '秒进分
   MM = MM + 1: SS = 0
 End If
 If SS < 10 Then             '当秒或分小于十时补前面一个字符“0”
  If SS = 0 Then
   ST = "00"
  Else
   ST = "0" & SS
  End If
 Else
  ST = SS
 End If
 If MM < 10 Then
  If MM = 0 Then
   MT = "00"
  Else
 MT = "0" & MM
 End If
 Else
   MT = MM
 End If
 SS = SS + 1                  '秒进一
 Watch.Text = "Time " & MT & ":" & ST   '计时显示
 If Hig = 0 Then     '不是高难的游戏时间
   If difficulty.Caption = "Hard" Then
     GTiM = 1: GTiS = 30
   Else
     GTiM = 3
   End If
 End If
 If MM = GTiM Then            '时间到(分钟)
   If GTiS <> 0 Then          '判断秒
     If SS <> GTiS + 1 Then
       Exit Sub
     End If
   End If
   TOVER = MsgBox("Time over,You lose !", vbOKOnly + vbExclamation, "GAME OVER")
   Image1.Picture = LoadPicture("")
   If PicN <> App.path & "\" & "pic01.jpg" Then
     PicN = ""
   End If
   For I = 0 To 15
     PIC(I).Left = PL(I)
     PIC(I).Top = PT(I)
   Next
   Mov = 0
   start.Caption = "Anew"
   WINER              '显示原拼图
 End If
End Sub



下面是结束程序:
Public a As Integer
Private Sub Command1_Click()
  Unload WIN  '继续
End Sub
Private Sub Command2_Click()
 End   '退出
End Sub

Private Sub Form_Load()
If Val(PICG.MT) = 0 Then
    TempT = Val(PICG.ST) & " Sec."
Else
  If Val(PICG.ST) = 0 Then
      TempT = Val(PICG.MT) & " Min."
  Else
      TempT = Val(PICG.MT) & " M " & PICG.ST & " S."
  End If
End If
WIN.Caption = WIN.Caption & "( Use time : " & TempT & ")"
WIN.a = Picture1.Width '动画边界
End Sub

Private Sub Form_Unload(Cancel As Integer)
   PICG.Show
   PICG.start.SetFocus
End Sub

Private Sub Timer1_Timer()
 Static b As Integer
 If WIN.a >= 0 Then ' 动画边界
   Picture1.Picture = LoadPicture("")
   WIN.a = WIN.a - 100
   Picture1.PaintPicture Image2.Picture, WIN.a, 0, _
   Picture1.Width - WIN.a, Picture1.Height, _
   0, 0, _
   Picture1.Width - WIN.a, Picture1.Height, _
   vbSrcCopy
   '将图片从右往左移动
 Else
   b = b + 1   '完成退出
   If b > 50 Then
     Unload WIN: b = 0
   End If
 End If
End Sub
--------------------编程问答-------------------- 你认为哪是关键代码 --------------------编程问答-------------------- 就是比如属于是公式的  可以套用的 --------------------编程问答-------------------- 不妨说明具体哪几句不明白 --------------------编程问答-------------------- --------------------编程问答-------------------- 就像是要求把这个程序讲解一遍  用VB的知识
对运行的主要步骤进行分析说明
--------------------编程问答--------------------
引用 5 楼 zhangjh86 的回复:
就像是要求把这个程序讲解一遍  用VB的知识
对运行的主要步骤进行分析说明


这个的话,太费脑子了。要求别人帮忙,自己先要不懒哦。
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,