文档介绍:汉诺塔C源程序实现及讲解
制作人:贾维华、刘璐
汉诺塔
一、汉诺塔游戏简介及其玩法
二、设计思路及其程序设计流程
三、源程序及其讲解
四、游戏程序中应注意的问题
一、汉诺塔游戏简介及其玩法
1 游戏方法:点击PLAY开始,会看到3个柱子和从大到小编着号码的盘子,而且盘子自上而下半径依次增大。成功把盘子顺序不变的堆到最右边的竹子旁为胜利。
2 游戏规则:一次只能移动一个木块,盘子可以累起来,但是必须把半径小的放在半径大的上面。
3操作指南:在挂有圆盘的柱子上方点击向上按钮‘ W ’或者‘ UPDOWN’按键选中圆盘,按左右移动键移动到相对应的柱子上方,按向下键放下圆盘,至此完成一次圆盘移动。
二、设计思路及程序设计流程
1 设计思路:本设计中将盘子的数目设定为3~9个。设三个柱子A、B、C
移动的过程可分解为三个步骤: 第一步把A上的n-1个圆盘移到B上; 第二步把A上的一个圆盘移到C上;
第三步把B上的n-1个圆盘移到C上;
其中第一步和第三步是类同的。
其实际思想是利用一个递归原理。
例如最简单的三阶汉诺塔移动方法:
A→C,A→B,C→B,A→C,B→A,B→C,A→C
2 程序设计流程图:
三、源程序及其讲解
1 源程序:见win tc
2 主程序构架
main()
{
INITIAL(); /*界面初始化*/
Start_Logo(); /*游戏启动始界面*/
getch();
again:
nStep=0;/*判断条件*/
Logo();/*进入游戏*/
goto again;
}
3. 主要程序分析
#include ""
#include ""
#include ""
#include ""
#include ""
#include ""
#define S setcolor
#define F setfillstyle
#define R rectangle
#define C circle
#define B bar
#define B3D bar3d
#define L line
#define O outtextxy
#define X 200
#define Y 20
int nStep=0;
int nRecord[7]={7,15,31,63,127,255,511},nRec;
int nDisk,nDisknum;
int nBaseNum;
float nDelay;
char chMark[15];
struct rod
{
int nDisk[10][5];
int nDiskName[10];
}tree[3];
/********************************************/
ntoa(int s)
{
int b[15];
int i,j;
for (i=0;i<15;i++)
chMark[i]='\0';
for (i=0;s>=10;i++)
{b[i]=s%10;
s/=10;}
b[i]=s;
for(j=i;j>=0;j--)
chMark[i-j]=b[j]+'0';
}
void INITIAL() /**GAME INITIAL**/
{
int gd=DETECT,gm=0;
initgraph(&gd,&gm,"");
setbkcolor(0);
}
void Start_Logo()/*启动标志*/
{
F(3,8);
B(200,150,439,259);
S(7);
R(201,151,442,262);
S(WHITE);
R(199,149,440,260);
settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
O(233,180,"HANOI TOWER");
S(1);
O(232,179,"HANOI TOWER");
S(WHITE);
settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
O(284,204,"V ");
S(1);
O(283,203,"V ");
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
S(WHITE);
O(205,240,"WERTE BY LiuLu AND JiaWeiHua!");
O(204,239,"WERTE BY LiuLu AND JiaWeiHua!");
}