课程设计(论文)任务书软件学院学院软件工程专业4班一、课程设计(论文)题目Hannoi塔二、课程设计(论文)工作自2011年12月12日起至2011年12月16日止。三、课程设计(论文)地点:软件学院实训中心四、课程设计(论文)内容要求:1.本课程设计的目的(1)掌握Java语言的程序设计方法;(2)理论联系实际,进一步提高学生的软件开发技术;(3)培养学生分析、解决问题的能力;(4)提高学生实践论文撰写能力。2.课程设计的任务及要求1)课程设计任务:设计GUI界面的Hannoi塔,用户可以通过拖动鼠标移动各个塔上的盘子,程序也可以自动演示盘子的移动过程。2)创新要求:1.有三个表示塔的对象,分别命名为A、B和C。A塔上有若干个盘子,盘子的大小不等,并按着大小顺序依次摆放在A塔上,大盘在下,小盘在上。用户可以用鼠标拖动盘子,把A塔上的盘子全部移动到另外两个塔中的任何一个塔上。要求每每次只能移动一个盘子,在任何时候不允许大盘压在小盘的上面。2.用户也可以选择让程序自动演示。选择自动演示后,程序将以动画形式演示把A塔上的盘子全部移到C塔的过程,并将移动过程以文本形式显示在一个文本区中。3)课程设计论文编写要求(1)课程设计任务及要求(2)设计思路--工作原理、功能规划(3)详细设计---数据分析、算法思路、类设计、功能实现(含程序流程图、主要代码及注释)、界面等。(4)运行调试与分析讨论---给出运行屏幕截图,分析运行结果,有何改进想法等。(5)设计体会与小结---设计遇到的问题及解决办法,通过设计学到了哪些新知识,巩固了哪些知识,有哪些提高。华东交通大学课程设计报告(6)参考文献(必须按标准格式列出,可参考教材后面的参考文献格式)(7)报告按规定排版打印,要求装订平整,否则要求返工;(8)课设报告的装订顺序如下:封面---任务书---中文摘要---目录----正文---附录(代码及相关图片)(9)严禁抄袭,如有发现,按不及格处理。4)课程设计评分标准:(1)学习态度:20分;(2)程序检查:20分;(3)课设答辩:20分;(4)课设报告:40分。5)参考文献:(1)丁振凡.Java语言实用教程(第2版)[M].清华大学出版社.2008.16)课程设计进度安排1.准备阶段(4学时):选择设计题目、了解设计目的要求、查阅相关资料2.程序模块设计分析阶段(4学时):程序总体设计、详细设计3.代码编写调试阶段(8学时):程序模块代码编写、调试、测试4.撰写论文阶段(4学时):总结课程设计任务和设计内容,撰写课程设计论文学生签名:2011年12月12日课程设计(论文)评审意见(1)学习态度(20分):优()、良()、中()、一般()、差();(2)程序检查(20分):优()、良()、中()、一般()、差();(3)课设答辩(20分):优()、良()、中()、一般()、差();(5)论文撰写(40分):优()、良()、中()、一般()、差();评阅人:钟小妹职称:讲师2011年12月16日华东交通大学课程设计报告中文摘要汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上安大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。汉诺塔的游戏规则:把三根柱子分别命名为A,B,C。大小不同的圆盘起始按照由下至上由大到小的顺序放在A柱上,最后需要通过移动使之按照由下至上由大到小的顺序放在C柱上,且在移动过程中不允许有大小错误,只允许小盘放在大盘上面。移到C柱即成功。本汉诺塔游戏程序是使此古老的游戏通过JAVA算法的实现在计算机上运行,且不丢失任何规则。华东交通大学课程设计报告目录一、课程设计任务及要求..................................................................1二、需求分析......................................................................................2三、设计思路......................................................................................3四、详细设计......................................................................................5五、运行调试与分析讨论................................................................10六、设计体会与小结........................................................................15七、参考文献....................................................................................16华东交通大学课程设计报告第1页一、课程设计任务及要求设计内容设计GUI界面的Hannoi塔,用户可以通过拖动鼠标移动各个塔上的盘子,程序也可以自动演示盘子的移动过程。设计要求1.有三个表示塔的对象,分别命名为A、B和C。A塔上有若干个盘子,盘子的大小不等,并按着大小顺序依次摆放在A塔上,大盘在下,小盘在上。用户可以用鼠标拖动盘子,把A塔上的盘子全部移动到另外两个塔中的任何一个塔上。要求每次只能移动一个盘子,在任何时候不允许大盘压在小盘的上面。2.用户也可以选择让程序自动演示。选择自动演示后,程序将以动画形式演示把A塔上的盘子全部移到C塔的过程,并将移动过程以文本形式显示在一个文本区中。华东交通大学课程设计报告第2页二、需求分析2.1界面及布局设计系统的整体布局为BorderLayout布局,采用了按钮、面板、复选框、文本框、文本区和拆分窗格等组件,按钮的有以下几个功能:1.可以改变盘子数目;2.可以改变盘子大小;3.可以改变盘子的颜色和背景颜色;4.可以重新开始游戏和自动演示搬运盘子;5.可以保存自动演示的文本信息;复选框可以控制背景音乐的播放和暂停,拆分窗格放入几个面板,面板全都是采用空布局。2.2A、B、C座的实现方法Java支持图形与图像功能,A,B,C座的实现就是利用java的这个功能,就是利用java2D技术。java拥有强大的二维图形处理能力,绘制A,B,C座就是使用paint(Graphicsg)方法,通过Graphics对象g调用drawLine()方法来绘制三条竖线,然后通过Graphics对象g调用fillRect()方法绘制出矩形区域,然后根据盘子数目在每条竖线上调用g.fillOval()方法绘制相同数目点,最后调用drawString()方法绘出A座,B座,C座,这样就实现了A座,B座,C座的绘制。2.3圆盘的实现方法JButton是java系统提供的类,实现圆盘的类Disc继承JButton类,所以Disc类是JButton的一个子类,创建的一个对象是Tower容器中的一个按钮用来表示Tower中的“盘子”,盘子对象是一个按钮,这样可以加入监视器,从而可以移动盘子。2.4改变背景和盘子颜色的方法Javax.Swing包中有类JColorChooser,该类有一个静态方法publicstaticColorshowDialog(Componentcomponent,Stringtitle,ColorinitalColor),该方法是创建一个颜色对话框,颜色对话框可果然那句用户在颜色对话框中选择的颜色返回一个颜色对象,当获取到这个颜色对象后,组件通过调用setBackground()方法来设置背景颜色和盘子颜色。华东交通大学课程设计报告第3页三、设计思路本程序要求实现用图形界面,画出3个柱子和若干个大小不一的圆盘,同时圆盘数目可以人工设定,当点击“开始”按钮后,系统自动展现圆盘的移动过程,从而实现汉诺塔问题,其中圆盘移动速度是每秒移动一次。汉诺塔算法属于递归算法,该算法过程为:假定要把n个盘子按题目规定由a杆借助b杆移动到c杆。模拟这一过程的算法称为autoMoveDisk(n,a,b,c)。则有:第一步:先把上面的n-1个盘子设法借助b杆放到c杆,如图1.1中的箭头1)所示,记做autoMoveDisk(n,a,c,b);第二步:把第n个盘子从a杆直接移到b杆,如图1.1中箭头2)所示;第三步:把c杆上的n-1个盘子借助a杆移到b杆,如图1.1中的箭头3)所示,记做autoMoveDisk(n,c,a,b);1、本程序定义了四个类,分别为:1)Disk类,此类是继承了Button类,是他的一个子类,用于实现画出图形界面中的盘子,包括定义盘子数量,设置盘子的颜色,判断柱子最上面是否有盘子(设置和返回盘子的状态)。该类在TowerPoint类和HannioTower类中都有被调用。2)TowerPoint类,本类用于实现定义盘子的放置位置,即一个坐标点(盘子的中心点在塔上的位置),同时还能够判断柱子上某点上是否有盘子(设置和返回该点上盘子的状态),还能够完成在该点上放置盘子,将盘子加到容器里。该类的初始化和真正实现是在HannioTower类中。3)HannioTower类,此类中主要包括两个部分:第一个部分:设置塔上点的属性,根据盘子数来存储三根柱子上点的坐标(即盘子的放置位置)并设置该点上没有盘子。同时设置盘子的属性,包括设置盘子的宽度和高度以及将盘子放到柱子上,并设置柱子最上面有华东交通大学课程设计报告第4页盘子。在图形界面上画柱子(即三根直线和一根水平直线),灰色矩形长条作为底座,用红色点标注盘子的放置位置和用A、B和C来标明三根柱子。第二个部分:也是核心部分,即汉诺塔算法通过函数的实现。该算法在上面已有介绍,但在算法的第二步中(把第n个盘子从a杆直接移到b杆),要考虑到取a杆上的第n个盘子时,要判断是否有该盘子和获得该盘子,并获得该盘子的位置(为设置拿走后该位置上没有盘子的属性),以及在塔中获得盘子的放置位置。最后将盘子的整个移动过程追加于文本域中。4)Tower类,该类为主类。主类使用Frame容器作为JavaApplication程序图形用户界面的。用于实现整个图形界面的布局(界面布局为边界布局),两个按钮、下拉按钮和文本域的定义及事件的监听。若点击“自动演示”按钮,判断线程是否存活,若不存活则创建线程;若点击“重新开始”按钮,若线程不存活,则重新构建图形界面,恢复到原始状态;若重新选择盘子数,则也重新构建图形界面,恢复到新的原始状态。线程的实现是通过该类实现了Runnable接口,并在该类中定义Runnable接口的run()方法,该方法代表了线程的执行起点。华东交通大学课程设计报告第5页四、详细设计程序流程图(汉诺塔程序流程图)程序代码说明开始输入盘数(初始化三个)判断盘数是否为1盘子数大于1,继续进行递归过程输出移动步骤执行移位操作执行移位操作输出移动步骤结束是华东交通大学课程设计报告第6页程序中引入的包:packagecode;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;(1)盘子类:类名:Disk作用:定义图形界面中的盘子属性继承的父类名:ButtonpublicclassDiskextendsButton{}定义的对象:intnumber//盘子的个数booleanisTop=false//判断柱子最上面是否有盘子主要成员方法:publicbooleangetIsTop()//返回最上面是否有盘子的属性publicvoidsetIsTop(booleanb)//