源代码下载地址:数据结构课设——汉诺塔游戏演示
一. 问题描述
汉诺塔游戏问题中的数据元素具有如下形式:
lchild:左孩子结点
rchild:右孩子结点
num:该移动步骤需要移动的盘子的编号
s:该移动步骤的起始柱
e:该移动步骤的终点柱
p[3]:三根柱子的横坐标
n:汉诺塔的层数
t:移动速度
二. 功能需求
要求输入盘子数(2个以上有效),移动速度,开始演示汉诺塔移动的步骤;
盘子,A,B,C柱需要自己绘制;
初始时盘子在A柱上通过B柱最终移动到C柱上(其中,盘子从上往下越来越大),显示出盘子在几个柱之间的移动过程。
三. 实现要点
- 汉诺塔游戏过程可以看做是对二叉树的中序遍历:
【将n-1个盘子从A移到B】 ----> 【中序遍历左子树】[n-1(A)->B]
【将第n个圆盘从A移到C】----> 【访问根节点】[N(A)->C]
【将n-1个圆盘从B移到C】—> 【中序遍历右子树】[n-1(B)->C]
使用了二叉树来存储汉诺塔游戏解决方案的移动步骤,在构造解空间树的时候,遵循由初始柱——>目标柱,分解为两部分:初始柱——>中转柱和中转柱——>目标柱,然后通过中序遍历解空间树演示移动过程。 - 汉诺塔游戏演示过程的绘制使用了EasyX图形库
全局变量:p[3]三根柱子的横坐标,n盘数,t移动速度
函数:
void ColorLine(int num, int s, int e, int color)改变线段颜色,
void PrintPillar()打印三根柱子,
void InitGraph()绘制初始化盘子都在A柱的图,
void Moveto(int from, int to, int len)实现盘子的移动。
其中,盘子的移动速度通过调用Sleep()函数来控制。 - 由于程序的图形绘制演示功能不够完善,目前只能演示2<=层数<=16的汉诺塔移动过程
- 编译环境:VS2019,配置EasyX图形库
四. 类定义
为二叉树建立BiTree类,其类定义如下:
#include<iostream>
#include<cstdio>
#include<graphics.h>
#include<easyx.h>
#include<conio.h>
#include<cmath>
using namespace std;
const int LEFT = 40;
const int RIGHT = 760;
const int TOP = 70;
const int BOTTOM = 450;
const int REC_WIDTH = 20;
//长方块宽20
//720/4=180
struct Node {
int num;//盘号
int s, e;//起始柱 终点柱
Node* lchild, * rchild;
};
int p[3], n, t;//三根柱子的横坐标,盘数,移动速度
void ColorLine(int num, int s, int e, int color);//改变线段颜色
void PrintPillar();//打印三根柱子
void InitGraph();//绘制初始化盘子都在A柱的图
void Moveto(int from, int to, int len);//len:半盘长 实现盘子的移动
void Menu();//提供操作菜单
class BiTree {
private:
int cnt;//移动步数
Node* root;
public:
BiTree(int a,int b,int c,int n);
~BiTree();
Node* create(int a, int b, int c, int n);
void postorder(Node* p); //中序遍历
void display();//演示
void release(Node *p);
};
在BiTree类中,提供了如下成员函数:
(1) 函数的声明:BiTree(int a,int b,int c,int n);
完成的功能:调用成员函数 create(int a, int b, int c, int n)
构造层数为n的存储汉诺塔移动步骤的解空间树
(2) 函数的声明:~BiTree();
完成的功能:调用成员函数release(Node *p)
释放解空间树
(3) 函数的声明:Node* create(int a, int b, int c, int n);
完成的功能:创建层数为n的存储汉诺塔移动步骤的解空间树
(4) 函数的声明:void postorder(Node* p); //中序遍历
完成的功能:中序遍历二叉树,调用函数Moveto(int from, int to, int len)
移动盘子
(5) 函数的声明:void release(Node *p);
完成的功能:释放二叉树
(6) 函数的声明:void display();
完成的功能:调用成员函数postorder(root)
演示汉诺塔的移动过程
五. 成果展示
开始程序执行,出现以下功能选择界面:
输入1进入演示功能界面,
若层数大于16需重新输入:
输入层数3,移动速度1:
按任意键进入演示界面:
输入任意键退出演示功能界面:
输入任意键返回功能选择界面:
输入0退出程序: