收藏 分销(赏)

Java专业课程设计方案报告汉诺塔.doc

上传人:精**** 文档编号:2658991 上传时间:2024-06-04 格式:DOC 页数:33 大小:146.04KB 下载积分:12 金币
下载 相关 举报
Java专业课程设计方案报告汉诺塔.doc_第1页
第1页 / 共33页
Java专业课程设计方案报告汉诺塔.doc_第2页
第2页 / 共33页


点击查看更多>>
资源描述
东华理工大学 Java课程设计汇报 题 目 : 汉诺塔 所在院系:  理学院 学生姓名: 漆俊、朱学曼、颜瑶 专 业: 信息和计算科学 班 级:1223201-2 指导老师:黄国辉 12月29日 目录 一. 概述 1. 题目概述 2. 题目分析 二. 课程设计 1.课程设计目标 2.课程设计内容 3.课程设计环境 4.课程设计要求 三.系统需求分析 1.系统目标 2.主体功效 3.开发环境 四.系统概要设计 1.系统功效模块划分 2.步骤图 3.自定义类说明 五.系统具体设计 六.测试 1. 测试方案 2. 测试结果 七.小结 八.参考文件 九. 程序代码 一.概述 1. 题目概述: 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程序设计设计目标是加深对理论教学内容了解和掌握,使学生较系统地掌握程序设计及其在网络开发中广泛应用,基础方法及技巧,为学生综合利用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。 2. 课程设计内容 我设计Hannoi塔,除了要编写6个java文件所给出类外,还需要java系统提供部分关键类,如JButton,JCheckBox等。汉诺塔中有三个座,名字分别为A,B,C。刚开始时候A塔上有3个大小不等盘子,这些盘子从座底到座顶按着大小次序依次摆放在A座上。用户能够用鼠标选中盘子,然后经过拖动鼠标来移动盘子。释放鼠标来放置该盘子。程序要求用户在移动盘子过程中,不许可吧大盘子放置在小盘子上面,用户最终要完成是把A座上全部盘子移动到B座或C座上。用户能够经过Hannoi塔界面提供改变盘子数目功效来改变盘子数目,同时能够改变盘子大小和改变盘子和界面背景颜色,而且还能够选择控制背景音乐播放。用户能够经过单击Hannoi塔界面上提供按钮,让程序自动完成把A座上盘子全部移动到C座上。用户在移动盘子过程中,能够随时单击Hannoi塔界面上提供按钮,重新开始。 3. 课程设计环境 硬件要求能运行Windows 9.X操作系统微机系统。JAVA程序设计语言及对应集成开发环境,J2SDK和ECLIPSE开发工具。 4. 课程设计要求 按课程设计指导书提供课题,要求学生在自行完成各个操作步骤,并能实现且达成举一反三目标,完成一个项目处理一类问题。要求学生能够全方面、深入了解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;对此能够很好地了解和掌握,能够进行简单分析和判定;能编写出含有良好风格程序;掌握JAVA程序设计基础技能和面向对象概念和方法;了解多线程、安全和网络等编程技术。同时培养学生进行分析问题、处理问题能力;培养学生进行设计分析、设计方法、设计操作和测试、设计过程观察、了解和归纳能力提升。 三.系统需求分析 1. 系统目标 所设计代码能够正常运行程序,而且根据设计目标预想完成具体功效。 2. 主体功效 (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. 系统功效模块划分 (1)Tower.java(主类) Tower类负责创建Hannoi塔主窗口,该类含有main方法,Hannoi塔从类开始实施。Tower类组员变量中有两种关键类型对象:一个int基础型数据和一个char型数组。两种类型对象分别是:HannoiTower和Button对象 。 (2)HannoiTower.java HannoiTower类是javax.swing包中JPanel容器子类,创建容器被添加到Tower窗口中心。HannoiTower类组员变量有两种关键类型对象、一个int基类型数据和一个char型数组。两种类型对象分别是:Disk、TowerPoint。 (3)TowerPoint.java TowerPoint类负责在HannoiTower中创建表示位置塔点对象。 (4)Disk.java Disk类是Button一个子类,创建对象是HannoiTower容器中一个按钮,用来表示HannoiTower中盘子。 2. 步骤图(图4-1) 3. 自定义类说明 (1)自定义类 类名: JButton 作用: 自定义主类, 实现圆盘类Disc继承JButton类 继承父类: Disc类 实现接口: 没有 (2)组员变量 JButton组员变量 组员变量描述 变量类型 名称 控制盘子数目 String JLabel 重新开始 String renew.setText 开始游戏 String renew.setText 背景颜色 String bgcolor 盘子颜色 String pzcolor (3)方法表 Chesspad方法 方法名 功效 备注 fillRect() 绘制出矩形区域 结构方法 g.fillOval() 绘制相同数目点 结构方法 drawString() 绘制出A、B、C座  结构方法 setBackground() 设置背景颜色和盘子颜色 结构方法 Timer(int a,Object b) 创建一个计时器  结构方法 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-1 Tower()是结构方法,负责完成窗口初始化。 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] Sartaj Sahni. Data Structure, Algorithms, and Application in C++. The McGraw-Hill Company Inc.1998[M] (第一版) (数据结构、算法和应用——C++语言描述.北京:机械工业出版社.1999 [3] Willan Ford,Willian Topp. Data Structures with C++. New Jersey:Prentice Hall Inc, Adivision Simon & Schuster Company,1996[M] (第一版) (数据结构——C++语言描述.北京:清华大学出版社,1997 [4] 徐孝凯.数据结构实用教程(C/C++描述)[M]. (第一版)北京:清华大学出版社.1999 [5] 陈慧南.数据结构(使用C++语言描述)[M]. (第一版)南京:东南大学出版社. [6] 殷人昆,陶永雷,谢若阳等.数据结构(用面向对象方法和C++描述)[M]. (第一版)北京:清华大学出版社.1999 九.程序代码 1.主类 /** * @(#)Tower.java * * * @author * @version 1.00 /12/29 */ import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Tower extends Frame implements ActionListener,Runnable { HannoiTower tower=null; Button renew,auto=null; char towerName[]={'A','B','C'}; int 盘子数目,盘宽,盘高; Thread thread; TextArea 信息条=null; public Tower() { thread=new Thread(this); 盘子数目=5; 盘宽=80; 盘高=18; 信息条=new TextArea(12,12); 信息条.setText(null); tower=new HannoiTower(盘子数目,盘宽,盘高,towerName,信息条); renew=new Button("重新开始"); auto=new Button("自动演示搬盘子"); renew.addActionListener(this); auto.addActionListener(this); add(tower,BorderLayout.CENTER); add(renew,BorderLayout.SOUTH); add(auto,BorderLayout.NORTH); add(信息条,BorderLayout.EAST); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); setVisible(true); setBounds(60,20,670,540); validate(); } public void actionPerformed(ActionEvent e) { if(e.getSource()==renew) { if(!(thread.isAlive())) { this.remove(tower); 信息条.setText(null); tower=new HannoiTower(盘子数目,盘宽,盘高,towerName,信息条); add(tower,BorderLayout.CENTER); validate(); } else { } } if(e.getSource()==auto) { if(!(thread.isAlive())) { thread=new Thread(this); } try { thread.start(); } catch(Exception eee) { } } } public void run() { this.remove(tower); 信息条.setText(null); tower=new HannoiTower(盘子数目,盘宽,盘高,towerName,信息条); add(tower,BorderLayout.CENTER); validate(); tower.自动演示搬运盘子(盘子数目,towerName[0] ,towerName[1],towerName[2]); } public static void main(String args[]) { new Tower(); } } 2. /** * @(#)HannoiTower.java * * * @author * @version 1.00 /12/29 */ import javax.swing.*; import java.awt.*; import java.awt.event.*; public class HannoiTower extends JPanel implements MouseListener,MouseMotionListener { TowerPoint point[]; int x,y; boolean move=false; Disk 盘子[]; int startX,startY; int startI ; int 盘子数目=0; int width,height; char towerName[]={'A','B','C'}; TextArea 信息条=null; public HannoiTower(int number,int w,int h,char[] name,TextArea text) { towerName=name; 盘子数目=number; width=w; height=h; 信息条=text; setLayout(null); addMouseListener(this); addMouseMotionListener(this); 盘子= new Disk[盘子数目]; point=new TowerPoint[3*盘子数目]; int space=20; for(int i=0;i<盘子数目;i++) { point[i]=new TowerPoint(40+width,100+space,false); space=space+height; } space=20; for(int i=盘子数目;i<2*盘子数目;i++) { point[i]=new TowerPoint(160+width,100+space,false); space=space+height; } space=20; for(int i=2*盘子数目;i<3*盘子数目;i++) { point[i]=new TowerPoint(280+width,100+space,false); space=space+height; } int tempWidth=width; int sub=(int)(tempWidth*0.2); for(int i=盘子数目-1;i>=0;i--) { 盘子[i]=new Disk(i,this); 盘子[i].setSize(tempWidth,height); tempWidth=tempWidth-sub; } for(int i=0;i<盘子数目;i++) { point[i].放置盘子(盘子[i],this); if(i>=1) 盘子[i].set上方有盘(true); } } public void paintComponent(Graphics g) { 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()); int leftx=point[盘子数目-1].getX()-width; int lefty=point[盘子数目-1].getY(); int w=(point[3*盘子数目-1].getX()+width)-(point[盘子数目-1].getX()-width); int h=height/2; g.setColor(Color.orange); g.fillRect(leftx,lefty,w,h); g.setColor(Color.red); int size=4; for(int i=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); } public void mousePressed(MouseEvent e) { Disk 盘子=null; Rectangle rect=null; if(e.getSource()==this) move=false; if(move==false) if(e.getSource() instanceof Disk) { 盘子=(Disk)e.getSource(); startX=盘子.getBounds().x; startY=盘子.getBounds().y; rect=盘子.getBounds(); for(int i=0;i<3*盘子数目;i++) { int x=point[i].getX(); int y=point[i].getY(); if(rect.contains(x,y)) { startI=i; break; } } } } public void mouseMoved(MouseEvent e) { } public void mouseDragged(MouseEvent e) { Disk disk=null; if(e.getSource() instanceof Disk) { 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); } } } public void mouseReleased(MouseEvent e) { Disk disk=null; move=false; Rectangle rect=null; if(e.getSource() instanceof Disk) { disk=(Disk)e.getSource(); rect=disk.getBounds(); e=SwingUtilities.convertMouseEvent(disk,e,this); } if(e.getSource()==this) { boolean containTowerPoint=false; int x=0,y=0; int endI=0; if(disk!=null) { for(int i=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) { Disk tempDisk=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);} } } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseClicked(MouseEvent e) { } public void 自动演示搬运盘子(int 盘子数,char one,char two,char three) { if(盘子数==1) { 信息条.append(""+one+" 到: "+three+"塔\n"); Disk disk=在塔中获取最上面盘子(one); int startI=在塔中获取最上面盘子位置(one); int endI=在塔中获取最上面盘子上方位置(three); if(disk!=null) { point[endI].放置盘子(disk,this);
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服