已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
汉诺塔一、 需求分析(1) 设计GUI界面的Hannoi塔。Hannoi塔中有三个座,名字分别为A、B和C。初始化状态是A做上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子。(2) 程序要求用户在移动盘子过程中,不允许把大盘放置在小盘的上面,用户最终要完成的是把A座上的全部盘子移动到B座或者说C座上。(3) 用户可以通过Hannoi塔界面提供的菜单来选择初级、中级和高级三个级别。初级级别的A座右3各大小不等的盘子、中级有4个而高级则有5个。(4) 用户可以通过单击Hannoi塔界面上提供的按钮,让程序自动完成A座上的盘子全部移动到C坐上。(5) 用户在移动盘子的过程中,可以随时单击Hannoi塔界面上的提供的按钮,重新开始当前的级别。二、 总体设计在设计Hannoi塔时,需编写6个JAVA源文件:HannoiWindow.Java 、TowerPoint.java、Disc.java、HandleMous.java和AutoMoveDisc.java。Hannoi塔除了要编写的6个Java源文件所给出的类外,还需要Java系统提供的一些重要的类,如JMenubar,JMenu,JMenuItem和JButton。Hannoi塔所用到得一些重要的类以及类之间的组合关系如图2.1所示: 图2.1 类之间的组合关系分工:在本次课程设计中我和吴林剑作为一个团队设计一个汉诺塔,我主要负责主窗口的设计和相关各个函数之间的调用,吴林剑主要负责容器的设计。以下是6个JAVA源文件的总体设计。2.1 HannoiWindow.java(主类) HannoiWindow类负责创建Hannoi塔的主窗口,该类含有main方法,Hannoi塔从该类开始执行。HannoiWindow类的成员变量中有五种重要类型的对象,一个int基本型数据和一个char行数组。五种类型的对象分别是JMenubar , JMenu,JMenuItem和JButton对象。 HannoiWindow类主要成员的作用将在后面的详细设计中阐述,HannoiWindow类创建的窗口以及其中的主要成员对象如图2.2所示: 图2.2HannoiWindow窗口及主要的成员对象2.2 Tower.java Tower类是javax.swing报中的JPanel容器的子类,创建的容器被添加到HannoiWindow窗口的中心。Tower类的成员变量中有四种重要的类型对象、一个int基本型数据和一个char型数组。2.3 Disc.java Disc类是JButton的一个子类,创建的对象是Tower容器中的一个按钮,用来白傲视Tower中的“盘子”。2.4 TowerPoint.java TowerPint.Java类负责在Tower中创建表示位置的塔的对象。2.5 HandleMouse.java HandleMouse类创建的对象负责处理鼠标事件。2.6 AutoMoveDisc.java AutoMoveDisc类创建的对象负责走动移动盘子从一个座到另一个座。三、 详细设计HannoiWindow类的详细设计1.效果图 HannoiWindow创建的窗口效果如图3.1所示:图3.1HannoiWindow创建的窗口2. UML图 HannoiWindow类是javax.swing包中JFrame的一个子类,表明该类的主要成员变量的方法的UML图如3.2所示:图3.2HannoiWindow类的UML图以下是UML图中有关数据和方法的详细说明。1) 成员变量1、 Tower是Tower创建的对象Tower对象是一个容器,刻画了Hannoi塔的结构,该对象被添加到窗口的中心。2、 anountOfDisc是int型数据,他的默认值是3。amountOfDisc的值用来确定tower对象中“盘子”的数目,即Disc对象的数目。3、 towerName是char型数组,长度为3,其中三个单元的默认值一次是A、B和C。towerName数组的单元的值用来确定tower中三座的名字。4、 bar是JMenuBar创建的菜单条用来添加菜单。Bar被放置的在窗口的顶部。5、 menuGrade是JMenu创建的菜单没起名字为“选择级别”。menuGrade被添加到菜单条bar中。6、 renew和autoButton是JBotton创建的按钮对象,名字一次为“重新开始”和“自动演示”Renew和autoButton都将当前窗口注册为自己的ActionEvent时间监视器。2) 方法1、 HannoiWindow()是构造方法,负责完成窗口的初始化。2、 Main方法是Hannoi塔程序运行的入口方法。3、 actionPerformed方法是HannoiWindow类实现的ActionListener接口中的方法。HannoiWindow创建的窗口时oneGradeItem、twoGradeItem和threeGradeItemsave三个菜单项以及renew和autoButton两个按钮的ActionEvent时间监视器。当用户选中某个菜单项或单击按钮时,窗口执行actionPerformed方法进行相应的操作。如果用户选中oneGradeItem、twoGradeItem和threeGradeItemsave三个菜单项的某一项时,actionPerformed方法所执行的操作就是改变amountOfDisc的值,并让tower对象根据amountOfDisc设置其初始状态。当用户单击renew按钮是,actionPerformed方法所进行的操作是保持当前amountOfDisc的值,并让tower对象根据amoutOfDisc的值设置起初始状态。当用户单击aotoButton按钮时,actionPerformed方法是让tower对象返回其中的AutoMoveDisc对象,该对象是一个对话框,用户可以通过该对话框让程序自动的移动“盘子”。3) 代码(HannoiWindow.java)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=将全部盘子从+towerName0+座搬运到+towerName1+ 座或+towerName2+座; 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(); 四、 运行结果初始界面:自动演示界面:选择难度级别界面:五、 实验总结通过本次课程设计我能熟练地运用JAVA里面的容器进行设计。对汉诺塔的逻辑设计也有了深刻的理解。六、 附录/HannoiWindow类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=将全部盘子从+towerName0+座搬运到+towerName1+ 座或+towerName2+座; 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(); / AutoMoveDiscimport 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,bClose; Timer time; int i=0,number=0; AutoMoveDisc(Container con) setModal(true); setTitle(自动演示搬盘子过程); this.con=con; moveStep=new StringBuffer(); time=new Timer(1000,this); time.setInitialDelay(10); showStep=new JTextArea(10,12); bStart=new JButton(演示); bStop=new JButton(暂停); bContinue=new JButton(继续); 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(new 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 pointA) 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 setAmountOfDisc(int n) amountOfDisc=n; public void actionPerformed(ActionEvent e) if(e.getSource()=time) number+; char cStart,cEnd; if(i=moveStep.length()-1) time.stop(); else if(e.getSource()=bStart) if(moveStep.length()=0) if(time.isRunning()=false) i=0; moveStep=new StringBuffer(); setMoveStep(amountOfDisc,towerName0,towerName1,towerName2); number=0; time.start(); else if(e.getSource()=bStop) if(time.isRunning()=true) time.stop(); else if(e.getSource()=bContinue) if(time.isRunning()=false) time.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(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;ipointB.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(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=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); / Disc类import javax.swing.*;import java.awt.*;public class Disc extends JButton int number; TowerPoint point; Disc() setBackground(Color.cyan); public void setNumber(int n) number=n; public int getNumber() return number; public void setPoint(TowerPoint p) point=p; public TowerPoint getPoint() return point; / HandleMouse import java.awt.event.*;import java.awt.*;public class HandleMouse implements 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 setPointB(TowerPoint pointB) this.pointB=pointB; public void setPointC(TowerPoint pointC) this.pointC=pointC; public void mo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 金融风险与合规联动机制
- 照明能源消耗监测方案
- 蒸汽管道保温技术方案
- 排水系统应急预案编制方案
- 2025-2030新基建发展推动下基础设防建设成效及挑战报告
- 2025-2030新加坡金融科技行业市场可行性评估投资布局规划前景报告
- 2025-2030新加坡航空制造业市场供需分析与发展趋势评估规划研究报告
- 2025-2030新加坡物业服务行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030新加坡旅游服务业市场发展分析及行业政策规划研究报告
- 2025-2030文旅产业融合发展趋势分析行业竞争格局与投资发展规划报告
- 村务监督业务培训课件
- 食品包装材料及容器
- 甲状腺癌医学知识讲座
- 灭菌包装袋内部资料课件
- 工作汇报PPT(山与海之歌动态)大气震撼模板
- 义务消防员培训课件的课件
- 市政施工围挡施工围挡方案
- 城镇道路工程施工与质量验收规范cjj
- YY0778-2018《射频消融导管》标准变化解读
- GB/T 8350-2003输送链、附件和链轮
- GB/T 18318.1-2009纺织品弯曲性能的测定第1部分:斜面法
评论
0/150
提交评论