沈阳理工Hannoi塔java课程设计.doc_第1页
沈阳理工Hannoi塔java课程设计.doc_第2页
沈阳理工Hannoi塔java课程设计.doc_第3页
沈阳理工Hannoi塔java课程设计.doc_第4页
沈阳理工Hannoi塔java课程设计.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

19沈阳理工大学java课程设计成 绩 评 定 表学生姓名李若帆班级学号 1403030221 专 业电子信息工程课程设计题目基于Java的Hannoi塔软件设计评语组长签字:成绩日期 2015年 月 日课程设计任务书学 院信息学院专 业电子信息工程学生姓名班级学号 课程设计题目基于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塔界面上提供的按钮,重新开始当前的级别。工作计划与进度安排: 第19周:布置课程设计任务,查阅资料,分组设计,程序调试。 第20周:程序调试,编写课程设计报告,验收,答辩。指导教师: 2015年 月 日专业负责人: 2015年 月 日学院教学副院长: 2015年 月 日目录1概述1.1 课程设计目的及内容2 系统需求分析2.1 系统目标2.2 主体功能2.3 开发环境3 系统概要设计3.1 系统的功能模块划分4系统详细设计4.1 总体功能设计4.2 HannoiWindow类4.3 Tower类4.4 Disc类4.5 TowerPoint类4.6 HandleMouse类4.7AutoMoveDise类5 运行5.1 运行方案5.2运行结果6 主要源代码7. 结论8参考文献31 概 述 1.1 课程设计目的及内容按课程设计指导书提供的课题,要求学生在自行完成各个操作环节,并能实现且达到举一反三的目的,完成一个项目解决一类问题。要求学生能够全面、深入理解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;对此能够较好地理解和掌握,能够进行简单分析和判断;能编写出具有良好风格的程序;掌握JAVA程序设计的基本技能和面向对象的概念和方法;了解多线程、安全和网络等编程技术。同时培养学生进行分析问题、解决问题的能力;培养学生进行设计分析、设计方法、设计操作与测试、设计过程的观察、理解和归纳能力的提高。我设计的Hannoi塔,除了要编写的6个java文件所给出的类外,还需要java系统提供的一些重要的类,如JButton,JCheckBox等。汉诺塔中有三个座,名字分别为A,B,C。刚开始的时候A塔上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座上。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动盘子。释放鼠标来放置该盘子。程序要求用户在移动盘子的过程中,不允许吧大盘子放置在小盘子的上面,用户最终要完成的是把A座上的全部盘子移动到B座或C座上2 系统需求分析2.1 系统目标可以正常运行程序,并且按照设计目的预想的完成具体功能。2.2 主体功能1) 设计GUI界面的Hannoi塔。汉诺塔中有三个座,名字分别为A,B,C。初始状态时A塔上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座上。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动盘子。释放鼠标来放置该盘子。2) 程序要求用户在移动盘子的过程中,不允许吧大盘子放置在小盘子的上面,用户最终要完成的是把A座上的全部盘子移动到B座或C座上。3) 用户可以通过Hannoi塔界面的提供的改变盘子数目功能来改变盘子的数目,同时可以改变盘子的大小以及改变盘子和界面的背景颜色,而且还可以选择控制背景音乐的播放。4) 用户可以通过单击Hannoi塔界面上提供的按钮,让程序自动完成把A座上的盘子全部移动到C座上。5) 用户在移动盘子的过程中,可以随时单击Hannoi塔界面上提供的按钮,重新开始。2.3 开发环境JAVA程序设计语言及相应的集成开发环境,J2SDK和ECLIPSE开发工具。3 系统概要设计3.1 系统的功能模块划分1) HannoiWindow.java(主类)HannoiWindow类负责创建Hannoi塔的主窗口,该类含有main方法,Hannoi塔从该类开始执行。HannoiWindow类的成员变量中有五种重要类型的对象、一个int基本型数据和一个char型数组。五种类型的对象分别是:Tower、JmenuBar、JmenuItem和Jbutton对象。HannoiWindow类的主要成员的作用将在后面的详细设计中阐述。2) Tower.javaTower类是javax.swing包中Jpanel容器的子类,创建的容器被添加到HannoiWindow窗口的中心。Tower类的成员变量中有四种重要类型的对象、一个int基本型数据和一个char型数组。四种类型的对象分别是:Disc、TowerPoint、HandleMouse、和AutoMoveDisc对象。Tower类的主要成员的作用将在后面的详细设计中阐述。3) Disc.javaDisc类是Jbutton的一个子类,创建的对象时Tower容器中的一个按钮,用来表示Tower中的“盘子”。4) TowerPoint.javaTowerPoint类负责在Tower中创建表示位置的塔点对象。5) HandleMouse.javaHandleMouse类创建的对象负责处理鼠标事件。6) AutoMoveDisc.javaAutoMoveDisc类创建的对象负责自动移动盘子从一个座到另一个座。4系统详细设计4.1 总体功能设计在设计hannoi塔时,需编写6个java源文件:HannoiWindow.java、Tower.java、TowerPoint.java、Disc.java、HandleMouse.java和AutoMoveDisc.java。Hannoi塔除了要编写的6个Java源文件所给出的类外,还需要Java系统提供的一些重要的类,如JMenuBar、JMenu、JMenuItem和JButton。Hannoi塔所用到的一些重要的类以及之间的组合关系。HannoiWindowTowerJButtonJMenuJMenuBarJMenuItemHandleMouseAutoMoveDiscTowerPointDisc图4.1 类之间的组合关系4.2 HannoiWindow类图4.2 HannoiWindow类的UML图4.3 Tower类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对象。例如,A座最上面的塔点是pointA0,中间的塔点是pointA1,最下面的塔点是pointA2。(6)handleMouse是HandleMouse类创建的鼠标事件监视器,用来监视disc数组的Disc对象上触发的鼠标事件。(7)autoMoveDisc是AutoMoveDisc创建的对话框。通过该对话框可以实现程序自动移动盘子。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创建的容器效果如图4.3所示。图4.3 Tower创建的容器4.4 Disc类JButtonTowerDiscnumber: intpoint: TowerPointDisc():无类型setNumber(int n): voidgetNumber(): intsetPoint(TowerPoint): voidgetPoint(): TowerPointdisc: Disc图4.4 Disc类的UML图4.5 TowerPoint类TowerTowerPOintx,y: inthaveDisc: booleandisc: DiscTowerPoint(int,int): 无类型isHaveDisc(): booleansetHaveDisc(boolean): voidgetX(): intgetY(): intPointA: TowerPointPointB: TowerPointPointC: TowerPointEquals(TowerPoint): booleanputDisc(Component,Container): voidgetDiscOnPoint(): DiscremoveDisc(Component,Container): void图4.5 TowerPoint类的UNL图4.6 HandleMouse类MouseMotionListenerMouseListenerTowerHandleMouseHandleMouse: HandleMousepointA,pointB,pointC: TowerPointstartPoint,endPoint: TowerPointcon: ContainerHandleMouse(Container): 无类型setPointA(TowerPoint): voidsetPointB(TowerPoint): voidsetPointC(TowerPoint): voidmousePressed(MouseEvent): voidmouseDragged(MouseEvent): voidmouseReleased(MouseEvent): void图4.6 HandleMouse类的UML图ActionListenerTowerautoMoveDisc: AutoMoveDiscamountOfDisc: intpointA,pointB,pointC: TowerPointtowerName: charcon: ContainermoveStep: StringBufferAutoMoveDisc(Container con):无类型setPointA(TowerPoint): voidsetPointB(TowerPoint): voidsetPointC(TowerPoint): voidactionPerformed(ActionEvent): voidsetTowerName(char): voidsetAmountOfDisc(int): voidsetMoveStep(int,char,char,char): voidautoMoveDisc(char,char): voidAutoMoveDiscShowStep: JTextAreabStart,bStop,bContinue,bClose: JButtontime: Timer4.7 AutoMoveDisc类图4.7 AutoMoveDisc类的UML图5运行5.1 运行方案将前面6个Java源文件:HannoiWindow.java、Tower.java、TowerPoint.java、Disc.java、HandleMouse.java和AutoMoveDisc.java保存同一目录中。分别编译这6个Java源文件,或运行“javac *.java”命令,编译全部源文件,然后运行主类,即运行HannoiWindow类。5.2 运行结果图5.1 程序截图1图5.2 程序截图2图5.3 程序截图36 主要源代码1) 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(); 2) Tower.javaimport 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; else amountOfDisc=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 DiscamountOfDisc; for(int i=0;idisc.length;i+) disci=new Disc(); disci.setNumber(i); int diskwidth=minDiscWidth+i*n; disci.setSize(diskwidth,discHeight); disci.addMouseListener(handleMouse); disci.addMouseMotionListener(handleMouse); pointA=new TowerPointamountOfDisc; pointB=new TowerPointamountOfDisc; pointC=new TowerPointamountOfDisc; int vertialDistance=discHeight; for(int i=0;ipointA.length;i+) pointAi=new TowerPoint(maxDiscWidth,100+vertialDistance); vertialDistance=vertialDistance+discHeight; vertialDistance=discHeight; for(int i=0;ipointB.length;i+) pointBi=new TowerPoint(2*maxDiscWidth,100+vertialDistance); vertialDistance=vertialDistance+discHeight; vertialDistance=discHeight; for(int i=0;ipointC.length;i+) pointCi=new TowerPoint(3*maxDiscWidth,100+vertialDistance); vertialDistance=vertialDistance+discHeight; for(int i=0;ipointA.length;i+) pointAi.putDisc(disci,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;ipointA.length;i+) pointAi.removeDisc(pointAi.getDiscOnPoint(),this); pointBi.removeDisc(pointBi.getDiscOnPoint(),this); pointCi.removeDisc(pointCi.getDiscOnPoint(),this); public void paintComponent(Graphics g) super.paintComponent(g); int x1,y1,x2,y2; x1=pointA0.getX(); y1=pointA0.getY()-discHeight/2; x2=pointAamountOfDisc-1.getX(); y2=pointAamountOfDisc-1.getY()+discHeight/2; g.drawLine(x1,y1,x2,y2); x1=pointB0.getX(); y1=pointB0.getY()-discHeight/2; x2=pointBamountOfDisc-1.getX(); y2=pointBamountOfDisc-1.getY()+discHeight/2; g.drawLine(x1,y1,x2,y2); x1=pointC0.getX(); y1=pointC0.getY()-discHeight/2; x2=pointCamountOfDisc-1.getX(); y2=pointCamountOfDisc-1.getY()+discHeight/2; g.drawLine(x1,y1,x2,y2); g.setColor(Color.blue); x1=pointAamountOfDisc-1.getX()-maxDiscWidth/2; y1=pointAamountOfDisc-1.getY()+discHeight/2; x2=pointCamountOfDisc-1.getX()+maxDiscWidth/2; y2=pointCamountOfDisc-1.getY()+discHeight/2; int length=x2-x1,height=6; g.fillRect(x1,y1,length,height); int size=5; for(int i=0;ipointA.length;i+) g.fillOval(pointAi.getX()-size/2,pointAi.getY()-size/2,size,size); g.fillOval(pointBi.getX()-size/2,pointBi.getY()-size/2,size,size); g.fillOval(pointCi.getX()-size/2,pointCi.getY()-size/2,size,size); g.drawString(towerName0+座,pointAamountOfDisc-1.getX(),pointAamountOfDisc-1.getY()+50); g.drawString(towerName1+座,pointBamountOfDisc-1.getX(),pointBamountOfDisc-1.getY()+50); g.drawString(towerName2+座,pointCamountOfDisc-1.getX(),pointCamountOfDisc-1.getY()+50); 3) Disc.javaimport 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; 4) TowerPoint.javaimport java.awt.*;public class TowerPoint int x,y; boolean haveDisc; Disc disc=null; public TowerPoint(int x,int y) this.x=x; this.y=y; public boolean isHaveDisc() return haveDisc; public void setHaveDisc(boolean boo) haveDisc=boo; public int getX() return x; public int getY() return y; public boolean equals(TowerPoint p) if(p.getX()=this.getX()&p.getY()=this.getY() return true; else return false; public void putDisc(Component com,Container con) disc=(Disc)com; con.setLayout(null); con.add(disc); int w=disc.getBounds().width; int h=disc.getBounds().height; disc.setBounds(x-w/2,y-h/2,w,h); haveDisc=true; disc.setPoint(this); con.validate(); public Disc getDiscOnPoint() return disc; public void removeDisc(Component com,Container con) if(com!=null) con.remove(com); con.validate(); 5) HandleMouse.javaimport java.awt.event.*;import java.awt.*;public class HandleMouse implements MouseListener,MouseMotionListener TowerPoint pointA,pointB,pointC; TowerPoint startPoint=null,endPoi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论