数据结构课设——汉诺塔游戏演示

源代码下载地址:数据结构课设——汉诺塔游戏演示

一. 问题描述

汉诺塔游戏问题中的数据元素具有如下形式:
数据结构
lchild:左孩子结点
rchild:右孩子结点
num:该移动步骤需要移动的盘子的编号
s:该移动步骤的起始柱
e:该移动步骤的终点柱
p[3]:三根柱子的横坐标
n:汉诺塔的层数
t:移动速度

二. 功能需求

要求输入盘子数(2个以上有效),移动速度,开始演示汉诺塔移动的步骤;
盘子,A,B,C柱需要自己绘制;
初始时盘子在A柱上通过B柱最终移动到C柱上(其中,盘子从上往下越来越大),显示出盘子在几个柱之间的移动过程。

三. 实现要点
  1. 汉诺塔游戏过程可以看做是对二叉树的中序遍历:
    【将n-1个盘子从A移到B】 ----> 【中序遍历左子树】[n-1(A)->B]
    【将第n个圆盘从A移到C】----> 【访问根节点】[N(A)->C]
    【将n-1个圆盘从B移到C】—> 【中序遍历右子树】[n-1(B)->C]
    使用了二叉树来存储汉诺塔游戏解决方案的移动步骤,在构造解空间树的时候,遵循由初始柱——>目标柱,分解为两部分:初始柱——>中转柱和中转柱——>目标柱,然后通过中序遍历解空间树演示移动过程。
  2. 汉诺塔游戏演示过程的绘制使用了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()函数来控制。
  3. 由于程序的图形绘制演示功能不够完善,目前只能演示2<=层数<=16的汉诺塔移动过程
  4. 编译环境: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退出程序:
在这里插入图片描述

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
汉诺塔游戏是一款非常受欢迎的益智游戏,其规则简单却寓意深刻,不仅能锻炼思维能力,还有助于培养耐心和毅力。而在实现汉诺塔游戏的过程中,Java语言被广泛应用,下面介绍一下Java实现汉诺塔游戏动画演示的代码。 在Java中实现汉诺塔游戏动画演示的关键其实就是利用递归的思想来求解游戏。具体实现步骤如下: 1. 定义汉诺塔游戏的三个棍子,可以使用数组或集合来实现。 2. 定义汉诺塔游戏的起始状态和目标状态,即将初始状态上的所有盘子全部移至目标状态上。 3. 定义一个递归函数,根据汉诺塔游戏规则将所有盘子从起始状态移至目标状态。 4. 在递归过程中,每次移动一个盘子,并画出该过程的动画效果。 Java代码实现如下: public void move(int num, char from, char to, char mid) { if (num == 1) { System.out.println("盘子" + num + "由" + from + "移动到" + to); // 在画布上绘制移动的过程 } else { move(num - 1, from, mid, to); System.out.println("盘子" + num + "由" + from + "移动到" + to); // 在画布上绘制移动的过程 move(num - 1, mid, to, from); } } 以上代码实现了汉诺塔游戏的递归求解过程,并在控制台打印了每次盘子移动的情况。要实现动画效果,可以在移动盘子的部分增加绘图操作,例如使用Java的AWT或JavaFX库来实现。 总之,Java实现汉诺塔游戏动画演示的代码并不复杂,只需用递归的方式来求解游戏,加上绘图操作即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clx_xuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值