实验一 汉诺塔问题的实现 设有三个塔座,分别为x,y,z,现在有n个直径各不相同的圆盘,并且按照直径从小
答案:1 悬赏:0
解决时间 2021-11-08 05:59
- 提问者网友:绫月
- 2021-11-07 08:57
实验一 汉诺塔问题的实现 设有三个塔座,分别为x,y,z,现在有n个直径各不相同的圆盘,并且按照直径从小
最佳答案
- 二级知识专家网友:执傲
- 2021-11-07 09:56
【主要代码】 1.程序初始化 程序初始化操作在窗体加载事件中完成,另外它与“重新开始”功能模块的作用完全相同,所以可以通过调用的方式来共享代码。代码的主要功能是移动步骤清零、在A区域复位盘子,以及清除B和C两区域盘子等,主要内容如下: 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) ’对齐盘子 End Sub 其中子过程SortImg是对指定区域内盘子进行居中对齐操作,后文中会有详细介绍。 2.转移盘子 该过程是整个程序的核心,需要考虑的事件包括从A区至B区和C区、从B区至A区和C区、从C区至A区和B区这样共六种情况,为了简化代码编写,笔者在程序中使用了控件数组。下面是从A区向其它两区转移盘子的代码,其它几种情况与之类似: 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) ’对齐盘子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 通过分析可知,如果用户所选盘子的上方还有盘子,则不符合游戏规则,会被终止。另外,程序中使用了类似其它软件中的“热区域”的概念,即当拖动鼠标至我们规定的B区域中时,将引发真正的移动操作(即激活子过程MoveImg),其主要代码如下: Private Sub MoveImg(SImg As Object, DImg As Object, Idx As Integer) For i = 0 To 4 If DImg(i).Picture = 0 Then ’当前区域有位置 If i > 0 Then If SImg(Idx).Width < DImg(i - 1).Width Then ’符合上小下大游戏条件 DImg(i).Picture = SImg(Idx).Picture ’移动盘子 Exit For Else Exit Sub ’移动操作不合法则退出 End If Else DImg(i).Picture = SImg(Idx).Picture ’向区域最下方移动盘子 Exit For End If End If Next i If i <= 4 Then SImg(Idx).Picture = LoadPicture("") Label4.Caption = Label4.Caption + 1 ’更新操作步数 End If End Sub 在移动子过程中,判定位置是否为空的主要依据是目标Image控件的Picture属性是否为0;当获知位置可用时,再进一步判断当前位置的下面位置盘子的尺寸是否大于当前盘子(即对游戏规则的判定),条件满足的话就可以通过传递Picture属性值来完成移动操作了;最后,还要将源位置盘子清空,并且记录操作步数。 3.对齐盘子 在上述两模块中都涉及了子过程SortImg,其主要功能是对区域内盘子进行居中对齐处理,这是美化程序执行效果的一项重要措施,同时在该部分中还加入了游戏胜利过关的判断(即每转移一步判断一次),主要代码如下: Private Sub SortImg(Img As Object, IntCenter As Integer) For i = 0 To 4 Img(i).Left = IntCenter - Img(i).Width / 2 Next i For i = 0 To 4 If Image1(i).Picture <> 0 Then Exit For If Image2(i).Picture <> 0 Then Exit For Next i If i > 4 Then MsgBox "恭喜:你成功了!", vbOKOnly + vbInformation, "胜利" End Sub 【编程后记】 面对一些看似复杂的程序功能,仔细研究一下,总会有好的思路和方法闪现出来。本例实现了汉诺塔游戏的基本设计思路,大家还可以在盘子数量、步数榜等方面予以改进,以使该程序变得更加丰富、精彩!
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯