汉诺塔 java.doc

上传人:仙人指路1688 文档编号:2387598 上传时间:2023-02-17 格式:DOC 页数:32 大小:977KB
返回 下载 相关 举报
汉诺塔 java.doc_第1页
第1页 / 共32页
汉诺塔 java.doc_第2页
第2页 / 共32页
汉诺塔 java.doc_第3页
第3页 / 共32页
汉诺塔 java.doc_第4页
第4页 / 共32页
汉诺塔 java.doc_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《汉诺塔 java.doc》由会员分享,可在线阅读,更多相关《汉诺塔 java.doc(32页珍藏版)》请在三一办公上搜索。

1、 JAVA技术大作业院 (系) 电气与信息工程学院 专业班级 计科普1004 学生姓名 樊科 学号 2020442736 成绩 2012年 5 月 5日 目录1 设计内容及要求41.1 汉诺塔算法的基本要求41.2需要实现的主要功能52.需求分析62.1 界面及其布局设计62.2 A、B、C座的实现方法62.2.1、成员变量72.2.2 方法72.3 圆盘的实现方法82.3.1 Disc成员变量82.3.2 Disc方法93 总体设计93.1 总体功能图93.2 总体流程图104 主要功能设计流程图114.1 A、B、C座实现流程图114.2 圆盘画法流程图125 运行效果135.1 运行界面

2、效果136. 源代码146.1 AutoMoveDisc 代码146.2 Disc 代码186.3 HandleMouse 代码196.4HannoiWindow 代码236.5Tower 代码266.6 TowerPoint代码291 设计内容及要求1.1 汉诺塔算法的基本要求(1) 设计GUI界面的Hannoi塔。Hannoi塔中有三个座,名字分别是A、B和C。初始状态是A座上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座上。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子。(2)程序要求用户在移动盘子过程中,不允许把大盘放置在小盘的上面,用

3、户最终要完成的是把A座上的全部盘子移动到B座或C座上。(3)用户可以通过Hannoi塔界面提供的菜单来选择初级、中级、高级和自定义四个级别。初级级别A座上有3个大小不等盘子、中级级别A座上有4个大小不等盘子、高级级别A座上有5个大小不等盘子、自定义级别A座用户可以任意输入盘子数目。(4)用户可以通过单击Hannoi塔界面上提供的按钮,让程序自动完成把A座上的盘子全部移动到C座上。(5)用户在移动盘子的过程中,可以随时单击Hannoi塔界面上提供的按钮,重新开始当前的级别。 1.2需要实现的主要功能(1)完成汉诺塔的“手工移动演示”; (2)完成汉诺塔的“自动移动演示”;(3)用户可以设置盘子的

4、数目;2.需求分析2.1 界面及其布局设计 系统的整体布局为:BorderLayout布局, 采用了菜单、按钮、面板等组件,菜单主要包括选择级别盘子个数,,按钮的功能包括重新开始,自动演示,演示,暂停,继续,关闭。2.2 A、B、C座的实现方法 Tower类是javax.swing包中JPanel容器的一个子类,创建的对象tower是HannoiWindow窗口的成员之一,被添加到HannoiWindow窗口的中心位置。标明Tower类的主要成员变量和方法以及和HannoiWindow类之间组合关系的UML图如图2-1所示。图 2-1Tower 类的UML 图2.2.1、成员变量(1)amou

5、ntOfDisc是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的值确定每

6、个盘子的高度。(5)pointA、pointB和pointC都是TowerPoint型数组,三个数组的长度与盘子数目相同,即都是amountOfDisc。pointA、pointB和pointC单元都是TowerPoint创建对象,分别用来表示Hannoi塔中三个座上的塔点。A座、B座和C座上的三个塔点分别由pointA、pointB和pointC中的单元来确定。每个座上的三个塔点都是从座顶依次对应数组的相应单元中的TowerPoint对象。(6)handleMouse是HandleMouse类创建的鼠标事件监视器,用来监视disc数组的Disc对象上触发的鼠标事件。(7)autoMoveDi

7、sc是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容器调用putDiscOnTo

8、wer ()方法可以将盘子放置在Hannoi塔的A座上,即在pointA指定的塔点上放置disc数组的成员。(7) tower容器调用getAutoMoveDisc ()方法返回其中的AutoMoveDisc对象:autoMoveDisc。tower是HannoiWindow窗口中的成员,当用户单击HannoiWindow窗口中的autoButton按钮时,窗口中的actionPerformed(ActionEvent)方法将被执行,该方法所进行的操作是让tower对象返回其中的AutoMoveDisc对象,该对象是一个对话框,用户可以通过该对话框让程序自动地移动盘子。(8) tower容器调

9、用removeDisk ()方法可以移调tower容器中的盘子。(9) tower容器调用paintComponent (Graphics)方法绘制出塔点的位置和必要的视图。图 2-2 Tower 创建容器视图2.3 圆盘的实现方法Disc类是javax.swing包中Jbutton类的子类,所创建的对象称作Hannoi塔中的“盘子”。Tower类有Disc类型的数组disc。Disc数组的单元是用Disc创建的对象,被放置在Tower所创建的容器tower中,用来表示tower中的“盘子”。标明Disc类的主要成员变量、方法以及和Tower类之间组合关系的UML如图2-3所示。 图1-3 D

10、isc 类的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()方法。盘子调用该方法返回其上

11、的数字号码。(4)setPoint(TowerPoint)方法。盘子调用该方法设置其所在的塔点。(5)getPoint()方法。盘子调用该方法返回其所在的塔点。因此Disc创建的按钮的效果如图1-4所示。图 1-4 Disc创建的三个按钮3 总体设计3.1 总体功能图图3-1总体功能图3.2 总体流程图图 3.2 总体流程图4 主要功能设计流程图4.1 A、B、C座实现流程图图4-1 A、B、C座实现流程图4.2 圆盘画法流程图图4-2 圆盘画法流程图5 运行效果5.1 运行界面效果图 5-1运行主界面效果图图 5-2自动演示效果图6. 源代码6.1 AutoMoveDisc 代码packag

12、e Hannoi;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class AutoMoveDisc extends JDialog implements ActionListener int amountOfDisc=3; TowerPoint pointA,pointB,pointC; char towerName; Container con; StringBuffer moveStep; JTextArea showStep; JButton bStart,bStop,bContinue,bC

13、lose; Timer time; int i=0,number=0; AutoMoveDisc(Container con) setModal(true); setTitle(自动演示搬盘子过程); this.con=con; moveStep=new StringBuffer(); time=new Timer(500,this); time.setInitialDelay(15); showStep=new JTextArea(15,20); bStart=new JButton(演示); bStop=new JButton(暂停); bContinue=new JButton(继续);

14、 bClose=new JButton(关闭); bStart.addActionListener(this); bStop.addActionListener(this); bContinue.addActionListener(this); bClose.addActionListener(this); JPanel south=new JPanel(); south.setLayout(new FlowLayout(); south.add(bStart); south.add(bStop); south.add(bContinue); south.add(bClose); add(ne

15、w JScrollPane(showStep),BorderLayout.CENTER); add(south,BorderLayout.SOUTH); setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); towerName=new char3; addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) time.stop(); setVisible(false); ); public void setPointA(TowerPoint p

16、ointA) this.pointA=pointA; public void setPointB(TowerPoint pointB) this.pointB=pointB; public void setPointC(TowerPoint pointC) this.pointC=pointC; public void setTowerName(char name) if(name0=name1|name0=name2|name1=name2) towerName0=A; towerName1=B; towerName2=C; else towerName=name; public void

17、setAmountOfDisc(int n) amountOfDisc=n; /*实现盘子搬动,演示开始、暂停、继续、关闭按钮事件处理*/ public void actionPerformed(ActionEvent e) if(e.getSource()=time) number+; char Start,End; if(i+End+座n); autoMoveDisc(Start,End); i=i+2; if(i=moveStep.length()-1) time.stop(); showStep.append(n演示完毕,樊科很高兴为您服务); else if(e.getSource(

18、)=bStart & moveStep.length()=0 & time.isRunning()=false) i=0; moveStep=new StringBuffer(); setMoveStep(amountOfDisc,towerName0,towerName1,towerName2); number=0; time.start(); else if(e.getSource()=bStop & time.isRunning()=true) time.stop(); else if(e.getSource()=bContinue & time.isRunning()=false) t

19、ime.restart(); else if(e.getSource()=bClose) time.stop(); setVisible(false); private void setMoveStep(int amountOfDisc,char one,char two,char three) if(amountOfDisc=1) moveStep.append(one); moveStep.append(three); else setMoveStep(amountOfDisc-1,one,three,two); moveStep.append(one); moveStep.append(

20、three); setMoveStep(amountOfDisc-1,two,one,three); private void autoMoveDisc(char cStart,char cEnd) Disc disc=null; if(cStart=towerName0) for(int i=0;ipointA.length;i+) if(pointAi.isHaveDisc()=true) disc=pointAi.getDiscOnPoint(); pointAi.setHaveDisc(false); break; if(cStart=towerName1) for(int i=0;i

21、pointB.length;i+) if(pointBi.isHaveDisc()=true) disc=pointBi.getDiscOnPoint(); pointBi.setHaveDisc(false); break; if(cStart=towerName2) for(int i=0;ipointC.length;i+) if(pointCi.isHaveDisc()=true) disc=pointCi.getDiscOnPoint(); pointCi.setHaveDisc(false); break; TowerPoint endPoint=null; int i=0; if

22、(cEnd=towerName0) for(i=0;i0) endPoint=pointAi-1; break; else if(i=0) break; if(i=pointA.length) endPoint=pointApointA.length-1; if(cEnd=towerName1) for(i=0;i0) endPoint=pointBi-1; break; else if(i=0) break; if(i=pointB.length) endPoint=pointBpointB.length-1; if(cEnd=towerName2) for(i=0;i0) endPoint

23、=pointCi-1; break; else if(i=0) break; if(i=pointC.length) endPoint=pointCpointC.length-1; if(endPoint!=null&disc!=null) endPoint.putDisc(disc,con); endPoint.setHaveDisc(true); 6.2 Disc 代码package Hannoi;import javax.swing.*;import java.awt.*;/*创建塔中的盘子*/public class Disc extends JButtonint num;TowerP

24、oint point;Disc()setBackground(Color.gray);public void setPoint(TowerPoint p)point=p;public void setNumber(int i)num=i;public int getNumber()return num;public TowerPoint getpoint()return point;6.3 HandleMouse 代码package Hannoi;import java.awt.event.*;import java.awt.*;public class HandleMouse impleme

25、nts MouseListener,MouseMotionListener TowerPoint pointA,pointB,pointC; TowerPoint startPoint=null,endPoint=null; int leftX,leftY,x0,y0; boolean move=false,countTime=false; Container con; HandleMouse(Container con) this.con=con; public void setPointA(TowerPoint pointA) this.pointA=pointA; public void

26、 setPointB(TowerPoint pointB) this.pointB=pointB; public void setPointC(TowerPoint pointC) this.pointC=pointC; public void mousePressed(MouseEvent e) move=false; Disc disc=null; disc=(Disc)e.getSource(); startPoint=disc.getpoint(); x0=e.getX(); y0=e.getY(); int m=0; for(int i=0;i0&(pointAm-1.isHaveD

27、isc()=false) move=true; break; else if(m=0) move=true; break; for(int i=0;i0&(pointBm-1.isHaveDisc()=false) move=true; break; else if(m=0) move=true; break; for(int i=0;i0&(pointCm-1.isHaveDisc()=false) move=true; break; else if(m=0) move=true; break; public void mouseMoved(MouseEvent e) public void

28、 mouseDragged(MouseEvent e) Disc disc=null; disc=(Disc)e.getSource(); leftX=disc.getBounds().x; leftY=disc.getBounds().y; int x=e.getX(); int y=e.getY(); leftX=leftX+x; leftY=leftY+y; if(move=true) disc.setLocation(leftX-x0,leftY-y0); public void mouseReleased(MouseEvent e) Disc disc=null; disc=(Dis

29、c)e.getSource(); Rectangle rect=disc.getBounds(); boolean location=false; int x=-1,y=-1; for(int i=0;ipointA.length;i+) x=pointAi.getX(); y=pointAi.getY(); if(rect.contains(x,y) endPoint=pointAi; if(i=pointA.length-1&endPoint.isHaveDisc()=false) location=true; break; else if(idisc.getNumber() location=true; break; for(int i=0;ipointB.length;i+) x=pointBi.getX(); y=pointBi.getY(); if(rect.contains(x,y) endPoint=pointBi; if(i=pointB.length-1&endPoint.isHaveDisc()=false) location=true; break; else if(ipointB.length-1&pointBi+1.isHaveDisc()=true &endPoint.isHaveDisc()=false &pointBi+1.getDis

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号