范文无忧网计划总结报告汇报

汉诺塔VB的心得体会

01月17日 编辑 fanwen51.com

[求一篇大学生暑期做家教的心得体会字数在1500字左右谢谢了]俗话说得好“物以稀为贵”,现在小孩都是独生子女,家里人人都宠得爱不释手,同时都体会到现在孩子越来越难管,很多家长同一体会,用软的不行,用硬的也不行,但是现在的家庭教育非常重要...+阅读

VB编写益智游戏“汉诺塔” 海粟/文 《软件报》2007年47期 61-74 【编程引子】 “汉诺塔”问题源自印度的一个古老传说,对于它的算法比较常见的是应用递归调用。在本例中,笔者将给大家介绍一种更简单和直观的处理方法。【编程分析】 汉诺塔游戏的主要目的是借助B区域,将A区域的五只盘子转移到C区域中,要求每次移动必须从最上层盘子开始,而且必须始终保证小号盘子在大号盘子的上方。

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

所以,笔者在本例中应用了“一个萝卜一个坑”的简单原理,将目标位置提前放置好Image控件,这样一来,盘子的移动和定位操作都成了对目标控件属性的控制,处理起来变得十分方便。【主要代码】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 0 Then Exit Sub '移动操作不合法 If X >= 2000 And X Call MoveImg(Image1, Image2, Index) '从A向B转移 Call SortImg(Image2, 3420) '对齐盘子3420为区域中心线X值 End If If X >= 4300 And X 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).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 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 【编程后记】 面对一些看似复杂的程序功能,仔细研究一下,总会有好的思路和方法闪现出来。

本例实现了汉诺塔游戏的基本设计思路,大家还可以在盘子数量、步数排行榜等方面予以改进,以使该程序变得更加丰富、精彩!

延伸阅读:

家长怎样写家教心得体会作文孩子的成长应该是立体的、多方位的、多能力的成长,对孩子的教育也应是立体、全方位式的教育,仅仅依赖学校教育,忽视家庭教育,对孩子的成长是一种缺憾。 家庭教育既是一门综合性...

求一篇社会实践报告和一篇感恩教育的感想体会暑期实践报告夏日里长长的暑期激起了我要在暑假参加社会实践的决心其实自己老早就有这种想法了我想依靠自己的双手和大脑来赚取自己所需的生活费,当然更多的是想通过亲身体验...

工作心得体会范文做营业前勤是一个琐碎的工作,从头到尾都要细心,一步不到麻烦就来了。做了几个月以来,向同事领导也学了不少东西,对自己的工作有非常大的帮助,现总结了以下几条小经验,很是实用。 1...

80分求三千字的会计心得体会或实习体会要速度要质量谢谢啦我们在2010年4月5号开始了本次会计实习,采取模拟实习的方式,使用印制好的资料作为整个会计实习的材料来源。通过实习,熟悉并掌握会计流程的各个步骤及其具体操作--包括了解账户...

从事出纳会计工作一年的心得体会出纳实习报告范文—- 出纳实习报告2005年我公司各部门都取得了可喜的成就,作为公司出纳,我在收付、反映、监督、管理四个方面尽到了应尽的职责,特别是在非典期间,仍按时到银行保...

社会实践活动心得体会600字不要抄的抄的一律满门抄斩!今年寒假虽然让我觉得很累很辛苦,但我从中锻炼了自己,认识了自己的不足,并且学到了很多课堂上学不到的东西,更多的是让我对人生有了新的认识,新的感悟。也通过将近两个月的实践,使...

社区服务的心得体会社区服务活动,使我增强了社会责任感和使命感,我也学到了一些处理问题的技巧,与人沟通的技巧,受益匪浅。 当我拿好铁锹到了路上时,很多居委会的人正在努力铲雪、扫雪。这还是我第...

社会实践综合与社区服务心得体会字数不少于800字暑假的社会实践活动已经结束了,但社会实践给我们带来的巨大影响却远没有结束。它使我们走出校园,走出课堂, 走向社会,走上了与实践相结合的道路,到社会的大课堂上去见识世面、施...

社会实践报告内容及心得体会不超过200字社会实践是沟通校园与社会的桥梁,是我们进入社会前继续充实自己知识的“深加工厂”。最终我们要面临社会和市场无情的竞争与淘汰,仅仅依靠校园里的知识是不够的。于是,我开始思...

推荐阅读
图文推荐
栏目列表