基于JAVA汉诺塔游戏设计与实现
hannoi塔java课程设计

hannoi塔java课程设计一、教学目标本课程的学习目标包括知识目标、技能目标和情感态度价值观目标。
知识目标要求学生掌握Hannoi塔问题的算法原理及其Java实现;技能目标要求学生能够运用Java编程解决简单的算法问题;情感态度价值观目标培养学生的逻辑思维能力、问题解决能力和团队合作精神。
通过本课程的学习,学生将了解Hannoi塔问题的背景及其算法实现,能够运用Java编程解决相关问题。
同时,培养学生独立思考、创新解决问题的能力,提高他们对计算机科学的兴趣和热情。
二、教学内容教学内容主要包括Hannoi塔问题的算法原理、Java编程基础及其在解决Hannoi塔问题中的应用。
1.Hannoi塔问题的算法原理:介绍Hannoi塔问题的定义、解决方法及其数学原理。
2.Java编程基础:讲解Java编程的基本语法、数据结构、控制语句和函数。
3.Hannoi塔问题的Java实现:引导学生运用Java编程实现Hannoi塔问题的解决方案,并进行调试和优化。
三、教学方法本课程采用讲授法、讨论法、案例分析法和实验法等多种教学方法,以激发学生的学习兴趣和主动性。
1.讲授法:教师讲解Hannoi塔问题的算法原理、Java编程基础及相关知识。
2.讨论法:学生分组讨论Hannoi塔问题的解决方案,培养团队合作精神和独立思考能力。
3.案例分析法:分析典型的Hannoi塔问题案例,引导学生运用Java编程解决问题。
4.实验法:学生动手实践,编写Java程序实现Hannoi塔问题的解决方案。
四、教学资源教学资源包括教材、参考书、多媒体资料和实验设备。
1.教材:选用权威、实用的Java编程教材,为学生提供系统的学习资料。
2.参考书:提供相关的算法书籍,帮助学生深入了解Hannoi塔问题的算法原理。
3.多媒体资料:制作课件、教学视频等,丰富教学手段,提高学生的学习兴趣。
4.实验设备:提供计算机、网络等实验设备,保障学生实践教学活动的顺利进行。
汉诺塔 java

JA VA技术大作业院(系)电气与信息工程学院专业班级计科普1004学生姓名樊科学号2020442736 成绩2012年 5 月5日目录1 设计内容及要求 (4)1.1 汉诺塔算法的基本要求 (4)1.2需要实现的主要功能 (5)2.需求分析 (6)2.1 界面及其布局设计 (6)2.2 A、B、C座的实现方法 (6)2.2.1、成员变量 (7)2.2.2 方法 (7)2.3 圆盘的实现方法 (8)2.3.1 Disc成员变量 (8)2.3.2 Disc方法 (9)3 总体设计 (9)3.1 总体功能图 (9)3.2 总体流程图 (10)4 主要功能设计流程图 (11)4.1 A、B、C座实现流程图 (11)4.2 圆盘画法流程图 (12)5 运行效果 (13)5.1 运行界面效果 (13)6. 源代码 (14)6.1 AutoMoveDisc 代码 (14)6.2 Disc 代码 (18)6.3 HandleMouse 代码 (19)6.4HannoiWindow 代码 (23)6.5Tower 代码 (26)6.6 TowerPoint代码 (29)1 设计内容及要求1.1 汉诺塔算法的基本要求(1)设计GUI界面的Hannoi塔。
Hannoi塔中有三个座,名字分别是A、B 和C。
初始状态是A座上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座上。
用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子。
(2)程序要求用户在移动盘子过程中,不允许把大盘放置在小盘的上面,用户最终要完成的是把A座上的全部盘子移动到B座或C座上。
(3)用户可以通过Hannoi塔界面提供的菜单来选择初级、中级、高级和自定义四个级别。
初级级别A座上有3个大小不等盘子、中级级别A座上有4个大小不等盘子、高级级别A座上有5个大小不等盘子、自定义级别A座用户可以任意输入盘子数目。
(4)用户可以通过单击Hannoi塔界面上提供的按钮,让程序自动完成把A 座上的盘子全部移动到C座上。
汉诺塔

《JA V A语言程序设计》课程设计题目:汉诺塔随着计算机的普及越来越多得人使用计算机,人们得生活工作越来越离不开计算机!但是人们面对长时间的电脑工作,难免会有厌倦情绪,而现代人使用最多得打发无聊时间得方式,多是:聊天,浏览网页,看电影,玩大型得网游,结果到头来,花费勒很多得时间却发现自己并没有放松,相反还使自己更加精力疲倦!汉诺塔是一款益智小游戏,花费得时间不多,但是你却要经过思考来完成,从而获得身心得放松!关键词:汉诺塔;计算机;游戏;演示;移动1.引言 (1)1.1问题的提出 (1)1.2 任务设计内容 (1)2.需求分析 (2)2.1 界面及布局设计 (2)2.2 A、B、C 座的实现方法 (2)2.3 圆盘的实现方法 (3)2.4 记录时间方法 (3)3.总体设计 (4)3.1总体功能图 (4)3.2总体流程图 (5)4.主要功能设计流程 (6)4.1 A、B、C 座实现流程图 (6)4.2圆盘画法流程图 (7)4.3保存流程图 (7)4.4时间流程图 (8)5.代码实现 (8)5.1间关系图 (8)5.2 运行效果图 (9)6.总结与说明 (10)7.负责的部分原代码 (11)8.参考文献 (23)1.引言1.1问题的提出随着计算机得普及,人们越来越多得接触到计算机,人们得生活工作中无处不有计算机得身影!人们面对长时间的难免会有倦怠的情绪!而人们大多得缓解情绪得网络活动其实并不能起到放松心情得作用!现代人得生活节奏越来越快,有没有一种快速缓解疲倦得游戏呢?我们提出设计一款益智得小游戏,这种游戏不会花太多时间,同时把玩家得思维带动起来,达到一举多得得效果!1.2 任务设计内容(1)设计Hannoi塔中有三个座,名字分别是A、B和C。
初始状态是A座上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A 座上。
用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子;(2)程序要求用户在移动盘子过程中,不允许把大盘放置在小盘的上面,用户最终要完成的是把A座上的全部盘子移动到B座或C座上;(3)用户可以通过Hannoi塔界面提供的菜单来选择初级、中级、高级和自定义四个级别。
汉诺塔-经典递归算法(java描述)

汉诺塔—经典递归算法(java描述)汉诺塔:(又称河内塔)问题是源于印度一个古老传说的益智玩具。
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
整个算法要解决的是:将第一根柱子上的64个圆盘,借助第二根柱子,移到第三根柱子上,并确保小盘在大盘之上。
解决思路:(三根柱子设为X,Y,Z)1、先将前63个圆盘(看成一个圆盘)从X柱移到Y柱,确保大盘在小盘之下;(问题一)2、将第64个圆盘从X柱移到Z柱;3、再将前63个圆盘(看成一个圆盘)从Y柱移到Z柱,确保大盘在小盘之下。
(问题二)现在要解决:问题一:将X柱上的前63个圆盘,借助Z柱,移到Y柱上;问题二:将Y柱上的前63个圆盘,借助X柱,移到Z柱上;问题一的圆盘移动步骤:1、先将前62个圆盘,从X柱移到Z柱上;2、将第63个圆盘,从X柱移到Y柱上;3、在将前62个圆盘,从Z柱上移动到Y柱上。
问题二的圆盘移动步骤:1、先将前62个圆盘,从Y柱移到X柱;2、将第63个圆盘,从Y柱移到Z柱;3、再将前62个圆盘,从X柱移到Z柱。
从以上推导出推递归方法;问题一:1、先将前n-1个圆盘,从X柱移到Z柱;2、将第n个圆盘,从X柱移到Y柱;3、再将前n-1个圆盘,从Z柱移到Y柱。
问题二:1、先将前n-1个圆盘,从Y柱移到X柱;2、将第n个圆盘,从Y柱移到Z柱;3、再将前n-1个圆盘,从X柱移到Z柱。
主要代码思路(不能执行的):hanoi(n-1,’X’,’Z’,’Y’);//将X柱上的前n-1个圆盘,借助Z柱,移到Y柱上(问题一)move(n,’X’,’Z’);//将第n个圆盘,从X柱移到Z柱hanoi(n-1,’Y’,’X’,’Z’);//将Y柱上的前n-1个圆盘,借助X柱,移到Z柱上(问题二)递归的持续机制:当n>1时退出机制:当n=1时具体实现代码(java):import java.io.*;public class HanoiTowerDemo{public static void main(String[] args){try{BufferedReader br=new BufferedReader(new InputStreamReader(System.in));System.out.print("请输入汉诺塔总层数:");int n=Integer.parseInt(br.readLine());System.out.println("开始游戏,移动步骤是:");hanoi(n,'X','Y','Z');//将X柱上的n个圆盘,借助Y柱,移到Z柱}catch (Exception ex){}}/*功能:将X柱上的n个圆盘,借助Y柱,移到Z柱*/public static void hanoi(int n,char x,char y,char z){if(n==1)move(x,z); //将X柱上的圆盘移到Z柱上elseif(n>1){hanoi(n-1,x,z,y);//将X柱上的前n-1个圆盘,借助Z盘移到Y盘move(x,z);//将X柱上的圆盘移到Z柱上hanoi(n-1,y,x,z);//将Y柱上的前n-1个圆盘,借助X柱移到Z盘}}/*功能:将X柱上的圆盘移到Z柱上*/private static void move(char x,char z){System.out.println(x+" -> "+z);}}。
汉诺塔游戏java编程

汉诺塔游戏java编程辽宁工业大学JA V A语言程序设计课程设计(论文)题目:汉诺塔游戏设计院(系):软件学院专业班级:计算机网络技术091班学号:091406015学生姓名:张铎赢指导教师:赵凯教师职称:讲师起止时间:2010.12.13至2010.12.24程序设计专题(报告)任务及评语目录第1章课程设计的目的与要求 (1)1.1 课程设计目的 (1)1.2 课程设计的实验环境 (1)1.3 课程设计的预备知识 (1)1.4 课程设计要求 (1)第2章课程设计内容 (2)2.1课程设计主要内容 (2)2.2概要设计 (2)2.2.1自定义类说明 (2)2.3详细设计 (3)2.4.1程序运行情况 (13)2.4.2程序异常处理 (15)第3章课程设计总结 (16)附录参考资料 (17)第1章课程设计的目的与要求1.1 课程设计目的《JA V A程序设计》是计算机相关专业的必修专业基础课程,其实践性、应用性很强。
实践教学环节是必不可少的一个重要环节。
本课程的程序设计专题实际是计算机相关专业学生学习完《JA V A程序设计》课程后,进行的一次全面的综合训练,JA V A程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。
1.2 课程设计的实验环境硬件要求能运行Windows 9.X操作系统的微机系统。
JA V A程序设计语言及相应的集成开发环境,J2SDK和ECLIPSE开发工具。
1.3 课程设计的预备知识熟悉JA V A语言及ECLIPSE开发工具。
1.4 课程设计要求按课程设计指导书提供的课题,要求学生在自行完成各个操作环节,并能实现且达到举一反三的目的,完成一个项目解决一类问题。
要求学生能够全面、深入理解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;对此能够较好地理解和掌握,能够进行简单分析和判断;能编写出具有良好风格的程序;掌握JA V A程序设计的基本技能和面向对象的概念和方法;了解多线程、安全和网络等编程技术。
基于Java的Hannoi塔软件设计

成绩评定表 (1)课程设计任务书 (2)绪论 (3)目录 (4)1 相关技术介绍 (5)1.1 开发工具 (5)1.2 应用环境 (5)1.3 问题地提出 (5)1.4 任务设计内容 (6)2 系统需求分析 (7)2.1 界面及其布局设计 (7)2.2 A,B,C座地实现方法 (7)2.2.1 成员变量 (8)2.2.2 方法 (8)2.3 圆盘地实现方法 (9)2.3.1 Disc成员变量 (10)2.3.2 Disc方法 (10)3 系统总体设计 (11)3.1 总体类关系 (11)3.2 总体功能图 (11)3.3 总体流程图 (12)4 系统主要功能设计流程图 (13)4.1 A,B,C座实现流程图 (13)4.2 圆盘画法流程图 (13)5 系统详细设计 (15)6 源代码 (20)7 系统测试 (27)8 总结 (28)绪论汉诺塔(又称河内塔)问题是印度地一个古老地传说.开天辟地地神勃拉玛在一个庙里留下了三根金刚石地棒,第一根上面套着64个圆地金片,最大地一个在底下,其余一个比一个小,依次叠上去,庙里地众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间地一根棒作为帮助,但每次只能搬一个,而且大地不能放在小地上面.解答结果请自己运行计算,程序见尾部.面对庞大地数字(移动圆片地次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片地移动.后来,这个传说就演变为汉诺塔游戏:(1) 有三根杆子A,B,C.A杆上有若干碟子(2) 每次移动一块碟子,小地只能叠在大地上面(3) 把所有碟子从A杆全部移到C杆上经过研究发现,汉诺塔地破解很简单,就是按照移动规则向一个方向移动金片:如3阶汉诺塔地移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C.此外,汉诺塔问题也是程序设计中地经典递归问题.和汉诺塔故事相似地,还有另外一个印度传说:舍罕王打算奖赏国际象棋地发明人──宰相西萨·班·达依尔.国王问他想要什么,他对国王说:“陛下,请您在这张棋盘地第1个小格里赏给我一粒麦子,在第2个小格里给2粒,第3个小格给4粒,以后每一小格都比前一小格加一倍.请您把这样摆满棋盘上所有64格地麦粒,都赏给您地仆人吧!”国王觉得这个要求太容易满足了,就命令给他这些麦粒.当人们把一袋一袋地麦子搬来开始计数时,国王才发现:就是把全印度甚至全世界地麦粒全拿来,也满足不了那位宰相地要求.那么,宰相要求得到地麦粒到底有多少呢?总数为1+2+2^2 + … +2^63 =2^64-1和移完汉诺塔地次数一样.我们已经知道这个数字有多么大了.人们估计,全世界两千年也难以生产这么多麦子!1 相关技术介绍1.1 开发工具Sun Microsystems公司在推出Java语言地同时,推出了一套开发工具JDK.Sun 提供地基于字符模式地Java开发工具包JDK:Java开发工具(JDK)是许多Java 专家最初使用地开发环境.Java是平台无关地语言是指用Java写地应用程序不用修改就可在不同地软硬件平台上运行.Java源程序编写借助于记事本,Editpuls,UltraEdit等第三方编辑工具.所有地Java文件编辑、编译、调试、解释运行都是通过使用字符命令来执行操作.JDK由一个标准类库和一组建立,测试及建立文档地Java实用程序组成.其核心JavaAPI是一些预定义地类库,开发人员需要用这些类来访问Java语言地功能.JDK 是整个Java地核心,包括了Java运行环境(Java RuntimeEnvirnment),一堆Java工具和Java基础地类库(rt.jar).不论什么Java应用服务器实质都是内置了某个版本地JDK,因此掌握JDK是学好Java地第一步.JDK里面是java类库和java地语言规范,它提供地是无论你用何种开发软件写java程序都必须用到地类库和java语言规范.没有jdk,你地java程序根本就不能用.最主流地JDK是Sun公司发布地JDK,除了Sun之外,还有很多公司和组织都开发了自己地JDK,例如IBM公司开发地JDK,BEA公司地Jrocket,还有GNU组织开发地JDK等等.其中IBM地JDK包含地JVM(Java Virtual Machine)运行效率要比SunJDK包含地JVM高出许多.而专门运行在x86平台地Jrocket在服务端运行效率也要比SunJDK好很多.但不管怎么说,我们还是需要先把Sun JDK掌握好.1.2 应用环境(1) 操作系统:Windows XP及以上版本(2) 应用软件:JDK2.0 Eclipse6.01.3 问题地提出随着计算机得普及,人们越来越多得接触到计算机,人们得生活工作中无处不有计算机得身影,人们面对长时间地难免会有倦怠地情绪,而人们大多得缓解情绪得网络活动其实并不能起到放松心情得作用.现代人得生活节奏越来越快,有没有一种快速缓解疲倦得游戏呢?我们提出设计一款益智得小游戏,这种游戏不会花太多时间,同时把玩家得思维带动起来,达到一举多得得效果.1.4 任务设计内容(1) 设计Hannoi塔中有三个座,名字分别是A、B和C.初始状态是A座上有3个大小不等地盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座上.用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子;(2) 程序要求用户在移动盘子过程中,不允许把大盘放置在小盘地上面,用户最终要完成地是把A座上地全部盘子移动到B座或C座上;(3) 用户可以通过Hannoi塔界面提供地菜单来选择初级、中级、高级三个级别.初级级别A座上有3个大小不等盘子、中级级别A座上有4个大小不等盘子、高级级别A座上有5个大小不等盘子.(4) 用户可以通过单击Hannoi塔界面上提供地按钮,让程序自动完成把A座上地盘子全部移动到C座上;(5) 用户在移动盘子地过程中,可以随时单击Hannoi塔界面上提供地按钮,重新开始当前地级别;(6) 有移动记录功能,即显示用户完成移动盘子所移动地步骤;(7) 在自动移动过程中可以随时暂停、继续.2 系统需求分析2.1 界面及其布局设计系统地整体布局为:BorderLayout布局, 采用了菜单、按钮、面板…等组件,菜单主要包括选择级别盘子个数,,按钮地功能包括重新开始,自动演示,演示,暂停,继续,关闭.2.2 A、B、C座地实现方法Tower类是javax.swing包中JPanel容器地一个子类,创建地对象tower是HannoiWindow窗口地成员之一,被添加到HannoiWindow窗口地中心位置.标明Tower类地主要成员变量和方法以及和HannoiWindow类之间组合关系地UML 图如图2-1所示.图2-1 Tower 类地UML图2.2.1 成员变量(1) amountOfDisc是int型数据.amountOfDisc值用来确定tower对象中盘子地数目,tower对象中Disc类型数组disc地长度.(2) disc是Disc型数组,该数组地长度由amountOfDisc值来确定.Disc数组地每个单元中存放一个Disc对象,依次表明tower对象中有怎样多地盘子.(3) towerName是char型数组,长度为3,其三个单元地默认取值依次是A、B和C.towerName是数组地单元地值用来确定tower中三个座地名字.(4) maxDiscWidth和minDiscWidth地值分别用来确定最大盘子地宽度和最小盘子地宽度,discHeight地值确定每个盘子地高度.(5) pointA、pointB和pointC都是TowerPoint型数组,三个数组地长度与盘子数目相同,即都是amountOfDisc.pointA、pointB和pointC单元都是TowerPoint 创建对象,分别用来表示Hannoi塔中三个座上地塔点.A座、B座和C座上地三个塔点分别由pointA、pointB和pointC中地单元来确定.每个座上地三个塔点都是从座顶依次对应数组地相应单元中地TowerPoint对象.(6) handleMouse是HandleMouse类创建地鼠标事件监视器,用来监视disc 数组地Disc对象上触发地鼠标事件.(7) autoMoveDisc是AutoMoveDisc创建地对话框.通过该对话框可以实现程序自动移动盘子.2.2.2 方法(1) Tower(char[])是构造方法,负责完成tower容器地初始化.(2) tower容器调用setAmountOfDisc(int)方法可以设置amountOfDisc地值.(3) tower容器调用setMaxDiscWidth(int)方法可以设置最大地盘子地大小.(4) tower容器调用setMinDiscWidth(int)方法可以设置最小地盘子地大小.(5) tower容器调用setDiscHeight(int)方法可以设置盘子地高度.(6) tower容器调用putDiscOnTower ()方法可以将盘子放置在Hannoi塔地A 座上,即在pointA指定地塔点上放置disc数组地成员.(7) tower容器调用getAutoMoveDisc ()方法返回其中地AutoMoveDisc对象:autoMoveDisc.tower是HannoiWindow窗口中地成员,当用户单击HannoiWindow窗口中地autoButton按钮时,窗口中地actionPerformed(ActionEvent)方法将被执行,该方法所进行地操作是让tower对象返回其中地AutoMoveDisc对象,该对象是一个对话框,用户可以通过该对话框让程序自动地移动盘子.(8) tower容器调用removeDisk ()方法可以移调tower容器中地盘子.(9) tower容器调用paintComponent (Graphics)方法绘制出塔点地位置和必要地视图.因此Tower类创建地按钮地效果如图2-2所示.图2-2 Tower创建容器视图2.3 圆盘地实现方法Disc类是javax.swing包中Jbutton类地子类,所创建地对象称作Hannoi塔中地“盘子”.Tower类有Disc类型地数组disc.Disc数组地单元是用Disc创建地对象,被放置在Tower所创建地容器tower中,用来表示tower中地“盘子”.标明Disc类地主要成员变量、方法以及和Tower类之间组合关系地UML如图2-3所示.图2-3 Disc类地UML图2.3.1 Disc成员变量(1) number地值确定所创建地“盘子”上地数字号码,通过该号码地大小来确定盘子地大小关系,即号码大地盘子大于号码小地盘子.(2) point是TowerPoint对象,是Disc所创建地“盘子”地一个重要成员.“盘子”被放置在tower容器地塔点上(TowerPoint对象称作塔点),“盘子”通过使用point 对象表明自己所在地塔点.2.3.2 Disc方法(1) Disc()构造方法.创建盘子对象时需要使用该构造方法.(2) setNumber(int).盘子调用该方法设置其上地数字号码.(3) getNumber()方法.盘子调用该方法返回其上地数字号码.(4) setPoint(TowerPoint)方法.盘子调用该方法设置其所在地塔点.(5) getPoint()方法.盘子调用该方法返回其所在地塔点.因此Disc创建地按钮地效果如图2-4所示.图2-4 Disc创建地三个按钮3 系统总体设计3.1 总体类关系在设计Hannoi塔时,需编写6个JA V A源文件:HannoiWindow.Java 、TowerPoint.java、Disc.java、HandleMous.java和AutoMoveDisc.java.Hannoi塔除了要编写地6个Java源文件所给出地类外,还需要Java系统提供地一些重要地类,如JMenubar,JMenu,JMenuItem和JButton.Hannoi塔所用到得一些重要地类以及类之间地组合关系如图3-1所示:图3-1 类之间地组合关系3.2总体功能图根据游戏需求分析,游戏主界面有“选择级别”、“重新开始”、“自动演示”三个按钮,每个按钮分别实现“初级,中级,高级”、“运行游戏”、“自动演示”效果,因此做出总体功能图如图3-2所示:图3-2 总体功能图3.3 总体流程图根据游戏相关功能设计,得出总体流程图如图3-3所示:图3-3 总体流程图4 系统主要功能设计流程图4.1 A、B、C座实现流程图为了整体布局地美观,首先要画出A、B、C座,主要经过“画三条竖线”,“画三个点”、“画矩形区域”、“画座名”几个步骤,得出制作流程图如图4-1所示:图4-1 A、B、C座实现流程图4.2 圆盘画法流程图与此同时,圆盘地制作要经过“设置盘子编号”、“设置盘子塔点”、“将盘子放在指定位置”三个步骤,得出圆盘地制作流程图如图4-2所示:图4-2 圆盘画法流程图5 系统详细设计5.1 HannoiWindow.java(主类)HannoiWindow类负责创建Hannoi塔地主窗口,该类含有main方法,Hannoi塔从该类开始执行.HannoiWindow类地成员变量中有五种重要类型地对象,一个int基本型数据和一个char 行数组.五种类型地对象分别是JMenubar ,JMenu,JMenuItem和JButton对象.HannoiWindow创建地窗口以及其中地主要成员对象如图5-1所示:图5-1 HannoiWindow窗口及主要地成员对象5.2 Tower.javaTower类是javax.swing报中地JPanel容器地子类,创建地容器被添加到HannoiWindow 窗口地中心.Tower类地成员变量中有四种重要地类型对象、一个int基本型数据和一个char型数组.Tower创建地窗口以及其中地主要成员对象如图5-2所示:图5-2 Tower创建地tower容器5.3 Disc.javaDisc 类是JButton 地一个子类,创建地对象是Tower 容器中地一个按钮,用来表示Tower 中地“盘子”.Disc 创建地窗口以及其中地主要成员对象如图5-3所示:图5-3 Disc 创建地三个按钮5.4 TowerPoint.javaTowerPint.Java 类负责在Tower 中创建表示位置地塔地对象.Disc 创建地窗口以及其中地主要成员对象如图5-4所示:图5-4 TowerPoint 绘制出地塔顶TowerPoint 所创建地对象将作为HannoiTower 类中TowerPoint 型数组pointA 、pointB 和pointC 中地元素.标明TowerPoint 类地主要成员变量、方法以及Tower 类之间组合关系地UML 图如图5-5所示.图5-5 TowerPoint类地UML图以下是UML图中有关数据和方法地详细说明.①成员变量x和y是TowerPoint对象中地两个int型数据,用来表示塔点在容器tower中地坐标.tower容器地坐标原点是容器地左上角,向右是x轴地正方向,向下是y轴地正方向.有盘子是boolean数据,如果当前塔点上有盘子时,该数据为true;否则为false.盘子是Disk声明地对象,用来存放当前塔点上地盘子对象地引用,如果当前塔点上有盘子,盘子存放地引用是null,即盘子是空对象.②方法TowerPoint(int,int)是构造方法,用来创建塔点对象.塔点对象调用是否有盘子()方法可以返回一个boolean数据,如果调用该方法地塔点上有盘子,是否有盘子()方法返回true;否则返回false.塔点对象调用set有盘子(boolean)方法可以根据参数地值设置当前塔点上是否有盘子.塔点对象调用getX()和getY()方法可以返回塔点地坐标中地x轴坐标和y轴坐标.塔点对象调用Equals(TowerPoint)方法可以判断当前塔点是否和参数指定地塔点相同.塔点对象调用Equals(TowerPoint)方法putDisc(Component com,Container con)方法,将参数com指定地盘子放置在参数con指定地容器中,盘子所在位置由当前地塔点坐标所确定,即将盘子放置在当前塔点上.塔点对象调用getDiscOnPoint()方法可以返回当前塔点上地盘子.塔点对象调用removeDisc(Component com,Container con)方法可以移掉当前塔点上地盘子.5.5 HandleMouse.javaHandleMouse类创建地对象负责处理鼠标事件.HandleMouse类实现了MouseListener和MouseMotionListener接口,创建地对象handleMouse是tower容器地成员之一,负责监视tower容器中Disc盘子对象上地鼠标事件.当用户用鼠标点击tower中地盘子,并拖动鼠标时,handleMouse对象负责给出移动盘子地有关算法.标明HandleMouse类地主要成员变量、方法以及和Tower类之间地组合关系地UML 图如图5-6所示.图5-6 Tower类地UML图5.6 AutoMoveDisc.javaAutoMoveDisc类创建地对象负责走动移动盘子从一个座到另一个座. AutoMoveDisc创建地窗口以及其中地主要成员对象如图5-7所示:(a)自动移动盘子从A到C (b)对话框显示文字信息图5-7 AutoMoveDisc类创建地对话框AutoMoveDisc类实现了ActionListener接口,创建地对象autoMoveDisc是Tower地成员之一.标明AutoMoveDisc类地主要成员变量、方法、以及和Tower类之间组合关系地UML 图如图5-8所示.6 源代码import javax.swing.*;import java.awt.*;import java.awt.event.*;public class HannoiWindow extends JFrame implements ActionListener{ Tower tower=null;int amountOfDisc=3;char []towerName={'A','B','C'};JMenuBar bar;JMenu menuGrade;JMenuItem oneGradeItem,twoGradeItem,threeGradeItem;JButton renew=null;JButton autoButton=null;JPanel center=new JPanel();HannoiWindow(){tower=new Tower(towerName);tower.setAmountOfDisc(amountOfDisc);tower.setMaxDiscWidth(120);tower.setMinDiscWidth(50);tower.setDiscHeight(16);tower.putDiscOnTower();add(tower,BorderLayout.CENTER);bar=new JMenuBar();menuGrade=new JMenu("选择级别");oneGradeItem=new JMenuItem("初级");twoGradeItem=new JMenuItem("中级");threeGradeItem=new JMenuItem("高级");menuGrade.add(oneGradeItem);menuGrade.add(twoGradeItem);menuGrade.add(threeGradeItem);bar.add(menuGrade);setJMenuBar(bar);oneGradeItem.addActionListener(this);twoGradeItem.addActionListener(this);threeGradeItem.addActionListener(this);renew=new JButton("重新开始");renew.addActionListener(this);autoButton=new JButton("自动演示");autoButton.addActionListener(this);JPanel north=new JPanel();north.add(renew);north.add(autoButton);String mess="将全部盘子从"+towerName[0]+"座搬运到"+towerName[1]+ "座或"+towerName[2]+"座";JLabel hintMess=new JLabel(mess,JLabel.CENTER);north.add(hintMess);add(north,BorderLayout.NORTH);setResizable(false);setVisible(true);setBounds(60,60,460,410);validate();setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public void actionPerformed(ActionEvent e){if(e.getSource()==oneGradeItem){amountOfDisc=3;tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();}else if(e.getSource()==twoGradeItem){amountOfDisc=4;tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();}else if(e.getSource()==threeGradeItem){amountOfDisc=5;tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();}else if(e.getSource()==renew){tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();}else if(e.getSource()==autoButton){tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();int x=this.getBounds().x+this.getBounds().width;int y=this.getBounds().y;tower.getAutoMoveDisc().setLocation(x,y);tower.getAutoMoveDisc().setSize(280,this.getBounds().height);tower.getAutoMoveDisc().setVisible(true);}validate();}public static void main(String args[]){new HannoiWindow();}}Tower类import javax.swing.*;import java.awt.*;public class Tower extends JPanel{int amountOfDisc=3;Disc [] disc;int maxDiscWidth,minDiscWidth,discHeight;char [] towerName;TowerPoint [] pointA,pointB,pointC;HandleMouse handleMouse;AutoMoveDisc autoMoveDisc;Tower(char [] towerName){handleMouse=new HandleMouse(this);this.towerName=towerName;setLayout(null);setBackground(new Color(200,226,226));}public void setAmountOfDisc(int number){if(number<=1)amountOfDisc=1;elseamountOfDisc=number;}public void setMaxDiscWidth(int m){maxDiscWidth=m;}public void setMinDiscWidth(int m){minDiscWidth=m;}public void setDiscHeight(int h){discHeight=h;}public AutoMoveDisc getAutoMoveDisc(){return autoMoveDisc;}public void putDiscOnTower(){removeDisk();int n=(maxDiscWidth-minDiscWidth)/amountOfDisc;disc=new Disc[amountOfDisc];for(int i=0;i<disc.length;i++){disc[i]=new Disc();disc[i].setNumber(i);int diskwidth=minDiscWidth+i*n;disc[i].setSize(diskwidth,discHeight);disc[i].addMouseListener(handleMouse);disc[i].addMouseMotionListener(handleMouse);}pointA=new TowerPoint[amountOfDisc];pointB=new TowerPoint[amountOfDisc];pointC=new TowerPoint[amountOfDisc];int vertialDistance=discHeight;for(int i=0;i<pointA.length;i++){pointA[i]=new TowerPoint(maxDiscWidth,100+vertialDistance);vertialDistance=vertialDistance+discHeight;}vertialDistance=discHeight;for(int i=0;i<pointB.length;i++){pointB[i]=new TowerPoint(2*maxDiscWidth,100+vertialDistance);vertialDistance=vertialDistance+discHeight;}vertialDistance=discHeight;for(int i=0;i<pointC.length;i++){pointC[i]=new TowerPoint(3*maxDiscWidth,100+vertialDistance);vertialDistance=vertialDistance+discHeight;}for(int i=0;i<pointA.length;i++){pointA[i].putDisc(disc[i],this);}handleMouse.setPointA(pointA);handleMouse.setPointB(pointB);handleMouse.setPointC(pointC);autoMoveDisc=new AutoMoveDisc(this);autoMoveDisc.setTowerName(towerName);autoMoveDisc.setAmountOfDisc(amountOfDisc);autoMoveDisc.setPointA(pointA);autoMoveDisc.setPointB(pointB);autoMoveDisc.setPointC(pointC);validate();repaint();}public void removeDisk(){if(pointA!=null){for(int i=0;i<pointA.length;i++){pointA[i].removeDisc(pointA[i].getDiscOnPoint(),this);pointB[i].removeDisc(pointB[i].getDiscOnPoint(),this);pointC[i].removeDisc(pointC[i].getDiscOnPoint(),this);}}}public void paintComponent(Graphics g){super.paintComponent(g);int x1,y1,x2,y2;x1=pointA[0].getX();y1=pointA[0].getY()-discHeight/2;x2=pointA[amountOfDisc-1].getX();y2=pointA[amountOfDisc-1].getY()+discHeight/2;g.drawLine(x1,y1,x2,y2);x1=pointB[0].getX();y1=pointB[0].getY()-discHeight/2;x2=pointB[amountOfDisc-1].getX();y2=pointB[amountOfDisc-1].getY()+discHeight/2;g.drawLine(x1,y1,x2,y2);x1=pointC[0].getX();y1=pointC[0].getY()-discHeight/2;x2=pointC[amountOfDisc-1].getX();y2=pointC[amountOfDisc-1].getY()+discHeight/2;g.drawLine(x1,y1,x2,y2);g.setColor(Color.blue);x1=pointA[amountOfDisc-1].getX()-maxDiscWidth/2;y1=pointA[amountOfDisc-1].getY()+discHeight/2;x2=pointC[amountOfDisc-1].getX()+maxDiscWidth/2;y2=pointC[amountOfDisc-1].getY()+discHeight/2;int length=x2-x1,height=6;g.fillRect(x1,y1,length,height);int size=5;for(int i=0;i<pointA.length;i++){g.fillOval(pointA[i].getX()-size/2,pointA[i].getY()-size/2,size,size);g.fillOval(pointB[i].getX()-size/2,pointB[i].getY()-size/2,size,size);g.fillOval(pointC[i].getX()-size/2,pointC[i].getY()-size/2,size,size);}g.drawString(towerName[0]+"座",pointA[amountOfDisc-1].getX(),pointA[amountOfDisc-1].getY()+50);g.drawString(towerName[1]+"座",pointB[amountOfDisc-1].getX(),pointB[amountOfDisc-1].getY()+50);g.drawString(towerName[2]+"座",pointC[amountOfDisc-1].getX(),pointC[amountOfDisc-1].getY()+50);}}7 系统测试界面如图6-1所示:图6-1 界面总结一个编程语言最强大地地方不是它是容易学,或者难学,而是它拥有一个强大地库.JA V A是一个完全面向对象地语言,JA V A地命名规则是很容易让人接受地.而且容易被编程人员记住.经过实践训练,对JA V A地综合应用能力有了较大地提高,另外对JA V A地特点有了更深层次地认识.这次实践中使用地代码虽然不长,但类与类之间也有很强地逻辑关系,这就是面向对象语言地最大优势,这样可使我更轻松地运用JA V A.这个Hannoi塔游戏就是在原有地程序基础上增加了改变盘子数目功能、自动演示功能.由于是在原有地基础上修改地,虽然理论上那个来讲这应该很简单,不会太难,但当我真正着手做起来得时候才发现,原来自己还是太嫩,刚开始什么都不懂,于是我就去图书馆参阅了大量地资料,也不停地向同学们请教,终于渐渐地让我从刚开始连如何运行程序,甚至类地作用等一些罪基本地东西都不清楚到最后通过努力终于把这个程序成功搞定.自然这期间除了辛苦也让我明白了很多,有些小问题也是不容忽视地,就如公共类只能有一个,而且必须要有.及类名必须要同公共类名相同.否则程序就无法运行.经过努力,查阅相关资料,终于完成该课题,虽然效果不是很好,但亲手做过之后还是很有成就感地.通过此次毕业设计,将我大学所学地JA VA知识得到巩固和应用,在设计地过程中我遇到了很到问题,不过在老师和同学们地帮助和自己地思考下还是很好地完成了.这此课程设计还让我懂得了写程序不能闭门造车,要努力拓宽知识面,开阔视野,拓展思维.它还让我学会了在网上查阅那些无限地资料.通过对此课题地开发,使我对用Eclipse开发平台有了一个比较清楚地认识,体会到理论和实践地重要性.由于自己地分析设计和程序经验不足,该系统设计和实现过程中,还有许多没有完善地地方,比如用户界面设计不够美观,异常出错处理比较差等多方面问题,这些都有待进一步完善和提高,对于文中出现地不足和系统中出现地问题敬请老师指导.。
Java实现汉诺塔移动,只需传一个int值(汉诺塔的阶)

Java实现汉诺塔移动,只需传⼀个int值(汉诺塔的阶) 1public class HNT {2public static void main(String[] args) {3 HNT a1 = new HNT();4 a1.lToR(10); //给汉诺塔a1左边放10阶的层数,把左边的10阶移动⾄右边。
5 }6private boolean pHToM(int num,String a,String b,String c) { //打印移动数据,从a移动到c.7if (num == 1) { //只移动⼀层的情况,return false表⽰,如果num == 1则不再继续打印num<1的情况8 System.out.printf("%s to %s\n",a,c);9return false;10 }11else if (num == 2) { //只移动两层的情况,return false表⽰,如果num == 2则不再继续打印num<2的情况12 System.out.printf("%s to %s\n",a,b);13 System.out.printf("%s to %s\n",a,c);14 System.out.printf("%s to %s\n",b,c);15return false;16 }17else { //18return true; //移动⼤于两层的情况,return true表⽰,如果num>2则继续循环到num<=2为⽌19 }20 }21public void lToR(int num) { //把num层的汉诺塔从左移动⾄右22if(pHToM(num,"left","mid","right")) {23 lToM(num - 1);24 lToR(1);25 mToR(num - 1);26 }27 }28public void lToM(int num) { //把num层的汉诺塔从左移动⾄中29if(pHToM(num,"left","right","mid")) {30 lToR(num - 1);31 lToM(1);32 rToM(num - 1);33 }34 }35public void mToL(int num) { //把num层的汉诺塔从中移动⾄左36if(pHToM(num,"mid","right","left")) {37 mToR(num - 1);38 mToL(1);39 rToL(num - 1);40 }41 }42public void mToR(int num) { //把num层的汉诺塔从中移动⾄右43if(pHToM(num,"mid","left","right")) {44 mToL(num - 1);45 mToR(1);46 lToR(num - 1);47 }48 }49public void rToL(int num) { //把num层的汉诺塔从右移动⾄左50if(pHToM(num,"right","mid","left")) {51 rToM(num - 1);52 rToL(1);53 mToL(num - 1);54 }55 }56public void rToM(int num) { //把num层的汉诺塔从右移动⾄中57if(pHToM(num,"right","left","mid")){58 rToL(num - 1);59 rToM(1);60 lToM(num - 1);61 }62 }63 }。
汉诺塔java代码

汉诺塔java代码汉诺塔(Hanoi Tower)是经典的递归问题,它涉及到将一组圆盘从一个垂直柱子移动到另一个垂直柱子,中间通过第三个柱子。
这个问题可以通过递归的方式非常优雅地解决。
下面是使用Java编写的汉诺塔问题的代码,代码注释详细解释了每个步骤的含义。
```java/*** 汉诺塔问题的Java实现*/public class HanoiTower {/*** 汉诺塔问题的解决方法** @param n 圆盘的数量* @param from 起始柱子* @param to 目标柱子* @param aux 辅助柱子*/public static void solveHanoi(int n, char from, char to, char aux) {// 如果只有一个圆盘,直接移动到目标柱子if (n == 1) {System.out.println("移动圆盘 1 从柱子 " + from + " 到柱子 " + to);return;}// 将 n-1 个圆盘从起始柱子移动到辅助柱子,目标柱子作为辅助solveHanoi(n - 1, from, aux, to);// 移动第 n 个圆盘到目标柱子System.out.println("移动圆盘 " + n + " 从柱子 " + from + " 到柱子 " + to);// 将 n-1 个圆盘从辅助柱子移动到目标柱子,起始柱子作为辅助solveHanoi(n - 1, aux, to, from);}public static void main(String[] args) {// 圆盘的数量int numberOfDiscs = 3;// 调用解决方法solveHanoi(numberOfDiscs, 'A', 'C', 'B');}}```在这段Java代码中,我们使用了一个递归函数`solveHanoi`来解决汉诺塔问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于JAVA汉诺塔游戏设计与实现 院 系:计算机与电子系 专 业 班:计算机应用技术0902班 姓 名:高亚 学 号:20092911057 指导教师:彭 文 艺 2012 年6月 基于JAVA汉诺塔游戏设计与实现 JAVA Tower of Hanoi-based Game Design and Implementation I
摘 要
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。 随着时代的不断发展进步,计算机已经融入我们的日常生活。很多时候,很多的问题想通过人的手来亲自解决已变得十分困难了,这时我们就要运用计算机来帮我们解决这些复杂的问题,汉诺塔问题就是这类较复杂的问题。 此次,我们通过Eclipse软件来解决汉诺塔问题。程序运行后会出现一个界面,界面上有各种操作提示,按照提示进行各种操作后会得到汉诺塔游戏的运行过程及结果。
关键词: Java 汉诺塔 Eclipse II
Abstract Java is a cross-platform application software can write object-oriented programming language by Sun Microsystems, Inc. in May 1995 launch of the Java programming language and the Java platform (namely JavaSE, JavaEE, of JavaME) the general term.Has excellent versatility, efficiency, platform portability, and security of Java technology, widely used in personal PC, the data center, game consoles, scientific supercomputers, mobile phones and the Internet, while the world's largest developer of professional community. Global cloud computing and mobile Internet industry environment, Java has significant advantages and broad prospects. With the continual development and progress, the computer has been integrated into our daily lives. In many cases, a lot of problems to think through the human hand to personally resolve the very difficult, then we will use the computer to help us solve these complex issues. The Tower of Hanoi problem is that these more complex problems. The Eclipse software to solve the Tower of Hanoi problem. After running a single interface, the interface on a variety of operating tips, follow the prompts to perform various operations will be the running process and the outcome of the Tower of Hanoi game.
Key words: Java Tower of Hanoi Eclipse III
目 录 摘要 .................................................................................................................... I Abstract ............................................................................................................. II 绪论 .................................................................................................................... 1 1 相关技术介绍 ................................................................................................. 2 1.1 开发工具........................................................................ 错误!未定义书签。 1.2 应用环境...................................................................................................... 2 1.3 问题的提出 .................................................................................................. 2 1.4 任务设计内容 ............................................................................................... 3 2 系统需求分析 ................................................................................................. 4 2.1 界面及其布局设计 ........................................................................................ 4 2.2 A、B、C座的实现方法 .................................................................................. 4 2.2.1 成员变量 ................................................................................................... 5 2.2.2 方法 .......................................................................................................... 5 2.3 圆盘的实现方法 ........................................................................................... 6 2.3.1 Disc成员变量 ........................................................................................... 7 2.3.2 Disc方法………………………………………………………………7 3 系统总体设计 ................................................................................................. 8 3.1 总体类关系 .................................................................................................. 8 3.2 总体功能图 .................................................................................................. 8 3.3 总体流程图 .................................................................................................. 9 4 系统主要功能设计流程图 .............................................................................. 10 4.1 A、B、C座实现流程图……………………………………………………10 4.2 圆盘画法流程图…………………………………………………………10 5 系统详细设计……………………………………………………………12 6 系统测试…………………………………………………………………17 结论 .................................................................................................................. 19 致谢 .................................................................................................................. 20 参考文献 ........................................................................................................... 21