用VB编写Hanoi塔问题动态演示程序[组图](3)
3.2 盘子移动的实现
盘子的移动过程主要有两种类型的移动,一种是垂直移动(包括自上而下和自下而上),另一种是水平移动(包括从左至右和从右至左)。盘子移动过程程序实现的主要思想是将每一次盘子从原位置移动到目标位置的路线分割成足够多的子路径,每个子路径的距离足够小,盘子从某子路径一端移动至另一端通过两个步骤来实现:第一步将原位置上的盘子颜色设置为form窗体背景色 Form1.
BackColor,以达到将盘子从原位置移开的显示效果;第二步在盘子将要到达的新位置重新绘制该盘子,从而达到盘子移动到另一端的显示效果。
例如某个用Form1.Line (4000, i)-( 4000 +400), i + 200)语句绘制的长为400像素、宽为200像素的盘子需要从矩形左上角坐标为(4000, i)的位置垂直向上移动到下一位置,则可能将该矩形在原位置重新绘制成窗体背景色,在矩形左上角坐标为(4000, i-stepC)位置重新绘制一个矩形来达到将该矩形从位置(4000, i)移动到位置(4000, i-stepC)的目的,其中stepC是移动步长,也即子路径的长度。stepC值不能设置的过大,如果设置的太大,则盘子移动过程中将会出现不连续的移动效果。盘子移动过程程序实现的核心代码如下:
Dim i As Integer, j As Integer, k As Integer 'i、k表示纵坐标,j表示横坐标
Form1.Caption = "汉诺塔问题-第" & n & "个盘子正在移动..."
'向上移动到first柱子顶端
For i = baseCoordinateY(pillarnum(getone)) To 600 - 210 Step -stepC
'把矩形本次移动前的图形擦掉
Form1.Line ((pillarnum(getone) * 4000 - (n * 400) / 2), i)-((pillarnum(getone) * 4000 + (n * 400) / 2), i + 200), Form1.BackColor, BF
fixpillar (getone)
Form1.Line ((pillarnum(getone) * 4000 - (n * 400) / 2), i - stepC)-((pillarnum(getone) * 4000 + (n * 400) / 2), i - stepC + 200), , BF
delay
Next i
'当前i =600-200-stepC,此时i值表示盘子的当前纵坐标
'向左、右平移到third柱子顶端
If pillarnum(getone) < pillarnum(putone) Then
'向右移
For j = (pillarnum(getone) * 4000 - (n * 400) / 2) To (pillarnum(putone) * 4000 - (n * 400) / 2) - stepC Step stepC
Form1.Line (j, i)-(j + n * 400, i + 200), Form1.BackColor, BF
Form1.Line (j + stepC, i)-(j + stepC + n * 400, i + 200), , BF
delay
Next j
Else
- 上一篇:让VB开发环境支持鼠标滚轮
- 下一篇:VB 在远程管网数据传输中的应用[组图]