⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.frm

📁 用Visual Basical写的汉诺塔源代码。
💻 FRM
字号:
VERSION 5.00
Begin VB.Form Form1 
   Caption         =   "Hanio塔演示程序"
   ClientHeight    =   5715
   ClientLeft      =   60
   ClientTop       =   345
   ClientWidth     =   8985
   LinkTopic       =   "Form1"
   ScaleHeight     =   5715
   ScaleWidth      =   8985
   StartUpPosition =   3  'Windows Default
   Begin VB.CommandButton Command4 
      Caption         =   "建立新塔"
      Height          =   345
      Left            =   30
      TabIndex        =   9
      Top             =   3870
      Width           =   2055
   End
   Begin VB.Frame Frame1 
      Caption         =   "显示移动过程:"
      Height          =   705
      Left            =   30
      TabIndex        =   7
      Top             =   4620
      Width           =   2055
      Begin VB.CommandButton Command2 
         Caption         =   "显示下一步"
         Height          =   345
         Left            =   60
         TabIndex        =   8
         Top             =   240
         Width           =   1935
      End
   End
   Begin VB.CommandButton Command3 
      Caption         =   "退出"
      Height          =   345
      Left            =   30
      TabIndex        =   6
      Top             =   5340
      Width           =   2055
   End
   Begin VB.PictureBox Picture1 
      Appearance      =   0  'Flat
      BackColor       =   &H80000005&
      ForeColor       =   &H80000008&
      Height          =   5685
      Left            =   2100
      ScaleHeight     =   5655
      ScaleWidth      =   6825
      TabIndex        =   4
      Top             =   0
      Width           =   6855
      Begin VB.Label Label3 
         BackStyle       =   0  'Transparent
         Caption         =   "位置C"
         Height          =   255
         Index           =   2
         Left            =   5970
         TabIndex        =   12
         Top             =   30
         Width           =   555
      End
      Begin VB.Label Label3 
         BackStyle       =   0  'Transparent
         Caption         =   "位置B"
         Height          =   255
         Index           =   1
         Left            =   2940
         TabIndex        =   11
         Top             =   30
         Width           =   555
      End
      Begin VB.Label Label3 
         BackStyle       =   0  'Transparent
         Caption         =   "位置A"
         Height          =   255
         Index           =   0
         Left            =   330
         TabIndex        =   10
         Top             =   0
         Width           =   555
      End
      Begin VB.Label Label2 
         Alignment       =   2  'Center
         Appearance      =   0  'Flat
         BackColor       =   &H00FF8080&
         BorderStyle     =   1  'Fixed Single
         Caption         =   "Label2"
         ForeColor       =   &H00FFFFFF&
         Height          =   225
         Index           =   0
         Left            =   0
         TabIndex        =   5
         Top             =   5430
         Width           =   1635
      End
   End
   Begin VB.TextBox Text1 
      Appearance      =   0  'Flat
      Height          =   285
      Left            =   1290
      TabIndex        =   3
      Text            =   "Text1"
      Top             =   3570
      Width           =   795
   End
   Begin VB.CommandButton Command1 
      Caption         =   "给出移动步骤"
      Height          =   345
      Left            =   30
      TabIndex        =   1
      Top             =   4230
      Width           =   2055
   End
   Begin VB.ListBox List1 
      Appearance      =   0  'Flat
      Height          =   3540
      Left            =   30
      TabIndex        =   0
      Top             =   0
      Width           =   2055
   End
   Begin VB.Label Label1 
      Caption         =   "Hanio塔盘数:"
      Height          =   225
      Left            =   30
      TabIndex        =   2
      Top             =   3600
      Width           =   1245
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
'显示移动步骤的步数,从1开始,最大是Res.GetLength给出的
Dim iStep As Integer

'代表三个塔的栈,要根据结果调整
Dim PA As New STACK
Dim PB As New STACK
Dim PC As New STACK

'移动方案的结果就在Res对象中,实际是个顺序表
Dim Res As New ListTable

'盘数,默认是3个
Dim DiskNum As Integer

'显示盘的时候要调整的位移偏差
Const W = 40
Sub DispDisk(ByVal m As Integer)
s = Res.GetElem(m).GetSource
t = Res.GetElem(m).GetTarget
'根据移动方案调整栈的内容,就是从源塔中POP出来,然后PUSH进目的塔
If s = "A" Then tmp = PA.POP
If s = "B" Then tmp = PB.POP
If s = "C" Then tmp = PC.POP

If t = "A" Then PA.PUSH tmp
If t = "B" Then PB.PUSH tmp
If t = "C" Then PC.PUSH tmp
'下面这段程序完全可以写到一个子程序里,没写的原因是有关于塔三个位置换算的方法,
'所以显的臃肿,希望自己看明白后,自行转换出来
'这段程序,只要给出一个PictureBox控件,里面放个Index=0的Label控件即可
'先显示A塔上的盘,位置在PictureBox控件的最左端
n = PA.GetStackLength
If n > 0 Then
    px = 0
    H = Picture1.Height - 20
    For i = 1 To n
        u = PA.GetStackElement(i)
        Label2(u).Top = H - Label2(u).Height
        H = H - Label2(u).Height
        px = W * u
        Label2(u).Left = px
    Next i
End If

'显示B塔上的盘,位置上是PictureBox控件的中心位置上
n = PB.GetStackLength
If n > 0 Then
    ax = Picture1.Width / 2 - Label2(0).Width / 2
    H = Picture1.Height - 20
    For i = 1 To n
        u = PB.GetStackElement(i)
        Label2(u).Top = H - Label2(u).Height
        H = H - Label2(u).Height
        px = ax + W * u
        Label2(u).Left = px
    Next i
End If

'C塔上的盘的显示,位置在PictureBox的最右端
n = PC.GetStackLength
If n > 0 Then
    ax = Picture1.Width - Label2(0).Width
    H = Picture1.Height - 20
    For i = 1 To n
        u = PC.GetStackElement(i)
        Label2(u).Top = H - Label2(u).Height
        H = H - Label2(u).Height
        px = ax + W * u
        Label2(u).Left = px
    Next i
End If
End Sub
'初始化一个塔,盘数为n并显示在界面上
Sub InitDisk(ByVal n As Integer)
    If n = DiskNum And (PA.GetStackLength > 0) Then Exit Sub
    PA.Clear
    PB.Clear
    PC.Clear
    Res.Clear
    For i = 1 To DiskNum - 1
        Unload Label2(i)
    Next i
    DiskNum = n
    Label2(0).Caption = 0
    Label2(0).Left = 0
    PA.PUSH 0
    For i = 1 To n - 1
        Load Label2(i)
        Label2(i).Top = Label2(i - 1).Top - Label2(0).Height
        Label2(i).Left = Label2(i - 1).Left + W
        Label2(i).Width = Label2(i - 1).Width - 2 * W
        Label2(i).Visible = True
        Label2(i).Caption = Str(i)
        PA.PUSH i
    Next i
End Sub
'初始化塔,三个塔分别是A、B、C
Private Sub Command1_Click()
Dim H As New Hanio
n = Val(Text1.Text)
Set Res = New ListTable
If IsNumeric(Text1.Text) And n > 0 Then
    Set Res = H.MoveHanio(n, "A", "B", "C")
Else
    Exit Sub
End If

'结果就在Res顺序表中,显示这些步骤
n = Res.GetLength
List1.Clear
List1.AddItem "移动步骤如下:"
For i = 1 To n
    List1.AddItem Str(i) + ":    " + Res.GetElem(i).GetSource + " 到 " + Res.GetElem(i).GetTarget
Next i
End Sub
'图形化显示下一步
Private Sub Command2_Click()
If Res.GetLength = 0 Then
    i = MsgBox("你还没运行出移动步骤,请先点:“给出移动步骤”按钮", vbOKOnly + vbExclamation, "警告")
    Exit Sub
End If
If iStep = Res.GetLength Then Exit Sub
iStep = iStep + 1
DispDisk iStep
End Sub
Private Sub Command3_Click()
End
End Sub
'重构一个N个盘的塔
Private Sub Command4_Click()
m = Val(Text1.Text)
If m = 0 Then
    i = MsgBox("请给出一个大于0的数字!", vbOKOnly + vbInformation, "警告")
    Exit Sub
End If
iStep = 0
InitDisk m
End Sub
Private Sub Form_Load()
Text1.Text = "3"
DiskNum = 0
iStep = 0
InitDisk 3
End Sub

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -