#include "Conio.h"#include "graphics.h"#define closegr closegraphvoid initgr(void) /* BGI初始化 */{ int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果 */ registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */ initgraph(&gd, &gm, "");}void pan(int i);int spy(int k);void move(int re,int we,int cg);void hanoi(int w,int e,int r,int t);void time();int m;int main(void){ printf("please input the number of plate(between 1 and 8)\n"); scanf("%d",&m); if(m>8) { printf("you input a error number\n"); sleep(1); return 0; } initgr(); /* BGI初始化 */ rectangle(5, 2, 635, 301); rectangle(5, 2, 635, 472); outtextxy(400,400,"MADE BY HERY"); outtextxy(400,430,"email: hxrgtb@163.com"); outtextxy(280,5,"HANOI TOWER"); setfillstyle(1,2); bar(90,100,100,300);/*第一根柱子的位置*/ bar(290,100,300,300);/*第二根柱子的位置*/ bar(490,100,500,300);/*第三根柱子的位置*/ pan(m); hanoi(m,1,2,3); outtextxy(200,350,"please input any key to exit!"); getch(); closegraph(); return 0;}void pan(int p) /*画出p个盘子*/{ int x1=10,x2=180,y1=290,y2=300,i=0; for (i=0;i<p;i++) { sleep(1); bar(x1,y1,x2,y2); x1=x1+10; y1=y1-12; x2=x2-10; y2=y2-12; } sleep(1); } void move(int a,int b,int c)/*把底a个盘子从b柱子移动到c柱子上*/ { void *buf; int size; int i,j,k,h,t; i=spy(b); j=spy(c); size=imagesize(10+10*(m-a)+200*(b-1),290-12*(i-1),180+(b-1)*200-10*(m-a),300-12*(i-1)); buf=malloc(size); if(!buf)return -1; getimage(10+10*(m-a)+200*(b-1),290-12*(i-1),180+(b-1)*200-10*(m-a),300-12*(i-1),buf); for(k=0;k<2;k++) { time(); putimage(10+10*(m-a)+200*(b-1),290-12*(i-1)-(105-6*(i-1))*k,buf,1); bar(90+200*(b-1),100,100+200*(b-1),300); putimage(10+10*(m-a)+200*(b-1),(290-12*(i-1))-(105-6*(i-1))-(105-6*(i-1))*k,buf,0); h=10+10*(m-a)+200*(b-1); t=(290-12*(i-1))-(105-6*(i-1))-(105-6*(i-1))*k; } for(k=0;k<2;k++) { time(); putimage(h+100*(c-b)*k,t,buf,1); putimage(h+100*(c-b)+100*(c-b)*k,t,buf,0); } h=h+100*(c-b)+100*(c-b)*(k-1); for(k=0;k<2;k++) { time(); putimage(h,t+(105-6*j)*k,buf,1); bar(90+200*(c-1),100,100+200*(c-1),300); putimage(h,t+(105-6*j)+(105-6*j)*k,buf,0); } free(buf); } void hanoi(int n,int x,int y,int z)/*递归函数*/ { if(n==1) move(1,x,z); else { hanoi(n-1,x,z,y); move(n,x,z); hanoi(n-1,y,x,z); } } int spy(int p) /*判断柱子上已有的盘子个数*/ { int i=89,j=295,l,t,r=0; i=i+200*(p-1); for(l=0;l<m;l++) { t=getpixel(i,j-12*l); if(t==2) r=r+1; } return r; } void time() /*时间延迟函数*/ { double i=0; for(i;i<1839000;) i++; }