1、void Move(int n, char a, char b); / 移动过程int switchab(char a); / 返回钢针号void adjust(); / 调整速度暂停/ 主函数void main() int n, ta4 = 115, 500, 285, 520; / 第一个圆盘的位置 printf(尽量小于16n); / 因为大于十六时就会显示有误,但程序可以正常运行请输入汉诺塔的层数(164): scanf(%d, &n); STKNODE* p; p = (STKNODE*)malloc(n * sizeof(STKNODE *); / 声明一个元素为 n 个的动态 S
2、TKNODE 型指针数组 for (int i2 = 0; i2 n; i2 +) pi2 = (STKNODE *)malloc(sizeof(STKNODE); / 为每一个指针申请空间 Initstk(&s0);s1);s2); / 将三个栈初始化 start(); / 呈现开始画面 setfillstyle(YELLOW); / 圆盘的颜色 for (int i=0; i i+) ta0 += 5; ta1 -= 20; ta2 -= 5; ta3 -= 20; bar(ta0, ta1, ta2, ta3); / 画出n个从大到小一次叠放的黄色圆盘 +s0.top; / 进栈 for
3、 (int i1 = 0; i1 ai1 = tai1; s0.stacks0.top = pi; / 记录每个矩形的位置,top为圆盘的个数 Hannoi(n, a, bc / 汉诺塔递归函数 system(pausettttGame Over!n/ 函数定义/ 汉诺塔的递归void Hannoi(int n, char a, char b, char c) if(n = 1) Move(1, a, c); else Hannoi(n-1, a, c, b); Move(n, a, c); Hannoi(n-1, b, a, c); / 栈的初始化void Initstk(STK *s) i
4、nt i; s-top = 0; for (i = 0;= MAX; s-stack+s-top = NULL;/ 移动过程void Move(int n, char a, char b) int i3, i4 = 0, i5 = 0; i3 = b - a; / 目的钢针与源钢针的位置差值 i4 = switchab(a); / 源钢针钢针号 i5 = switchab(b); / 目的钢针号 STKNODE *q1, *q0; / 两个中间结点用于源栈和目的栈间的值得传递,q1为目的栈,q0为源栈 q1 = (STKNODE *)malloc(sizeof(STKNODE); q0 = (
5、STKNODE *)malloc(sizeof(STKNODE); / 源栈与目的栈值的传递 q0 = si4.stacksi4.top; +si5.top; / 进栈 q1-a0 = q0-a0 + i3 * 200;a1 = 500 - si5.top * 20;a2 = q0-a2 + i3 * 200;a3 = 500 - si5.top * 20 + 20; si5.stacksi5.top = q1; -si4.top; / 出栈 / 向上运动 while (q0-a1 = 100) setfillstyle(YELLOW); bar(q0-a0, q0-a1, q0-a2, q0
6、-a3); adjust(); / 调整函数 Sleep(10 * v); / 暂停(ms) setfillstyle(WHITE); setcolor(RED); line(q0-a0 + q0-a2) / 2, q0-a1, (q0- / 重新画上被擦掉原有的红线 q0-a1 -= 10;a3 -= 10; if (si4.top = 0) / 重新画上最后一个矩形块擦掉的底座上的两条红线 line(110 + i4 * 200, 500, 290 + i4 * 200, 500); line(110 + i4 * 200, 493, 290 + i4 * 200, 493); / 向左或
7、右运动,与 i3 的正负有关a2 != q1-a2) if (i3 0) / i3a0 -= 20;a2 -= 20; else / i30向右移a0 += 20;a2 += 20; / 向下运动a3 100) / 重画被擦掉的红线 setcolor(RED); line(q0-a1 += 10;a3 += 10; / 在目的钢针上的相应位置绘制出黄色矩形块 bar(q1-a0, q1-a1, q1-a2, q1-/ 绘制开始界面void start() / 初始化画面大小 initgraph(800, 650); / 背景设为白色 setbkcolor(WHITE); / 用白色填充整个画面
8、 cleardevice(); / 绘制彩虹,形成一道彩虹,摘自 easyx 帮助文档示例程序 float H, S, L; H = 0; / 色相 S = 1; / 饱和度 L = 0.5f; / 亮度 setlinestyle(PS_SOLID, NULL, 2); / 设置线宽为 2 for(int r = 600; r 544; r-) H += 5; setcolor( HSLtoRGB(H, S, L) ); circle(750, 900, r); / 说明 setfont(50, 0, 华文楷体 setcolor(RED); outtextxy(200, 150, 汉诺塔移动动
9、画 setfont(20, 0, 黑体 outtextxy(600, 200, BY:Ronald outtextxy(500, 200, 版本V1.1 setcolor(GREEN); outtextxy(200, 350, 随便按一个键开始吧! / 绘制运动的矩形 while (1) / 检测是否有键盘敲击 if (kbhit() break; / 向右 int a = 40, b = 40; /初始位置 while (a = 760) setfillstyle(YELLOW); bar(a, b, a + 10, b + 20); Sleep(10); setfillstyle(WHIT
10、E + a); a += 10; / 向下 while (b= 40) setfillstyle(GREEN); setfillstyle(WHITE - a); a -= 10; / 向上 while (b setfillstyle(BLUE); setfillstyle(WHITE + b); b -= 10; / 清空开始界面 / 绘制运动画面的的环境 / 三根红色线段作为钢针 line(400, 110, 400, 500); line(600, 110, 600, 500); line(200, 110, 200, 500); / 长方体形的底座 setfillstyle(LIGHT
11、GRAY); bar3d(80, 500, 720, 510, 10, true); / 暂停按钮 bar(360, 540, 440, 580); setfont(30, 0, outtextxy(370, 550, 暂停宋体 outtextxy(300, 580, 鼠标暂停后请按空格继续 / 加速按钮 bar(160, 540, 240, 580); outtextxy(170, 550, 加速 outtextxy(170, 580, 请按 d / 减速按钮 bar(560, 540, 640, 580); outtextxy(570, 550, 减速 outtextxy(570, 580
12、, 请按 a outtextxy(10, 10, 正在进行中请欣赏:/ 判断目的钢针与源钢针的钢针号返回钢针号int switchab(char a) switch (a) case : return 0; return 1; return 2; default:/ 调整函数,实现加速,减速,暂停void adjust() char f; / 接收键盘敲进去的按钮和鼠标点击时赋予的变化值 / 用 f 接受键盘的键入值 if(kbhit() f = getch(); / 检测鼠标消息 if (MouseHit()=true) / 接收鼠标消息 MOUSEMSG Mouse; Mouse = Ge
13、tMouseMsg(); / 响应鼠标消息 if (Mouse.x = 360 & Mouse.x = 540 & Mouse.y = 580 & Mouse.mkLButton) f = ;= 160 &= 240 &d= 560 &= 640 & / 作用于动画 switch(f) / 暂停 / 用继续覆盖暂停 setfont(30, 0, setcolor(GREEN); outtextxy(370, 550, 继续 getch(); / 继续后变回显示暂停 / 减速 / 当被点击时,减速位置震动一下 setfillstyle(LIGHTGRAY); bar(560, 540, 640, 580); outtextxy(575, 545, Sleep(30); / 减速 v+; / 回原位 outtextxy(570, 550, / 加速 bar(160, 540, 240, 580); outtextxy(165, 545, outtextxy(170, 550, / 加速 v-; / v 最小为1 if (v = 0) v = 1; f = r / f 初始化为 r FlushMouseMsgBuffer(); / 清空鼠标消息
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2