资源描述:
《基于jsse的汉诺塔游戏设计与实现》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、基于JSSE的汉诺塔游戏设计与实现作者:康多全(合肥学院计算机科学与技术系,安徽省合肥市合肥学院(南区)邮编230601)摘要:对汉诺塔游戏问题进行了研究,发现了对汉诺塔游戏用递归算法实现符合问题逻辑结构。设计了基于JSSE的递归算法实现了手动移盘和自动移盘的游戏功能。关键词:汉诺塔河内塔盘子问题游戏设计递归问题TheDesignandRealizationofHanoiTowerGameBasedonJSSEKANGDuoquan(HEFEIUNIVERSITYHEFEIANHUI)Abstract:
2、CarriedonaresearchtotheproblemofHanoiTowerGame,discoveredthattherealizationusingareturncalculatewaymatchesthelogicstructureoftheHanoiTowerGame.DesignedthereturncalculatewaytocarryoutthefunctionofthegametomovethedishautomaticallyormovebyhandbasedonJSSE.Ke
3、ywords:HanoiTowerTheproblemofthedishDesignforgame1引言:相传在古印度的布拉玛婆罗门圣庙的僧侣在进行一种被称为汉诺塔的游戏,其装置是一块铜板,上面有三根杆(编号A、B、C),A杆上自下而上、由大到小按顺序串上64个金盘。游戏的目标是把 A杆上的金盘全部移到C杆上,并仍原有顺序叠好。条件是每次只能移动一个盘,并且在每次移动都不允许大盘移到小盘之上。僧侣们说游戏结束的时候就是世界末日。现要求利用递归调用技术把N个盘从A杆移到C杆的移动过程演示出来。2问题分析:
4、 这是一个著名的问题,几乎所有的教材上都有这个问题。由于条件是一次只能移动一个盘,且不允许大盘放在小盘上面,所以64个盘的移动次数是: 18,446,744,073,709,551,615 这是一个天文数字,若每一微秒可能计算(并不输出)一次移动,那么也需要几乎一百万年。我们仅能找出问题的解决方法并解决较小N值时的汉诺塔,但很难用计算机解决64层的汉诺塔。分析问题,找出移动盘子的正确算法。9这个移动过程很复杂与烦琐,但规律性却很强。使用递归调用技术来解决这个移动过程,先得找到一个递归调用模型。想要得到汉
5、诺塔问题的简单解法,着眼点应该是移动A杆最底部的大盘,而不是其顶部的小盘。不考虑64个盘而考虑N个盘的一般情况。要想将A杆上的N个盘移至C杆,我们可以这样设想:1.以C盘为临时杆,从A杆将1至N-1号盘移至B杆。2.将A杆中剩下的第N号盘移至C杆。3.以A杆为临时杆,从B杆将1至N-1号盘移至C杆。我们看到,步骤2只需移动一次就可以完成;步骤1与3的操作则完全相同, 唯一区别仅在于各杆的作用有所不同。这样,原问题被转换为与原问题相同性质的、规模小一些的新问题。 这就是需要找的递归调用模型。 3递归算法设
6、计根据以上分析,在三个柱子中选择一个作为临时杆,可得到基本递归算法如下:publicclassTowersOfHanoi//实现递归算法的类{privateinttotalDisks;publicTowersOfHanoi(intdisks){totalDisks=disks;}publicvoidsolve(){moveTower(totalDisks,1,3,2);}privatevoidmoveTower(intnumDisks,intstart,intend,inttemp){if(numDis
7、ks==1)moveOneDisk(start,end);else{moveTower(numDisks-1,start,temp,end);moveOneDisk(start,end);moveTower(numDisks-1,temp,end,start);}}privatevoidmoveOneDisk(intstart,intend){System.out.println("Moveonediskfrom"+start+"to"+end);}}4游戏界面设计4.1布局设计在Java的GUI界面设
8、计中,布局控制是通过为容器设置布局编辑器来实现的。java.awt包中共定义了五种布局编辑类,每个布局编辑类对应一种布局编辑策略,分别是FlowLayout、9BorderLayout、CardLayout、GridLayout和GridBagLayout。当一个容器选定一种布局编辑策略时,它应该创建该策略对应的布局编辑类的对象,并将此对象设置为自己的布局编辑器。没有设置布局编辑器的容器,其中的对象会互相覆盖,影响使用,所以必须为每个容器设