排序问题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智游戏。上帝创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上安大小顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定:在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘,最后把这些圆盘放在第三根柱子上,并且从下往上是圆盘大小依次减小的。当所有的圆盘都从第一根柱子移到第三根柱子上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

不管这个传说的可信度有多大,如果考虑一下把64个圆盘,由一根柱子上移到另一根柱子上,并且始终保持上小下大的顺序。这需要多少次移动呢?这里就需要用到递归的方法。假设有n个圆盘,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(n+1)=2*f(n)+1。化解得f(n)=2n-1。鉴于264-1这个数字太大,本次就只用5个圆盘,这样既让人一目了然,而且也起到益脑的作用。

二、简要分析

汉诺塔游戏的主要目的是借助B柱子,将A柱子的五个盘子转移到C柱子上,要求每次移动必须从最上层盘子开始,而且必须始终保证小号盘子在大号盘子的上方。

程序的主要技术点,除了对上述要求的实现外,还要考虑到鼠标拖放盘子以及盘子的定位、排序等内容。在设计初期,我首先考虑的是采用单击选定,再次单击定位的方式来移动盘子,但这样做必须要让程序记住谁是活动盘子,而且操作的直观性较差。所以,最后我选择了利用鼠标事件来模拟拖动盘子的动作。

而对于盘子移动后的定位问题,如果单纯靠坐标计算来显示,工作量是非常大的。所以,我在本例中应用了“一个萝卜一个坑”的简单原理,将目标位置提前放置好Image控件,这样一来,盘子的移动和定位操作都成了对目标控件属性的控制,利用在适当的区域有效,这样不会因为位置的不精确而带来操作不方便,这样就让这个小游戏处理起来变得十分方便。三、功能描述

本程序实现了利用一个中间帮助柱子B,将A柱子上的五个盘按照游戏规则移动到C柱子上。其中利用了函数的递归调用,图片的移动事件,鼠标事件,以及图片的载入、控件数组等相关知识。

(1)用户可以随时点击“重新开始”按钮重新开始这个游戏;

(2)用户可以随时点击“退出”按钮退出这个游戏。

Private Sub Command1_Click()

Label4.Caption = 0 '移动步骤清零

For i = 0 To 4

Image1(i).Picture = LoadPicture(App.Path & "\p" & i & ".jpg") '在当前目录下载入图片

Image2(i).Picture = LoadPicture("") '没有图片载入

Image3(i).Picture = LoadPicture("") '没有图片载入

Next i

Call SortImg(Image1, 1080) '将在A线上的盘子对齐

End Sub

Private Sub Command2_Click()

End

End Sub

Private Sub Form_Load()

WindowsMediaPlayer1.URL = (App.Path & "\月光奏鸣曲.MP3")

Call Command1_Click

End Sub

Private Sub Image1_MouseUp(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)

If Index < 4 Then If Image1(Index + 1).Picture <> 0 Then Exit Sub '移动操作不合法

If X >= 2000 And X <= 3200 Then

Call MoveImg(Image1, Image2, Index) '从A向B转移

Call SortImg(Image2, 3420) '将在B线上的盘子以3420为区域中心线X值对齐

End If

If X >= 4300 And X <= 5700 Then

Call MoveImg(Image1, Image3, Index) '从A向C转移

Call SortImg(Image3, 5760)

End If

End Sub

Private Sub Image2_MouseUp(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)

If Index < 4 Then If Image2(Index + 1).Picture <> 0 Then Exit Sub '移动操作不合法

If X >= 2100 And X <= 3400 Then

Call MoveImg(Image2, Image3, Index) '从B向C转移

Call SortImg(Image3, 5760) '将在C线上的盘子以5760为区域中心线X值对齐

End If

If X >= -2700 And X <= -1200 Then

Call MoveImg(Image2, Image1, Index) '从B向A转移

Call SortImg(Image1, 1080)

End If

End Sub

Private Sub Image3_MouseUp(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)

If Index < 4 Then If Image3(Index + 1).Picture <> 0 Then Exit Sub '移动操作不合法

If X >= -2700 And X <= -1200 Then

相关文档
最新文档