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

前言

        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的博客-CSDN博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
汉诺塔游戏是一款非常受欢迎的益智游戏,其规则简单却寓意深刻,不仅能锻炼思维能力,还有助于培养耐心和毅力。而在实现汉诺塔游戏的过程中,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实现汉诺塔游戏动画演示的代码并不复杂,只需用递归的方式来求解游戏,加上绘图操作即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

b2b160

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

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

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

打赏作者

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

抵扣说明:

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

余额充值