• 回答数

    3

  • 浏览数

    335

娜娜娜娜An
首页 > 学术期刊 > 小学汉诺塔研究论文

3个回答 默认排序
  • 默认排序
  • 按时间排序

陈宏立夏

已采纳

VB编写益智游戏“汉诺塔”海粟/文《软件报》2007年47期 61-74【编程引子】 “汉诺塔”问题源自印度的一个古老传说,对于它的算法比较常见的是应用递归调用。在本例中,笔者将给大家介绍一种更简单和直观的处理方法。【编程分析】汉诺塔游戏的主要目的是借助B区域,将A区域的五只盘子转移到C区域中,要求每次移动必须从最上层盘子开始,而且必须始终保证小号盘子在大号盘子的上方。程序的主要技术点,除了对上述要求的实现外,还要考虑到鼠标拖放盘子以及盘子的定位、排序等内容。在设计初期,笔者首先考虑采用单击选定,再次单击定位的方式来移动盘子,但这样做必须要让程序记住谁是活动盘子,而且操作的直观性较差。所以,最后笔者还是选择了利用鼠标事件来模拟拖动盘子的动作。而对于盘子移动后的定位问题,如果单纯靠坐标计算来显然,工作量是非常大的。所以,笔者在本例中应用了“一个萝卜一个坑”的简单原理,将目标位置提前放置好Image控件,这样一来,盘子的移动和定位操作都成了对目标控件属性的控制,处理起来变得十分方便。【主要代码】1.程序初始化程序初始化操作在窗体加载事件中完成,另外它与“重新开始”功能模块的作用完全相同,所以可以通过调用的方式来共享代码。代码的主要功能是移动步骤清零、在A区域复位盘子,以及清除B和C两区域盘子等,主要内容如下:Private Sub Command1_Click() = 0 ’移动步骤清零 For i = 0 To 4 Image1(i).Picture = LoadPicture( & "\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 IfEnd 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("") = + 1 ’更新操作步数 End IfEnd 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【编程后记】 面对一些看似复杂的程序功能,仔细研究一下,总会有好的思路和方法闪现出来。本例实现了汉诺塔游戏的基本设计思路,大家还可以在盘子数量、步数排行榜等方面予以改进,以使该程序变得更加丰富、精彩!

177 评论

别惹阿玉

汉诺塔开发孩子智力,锻炼思维能力。

汉诺塔引导孩子根据数学素材进行具体化的数学构思,形成数学运算,通过循序渐进的训练帮助孩子熟悉数学概念,从而全面开发孩子的左右脑潜力。

孩子在小学阶段通过锻炼数学思维让他的思维能力得以提高增强,那么对他后期学好数理化的帮助是很大的。科学研究表明,在小学里思维数学得好的孩子对中学阶段的数理化课程大都能轻松对付,因为孩子头脑比较活络,逻辑思维强。

汉诺塔的由来:

1、法国数学家爱德华卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。

2、不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

以上内容参考百度百科——汉诺塔

165 评论

默默茶叶

汉诺威塔是一款集娱乐与运算的智力游戏,它不仅能使人在休闲的时候放松心情,而且还能在玩的过程中不断的提高你的思维能力.

有三个柱子A, B, C. A柱子上叠放有n个盘子,每个盘子都比它下面的盘子要小一点,可以从上到下用1, 2, 。。。, n编号.要求借助柱子C,把柱子A上的所有的盘子移动到柱子B上.移动条件为:

1、一次只能移一个盘子

2、移动过程中大盘子不能放在小盘子上,只能小盘子放在大盘子上

本文的主要算法是利用函数的递归调用算法。首先,想办法将A座上的前n-1个盘借助C座移动到B座上,然后将A组上的第n个盘移动到C座上。然后再将B座上的n—1个盘借助A座移动到C座上,此次移动也和第一次移动一样,重复递归,直到最后一个盘为止。

104 评论

相关问答

  • 南京古塔研究论文

    (1944-1972年)穆塞韦尼出生于乌干达西部恩通加莫区,是巴尼安科莱人。他的姓解作“第七队员之子”,以纪念第二次世界大战时许多乌干达人参与的英国殖民军队国王

    聪聪老头 5人参与回答 2023-12-10
  • 诺丁汉大学毕业论文补考

    宁波诺丁汉大学挂科补考的规定: 1、一般来说,大一的课程是单独的,所以不需要过于关注。R&W或者L&S之类的课程是在8月份补考。如果总均分过不了的话,需要全部重

    垫块砖一米三 4人参与回答 2023-12-07
  • 诺丁汉研究生毕业论文

    一般来说都是根据学生所在院校,一般是在6-8或9月间写论文,然后毕业论文过了,就一般在12月或者1月的时候开毕业典礼,那时候你就可以拿到证书。

    刘思韵2522 3人参与回答 2023-12-08
  • 英国诺丁汉大学毕业论文

    在英国就读本科阶段,前面的考试都已经顺利结业了,但是最后却被卡在论文这一关导致不能顺利毕业确实是一件很可惜的事情,但是也是有办法可以解决的。下面是我的一些建议,

    黄豆珵珵 3人参与回答 2023-12-08
  • 诺丁汉留学生毕业论文没过

    没有毕业,或者挂科是不可以办理学历认证的做学历认证最重要的就是那一张纸质的毕业证书,如果有那一张纸质的毕业证书的话,可以直接去教育部留学服务中心去办理学历认证,

    708带你去吃吧 4人参与回答 2023-12-12