汉诺塔模拟程序报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

合肥学院

计算机科学与技术系

课程设计报告

2010~2011学年第一学期

课程 JAVA语言课程设计

课程设计名称汉诺塔模拟程序

学生姓名程伟

学号0704031021

专业班级网络工程(1)班

指导教师许强、张贯虹

2010年9月

1、 需求分析

本次的课程设计的主要任务是:设计一个模拟程序,图形化地展现汉诺塔的求解过程。主要解决的问题是:

1. 学习数据结构课程中关于汉诺塔的知识和算法。

N阶Hanoi塔,有3个柱子a、b、c,a柱子上从上至下叠放有n个直径由小到大、编号依次为1,2,…,n的圆盘。现要求将a柱上的n个圆盘移至c柱,并仍按同样顺序叠放。圆盘移动时须遵循以下原则:

1) 每次只能移动一个圆盘。

2) 圆盘可以插在a、b、c中的任何一个柱子上。

3) 任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。

圆盘的移动过程是一个递归调用过程。

2. 设计图形界面,画出3个柱子和若干个大小不一的圆盘,圆盘数量可人工设定。

Frame是一种具有边框的容器,它是Java中最常用的容器之一,它又是Java Application程序的图形用户界面。Frame只能作为最外层容器,不能被任何其他容器所包含。下拉列表是一种“多选一”的输入界面,通常只可看见下拉列表的一个选项和它右边的箭头按钮。当要改变盘子的个数时(即单击下拉列表中选中项),系统自动产生一个ItemEvent类对象所包含这个时间的信息,并将该对象作为实参传递给被自动调用的监听者的选择事件的响应方法。

3. 当点击“开始”按钮后,系统自动展现圆盘的移动过程,一秒移动一次。

线程是进程中一段连续的控制流程或是一段执行路径。在Java语言中,线程的创建有两种方式:(1)定义一个Thread类的子类,并在该子类中重写run()方法,该run()方法是线程执行的起点;(2)定义一个实现Runnable接口的类,并在该类中定义Runnable接口的run()方法,同样,该run()方法代表了线程执行的起点。本程序中用到第二种创建线程的方法。

2、 设计

.1 设计思想

本程序要求实现用图形界面,画出3个柱子和若干个大小不一的圆盘,同时圆盘数目可以人工设定,当点击“开始”按钮后,系统自动展现圆盘的移动过程,从而实现汉诺塔问题,其中圆盘移动速度是每秒移动一次。

1、 所谓汉诺塔,既是一种游戏,游戏的装置是一块铜板,上面有3根

杆,最左 杆自下而上、由大到小顺序串有64个金盘,呈一个塔形(如图1.1所示)。游戏要求把左边杆上的金盘全部移动到最右

边的杆上,条件是一次只能够动一个盘子,并且不允许大盘放在小盘上面。容易推出,n个盘从一根杆移到另一根杆需要2n-1次。

b

c

a

1)

3)

2)

图1.1 汉诺塔

汉诺塔算法属于递归算法,该算法过程为:

假定要把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);

2、 本程序定义了四个类,分别为:

1) Disk类,此类是继承了Button类,是他的一个子类,用于实现画出图形界面中的盘子,包括定义盘子数量,设置盘子的颜色,判断柱子最上面是否有盘子(设置和返回盘子的状态)。该类在TowerPoint类和HannioTower类中都有被调用。

2)TowerPoint类,本类用于实现定义盘子的放置位置,即一个坐标点(盘子的中心点在塔上的位置),同时还能够判断柱子上某点上是否有盘子(设置和返回该点上盘子的状态),还能够完成在该点上放置盘子,将盘子加到容器里。该类的初始化和真正实现是在HannioTower类中。

3)HannioTower类,此类中主要包括两个部分:

第一个部分:设置塔上点的属性,根据盘子数来存储三根柱子上点

的坐标(即盘子的放置位置)并设置该点上没有盘子。同时设置盘子的属性,包括设置盘子的宽度和高度以及将盘子放到柱子上,并设置柱子最上面有盘子。

在图形界面上画柱子(即三根直线和一根水平直线),灰色矩形长条作为底座,用红色点标注盘子的放置位置和用A、B和C来标明三根柱子。

第二个部分:也是核心部分,即汉诺塔算法通过函数的实现。该算法在上面已有介绍,但在算法的第二步中(把第n个盘子从a杆直接移到b 杆),要考虑到取a杆上的第n个盘子时,要判断是否有该盘子和获得该盘子,并获得该盘子的位置(为设置拿走后该位置上没有盘子的属性),以及在塔中获得盘子的放置位置。最后将盘子的整个移动过程追加于文本域中。

4)Tower类,该类为主类。主类使用Frame容器作为Java Application程序图形用户界面的。用于实现整个图形界面的布局(界面布局为边界布局),两个按钮、下拉按钮和文本域的定义及事件的监听。若点击“自动演示”按钮,判断线程是否存活,若不存活则创建线程;若点击“重新开始”按钮,若线程不存活,则重新构建图形界面,恢复到原始状态;若重新选择盘子数,则也重新构建图形界面,恢复到新的原始状态。

线程的实现是通过该类实现了Runnable接口,并在该类中定义Runnable接口的run()方法,该方法代表了线程的执行起点。

.2 详细设计

2.2.1 程序流程图(汉诺塔程序流程图)

开始

输入盘数(初始化三个)

判断盘数是否为1

盘子数大于1,继续进行递归过程

输出移动步骤

执行移位操作

执行移位操作

输出移动步骤

结束

相关文档
最新文档