2024年2月8日发(作者:)
科技创新导报2011 NO.30Science and Technology Innovation HeraldI T 技 术利用VB数组的方法实现汉诺塔游戏的设计①刘晓章(南京高等职业技术学校 江苏南京 210019)摘 要:本设计是利用VB中的数组方法,来设计出一个汉诺塔的交互式游戏程序,该程序能让用户选择想移动的圆盘数量,自动生成不同大小和颜色的圆盘,用户可以用鼠标进行游戏操作,当操作错误或者犯规时有相应的提示。关键词:数组 汉诺塔 移动 圆盘中图分类号:TP311.11文献标识码:A文章编号:1674-098X(2011)10(c)-0012-021 引言进行移盘操作。在很多关于程序设计的书中介绍到递子程序L_MouseMove(Index As归的章节时都要讲到“汉诺塔”的例子,大Integer,Button As Integer,Shift As意是在一块板上有三根针第一根针上从小Integer,X As Single,Y As Single)则是当到大套有64个圆盘,每次只能移动一个圆选好盘子后,到放置盘片的过程中,让盘子盘,而且只能将小的盘片放在大的盘片之跟随鼠标光标一起移动。上,通过第二根针过渡,将所有圆盘移至第子程序xz(index),判断是选取(拿)圆三根针即为成功。在各书中是用递归的算盘,还是进行放置圆盘的工作,取盘子时该法来解决“汉诺塔”的实现步骤的。如何利针上有没有盘子,放盘子时要放的盘子是用Visual Basic来设计可供学生进行真正操否是该针上最小的盘片等。并进行相应的作、玩的游戏呢?我通过探索和设计,用数参数设置。组的方法实现了互动汉诺塔游戏的制作。子程序md(Index),是进行移动圆盘的操作,当在某针上可以放置所移来的圆盘2 具体的设计思路时,则进行该程序,并将数组的相关数组元因为盘片的数量增加会导致玩成功的素的值进行修改,其后将该盘画在此针上。时间急剧增加,按照全部步骤正确,以每秒子程序downd(j),是进行放盘子的操移动一个盘片计算,要玩完64个盘片至少作,主要是判断现在该针上共有几个圆盘,要264-1次,合5849亿年之久。所以,要首先并将现在移动过来的盘子放在最上面,并让用户选择要玩的圆盘总数n,根据n,设计画出。出一个二维数组a(3,n),第一维为针(柱子)其它还设计了一些关于游戏成功、帮数,第二维为盘数。数组元素的值为布尔助、显示帮助、游戏复位等的子程序。型,且对应于盘的位置。如a(2,5)为true则表示在第二个针上,第5个盘在其上存在。如a3 主要事件过程代码(3,1)为false则表示在第三个针上,第1个盘Dim n As Integer'n为要移动的盘子子不存在。总数程序开始时,根据用户输入的准备移Dim a() As Boolean'两维数组,第一动的圆盘总数n,用控件数组自动生成n个维针号,第二维盘号,T为盘在针上,F为盘圆盘,并且随机产生其颜色。开始后画在第不在针上。一个柱子上。Dim S As Boolean's为判断是取盘子子程序d_Click(Index As Integer),是还是放盘子准备拿取圆盘,判断如果该针上有圆盘,就Dim di As Integer'di为全局记忆现在图1 游戏操作截图①作者简介:刘晓章(1964-),男,南京高等职业技术学校计算机管理系主任,本科12科技创新导报 Science and Technology Innovation Herald操作的是第几个盘子Dim pi As Integer 'pi为全局记忆刚才操作的是第几个柱子Private Sub Cmdbegin_Click()n=InputBox("请输入你想要移动的盘子总数,"&vbCrLf&"最好在2个到8个之间。","汉诺塔游戏开始",4)ReDim a(3,n)Fori= 1 Ton'初始四盘在1针上a(1,i)=TrueNext iS=True's为T时准备选取盘子RandomizeFor i=1 Ton'在第一个针上画出n个盘子Load d(i)d(i).Height=240d(i).Width=(i+2)*240d(i).FillColor=RGB(Rnd*255,Rnd*255,Rnd*255)d(i).Top=(28-(n-i+1)*2)*120d(i).Left=13.5*120-d(i).Width/2d(i).ZOrder 0d(i).Visible=TrueNext iEnd SubPrivate Sub L_Click(Index As Integer)'L(i)为3个柱子的鼠标点选区,只能选取最上的一个盘xz(Index)'调用选择子程序End SubPrivate Sub d_Click(Index As Integer)'d(i)为n个盘子的控件数组For i=1 To 3If a(i, Index) Then xz (i): Exit SubNext iEnd SubPrivate Sub md(Index)'移盘子程序a(Index,di)=True'数组中新位置置盘a(pi,di)=False'数组中老位置去盘downd IndexS=Not S'移盘过程结束,s置为T,准备下次的选盘End SubPrivate Sub xz(Index)'选择子程序,(下转14页).. All Rights Reserved.
科技创新导报2011 NO.30Science and Technology Innovation HeraldI T 技 术点研究算法的设计实现过程,并通过定量定性分析该算法在P2P网络上的性能优势,不仅能够提高数据传输可靠性,均衡负载,提高容错性,通过减少数据传输路径数,还大大降低了节点功耗,实现节能高效的新型可靠多路径路由协议。己到汇聚节点跳数等同节点,比自己到汇聚节点跳数少1的节点,以及比自己到汇聚H-、节点多1的节点;这三类节点分别用H0、H+表示,为了保证所有选中的邻居节点能提供发送数据的M条路径,邻居节点要创建一定的路径数。假设三类节点集合中,分0-+K、K个节点选中,并且需要为源别有K、节点创建的路径数为P0、P-、P+,则有(2)的结果:
K0P0KPKPM (2)5 算法性能分析NC-RMPP协议考虑逐跳的可靠性传输,并在路由中加入网络编码,通过编码运算将多个数据沿着多条路径传输,并在接收端容错分析后,该协议提高了数据传输可靠性,均衡网络负载,提高网络的容错性,节省节点的能量消耗。下面通过Matlab和OMNET++仿真比较分析了NC-RMPP协议在可靠度、冗余度及能量消耗的性能。5.1实验仿真平台使用OMNET++建立一个网络模型的步骤分为网络描述、消息定义、模块实现、系统配置4个步骤。在OMNET++中,在OMNET++中对消息的建模是通过建立msg文件,在文件中用OMNET++提供的一种类似于C++的语言描述消息中所包括的域,为了适应新的网络环境的变化,OMNET++提供了一种配置文件的机制。5.2可靠度和冗余度相同路径数下NC-RMPP路由的可靠度优于传统多路径路由,在一定可靠度下,采用网络编码机制后需要的路径数少于传统的多路径路由所需路径数,在路径数为16条的时候NC-RMPP路由就能保证以95%的可靠度传输,此时传统多路径路由需24条才能保证同样可靠度。NC-RMPP路由并不要保证每个数据包都正确接收,接收节点只需接收到部分编码包就可以正确的恢复出源数据,因此随着期望可靠度越高,这两种机制下成功交付需要的路径数相差就越大,NC-RMPP路由所需的路径数也将大大降低。NC-RMPP路由可靠性机制体现传输路径数的减少,这是因为算法中采用了网络编码技术,对收到的数据包进行编码运算,而且在接收端解码时允许部分信息丢失。当然影响路径数的因素有很多,包括信道出错率、网络跳数、编码报文数等,下面图1中分别考虑到几个参数的影响。从(图1)中看出设定的可靠度为0.8,源节点到汇聚节点的跳数为6跳,原始报文4个编为一组的情况下,误码率增大,两种方式传输需要的路径数也增大,这种趋势当误码率较高时尤为明显。而在同等条件下,NC-RMPP路由保证一定可靠度的传输所需的路径数要低;在误码率较高时相差的路径数会更加大,NC-RMPP路由在误码率较高时更能发挥优势。参考文献[1]Sen S,Wang ing peer-to-peertraffic across large networks[J].IEEE/ACM Transactions on Networking,2004,12(2): 219~232.[2]Philip ,Yunnan Wu,cal network coding[C].In:41st Annua Allerton Conference onCommunication Control and Computing,Oct.2003,115~124.[3]杨林,郑刚.一种集成网络编码的低轨卫星网络多径路由算法[J].中南大学学报(自然科学版),2007,38(5):950~955.[4]张晶晶,何荣希,陈玉飞.无线传感器网络多径路由协议综述[J].计算机工程与设计,2007,28(22):5417~5419.6 结语本文在研究网络编码性能基础上,提出一种新的NC-RMPP路由协议,该算法是基于网络编码的可靠多路径路由协议,重If i>di Then'最上的盘子比要移的盘子大,则移盘可以进行md(Index)cgElseMsgBox"只能小盘放在大盘上!"downd pi'将盘子放回原来的针上S=True'重新进行选盘的过程End IfExit SubEnd IfNext imd (Index)cgEnd IfEnd SubPrivate Sub L_MouseMove(Index AsInteger,Button As Integer, Shift AsInteger,X As Single,Y As Single)If Not S Then d(di).Move L(Index).Left + X - d(di).Widt/2,L(Index).Top+Y+10'盘子跟着鼠标走End SubPrivate Sub downd(j)'j为放盘的针号d(di).Move(13.5+(j-1)*21)*120 - d(di).Width/2,28*120-240'在新柱子上将盘子下沉至底For i =di+1 To n'判断新位置上已有盘子数,再将盘子上移到位If a(j,i)Then d(di).Move d(di).Left,d(di).Top-240Next iEnd SubPrivate Sub cg()'判断是否最终成功子程序For i=1 To nflag=TrueIf Not a(3,i) Then flag = False:ExitForNext iIf flag ThenBeepMsgBox"你成功了!"End IfEnd . All Rights Reserved.(上接12页)Index为选的第几个柱子If S Then's为T,则进行选取盘子的过程flag=True'flag为该柱子上是否有盘子,T为没有盘子,F为有盘子For i=1 To nIf a(Index,i) Then flag=FalseNext iIf flag Then MsgBox"请选有盘子的柱子!":Exit SubS=Not S'选取成功,准备进行放盘子的操作For i=1 To n'只能取该柱子上最上面的一个盘子,判断之If a(Index,i) Thenpi=Index'记住选择的柱子号di=i'记住选择的盘子号Exit ForEnd IfNext i4 游戏操作截图(图1)Else's为F,则进行放盘子的操作For i =1 To n'i是从上往下看,现准备放盘的柱子上有几号盘子If a(Index,i)Then'找到了从上往下的第一个盘子14科技创新导报 Science and Technology Innovation Herald
发布者:admin,转转请注明出处:http://www.yc00.com/web/1707358673a1495818.html
评论列表(0条)