#include<iostream.h>
#include<conio.h>
#include<graphics.h>
#define STATUS int
#include<dos.h>
class ta //塔类
{
private :
STATUS status; //塔的状态
int x; //坐标及塔上盘的数量
int z[20];
int y;
public :
ta(){
status=x=y=0;
int j;
for(j=0;j<20;j++)
z[j]=0;
}
~ta(){}
void setzb(int a,int b)
{
x=a;
y=b;
}
int gethzb()
{
return x;
}
int getczb()
{
return y;
}
void setstatus()
{
status=status+1;
}
STATUS getstatus()
{
return status;
}
void gbstatus()
{
status-=1;
}
void setpansz(int x)
{
z[status]=x;
}
int getpansz()
{
return z[status];
}
} ;
class pan //盘类
{
private :
int size; //盘的大小
public:
pan (){size=0;}
~pan(){}
void setpsz(int x)
{
size=x;
}
int getpsz()
{
return size;
}
};
void jianta(ta &ta1,int x,int y)
{
setcolor(BLUE);
ta1.setzb(x,y);
line(x,y,x+100,y);
line(x+50,y-50,x+50,y);
}
void jiapan(ta &ta1,pan pan1) //向塔上加盘
{
int x,y;
STATUS status;
int a,b;
x=ta1.getpansz();
y=pan1.getpsz();
if(x<=y&&x>0)
{
cout<<"can not jia pan"<<endl;
return ;
}
a=ta1.gethzb();
b=ta1.getczb();
status=ta1.getstatus();
setcolor(RED);
delay(400);
line( a+50-5*y,b-5*(status+1),a+50-5*y,b-5*status) ;
line(a+50-5*y,b-5*(status+1),a+50+5*y,b-5*(status+1));
line(a+50+5*y,b-5*(status+1),a+50+5*y,b-5*status);
ta1.setstatus();
ta1.setpansz(y);
}
void qupan( ta &ta1)
{
int x,y,z; //从塔上减盘
STATUS status;
x=ta1.gethzb();
y=ta1.getczb();
status=ta1.getstatus();
z=ta1.getpansz();
setcolor(BLACK);
line(x+50-5*z,y-5*status,x+50-5*z,y-5*(status-1));
line(x+50-5*z,y-5*status,x+50+5*z,y-5*status);
line(x+50+5*z,y-5*status,x+50+5*z,y-5*(status-1));
ta1.gbstatus();
}
void move(ta &ta1 ,ta &ta2 ) //移动盘
{
int x;
pan panx;
x=ta1.getpansz();
panx.setpsz(x);
qupan (ta1);
jiapan(ta2,panx);
}
void hannota(int n,ta &ta1,ta &ta2,ta &ta3)
{
if (n==1)
move(ta1,ta3);
else
{
hannota(n-1,ta1,ta3,ta2);
move(ta1,ta3);
hannota(n-1,ta2,ta1,ta3);
}
}
void main()
{
ta ta1,ta2,ta3;
pan pan1,pan2,pan3,pan4,pan5;
ta &ta1x=ta1;
ta &ta2x=ta2;
ta &ta3x=ta3;
pan panx[15];
int driver=DETECT;
int mode=VGAHI;
initgraph(&driver,&mode,"E:\\TC3\\BGI");
setbkcolor(BLACK);
jianta(ta1x,50,400);
jianta(ta2x,200,400);
jianta(ta3x,350,400);
int j;
int n;
for(j=1;j<15;j++)
panx[j].setpsz(j);
cout<<"enter the pan shu(1--14)"<<endl;
do
{
cin>>n;
}while(n<1||n>14);
for(j=n;j>0;j--)
jiapan(ta1x,panx[j]);
hannota(n,ta1x,ta2x,ta3x);
getch();
}