JAVA汉诺塔报告.docx
- 文档编号:8977266
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:28
- 大小:140.15KB
JAVA汉诺塔报告.docx
《JAVA汉诺塔报告.docx》由会员分享,可在线阅读,更多相关《JAVA汉诺塔报告.docx(28页珍藏版)》请在冰豆网上搜索。
JAVA汉诺塔报告
JAVA技术大作业
院(系)电气与信息工程学院
专业班级计科100X班
学生姓名XXX学号XXXXXXX
成绩
年月日
摘要
汉诺塔(又称河内塔)是源于印度一个古老传说的益智玩具。
其游戏规则是:
假设有三根柱子分别命名为A,B,C。
开始时,有大小不一的几个圆盘从大到小的顺序放在A柱上,在B的条件下,最后将A柱上的所有圆盘移至C柱上,且在移动过程中小圆盘不能放置在大圆盘下,只能将小圆盘放置于大圆盘之上,移动完成后,C柱上的圆盘以由小到大的顺序排列。
本java程序正是以将此游戏移至电脑上,通过java算法的实现在计算机上运行,且不破坏此游戏规则。
在此软件中,运用了大量java包、java自身所包含的类等,实现了汉诺塔的界面设计等功能,且在电脑上可简单操作,也可让程序自己进行演示。
关键字:
汉诺塔java界面设计包
目录
1.设计内容及要求-3-
1.1设计内容-3-
1.2设计要求-4-
2需求分析-4-
2.1界面需求分析-4-
2.2塔座及圆盘实现方法-5-
2.3游戏自动演示的实现-5-
3系统设计-6-
3.1总体功能分析-6-
3.2总体流程-7-
4主要功能设计流程分析-7-
4.1塔座实现流程-7-
4.2圆盘实现流程-8-
4.3自动演示流程-8-
5代码分析及程序调试-9-
5.1类之间的关系图-9-
5.2代码分析及实现图-10-
5.2.1盘子的实现-10-
5.2.2实现盘子搬动,演示开始、暂停、继续、关闭按钮功能-12-
5.2.3菜单的创建以及“重新开始”、“自动演示”的实现-14-
5.2.4运行调试及分析-16-
6总结-16-
7致谢-17-
8参考文献-18-
附加:
程序代码-19-
1.设计内容及要求
1.1设计内容
(1)设计GUI界面的Hannoi塔;
(2)用户可用鼠标移动塔上的圆盘;
(3)用户可自行选择游戏等级,分有初级、中级、高级;
(4)程序可自动演示移动盘子的全过程。
1.2设计要求
(1)设计GUI界面的Hannoi塔。
Hannoi塔中有三个座,名字分别是A、B、C。
初始状态是A座上有3个大小不等的盘子,这些盘子从座底到座顶按照大小顺序依次摆放在A座上。
用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子。
(2)程序要求用户在移动盘子过程中,不允许把大盘放置在小盘的上面,用户最终要完成的是把A座上的全部盘子移动到B座或者C座上。
(3)用户可以通过Hannoi塔界面提供的菜单来选中初级、中级和高级三个级别。
初级级别A座上有3个大小不等的盘子、中级级别A座有4个大小不等的盘子、高级为5个。
(4)用户可以通过单击Hannoi塔界面上提供的按钮,让程序自动完成把A座上的盘子全部移动到C座上。
(5)用户在移动盘子过程中,可以随时单击Hannoi塔界面上提供的按钮,重新开始当前级别的游戏。
2需求分析
2.1界面需求分析
该软件的界面整体布局为BorderLayout布局,其中采用了菜单栏、按钮、面板、文本框以及文本区等组件;其中面板相当于容器,将该软件所需要的部分组件放入其中,并且实现其中功能;文本框及文本区是用于显示文字信息,例如在自行演示游戏过程时,我们可在文本区中看见演示的详细信息;在此软件中,运用了抽象按钮类来实现菜单项,且还有一般按钮选项,用于开始程序和自动演示过程。
2.2塔座及圆盘实现方法
(1)塔座的实现
实现此部分的功能是运用的组件绘图法,在函数paintComponent(Graphicsg)方法中,通过Graphics对象g调用绘图方法,然后在指定的组件上绘图,其中在此函数中需要确定两个点的坐标,分别用g及相应坐标调用drawLine()画直线,用fillRect()填充矩形,最后只要用fillOval()绘制塔座上的点数及运用drawString()绘出A、B、C座即可实现塔座图形。
(2)圆盘的实现
圆盘所继承的类是java中本身就包含的类JButton,也就是说每一个圆盘也相当于是一个按键,此时我们就可对每一个圆盘进行监听,从而实现圆盘的移动;而圆盘的颜色可调用函数setBackground()进行改变。
总结有,圆盘及塔座如下图:
图2.2塔座及圆盘的实现
2.3游戏自动演示的实现
在使用者点击“自动演示”按钮时,即会弹出一个新对话框,在开始进行演示时新对话框中的文本框中会显示演示的文字信息,且在主框架中圆盘也会有相应的移动;实现此过程是运用的递归算法,而此阶段用递归方法较简单。
此功能实现如下图:
图2.3自动演示的实现
3系统设计
图3.1总体功能图
3.1总体功能分析
根据对软件的功能分析,在
此系统中必须要有以下功能:
等
级选择、重新开始、自动演示等
,且在演示界面中还有演示、暂
停、继续、关闭功能。
则此功能
分析有图右总共能图:
图3.2总体流程图
3.2总体流程
根据系统功能及过程,可
得到系统总体流程图,如右图:
右图是整个程序运行的过
程,当软件开始运行时,我们
可以进行任何一项功能,若要
移动圆盘则要先判断圆盘个数
,若要进行其他功能则可直接
点击即可。
4主要功能设计流程分析
图4.1塔座实现流程图
4.1塔座实现流程
根据对实现塔座的分析,可
画出塔座实现流程图,如图右:
如右流程图,在此功能模块
中,画竖线时需确定坐标(即四
个点x1、y1、x2、y2所确定的坐
标),确定后即可画竖线,然后用
Java绘图包中的函数填充矩形,再
用填充椭圆的函数确定塔点,最后
确定A、B、C座即可。
图4.2圆盘实现流程图
4.2圆盘实现流程
根据对圆盘画法的分析,可得
出圆盘实现流程图,如图右:
如右流程图,盘子类继承JBu
tton类,然后设置盘子的颜色,再
设置盘子编号,最后设置塔点位置
即可,注意:
程序运行时自动初始
化盘子个数为3。
图4.3自动演示流程图
4.3自动演示流程
根据对自动演示模块的分析,
可得到自动演示流程图,如图右:
如图右,在此过程中是一个
相对简单的过程,但是在实际处
理中是比较繁琐的,故该流程图
只表示出大概过程;在实际中我
们需要判断计时器状态和按键的
监听,而实现此阶段功能正是运
用计时器类中的函数。
5代码分析及程序调试
5.1类之间的关系图
汉诺塔除了要编写的6个类以外,还需要部分java系统所提供的类,如计时器类、JButton类、JMenu类等,则根据类的关系,可得到它们之间的关系,如下图所示:
图5.1类的关系图
5.2代码分析及实现图
5.2.1盘子的实现
在盘子的实现中,该程序用继承JButton的类Disc实现,具体代码如下:
importjavax.swing.*;
importjava.awt.*;
/*创建塔中的盘子*/
publicclassDiscextendsJButton{
intnum;
TowerPointtpoint;
publicDisc()
{
setBackground(Color.blue);
}
publicvoidsetNumber(intn)
{
num=n;
}
publicintgetNumber()
{
returnnum;
}
publicvoidsetPoint(TowerPointtp)
{
tpoint=tp;
}
publicTowerPointgetPoint()
{
returntpoint;
}
}
如上代码,其中有两个变量,一个是整型的num,表示圆盘的个数;TowerPoint类型的tpoint用于表示圆盘应在的点的位置;首先对圆盘进行“上色”,然后分别设置盘子的数量和塔点,最后得出塔点和盘子数量即可。
其中在上述代码中含有塔点类,即TowerPoint,具体代码如下:
importjava.awt.*;
/*请实现表示塔点位置的类*/
publicclassTowerPoint{
intx,y;
booleanhaveDisc;
Discdisc=null;
publicTowerPoint(intx,inty){
this.x=x;
this.y=y;}
publicbooleanisHaveDisc(){
returnhaveDisc;}
publicvoidsetHaveDisc(booleanboo){
haveDisc=boo;}
publicintgetX(){
returnx;}
publicintgetY(){
returny;}
publicbooleanequals(TowerPointp){
if(p.getX()==this.getX()&&p.getY()==this.getY())
returntrue;
else
returnfalse;}
publicvoidputDisc(Componentcom,Containercon){
disc=(Disc)com;
con.setLayout(null);
con.add(disc);
intw=disc.getBounds().width;
inth=disc.getBounds().height;
disc.setBounds(x-w/2,y-h/2,w,h);
haveDisc=true;
disc.setPoint(this);
con.validate();}
publicDiscgetDiscOnPoint(){
returndisc;}
publicvoidremoveDisc(Componentcom,Containercon){
if(com!
=null)
con.remove(com);
con.validate();}
}
在塔点类中,整型的x、y是用来判断盘子的位子,boolean类型的haveDisc是用来判断塔点上是否有盘子;而下面的成员函数是用来设置塔点位置以及在塔点位置上放置盘子。
5.2.2实现盘子搬动,演示开始、暂停、继续、关闭按钮功能
此部分具体代码如下:
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==time)
{
number++;
charcStart,cEnd;
if(i<=moveStep.length()-2)
{
cStart=moveStep.charAt(i);
cEnd=moveStep.charAt(i+1);
showStep.append(""+number+".从"+cStart+"座搬一个盘子到"+cEnd+"座\n");
autoMoveDisc(cStart,cEnd);
}
i=i+2;
if(i>=moveStep.length()-1)
{
time.stop();
}
}
if(e.getSource()==bStart)
{
if(moveStep.length()==0)
{
if(time.isRunning()==false)
{
i=0;
setMoveStep(amountOfDisc,towerName[0],towerName[1],towerName[2]);
number=0;
time.start();
}
}
}
if(e.getSource()==bStop)
{
if(time.isRunning()==true)
time.stop();
}
if(e.getSource()==bContinue)
{
if(time.isRunning()==false)
time.restart();
}
if(e.getSource()==bClose)
{
time.stop();
setVisible(false);
}
}
如上代码,此部分主要是用e.getSource()来获取相应的单机事件,然后根据计时器是否计时来进行相应的操作,例如:
当点击继续按钮时,要先判断计时器
是停止计时才能进行接下来的操作。
演示界面如图下:
图5.2.2演示界面
5.2.3菜单的创建以及“重新开始”、“自动演示”的实现
此部分功能代码如下:
publicvoidactionPerformed(ActionEvente)
{
if(e.getSource()==oneGradeItem)//初级3个
{
amountOfDisc=3;
tower.setAmountOfDisc(3);
tower.putDiscOnTower();
}
if(e.getSource()==twoGradeItem)//中级4个
{
amountOfDisc=4;
tower.setAmountOfDisc(4);
tower.putDiscOnTower();
}
if(e.getSource()==threeGradeItem)//高级5个
{
amountOfDisc=5;
tower.setAmountOfDisc(5);
tower.putDiscOnTower();
}
if(e.getSource()==renew)//重新开始
{
tower.setAmountOfDisc(amountOfDisc);
tower.putDiscOnTower();
}
if(e.getSource()==autoButton)//自动演示
{
tower.setAmountOfDisc(amountOfDisc);
tower.putDiscOnTower();
intx=getBounds().x+getBounds().width;
inty=this.getBounds().y;
tower.getAutoMoveDisc().setLocation(x,y);
tower.getAutoMoveDisc().setSize(280,this.getBounds().height);
tower.getAutoMoveDisc().setVisible(true);
}
validate();
}
如上代码,其中变量oneGradeItem、twoGradeItem、threeGradeItem属于JMenuItem类中,此三者表示菜单栏下的“初级”、“中级”、“高级”;整型类的amountOfDisc表示盘子的个数,盘子个数根据等级不同而改变,而程序初始化盘子个数为3;在此函数中大部分运用了Tower类中的函数,如setAmountOfDisc()表示设置盘子个数,putDiscOnTower()表示将盘子放到塔上,且getBounds()函数是用来确定组件的位置。
在自动演示阶段,程序是运用的3个盘子进行演示,将盘子放到踏上以后,需确定盘子移动的过程,而此过程我们运用递归算法实现,等到盘子移动完以后,演示过程完毕。
此功能界面如下:
图5.2.3菜单及重新开始、自动演示按钮的实现
(4)运行调试及分析讨论
5.2.4运行调试及分析
(1)如何获得盘子的宽度及长度,以及如何将盘子放到指定位置?
根据java绘图法,我们可知:
函数getBounds()以Rectangle对象的形式获取组件的边界,且和该函数想对应的函数setBounds()可移动组件并且调节组件大小;运用这两个函数即可解决此问题。
(2)在汉诺塔中的第二个问题,我们所要考虑的就是如何把N个盘子从A塔移到B塔?
在移动盘子时,首先要判断是否有该盘子和如何获得该盘子,并且要得知该盘子此时说在位置,以及在塔中获得盘子的位置。
6总结
现在,计算机对于现代人来说是不可缺少的,人类运用计算机进行工作、休闲、娱乐等;所以在工作闲暇之余可以玩一点小游戏放松是很有需要的,而运用java来写一些小程序是很简单的,因为java较为简单,并且实现也并不困难,例如这次的汉诺塔,我们只需要编写部分的代码即可,然后结合java包本身就包含的类即可写出,且实现功能较多,如修改盘子、塔以及界面的背景颜色,选择等级等。
通过编写汉诺塔这个游戏,我认识到在编写程序中是很需要注重细节问题的,当程序出现问题的时候,往往是细节问题很难注意,且能影响程序的整体运行;当找到每一处问题的时候,对我们自己的编程能力也是有一点的提高的;在最开始时来编写这个程序是很困难的,虽然整个程序并不是自己单独写出来的,但是后来根据书本的知识以及老师的帮助,自己还是可以完成部分算法。
7致谢
在这次程序设计的撰写过程中,我得到了许多人的帮助。
首先要感谢的就是易老师,易老师不仅给我们讲解java的知识,而且在我们遇到学习上的问题的时候也会帮助我们解决问题;接下来要感谢的人就是我的同学们,因为在我遇到不懂的问题的时候你们会不耐其烦的给我讲解,在我快要失望的时候也会鼓励我坚持下去;真的是非常谢谢帮助过我的每一个人。
通过对这门课程的学习,我更深的学习到细节决定成败,在java程序编写中,就算是出现一点点的问题也会让人很头疼的,而且一点点错误都会影响到程序的整体运行情况;java这门课也教会了我如何去思考一个问题并且将问题解决。
总的来说,这门可不仅教会了我从不同的角度看一个问题,解决一个问题,它更让我的只是有所增长。
签名:
岑余霞
时间:
2012年5月7日
8参考文献
[1]叶核亚.Java程序设计使用教程.北京:
电子工业出版社,2010.2
[2]丁振凡.Java语言实用教程.北京:
北京邮电大学出版社,2005
[3]陈轶.姚晓昆.Java程序设计实验指导.北京:
清华大学出版社,2006
附加:
程序代码
/*实现盘子搬动,演示开始、暂停、继续、关闭按钮事件处理*/
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==time)
{
number++;
charcStart,cEnd;
if(i<=moveStep.length()-2)
{
cStart=moveStep.charAt(i);
cEnd=moveStep.charAt(i+1);
showStep.append(""+number+".从"+cStart+"座搬一个盘子到"+cEnd+"座\n");
autoMoveDisc(cStart,cEnd);
}
i=i+2;
if(i>=moveStep.length()-1)
{
time.stop();
}
}
if(e.getSource()==bStart)
{
if(moveStep.length()==0)
{
if(time.isRunning()==false)
{
i=0;
setMoveStep(amountOfDisc,towerName[0],towerName[1],towerName[2]);
number=0;
time.start();
}
}
}
if(e.getSource()==bStop)
{
if(time.isRunning()==true)
time.stop();
}
if(e.getSource()==bContinue)
{
if(time.isRunning()==false)
time.restart();
}
if(e.getSource()==bClose)
{
time.stop();
setVisible(false);
}
}
/*创建塔中的盘子*/
publicclassDiscextendsJButton{
intnum;
TowerPointtpoint;
publicDisc()
{
setBackground(Color.blue);
}
publicvoidsetNumber(intn)
{
num=n;
}
publicintgetNumber()
{
returnnum;
}
publicvoidsetPoint(TowerPointtp)
{
tpoint=tp;
}
publicTowerPointgetPoint()
{
returntpoint;
}
/*请实现表示塔点位置的类*/
publicclassTowerPoint{
intx,y;
booleanhaveDisc;
Discdisc=null;
publicTowerPoint(intx,inty){
this.x=x;
this.y=y;
}
publicbooleanisHaveDisc(){
returnhaveDisc;
}
publicvoidsetHaveDisc(booleanboo){
haveDisc=boo;
}
publicintgetX(){
returnx;
}
publicintgetY(){
returny;
}
publicbooleanequals(TowerPointp){
if(p.getX()==this.getX()&&p.getY()==this.getY())
returntrue;
else
returnfalse;
}
publicvoidputDisc(Componentcom,Containercon){
disc=(Disc)com;
con.se
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 汉诺塔 报告