Java专业课程设计方案报告汉诺塔_第1页
Java专业课程设计方案报告汉诺塔_第2页
Java专业课程设计方案报告汉诺塔_第3页
Java专业课程设计方案报告汉诺塔_第4页
Java专业课程设计方案报告汉诺塔_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

东华理工大学Java课程设计汇报题目:汉诺塔所在院系:理学院学生姓名:漆俊、朱学曼、颜瑶专业:信息和计算科学班级:1223201-2指导老师:黄国辉12月29日目录概述题目概述题目分析课程设计1.课程设计目标2.课程设计内容3.课程设计环境4.课程设计要求三.系统需求分析1.系统目标2.主体功效3.开发环境四.系统概要设计1.系统功效模块划分2.步骤图3.自定义类说明五.系统具体设计六.测试测试方案测试结果七.小结八.参考文件程序代码一.概述题目概述:Hannoi塔:

设计GUI界面Hannoi塔,用户能够经过拖动鼠标移动各个塔上盘子,程序也能够自动演示盘子移动过程。

设计要求

1.有三个表示塔对象,分别命名为A、B和C。A塔上有若干个盘子,盘子大小不等,并按着大小次序依次摆放在A塔上,大盘在下,小盘在上。用户能够用鼠标拖动盘子,把A

塔上盘子全部移动到另外两个塔中任何一个塔上。要求每次只能移动一个盘子,在任何时候不许可大盘压在小盘上面。

2.用户也能够选择让程序自动演示。选择自动演示后,程序将以动画形式演示把A塔上盘子全部移到C塔过程,并将移动过程以文本形式显示在一个文本区中。2.题目分析:(1)在窗口中画出初始时塔和碟子状态。(2)能够以自动或手动两种方法搬移碟子。(3)自动搬移能够经过定时器或多线程方法,每一次移动时间间隔能够自定,以人眼观察比较舒适为宜,每一次移动过程如能实现动画最好。(4)定义塔描述类和碟子描述类。(5)在程序中,碟子数目及每次移动时间间隔能够经过对话框设置(也应该有默认值)。(6)支持暂停功和继续功效(在自动搬移过程中能够暂停,并继续)。(7)暂停后,能够将目前状态保留(碟子和塔组合关系)。(8)能够从7中保留文件中读出某个状态,并继续移动。二.课程设计1.课程设计目标《JAVA程序设计》是计算机相关专业选修专业基础课程,其实践性、应用性很强。实践教学步骤是必不可少一个关键步骤。本课程程序设计专题实际是计算机相关专业学生学习完《JAVA程序设计》课程后,进行一次全方面综合训练,JAVA程序设计设计目标是加深对理论教学内容了解和掌握,使学生较系统地掌握程序设计及其在网络开发中广泛应用,基础方法及技巧,为学生综合利用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。课程设计内容我设计Hannoi塔,除了要编写6个java文件所给出类外,还需要java系统提供部分关键类,如JButton,JCheckBox等。汉诺塔中有三个座,名字分别为A,B,C。刚开始时候A塔上有3个大小不等盘子,这些盘子从座底到座顶按着大小次序依次摆放在A座上。用户能够用鼠标选中盘子,然后经过拖动鼠标来移动盘子。释放鼠标来放置该盘子。程序要求用户在移动盘子过程中,不许可吧大盘子放置在小盘子上面,用户最终要完成是把A座上全部盘子移动到B座或C座上。用户能够经过Hannoi塔界面提供改变盘子数目功效来改变盘子数目,同时能够改变盘子大小和改变盘子和界面背景颜色,而且还能够选择控制背景音乐播放。用户能够经过单击Hannoi塔界面上提供按钮,让程序自动完成把A座上盘子全部移动到C座上。用户在移动盘子过程中,能够随时单击Hannoi塔界面上提供按钮,重新开始。课程设计环境硬件要求能运行Windows9.X操作系统微机系统。JAVA程序设计语言及对应集成开发环境,J2SDK和ECLIPSE开发工具。课程设计要求按课程设计指导书提供课题,要求学生在自行完成各个操作步骤,并能实现且达成举一反三目标,完成一个项目处理一类问题。要求学生能够全方面、深入了解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;对此能够很好地了解和掌握,能够进行简单分析和判定;能编写出含有良好风格程序;掌握JAVA程序设计基础技能和面向对象概念和方法;了解多线程、安全和网络等编程技术。同时培养学生进行分析问题、处理问题能力;培养学生进行设计分析、设计方法、设计操作和测试、设计过程观察、了解和归纳能力提升。三.系统需求分析系统目标所设计代码能够正常运行程序,而且根据设计目标预想完成具体功效。主体功效(1)设计GUI界面Hannoi塔。Hannoi塔中有三个座,名字分别是A、B和C。初始状态是A座上有五个大小不等盘子,这些盘子从座底到座顶按着大小次序依次摆放在A座上。用户能够用鼠标选中盘子,然后经过拖动鼠标来移动该盘子、释放鼠标来放置该盘子。(2)程序要求用户在移动盘子过程中,不许可把大盘子放在小盘子上面,用户最终要完成是把A座上全部盘子移动到B座或C座上。(3)用户能够经过单击Hannoi塔界面上提供按钮,让程序自动完成把A座上盘子全部移动到B座或C座上。(4)用户在移动盘子过程中,能够随时单击Hannoi塔界面上提供按钮,重新开始游戏。3.开发环境JAVA程序设计语言及对应集成开发环境,JDK1.6。四.系统概要设计关键要实现功效有:完成汉诺塔“手工移动演示”;完成汉诺塔“自动移动演示”;增加计时功效,即显示用户完成移动盘子所花费时间;用户能够设置最大和最小盘子大小;用户能够选择播放和暂停背景音乐;用户能够设置盘子数目;用户能够设置盘子颜色和背景颜色;用户能够将自动移动盘子文本信息保留到文件。系统功效模块划分(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中盘子。步骤图(图4-1)自定义类说明(1)自定义类类名:JButton作用:自定义主类,实现圆盘类Disc继承JButton类继承父类:Disc类实现接口:没有(2)组员变量JButton组员变量组员变量描述变量类型名称控制盘子数目StringJLabel重新开始Stringrenew.setText开始游戏Stringrenew.setText背景颜色Stringbgcolor盘子颜色Stringpzcolor(3)方法表Chesspad方法方法名功效备注fillRect()绘制出矩形区域结构方法g.fillOval()绘制相同数目点结构方法drawString()绘制出A、B、C座

结构方法setBackground()设置背景颜色和盘子颜色结构方法Timer(inta,Objectb)创建一个计时器

结构方法stop()停止计时器计时

接口方法write保留文件

接口方法actionPerformed事件处理

evaluate评定

五.系统具体设计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事件监视器。方法取消起始塔定义,并将塔顶盘设为黄色取消起始塔定义,并将塔顶盘设为黄色是否自动搬移退出开始是否正在移动退出是否点中某个塔退出是否已定义起始塔塔上是否有盘退出定义目前塔为起始塔,并将塔顶盘设为蓝色是否起始塔消息框报错退出该塔顶盘是否比欲移动盘大消息框报错退出定义为目标塔,调MovePlate函数,将起始塔顶金盘移动到目标塔顶。退出是否是否否是是否退出否是是否否是图4-1Tower()是结构方法,负责完成窗口初始化。main方法是Hannoi塔程序运行入口方法。actionPerformed(ActionEvent)方法是HannoiTower类实现ActionListener接口中方法。HannoiTower创建窗口是renew和auto两个按钮ActionEvent事件监视器。当用户单击按钮时,窗口将实施actionPerformed(ActionEvent)方法进行对应操作。当用户单击renew按钮时,actionPerformed(ActionEvent)方法所进行操作是保持目前盘子数目标值,并让tower对象依据盘子数目标值设置其初始状态。当用户单击auto按钮时,actionPerformed(ActionEvent)方法所进行操作是让tower对象返回其中AutoMoveDisc对象,该对象是一个对话框,用户能够经过对话框让程序自动地移动“盘子”。六.测试1.测试方案本程序初始状态是A塔上有五个大小不等盘子,这些盘子从座底到座顶按着大小次序依次摆放在A塔上。用户能够用鼠标选中盘子,然后经过拖动鼠标来移动该盘子、释放鼠标来放置该盘子。程序要求用户在移动盘子过程中,不许可把大盘子放在小盘子上面,用户最终要完成是把A塔上全部盘子移动到B塔或C塔上。用户能够经过单击Hannoi塔界面上提供按钮,让程序自动完成把A塔上盘子全部移动到B塔或C塔上。用户在移动盘子过程中,能够随时单击Hannoi塔界面上提供按钮,重新开始游戏。2.测试结果七.小结经过着为期两天时间,我学到了很多,自然在这期间碰到困难数不胜数,开始最让我没辙是题目不知道该订什么好,想过很多个题目但往往跟其它同学反复了,为了避免做出来东西雷同了,只能继续想其它方面,想过去做些复杂,但实在是能力有限,,最终我们小组最终决定做这个Hannoi塔游戏.这个Hannoi塔游戏就是在原有程序基础上增加了改变盘子数目功效、改变盘子大小功效、改变背景颜色功效、改变盘子颜色功效、计时器功效和保留信息到文件功效,因为是在原有基础上修改,即使理论上那个来讲这应该很简单,不会太难,但当我真正着手做起来得时候才发觉,原来自己还是太嫩,刚开始什么全部不懂,于是我们就去网上参阅了大量资料,也不停向同学们请教,最终逐步让我从刚开始连怎样运行程序,甚至类作用等部分罪基础东西全部不清楚到最终经过努力最终把这个程序成功搞定.自然这期间除了辛劳也让我明白了很多,有些小问题也是不容忽略,就如公共类只能有一个,而且必需要有.及类名必需要同公共类名相同.不然程序就无法运行.经过编写这个Hannoi塔游戏,我们认识到应该注意细节问题,即使是很小问题,但能够提升自己编程能力,而且还能够培养自己编程严谨性,同时还能够为以后编程积累经验。除此之外让我们对java变成语言又有了更深一步了解,曾经对于部分类名似是而非,现在经过编写这个程序让我逐步变得明朗部分了,最少能够分清父类子类,和部分类和方法用途,当然这些全部离不开小组组员分工合作,总而言之经过这次课程设计,我们真学到了很多.八.参考文件[1]苏仕民.数据结构课程设计北京:机械工业出版社.参考书:[2]SartajSahni.DataStructure,Algorithms,andApplicationinC++.TheMcGraw-HillCompanyInc.1998[M](第一版)(数据结构、算法和应用——C++语言描述.北京:机械工业出版社.1999[3]WillanFord,WillianTopp.DataStructureswithC++.NewJersey:PrenticeHallInc,AdivisionSimon&SchusterCompany,1996[M](第一版)(数据结构——C++语言描述.北京:清华大学出版社,1997[4]徐孝凯.数据结构实用教程(C/C++描述)[M].(第一版)北京:清华大学出版社.1999[5]陈慧南.数据结构(使用C++语言描述)[M].(第一版)南京:东南大学出版社.[6]殷人昆,陶永雷,谢若阳等.数据结构(用面向对象方法和C++描述)[M].(第一版)北京:清华大学出版社.1999九.程序代码1.主类/***@(#)Tower.java***@author*@version1.00/12/29*/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();}}2./***@(#)HannoiTower.java***@author*@version1.00/12/29*/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;

温馨提示

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

评论

0/150

提交评论