📄 form1.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 + -