汉诺塔可视化移动过程
班级:计科1203班 姓名:杜杨浩 学号:2012310200707
问题描述:假设有三个塔座:X,Y,Z,在塔座X上有N个直径大小各不相同,按圆盘大小从小到大编号为1,2,…,N的圆盘。要求将X塔座上N个圆盘移动到塔座Z上,并仍按同样顺序叠排。圆盘移动时必须遵守下列规则:
(1) 每次只能移动一个圆盘
(2) 圆盘可以加到塔座X、Y、Z中任意一个上
(3) 任何时刻都不能将一个较大的圆盘放在较小的圆盘之上
要求将圆盘移动的整个过程用可视化图形的方式表现出来。
汉诺塔可视化移动过程设计说明书
一、需求分析:
该实验的核心目标就是将圆盘移动的整个过程用可视化的方式表现出来,具体的还有如下功能实现:
1) 设置圆盘的颜色和塔座的颜色(圆盘的边缘颜色与塔座颜色一致)
2) 设置圆盘的数量和圆盘的最大尺寸
3) 设置开始按钮和退出按钮,分别控制程序的开始和退出
4) 在圆盘整个移动过程结束后会弹出一个对话框,提示用户圆盘移动过程已结束,当用户点击弹出对话框确定按钮时,弹出对话框和原对话框均消失
二、系统模型:
该程序采用二维模型,用平面图形来表示三维物体。
三、界面设计:
该程序设置了6个下拉列表框用于分别设置圆盘的颜色和塔座的颜色。另设置了2个下拉列表框用于设置圆盘的数量和最大圆盘的尺寸。另附设两个按钮,分别为开始按钮和退出按钮。将每个塔座用英文字母代表以静态文本框的形式表现出来。上述是控件的界面设计,下面是核心的圆盘动态移动过程的界面设计:
首先,圆盘的每一次移动过程如下:假设现在是X——>Y(圆盘从塔座X移动到塔座Y),那么界面的显示顺序是这样的:
1) X塔座上去掉最顶层的圆盘后所剩圆盘的全部显示,X塔座上原最顶层的圆盘在X塔座的顶端(即表现出要离开X塔座),Y、Z塔座显示原有的所有圆盘。
2) X塔座上原最顶层的圆盘由X顶端移动到Y顶端,其它不变
3) X塔座上原最顶层的圆盘由Y塔座顶端移动到Y塔座上所有圆盘的最顶层,其它不变
这样圆盘的一次移动过程结束,每一次的移动过程都由诸如上述步骤顺序组合显示,这样整个移动过程就是每一次移动过程的累加了。最后当整个圆盘移动过程结束,会弹出一个对话框,提示用户圆盘移动过程已经结束。但用户点击弹出式对话框确定按钮时,弹出式对话框会关闭,并且原对话框也关闭,整个界面显示过程结束。
四、系统中重要类及方法的说明:
该程序设计中除了MFC自带的对话框类,我还设计了两个一般类,和一个对话框类。其中一般类和MFC自带对话框类的设计是关键,自行设计的对话框类只是为了作为弹出式对话框提示用户相关结束信息。下面主要讲解一下两个一般类和MFC自带的对话框类。
首先是两个一般类。分别为disk类和tazuo类。disk类即为圆盘类。有颜色和尺寸两类属性。对应方法有五个,分别为:
int Get_color_red(); //获取圆盘颜色RGB中的红色信息
int Get_color_green();//获取圆盘颜色RGB中的绿色信息
int Get_color_blue();//获取圆盘颜色RGB中的蓝色信息
void Set_digits(int size); //设置圆盘的半径
int Get_digits(); //获取圆盘的半径
而tazuo类的属性和方法相对较少。其属性为int cr,cg,cb;分别代表塔座颜色RGB中的R、G、B信息。对应的方法有三个,分别为:
int Get_color_red(); //获取塔座颜色RGB中的红色信息
int Get_color_green();//获取塔座颜色RGB中的绿色信息
int Get_color_blue();//获取塔座颜色RGB中的蓝色信息
接着详细介绍一下MFC自带的对话框类。在该类中我附加了如下属性:
bool paintbegin; //用于标识是否可以开始绘图
int diskred;//用于记录下拉列表框中圆盘颜色RGB值中的R信息
int diskgreen;// 用于记录下拉列表框中圆盘颜色RGB值中的G信息
int diskblue;// 用于记录下拉列表框中圆盘颜色RGB值中的B信息
int tazuored;// 用于记录下拉列表框中塔座颜色RGB值中的R信息
int tazuogreen;// 用于记录下拉列表框中塔座颜色RGB值中的G信息