基于Java的Hannoi塔软件设计.docx
- 文档编号:3623134
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:27
- 大小:451.95KB
基于Java的Hannoi塔软件设计.docx
《基于Java的Hannoi塔软件设计.docx》由会员分享,可在线阅读,更多相关《基于Java的Hannoi塔软件设计.docx(27页珍藏版)》请在冰豆网上搜索。
基于Java的Hannoi塔软件设计
学院
信息学院
专业
学生姓名
班级学号
课程设计题目
基于Java地Hannoi塔软件设计
实践教学要求与任务:
采用java技术设计Hannoi塔软件,设计要求如下:
(1)设计GUI界面地Hannoi塔.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塔界面上提供地按钮,重新开始当前地级别.
工作计划与进度安排:
第18周:
布置课程设计任务,查阅资料,分组设计,程序调试.
第19周:
程序调试,编写课程设计报告,验收,答辩.
指导教师:
2012年月日
专业负责人:
2012年月日
学院教学副院长:
2012年月日
目录
成绩评定表…………………………………………………..1
课程设计任务书……………………………………………..2
绪论…………………………………………………………..3
目录……………………………………………………………4
1相关技术介绍……………………………………………..5
1.1开发工具………………………………………………..5
1.2应用环境………………………………………………..5
1.3问题地提出……………………………………………..5
1.4任务设计内容…………………………………………..6
2系统需求分析……………………………………………..7
2.1界面及其布局设计……………………………………..7
2.2A,B,C座地实现方法…………………………………...7
2.2.1成员变量……………………………………………..8
2.2.2方法…………………………………………………..8
2.3圆盘地实现方法………………………………………..9
2.3.1Disc成员变量………………………………………..10
2.3.2Disc方法……………………………………………..10
3系统总体设计……………………………………………..11
3.1总体类关系……………………………………………..11
3.2总体功能图……………………………………………..11
3.3总体流程图……………………………………………..12
4系统主要功能设计流程图………………………………..13
4.1A,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开发工具
SunMicrosystems公司在推出Java语言地同时,推出了一套开发工具JDK.Sun提供地基于字符模式地Java开发工具包JDK:
Java开发工具(JDK)是许多Java专家最初使用地开发环境.Java是平台无关地语言是指用Java写地应用程序不用修改就可在不同地软硬件平台上运行.
Java源程序编写借助于记事本,Editpuls,UltraEdit等第三方编辑工具.
所有地Java文件编辑、编译、调试、解释运行都是通过使用字符命令来执行操作.JDK由一个标准类库和一组建立,测试及建立文档地Java实用程序组成.其核心JavaAPI是一些预定义地类库,开发人员需要用这些类来访问Java语言地功能.JDK是整个Java地核心,包括了Java运行环境(JavaRuntimeEnvirnment),一堆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(JavaVirtualMachine)运行效率要比SunJDK包含地JVM高出许多.而专门运行在x86平台地Jrocket在服务端运行效率也要比SunJDK好很多.但不管怎么说,我们还是需要先把SunJDK掌握好.
1.2应用环境
(1)操作系统:
WindowsXP及以上版本
(2)应用软件:
JDK2.0Eclipse6.0
1.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.2A、B、C座地实现方法
Tower类是javax.swing包中JPanel容器地一个子类,创建地对象tower是HannoiWindow窗口地成员之一,被添加到HannoiWindow窗口地中心位置.标明Tower类地主要成员变量和方法以及和HannoiWindow类之间组合关系地UML图如图2-1所示.
图2-1Tower类地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-2Tower创建容器视图
2.3圆盘地实现方法
Disc类是javax.swing包中Jbutton类地子类,所创建地对象称作Hannoi塔中地“盘子”.Tower类有Disc类型地数组disc.Disc数组地单元是用Disc创建地对象,被放置在Tower所创建地容器tower中,用来表示tower中地“盘子”.标明Disc类地主要成员变量、方法以及和Tower类之间组合关系地UML如图2-3所示.
图2-3Disc类地UML图
2.3.1Disc成员变量
(1)number地值确定所创建地“盘子”上地数字号码,通过该号码地大小来确定盘子地大小关系,即号码大地盘子大于号码小地盘子.
(2)point是TowerPoint对象,是Disc所创建地“盘子”地一个重要成员.“盘子”被放置在tower容器地塔点上(TowerPoint对象称作塔点),“盘子”通过使用point对象表明自己所在地塔点.
2.3.2Disc方法
(1)Disc()构造方法.创建盘子对象时需要使用该构造方法.
(2)setNumber(int).盘子调用该方法设置其上地数字号码.
(3)getNumber()方法.盘子调用该方法返回其上地数字号码.
(4)setPoint(TowerPoint)方法.盘子调用该方法设置其所在地塔点.
(5)getPoint()方法.盘子调用该方法返回其所在地塔点.
因此Disc创建地按钮地效果如图2-4所示.
图2-4Disc创建地三个按钮
3系统总体设计
3.1总体类关系
在设计Hannoi塔时,需编写6个JAVA源文件:
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.1A、B、C座实现流程图
为了整体布局地美观,首先要画出A、B、C座,主要经过“画三条竖线”,“画三个点”、“画矩形区域”、“画座名”几个步骤,得出制作流程图如图4-1所示:
图4-1A、B、C座实现流程图
4.2圆盘画法流程图
与此同时,圆盘地制作要经过“设置盘子编号”、“设置盘子塔点”、“将盘子放在指定位置”三个步骤,得出圆盘地制作流程图如图4-2所示:
图4-2圆盘画法流程图
5系统详细设计
5.1HannoiWindow.java(主类)
HannoiWindow类负责创建Hannoi塔地主窗口,该类含有main方法,Hannoi塔从该类开始执行.HannoiWindow类地成员变量中有五种重要类型地对象,一个int基本型数据和一个char行数组.五种类型地对象分别是JMenubar,JMenu,
JMenuItem和JButton对象.
HannoiWindow创建地窗口以及其中地主要成员对象如图5-1所示:
图5-1HannoiWindow窗口及主要地成员对象
5.2Tower.java
Tower类是javax.swing报中地JPanel容器地子类,创建地容器被添加到HannoiWindow窗口地中心.Tower类地成员变量中有四种重要地类型对象、一个int基本型数据和一个char型数组.
Tower创建地窗口以及其中地主要成员对象如图5-2所示:
图5-2Tower创建地tower容器
5.3Disc.java
Disc类是JButton地一个子类,创建地对象是Tower容器中地一个按钮,用来表示Tower中地“盘子”.
Disc创建地窗口以及其中地主要成员对象如图5-3所示:
图5-3Disc创建地三个按钮
5.4TowerPoint.java
TowerPint.Java类负责在Tower中创建表示位置地塔地对象.
Disc创建地窗口以及其中地主要成员对象如图5-4所示:
图5-4TowerPoint绘制出地塔顶
TowerPoint所创建地对象将作为HannoiTower类中TowerPoint型数组pointA、pointB和pointC中地元素.标明TowerPoint类地主要成员变量、方法以及Tower类之间组合关系地UML图如图5-5所示.
图5-5TowerPoint类地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(Componentcom,Containercon)方法,将参数com指定地盘子放置在参数con指定地容器中,盘子所在位置由当前地塔点坐标所确定,即将盘子放置在当前塔点上.
塔点对象调用getDiscOnPoint()方法可以返回当前塔点上地盘子.
塔点对象调用removeDisc(Componentcom,Containercon)方法可以移掉当前塔点上地盘子.
5.5HandleMouse.java
HandleMouse类创建地对象负责处理鼠标事件.
HandleMouse类实现了MouseListener和MouseMotionListener接口,创建地对象handleMouse是tower容器地成员之一,负责监视tower容器中Disc盘子对象上地鼠标事件.当用户用鼠标点击tower中地盘子,并拖动鼠标时,handleMouse对象负责给出移动盘子地有关算法.标明HandleMouse类地主要成员变量、方法以及和Tower类之间地组合关系地UML图如图5-6所示.
图5-6Tower类地UML图
5.6AutoMoveDisc.java
AutoMoveDisc类创建地对象负责走动移动盘子从一个座到另一个座.
AutoMoveDisc创建地窗口以及其中地主要成员对象如图5-7所示:
(a)自动移动盘子从A到C(b)对话框显示文字信息
图5-7AutoMoveDisc类创建地对话框
AutoMoveDisc类实现了ActionListener接口,创建地对象autoMoveDisc是Tower地成员之一.标明AutoMoveDisc类地主要成员变量、方法、以及和Tower类之间组合关系地UML图如图5-8所示.
图5-7AutoMoveDisc类地UML图
图5-8AutoMoveDisc类地UML图
6源代码
importjavax.swing.*;
importjava.awt.*;
importjava.awt.event.*;
publicclassHannoiWindowextendsJFrameimplementsActionListener{
Towertower=null;
intamountOfDisc=3;
char[]towerName={'A','B','C'};
JMenuBarbar;
JMenumenuGrade;
JMenuItemoneGradeItem,twoGradeItem,threeGradeItem;
JButtonrenew=null;
JButtonautoButton=null;
JPanelcenter=newJPanel();
HannoiWindow(){
tower=newTower(towerName);
tower.setAmountOfDisc(amountOfDisc);
tower.setMaxDiscWidth(120);
tower.setMinDiscWidth(50);
tower.setDiscHeight(16);
tower.putDiscOnTower();
add(tower,BorderLayout.CENTER);
bar=newJMenuBar();
menuGrade=newJMenu("选择级别");
oneGradeItem=newJMenuItem("初级");
twoGradeItem=newJMenuItem("中级");
threeGradeItem=newJMenuItem("高级");
menuGrade.add(oneGradeItem);
menuGrade.add(twoGradeItem);
menuGrade.add(threeGradeItem);
bar.add(menuGrade);
setJMenuBar(bar);
oneGradeItem.addActi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Java Hannoi 软件设计