中易网

实验一 汉诺塔问题的实现 设有三个塔座,分别为x,y,z,现在有n个直径各不相同的圆盘,并且按照直径从小

答案:1  悬赏:0  
解决时间 2021-11-08 05:59
实验一 汉诺塔问题的实现 设有三个塔座,分别为x,y,z,现在有n个直径各不相同的圆盘,并且按照直径从小
最佳答案
【主要代码】 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 【编程后记】 面对一些看似复杂的程序功能,仔细研究一下,总会有好的思路和方法闪现出来。本例实现了汉诺塔游戏的基本设计思路,大家还可以在盘子数量、步数榜等方面予以改进,以使该程序变得更加丰富、精彩!
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
江淮瑞风s3手动挡汽车加挡怎么操作
奢侈品护理培训哪家好,技术培训性价比高
护理牙齿
夏天涂防晒霜适合孩子吗?
漳州哪个美容院好?
速度找lv,,gucci,prada,D&G,衣服鞋子厂家
激光祛斑效果 和注意 以及反弹不?? 有经历
··“高密度聚醚型聚氨酯3”材质的枕头怎么
宋村村怎么去啊,我要去那办事
家长应如何让孩子爱上吃饭?
2014年中国地板十佳品牌?
70平跃层装修怎么设计比较好看?
宁波有做地热吗?是什么公司?
扭了下脚
英文歌低沉女声 开头是how。。。高潮部分是 i
推荐资讯
丽贝丽丰胸组合是怎么使用的?效果怎么样呢?
武昌哪卖手级的最便宜又好啊?
哺乳期吃味精对宝宝有害吗?
南汇长途汽车站到南通汽车站时刻表
电视墙朝大门的客厅怎么装修
郑州大学路附近哪里能修九阳豆浆机
醋蛋的制作的方法有哪些?
風險的意思是什么?風險的释义是什么啊?
求问海蒂诗抽屉轨道怎么样
我想知道柯米诺对鬓角胡须位置可以吗?
25岁,眼睛下面有细纹。眼袋黑。用什么眼霜好
晚上做完面膜后是应该什么保养品都不用,让皮
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?