SimpleCG动画示例--汉诺塔动画演示

写给大一小白的 汉诺塔问题 C++详解(动画演示) 传说: 在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和... 阅读详情

前言

        SimpleCG的使用方法在前面已经介绍了许多,有兴趣的同学如果有去动手,制作一些简单动画应该没多大问题的。所以这次我们来演示一下简单动画。我们刚学习C语言的递归函数时,有一个经典例子相信很多同学都写过,那就是汉诺塔。那么我们今天就来写一个汉诺塔的直观动画演示。

运行程序下载bin/AnimateHannuo.zip · master · b2b160 / SimpleCG_Demo · GitCode

一、全部源码


#include "../import/include/CGBoard.h"
#include "math.h"
#ifdef _DEBUG
#pragma comment(lib,"../import/lib/SimpleCG_MDd.lib")
#else
#pragma comment(lib,"../import/lib/SimpleCG_MT.lib")
#endif

#define C_FLOOR_CNT		7
#define C_FLOOR_BOTTOM  380
#define C_HAN_HEIGHT	10
#define C_HAN_SPEED		30

int g_nWidth = 640;		//画面宽度
int g_nHeight= 400;		//画面高度
enum ENUM_DIRECTION
{
	enumDIR_NULL,
	enumDIR_UP,
	enumDIR_DOWN
};
struct tagHannuo
{
	int nNumber;
	COLORREF nColor;
	int nWidth;
	int nPosHan;
	int nDir;
	POINT ptPos;
};

tagHannuo g_pHannuo[C_FLOOR_CNT];
int g_nMoving = -1;
void DrawHan()
{
	int i;
	int j=0;

	setlinewidth(2);
	
	for(i=0;i<3; i++ )
	{
		_line( 100 + 200 * i, 50, 100 + 200 * i,C_FLOOR_BOTTOM );
		_line( 20 + 200 * i, C_FLOOR_BOTTOM, 180 + 200 * i,C_FLOOR_BOTTOM );
	}
	int nIndex = 0;
	for(j=0;j<3;++j)
	{
		nIndex = 0;
		for(i=C_FLOOR_CNT-1;i>=0; i-- )
		{
			if(g_pHannuo[i].nPosHan == j && i != g_nMoving)
			{
				setfillcolor(g_pHannuo[i].nColor);
				_solidrectangle( 100 +200 * g_pHannuo[i].nPosHan - g_pHannuo[i].nWidth/2, C_FLOOR_BOTTOM - nIndex * C_HAN_HEIGHT - C_HAN_HEIGHT, 100 +200 * g_pHannuo[i].nPosHan + g_pHannuo[i].nWidth/2, C_FLOOR_BOTTOM - nIndex * C_HAN_HEIGHT);
				++nIndex;
			}
		}
	}
}
void DrawMoving()
{
	if(g_nMoving>=0)
	{
		setfillcolor(g_pHannuo[g_nMoving].nColor);
		_solidrectangle( g_pHannuo[g_nMoving].ptPos.x, g_pHannuo[g_nMoving].ptPos.y, g_pHannuo[g_nMoving].ptPos.x + g_pHannuo[g_nMoving].nWidth, g_pHannuo[g_nMoving].ptPos.y+ C_HAN_HEIGHT);
	}
}
void DrawAll()
{
	ClearDevice();

	DrawHan();
	DrawMoving();
	ReflushWindow();
}
void Moving( int nItem, int nFrom, int nTo )
{
	g_nMoving = nItem;
	g_pHannuo[nItem].ptPos.x = 100 +200 * nFrom - g_pHannuo[nItem].nWidth/2;
	for( g_pHannuo[nItem].ptPos.y = C_FLOOR_BOTTOM - C_FLOOR_CNT * C_HAN_HEIGHT; IsShowingWindow()&&g_pHannuo[nItem].ptPos.y>40; g_pHannuo[nItem].ptPos.y-=10 )
	{
		DrawAll();
		Sleep(C_HAN_SPEED);
	}
	int nXStep = (nTo - nFrom) * 5;
	int nDest = 100 +200 * nTo - g_pHannuo[nItem].nWidth/2;
	for( g_pHannuo[nItem].ptPos.x = 100 +200 * nFrom - g_pHannuo[nItem].nWidth/2; IsShowingWindow()&&abs(g_pHannuo[nItem].ptPos.x-nDest)>5; g_pHannuo[nItem].ptPos.x+=nXStep )
	{
		DrawAll();
		Sleep(C_HAN_SPEED);
	}
	g_pHannuo[nItem].ptPos.x = 100 +200 * nTo - g_pHannuo[nItem].nWidth/2;
	for( g_pHannuo[nItem].ptPos.y = 40; IsShowingWindow()&&g_pHannuo[nItem].ptPos.y<C_FLOOR_BOTTOM - C_FLOOR_CNT * C_HAN_HEIGHT; g_pHannuo[nItem].ptPos.y+=10 )
	{
		DrawAll();
		Sleep(C_HAN_SPEED);
	}
	g_nMoving = -1;
	g_pHannuo[nItem].nPosHan = nTo;
}
void MoveHan( int nFloor, int nFrom, int nTo, int nMiddle )
{
	if( nFloor == 1 )
	{
		Moving( nFloor-1, nFrom-1, nTo-1);
		return;
	}
	MoveHan( nFloor-1, nFrom, nMiddle, nTo );
	Moving( nFloor-1, nFrom-1, nTo-1);
	MoveHan( nFloor-1, nMiddle, nTo, nFrom );
}
void DrawProcess()
{
	bool bIsRunning = true;
	int i;
	srand(GetTickCount());
	for(i=0;i<C_FLOOR_CNT; i++ )
	{
		g_pHannuo[i].nNumber=i+1;
		g_pHannuo[i].nColor = RGB(rand()%200,rand()%200,rand()%200);
		g_pHannuo[i].nDir = enumDIR_NULL;
		g_pHannuo[i].nPosHan = 0;
		g_pHannuo[i].nWidth = 20*(i+1);
	}
	MoveHan(C_FLOOR_CNT,1,2,3);
	
	DrawAll();
}
int _tmain(int argc, _TCHAR* argv[])
{
	//初始化
	if( !ShowingBoard(g_nWidth,g_nHeight, DrawProcess))
		return 1;
	//关闭图库
	CloseBoard();
	return 0;
}

对于写过汉诺塔的同学来说,程序逻辑应该没什么难度,就是在递归程序上增加了动画过程。

二、演示效果

对于5层来说是不难的,但递归对于层数增加所带来的时间消耗是呈指数增加的,所以通过动画来观察层数增加带来的时间消耗非常直观。在原始的汉诺塔里是64层,要移完所有的层数将会世界末日,因为即便到世界的尽头也无法完成。有兴趣的同学可以把代码输入并把层数加大看看。

三、代码下载

汉诺塔演示源代码

AnimateHannuo · master · b2b160 / SimpleCG_Demo · GitCode

库安装方法如下

SimpleCG库安装使用_b2b160的博客-优快云博客

805-解决汉诺塔问题 汉诺塔问题 汉诺塔问题源自印度一个古老的传说,印度教的“创造之神”梵天创造世界时做了 3 根金刚石柱,其中的一根柱子上按照从小到大的顺序摞着 64 个黄金圆盘。梵天命令一个叫婆罗门的门徒将所有的圆盘移动到另一个柱子上, 移动过程中必须遵守以下规则: 每次只能移动柱子最顶端的一个圆盘; 每个柱子上,小圆盘永远要位于大圆盘之上; 图 1 展示了包含 3 个圆盘的汉诺塔问题: 一根柱子上摞着 3 个不同大小的圆盘,那么在不违反规则的前提下,如何将它们移动到另一个柱子上呢?图 2 给大家提供了一种实现方案: 阅读详情

相关推荐

汉诺塔问题算法(c语言控制台动画演示版)

递归思想非常简单也是最常见的算法之一,其中一代表例题就是汉诺塔问题。解题的算法很简单:void Hanoi(int n,int A,int B,int C){    if(n>0)    {        Hanoi(n-1,a,c,b);        move(a,b);            show();                 Hanoi(n-1,c,b,a); 

miaowangjian的专栏 8166

海龟绘制简单动画——汉诺塔

本篇介绍用递归算法解决汉诺塔问题,并用动画的形式演示整个盘片移动过程,直到从A柱全部移到C柱。并介绍了从大到小生成盘片放置于A柱,盘片的移动,不同盘片的颜色设置(最大盘红色渐变到最小盘蓝色),以及键盘事件编程等。

hz_zhangrl的博客 1468

少儿学编程系列 --- 使用Python Turtle动画演示汉诺塔(Tower of Hanoi)如何移动

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 目前汉诺塔是一个非常好玩的益智玩具,常见的汉诺塔是3-10层,如下图是一个7层的汉诺塔。 本文使用python、turtle, 动画演示汉诺塔如何移动,让孩子清楚的看到怎么移动。

penriver的博客 2009

用Python实现可视化汉诺塔动画:

用Python实现可视化汉诺塔动画: 1)可设置盘子的数量、速度(盘子移动的快慢); 2)记录盘子移动的次数; 3)可重置动画; 4)可单步移动,可连续移动; 5)使用面向对象程序设计实现。

weixin_64890968的博客 2561

汉诺塔递归算法可视化演示程序(参考实现)

htmltable {th, td {th {pre {简介:汉诺塔是一种经典的逻辑谜题,基于递归与分治法思想,要求将所有圆盘从源柱移动到目标柱,遵循大盘不压小盘的规则。本“汉诺塔演示程序”通过图形化界面直观展示递归算法的执行过程,包含用户交互、动画效果、合法性校验和自动演示等功能,帮助学习者深入理解递归机制与问题分解策略。该程序不仅适用于算法教学,也是掌握递归编程与逻辑思维训练的理想实践项目。

weixin_35433448的博客 1498

汉诺塔算法的MFC动画演示程序设计与实现

MFC,即Microsoft Foundation Classes,是一个C++库,旨在封装Windows API的底层操作,简化Windows应用程序的开发。MFC利用面向对象的设计和编程技术,将Windows编程中的大量细节抽象为对象,如窗口、控件、设备上下文等。开发者可以利用这些类,不必深入了解底层API,就能高效地开发出具有标准Windows用户界面的应用程序。MFC框架同样包含消息映射机制,这是MFC与传统Win32 API编程方式的一个重要区别。

weixin_42605397的博客 826

SimpleCG程序运行框架介绍

通过以上三个框架的内容介绍,同学们可以依据所设计软件的特点选择适当的框架进行SimpleCG的应用开发。后续将用几个小游戏的例子进一步介绍游戏框架的开发方法,有兴趣的同学可以关注并留意后续文章介绍。

我的程序世界 249

汉诺塔演示动画很经典

经典的汉诺塔动画,基于MFC,基于MFC编写程序,在客户区以动画的形式显示汉诺塔移动的过程。程序运行伊始,先在客户区显示汉诺塔题目要求

使用 turtle 库制作汉诺塔动画

先看效果吧: 1. 汉诺塔递归 如果需要把 n 个 plates 从 A 柱移到 C 柱: 先将上面的 n-1 个 plates 从 A 移到 B 将 A 最后一个 plates 移到 C 再将 n-1 个 plates 从 B 移到 C def hano(n, A, B, C): if n == 1: print(A + ' -> ' + C) else: hano(n-1, A, C, B) print(A + ' ->

我有两颗糖 1047

matlab递归实现汉诺塔m函数文件(动画演示)

原创######### matlab递归实现汉诺塔m函数文件 压缩包中含有两个文件hannuota.m和hanoi.m 其中,hannuota.m无动画演示,调用格式为: >>hannuota(5,'A','B','C') hanoi.m有动态演示汉诺塔功能,是在hannuota.m的基础上实现,调用格式为: >>hanoi(5)

汉诺塔演示程序(包含二叉树的演示动画)

汉诺塔 演示程序 二叉树 演示动画 实现动态的观看到汉诺塔的盘子移动过程,动态的观看到树的遍历过程,树的查找过程

汉诺塔实践python_汉诺塔的python 动画演示

1.简介古代有一座汉诺塔,塔内有3个座A、B、C,A座上有n个盘子,盘子大小不等,大的在下,小的在上,如图所示。有一个和尚想把这n个盘子从A座移到C座,但每次只能移动一个盘子,并且自移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座来放盘子。2.解决方法解法的基本思想是递归。假设有 A、B、C 三个塔,A 塔有块盘,目标是把这些盘全部移到 C 塔。那么先把 A 塔顶部...

weixin_39679678的博客 1142

ms17-010 永恒之蓝漏洞利用+抓包分析过程

一、实验环境: 1、攻击机:Kali 1)攻击工具:msf 2)分析工具:wireshark 3)IP地址:192.168.204.157(自动获得) 2、靶 机:Windows7 1)版本:SP1 2)开启网络共享(SMB协议) 3)关闭防火墙 4)IP地址:192.168.204.150(自动获得) 3、网卡连接方式:Vmnet8(NAT) 二、实验步骤: ...

qq_41976183的博客 6947

n阶Hanoi塔问题(动图分析)-C语言

通过动图形象分析Hanoi塔问题

APP_xinyonghu_li的博客 2217

(2024,DDPM,DDIM,流匹配,SDE,ODE)扩散:基础教程

本文的目标是尽可能简单地教授扩散。第一节介绍扩散的基本原理。第二节和第三节展示如何构建随机和确定性扩散采样器。第四部分介绍了密切相关的流匹配,可看作是扩散的推广。​第五节,强调实践中最重要的一些设计选择,包括采样器、噪声时间表和参数化方法。

qq_44681809的博客 1万+

U盘安装单系统ubuntu10.04之全过程&拔掉U盘后系统无法启动

借助U盘把电脑装成ubuntu单系统之过程记录,以及遇到拔掉U盘后系统无法启动问题,电脑就显示: Non-System disk or disk error, replace and strike any key when ready

CXHPLY的专栏 8680

逆序输出正整数以及汉诺塔问题

一.逆序输出正整数 #include&lt;iostream&gt; using namespace std; void print(int n)//递归的思想 { cout&lt;&lt;n%10; if(n&gt;=10) { print(n/10); } } int main() { int n; cin&gt;&gt;n; print(n); return 0; }...

Lavener_Love的博客 968

【ISAR成像】基于Matlab的飞机点目标模型仿真与图像优化

本文详细介绍了如何使用Matlab进行ISAR成像仿真,重点讲解了从构建飞机点目标模型到生成清晰图像的完整流程。通过模拟雷达回波、距离压缩、运动补偿及方位压缩等核心信号处理步骤,并结合相位梯度自聚焦等优化技巧,有效提升了ISAR图像的清晰度与分辨率。文章还分享了雷达参数调优、加窗处理等实战经验,为雷达信号处理与目标识别研究提供了实用指导。

weixin_29071809的博客 389

写给信息学竞赛选手的趣味编程 基于DevC++的SDL2图形程序设计(四) 三层汉诺塔的简单动画实现

本程序利用SDL实现三层汉诺塔移动动画三次。核心问题是精灵的概念和坐标系的使用。

zotion_male的博客 1006

新能源汽车整车控制器(VCU)深度全解:硬件原理、工作流程、接口设计与高压安全实战

整车控制器(VCU,Vehicle Control Unit)是新能源纯电动、混动汽车的核心决策大脑,相当于汽车的“中枢神经系统”。它不直接驱动电机,却统筹电机控制器(MCU)、电池管理系统(BMS)、充电机(OBC)、DC/DC、空调、热管理、底盘等全部部件,负责驾驶意图解析、动力输出控制、高压上下电管理、故障安全保护、能量优化等关键任务。VCU所有设计均围绕车规级环境适应性、功能安全(ISO 26262)、实时性、高压安全性四大核心目标,与通用控制器完全不同。

优快云-新能源汽车研发测试专业博主 2483

《AgentScope-Java 深入浅出教程》第3章 消息系统(Message)

在 AgentScope 中,消息(Msg)是最核心的数据结构。│ 消息的作用 ││ ││ │ 用户输入 │ ────────────┐ ││ ▼ ││ │智能体通信│ ◄────► │ 消息对象 │ ◄────► │ LLM API │ ││ ▲ ││ │ ││ │ 历史存储 │ ────────────┘ ││ │用户输入:封装用户的问题和指令智能体输出:封装智能体的回复和工具调用智能体通信:在多智能体系统中传递信息LLM API 交互:转换为 LLM 可理解的格式历史存储。

步子哥的博客 229

汉诺塔(hanoi)演示动画项目教程

汉诺塔(hanoi)演示动画项目教程 1. 项目介绍 汉诺塔(hanoi)演示动画项目是一个使用JavaScript和HTML实现的汉诺塔问题演示动画。该项目通过可视化的方式展示了汉诺塔问题的解决过程,帮助用户更好地理解汉诺塔算法的原理和实现。 2. 项目快速启动 2.1 克隆项目 首先,克隆项目到本地: git clone https://github.com/abel533/hanoi.git...

gitblog_00025的博客 543

Qt EGLFS 图形后端详解

EGLFS (EGL Full Screen) 是Qt框架在嵌入式Linux系统中的高性能图形显示后端,它提供了直接基于EGL和OpenGL ES的硬件加速渲染解决方案。

浩瀚之水的专栏 513

[js - 算法可视化] 汉诺塔(Hanoi)演示程序

前段时间偶然看到有个日本人很早之前写了js的多种排序程序,使用js+html实现的排序动画,效果非常好。 受此启发,我决定写几个js的算法动画,第一个就用汉诺塔。 另外在这个程序里面,实现了一点,就是顺序动画,这一点很重要(同时,因为我对jquery的顺序不熟悉,希望有人可以告诉我怎么用jquery实现)。 1.jquery中,通常都是针对同一个对象,进行不同的动画。 2.针对不同对象的动画会在同一时间开始执行。 3.针对不同对象的动画,可以用jquery的完成函数实现。

偶尔记一下 - mybatis.io 1万+

西门子TP900精智系列触摸屏和三菱Q系列PLC以太网通信的组态步骤

西门子TP900精智系列触摸屏和三菱Q系列PLC以太网通信的组态步骤

Robot_PLC_HMI_Automation 6100

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: SimpleCG文字输出基础
下一篇: SimpleCG图像操作基础
b2b160
博客等级 码龄20年 2408粉丝 96原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

b2b160

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

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

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

打赏作者

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

抵扣说明:

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

余额充值