JAVA课程设计Hannoi塔实验报告_第1页
JAVA课程设计Hannoi塔实验报告_第2页
JAVA课程设计Hannoi塔实验报告_第3页
JAVA课程设计Hannoi塔实验报告_第4页
JAVA课程设计Hannoi塔实验报告_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

永磁同步电机双环调速系统的仿真研究Java程序设计课程设计报告(2011)PAGE16PAGE1Java程序设计课程设计报告(2011--2012年度第1学期)Hannoi塔专业学生姓名班级学号指导教师完成日期Hannoi塔PAGE3Hannoi塔目录目录 21概述 11.1课程设计目的 11.2课程设计内容 12系统需求分析 12.1系统目标 12.2主体功能 12.3开发环境 13系统概要设计 23.1系统的功能模块划分 23.2系统流程图 24系统详细设计 25测试 145.1测试方案 145.2测试结果 146小结 16参考文献 17附录1源程序清单 18PAGE17题目1概述1.1课程设计目的随着社会的进步,我们用来娱乐的游戏世界也越来越丰富,越来越复杂。本程序的Hannoi塔游戏不但包括了游戏最基本的功能,而且还能培养用户的逻辑思维能力,同时也给玩家提供了一定的娱乐空间。本游戏还包括一个自动演示搬移Hannoi塔的功能,此功能能够帮助初次接触此游戏的用户了解此游戏的玩法。1.2课程设计内容设计HUI界面的Hannoi塔,用户可以通过拖动鼠标移动各个塔上的盘子,程序也可以自动演示盘子的移动过程2系统需求分析2.1系统目标可以正常运行程序,并且按照设计目的预想的完成具体功能。2.2主体功能(1)设计GUI界面的Hannoi塔。Hannoi塔中有三个座,名字分别是A、B和C。初始状态是A座上有五个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座上。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子。(2)程序要求用户在移动盘子过程中,不允许把大盘子放在小盘子的上面,用户最终要完成的是把A座上的全部盘子移动到B座或C座上。(3)用户可以通过单击Hannoi塔界面上提供的按钮,让程序自动完成把A座上的盘子全部移动到B座或C座上。(4)用户在移动盘子的过程中,可以随时单击Hannoi塔界面上提供的按钮,重新开始游戏。2.3开发环境JDK1.6。3系统概要设计3.1系统的功能模块划分(1)Tower.java(主类)Tower类负责创建Hannoi塔的主窗口,该类含有main方法,Hannoi塔从类开始执行。Tower类的成员变量中有两种重要类型的对象:一个int基本型数据和一个char型数组。两种类型的对象分别是:HannoiTower和Button对象。(2)HannoiTower.javaHannoiTower类是javax.swing包中JPanel容器的子类,创建的容器被添加到Tower窗口的中心。HannoiTower类的成员变量有两种重要类型的对象、一个int基类型数据和一个char型数组。两种类型的对象分别是:Disk、TowerPoint。(3)TowerPoint.javaTowerPoint类负责在HannoiTower中创建表示位置的塔点对象。(4)Disk.javaDisk类是Button的一个子类,创建的对象是HannoiTower容器中的一个按钮,用来表示HannoiTower中的盘子。3.2系统流程图TowerTowerButtonHannoiTowButtonHannoiTowerTowerPointDiskTowerPointDisk4系统详细设计Tower类Tower类是javax.swing包中Frame的一个子类,标明该类的主要成员变量和方法:成员变量tower是HannoiTower创建的对象。tower对象是一个容器,刻画了Hannoi塔的结构,该对象被添加到窗口的中心。盘子数目是int型数据,它的默认值是5。盘子数目的值是用来确定tower对象中“盘子”的数目。towerName是char型数组,长度为3,其三个单元的默认取值依次是A、B和C。towerName数组的单元的值用来确定tower中三个塔的名字。renew和auto是Button创建的按钮对象,名字依次为“重新开始”和“自动演示搬盘子”,renew和auto都将当前窗口注册为自己的ActionEvent事件监视器。方法Tower()是构造方法,负责完成窗口的初始化。main方法是Hannoi塔程序运行的入口方法。actionPerformed(ActionEvent)方法是HannoiTower类实现的ActionListener接口中的方法。HannoiTower创建的窗口是renew和auto两个按钮的ActionEvent事件监视器。当用户单击按钮时,窗口将执行actionPerformed(ActionEvent)方法进行相应的操作。当用户单击renew按钮时,actionPerformed(ActionEvent)方法所进行的操作是保持当前的盘子数目的值,并让tower对象根据盘子数目的值设置其初始状态。当用户单击auto按钮时,actionPerformed(ActionEvent)方法所进行的操作是让tower对象返回其中的AutoMoveDisc对象,该对象是一个对话框,用户可以通过对话框让程序自动地移动“盘子”。代码(Tower.java)importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;publicclassTowerextendsFrameimplementsActionListener,Runnable{HannoiTowertower=null;Buttonrenew,auto=null;chartowerName[]={'A','B','C'};int盘子数目,盘宽,盘高;Threadthread;TextArea信息条=null;publicTower(){thread=newThread(this);盘子数目=5;盘宽=80;盘高=18;信息条=newTextArea(12,12);信息条.setText(null);tower=newHannoiTower(盘子数目,盘宽,盘高,towerName,信息条);renew=newButton("重新开始");auto=newButton("自动演示搬盘子");renew.addActionListener(this);auto.addActionListener(this);add(tower,BorderLayout.CENTER);add(renew,BorderLayout.SOUTH);add(auto,BorderLayout.NORTH);add(信息条,BorderLayout.EAST);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}};setVisible(true);setBounds(60,20,670,540);validate();}publicvoidactionPerformed(ActionEvente){if(e.getSource()==renew){if(!(thread.isAlive())){this.remove(tower);信息条.setText(null);tower=newHannoiTower(盘子数目,盘宽,盘高,towerName,信息条);add(tower,BorderLayout.CENTER);validate();}else{}}if(e.getSource()==auto){if(!(thread.isAlive())){thread=newThread(this);}try{thread.start();}catch(Exceptioneee){}}}publicvoidrun(){this.remove(tower);信息条.setText(null);tower=newHannoiTower(盘子数目,盘宽,盘高,towerName,信息条);add(tower,BorderLayout.CENTER);validate();tower.自动演示搬运盘子(盘子数目,towerName[0],towerName[1],towerName[2]);}publicstaticvoidmain(Stringargs[]){newTower();}}HannoiTower类HannoiTower类是javax.swing包中JPanel容器的一个子类,创建的对象tower是Tower窗口的成员之一,被添加到Tower窗口的中心位置。成员变量盘子数目是int型数据。盘子数目值用来确定tower对象中盘子的数目。盘子是Disk型数组,该数组的长度由盘子数目值来确定。Disk数组的每个单元中存放一个Disk对象,依次表明tower对象中有怎样多的盘子。towerName是char型数组,长度为3,其三个单元的默认取值依次是A、B和C。Height的值确定每个盘子的高度。pointA、pointB、pointC都是TowerPoint型数组,三个数组的长度与盘子数目相同,即都是盘子数目。pointA、pointB和pointC的单元都是TowerPoint创建对象,分别用来表示Hannoi塔中三个座上的塔点。A座、B座和C座上的三个塔点分别由pointA、pointB和pointC中的单元来确定。每个座上的五个塔点都是从座顶到座底依次对应数组的相应单元中的TowerPoint对象。方法HannoiTower(char[])是构造方法,负责完成tower容器的初始化。tower容器调用paintComponent(Graphics)方法绘制出塔点的位置和必要的视图。代码(HannoiTower.java)importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;publicclassHannoiTowerextendsJPanelimplementsMouseListener,MouseMotionListener{TowerPointpoint[];intx,y;booleanmove=false;Disk盘子[];intstartX,startY;intstartI;int盘子数目=0;intwidth,height;chartowerName[]={'A','B','C'};TextArea信息条=null;publicHannoiTower(intnumber,intw,inth,char[]name,TextAreatext){towerName=name;盘子数目=number;width=w;height=h;信息条=text;setLayout(null);addMouseListener(this);addMouseMotionListener(this);盘子=newDisk[盘子数目];point=newTowerPoint[3*盘子数目];intspace=20;for(inti=0;i<盘子数目;i++){point[i]=newTowerPoint(40+width,100+space,false);space=space+height;}space=20;for(inti=盘子数目;i<2*盘子数目;i++){point[i]=newTowerPoint(160+width,100+space,false);space=space+height;}space=20;for(inti=2*盘子数目;i<3*盘子数目;i++){point[i]=newTowerPoint(280+width,100+space,false);space=space+height;}inttempWidth=width;intsub=(int)(tempWidth*0.2);for(inti=盘子数目-1;i>=0;i--){盘子[i]=newDisk(i,this);盘子[i].setSize(tempWidth,height);tempWidth=tempWidth-sub;}for(inti=0;i<盘子数目;i++){point[i].放置盘子(盘子[i],this);if(i>=1)盘子[i].set上方有盘(true);}}publicvoidpaintComponent(Graphicsg){super.paintComponent(g);g.drawLine(point[0].getX(),point[0].getY(),point[盘子数目-1].getX(),point[盘子数目-1].getY());g.drawLine(point[盘子数目].getX(),point[盘子数目].getY(),point[2*盘子数目-1].getX(),point[2*盘子数目-1].getY());g.drawLine(point[2*盘子数目].getX(),point[2*盘子数目].getY(),point[3*盘子数目-1].getX(),point[3*盘子数目-1].getY());g.drawLine(point[盘子数目-1].getX()-width,point[盘子数目-1].getY(),point[3*盘子数目-1].getX()+width,point[3*盘子数目-1].getY());intleftx=point[盘子数目-1].getX()-width;intlefty=point[盘子数目-1].getY();intw=(point[3*盘子数目-1].getX()+width)-(point[盘子数目-1].getX()-width);inth=height/2;g.setColor(Color.orange);g.fillRect(leftx,lefty,w,h);g.setColor(Color.red);intsize=4;for(inti=0;i<3*盘子数目;i++){g.fillOval(point[i].getX()-size/2,point[i].getY()-size/2,size,size);}g.drawString(""+towerName[0]+"塔",point[盘子数目-1].getX(),point[盘子数目-1].getY()+30);g.drawString(""+towerName[1]+"塔",point[2*盘子数目-1].getX(),point[盘子数目-1].getY()+30);g.drawString(""+towerName[2]+"塔",point[3*盘子数目-1].getX(),point[盘子数目-1].getY()+30);g.drawString("将全部盘子从"+towerName[0]+"塔搬运到"+towerName[1]+"塔或"+towerName[2]+"塔",point[盘子数目-1].getX(),point[盘子数目-1].getY()+80);}publicvoidmousePressed(MouseEvente){Disk盘子=null;Rectanglerect=null;if(e.getSource()==this)move=false;if(move==false)if(e.getSource()instanceofDisk){盘子=(Disk)e.getSource();startX=盘子.getBounds().x;startY=盘子.getBounds().y;rect=盘子.getBounds();for(inti=0;i<3*盘子数目;i++){intx=point[i].getX();inty=point[i].getY();if(rect.contains(x,y)){startI=i;break;}}}}publicvoidmouseMoved(MouseEvente){}publicvoidmouseDragged(MouseEvente){Diskdisk=null;if(e.getSource()instanceofDisk){disk=(Disk)e.getSource();move=true;e=SwingUtilities.convertMouseEvent(disk,e,this);}if(e.getSource()==this){if(move&&disk!=null){x=e.getX();y=e.getY();if(disk.get上方有盘()==false)disk.setLocation(x-disk.getWidth()/2,y-disk.getHeight()/2);}}}publicvoidmouseReleased(MouseEvente){Diskdisk=null;move=false;Rectanglerect=null;if(e.getSource()instanceofDisk){disk=(Disk)e.getSource();rect=disk.getBounds();e=SwingUtilities.convertMouseEvent(disk,e,this);}if(e.getSource()==this){booleancontainTowerPoint=false;intx=0,y=0;intendI=0;if(disk!=null){for(inti=0;i<3*盘子数目;i++){x=point[i].getX();y=point[i].getY();if(rect.contains(x,y)){containTowerPoint=true;endI=i;break;}}}if(disk!=null&&containTowerPoint){if(point[endI].是否有盘子()==true){disk.setLocation(startX,startY);}else{if(endI==盘子数目-1||endI==2*盘子数目-1||endI==3*盘子数目-1){point[endI].放置盘子(disk,this);if(startI!=盘子数目-1&&startI!=2*盘子数目-1&&startI!=3*盘子数目-1){(point[startI+1].获取盘子()).set上方有盘(false);point[startI].set有盘子(false);}else{point[startI].set有盘子(false);}}else{if(point[endI+1].是否有盘子()==true){DisktempDisk=point[endI+1].获取盘子();if((tempDisk.getNumber()-disk.getNumber())>=1){point[endI].放置盘子(disk,this);if(startI!=盘子数目-1&&startI!=2*盘子数目-1&&startI!=3*盘子数目-1){(point[startI+1].获取盘子()).set上方有盘(false);point[startI].set有盘子(false);tempDisk.set上方有盘(true);}else{point[startI].set有盘子(false);tempDisk.set上方有盘(true);}}else{disk.setLocation(startX,startY);}}else{disk.setLocation(startX,startY);}}}}if(disk!=null&&!containTowerPoint){disk.setLocation(startX,startY);}}}publicvoidmouseEntered(MouseEvente){}publicvoidmouseExited(MouseEvente){}publicvoidmouseClicked(MouseEvente){}publicvoid自动演示搬运盘子(int盘子数,charone,chartwo,charthree){if(盘子数==1){信息条.append(""+one+"到:"+three+"塔\n");Diskdisk=在塔中获取最上面的盘子(one);intstartI=在塔中获取最上面盘子的位置(one);intendI=在塔中获取最上面盘子的上方位置(three);if(disk!=null){point[endI].放置盘子(disk,this);point[startI].set有盘子(false);try{Thread.sleep(1000);}catch(Exceptionee){}}}else{自动演示搬运盘子(盘子数-1,one,three,two); 信息条.append(""+one+"到:"+three+"塔\n");Diskdisk=在塔中获取最上面的盘子(one);intstartI=在塔中获取最上面盘子的位置(one);intendI=在塔中获取最上面盘子的上方位置(three);if(disk!=null){point[endI].放置盘子(disk,this);point[startI].set有盘子(false);try{Thread.sleep(1000);}catch(Exceptionee){}} 自动演示搬运盘子(盘子数-1,two,one,three);}}publicDisk在塔中获取最上面的盘子(char塔名){Diskdisk=null;if(塔名==towerName[0]){for(inti=0;i<盘子数目;i++){if(point[i].是否有盘子()==true){disk=point[i].获取盘子();break;}}}if(塔名==towerName[1]){for(inti=盘子数目;i<2*盘子数目;i++){if(point[i].是否有盘子()==true){disk=point[i].获取盘子();break;}}}if(塔名==towerName[2]){for(inti=2*盘子数目;i<3*盘子数目;i++){if(point[i].是否有盘子()==true){disk=point[i].获取盘子();break;}}}returndisk;}publicint在塔中获取最上面盘子的上方位置(char塔名){intposition=0;if(塔名==towerName[0]){inti=0;for(i=0;i<盘子数目;i++){if(point[i].是否有盘子()==true){position=Math.max(i-1,0);break;}}if(i==盘子数目){position=盘子数目-1;}}if(塔名==towerName[1]){inti=0;for(i=盘子数目;i<2*盘子数目;i++){if(point[i].是否有盘子()==true){position=Math.max(i-1,0);break;}}if(i==2*盘子数目){position=2*盘子数目-1;}}if(塔名==towerName[2]){inti=0;for(i=2*盘子数目;i<3*盘子数目;i++){if(point[i].是否有盘子()==true){position=Math.max(i-1,0);break;}}if(i==3*盘子数目){position=3*盘子数目-1;}}returnposition;}publicint在塔中获取最上面盘子的位置(char塔名){intposition=0;if(塔名==towerName[0]){inti=0;for(i=0;i<盘子数目;i++){if(point[i].是否有盘子()==true){position=i;break;}}if(i==盘子数目){position=盘子数目-1;}}if(塔名==towerName[1]){inti=0;for(i=盘子数目;i<2*盘子数目;i++){if(point[i].是否有盘子()==true){position=i;break;}}if(i==2*盘子数目){position=2*盘子数目-1;}}if(塔名==towerName[2]){inti=0;for(i=2*盘子数目;i<3*盘子数目;i++){if(point[i].是否有盘子()==true){position=i;break;}}if(i==3*盘子数目){position=3*盘子数目-1;}}returnposition;}}Disk类是javax.swing包中Button类的子类,所创建的对象称作Hannoi塔中的“盘子”。HannoiTower类有Disk类型的数组盘子。盘子数组的单元是用Disk创建的对象,被放置在Tower所创建的容器tower中,用来表示tower中的“盘子”。成员变量number的值确定所创建的“盘子”上的数字号码,通过该号码的大小来确定盘子的大小关系,即号码大的盘子大于号码小的盘子。方法Disk()构造方法。创建盘子对象时需要使用该构造方法。setNumber(intn)。盘子调用该方法设置其上的数字号码。getNumber()方法。盘子调用该方法返回其上的数字号码。set上方有盘()方法。盘子调用该方法设置其所在的塔点。get上方有盘()方法。盘子调用该方法返回其所在的塔点。代码(Disk.java)importjava.awt.*;publicclassDiskextendsButton{intnumber;boolean上方有盘=false;publicDisk(intnumber,HannoiTowercon){this.number=number;setBackground(Color.blue);addMouseMotionListener(con);addMouseListener(con);}publicbooleanget上方有盘(){return上方有盘;}publicvoidset上方有盘(booleanb){上方有盘=b;}publicintgetNumber(){returnnumber;}}TowerPoint类TowerPoint所创建的对象将作为HannoiTower类中TowerPoint型数组pointA、pointB和pointC中的元素。成员变量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(C

温馨提示

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

评论

0/150

提交评论