📄 hanoi.cpp
字号:
#include"iostream.h"
char disk0,disk1;
int time=0;
//********************************************************************************类
class Disk
{
int *a;
public:
Disk(int n);
void initializte(int n);
int* output(){return a;}
};
class Position:public Disk
{
int N;
public:
Position();
int output(){return N;}
void show(Disk a,Disk b,Disk c);
void movehanoi(Disk a,Disk b);
int check(Disk c);
void move(Disk a,Disk b,Disk c);
};
//********************************************************************************类外函数
char iszero(char num)
{
if(num!=0)
return num+48;
return ' ';
}
void choose0()
{
cout << " 输入你的选择:"<<endl;
cout<<" 将盘子 ";
cin>>disk0;
}
void choose1()
{
cout<<" 移动到 ";
cin>>disk1;
}
void hanoi(int n,Disk a,Disk b,Disk c,Position abc)
{
static Disk A=a,B=b,C=c; //定义静态对象,使show()函数中的变量不会出错。
if (n==1)
{
abc.movehanoi(a,c);
abc.show(A,B,C);
}
else
{
hanoi(n-1,a,c,b,abc);
abc.movehanoi(a,c);
abc.show(A,B,C);
hanoi(n-1,b,a,c,abc);
}
}
//*********************************************************************************Disk类的函数
Disk::Disk(int n)
{
a=new int[n];
for(int i=0;i<n;i++){a[i]=0;}
}
void Disk::initializte(int n) //按输入盘子的个数将其初始化
{
int *flag=a;
for(int i=0;i<n;i++){*a=i+1;a++;}
a=flag;
}
//*********************************************************************************Position类的函数
Position::Position():Disk(0) //接收用户输入的盘子数.(构造函数中暂时将基类初始化为0)
{
N=0;
cout<<" 请先输入盘子的个数(1-9的整数):";
cin>>N;
}
void Position::show(Disk A,Disk B,Disk C) //显示塔的状态
{
int *a=A.output(),*b=B.output(),*c=C.output();
cout<<" ------Hanoi Tower------"<<endl;
for(int i=0;i<N;i++)
{
char aa=*a,bb=*b,cc=*c;
cout << " " <<iszero(aa) <<" " <<iszero(bb) <<" "<<iszero(cc) << endl;
a++;b++;c++;
}
cout << " \\_A_/" <<" "<< "\\_B_/" <<" "<< "\\_C_/" << endl;
}
int Position::check(Disk c) //计算数组中0的个数并返回
{
int count=0;
int *a=c.output();
for(int i=0;i<N;i++)
{
char aa=*a;
if(iszero(aa) ==' ')
count++;
a++;
}
return count;
}
void Position::move(Disk a,Disk b,Disk c) //移动盘子。方法:将目标盘的指针永远指向最后一个无效字符(0),
{ //将移动盘的指针永远指向第一个有效字符,然后替换两者的值。
int temp;
if((disk0=='a'||disk0=='A')&&(disk1=='b'||disk1=='B')) //disk0和disk1为全局变量
{
int n0=check(a);
int n1=check(b);
int *aa=a.output();
int *bb=b.output();
bb[N]=10; //将盘子数组中第n+1个数赋值,作为判断用。
aa[N]=10; //
if((aa[n0]<bb[n1])&&aa[n0]!=10) //确保移动盘子合乎游戏规则,不能将小的移到大的上面,不能将空盘子移动。
{
temp=aa[n0];
aa[n0]=0;
bb[n1-1]=temp;
}
}
if((disk0=='a'||disk0=='A')&&(disk1=='c'||disk1=='C'))
{
int n0=check(a);
int n1=check(c);
int *aa=a.output();
int *bb=c.output();
bb[N]=10;
aa[N]=10;
if((aa[n0]<bb[n1])&&aa[n0]!=10)
{
temp=aa[n0];
aa[n0]=0;
bb[n1-1]=temp;
}
}
if((disk0=='b'||disk0=='B')&&(disk1=='c'||disk1=='C'))
{
int n0=check(b);
int n1=check(c);
int *aa=b.output();
int *bb=c.output();
bb[N]=10;
aa[N]=10;
if((aa[n0]<bb[n1])&&aa[n0]!=10)
{
temp=aa[n0];
aa[n0]=0;
bb[n1-1]=temp;
}
}
if((disk0=='b'||disk0=='B')&&(disk1=='a'||disk1=='A'))
{
int n0=check(b);
int n1=check(a);
int *aa=b.output();
int *bb=a.output();
bb[N]=10;
aa[N]=10;
if((aa[n0]<bb[n1])&&aa[n0]!=10)
{
temp=aa[n0];
aa[n0]=0;
bb[n1-1]=temp;
}
}
if((disk0=='c'||disk0=='C')&&(disk1=='a'||disk1=='A'))
{
int n0=check(c);
int n1=check(a);
int *aa=c.output();
int *bb=a.output();
bb[N]=10;
aa[N]=10;
if((aa[n0]<bb[n1])&&aa[n0]!=10)
{
temp=aa[n0];
aa[n0]=0;
bb[n1-1]=temp;
}
}
if((disk0=='c'||disk0=='C')&&(disk1=='b'||disk1=='B'))
{
int n0=check(c);
int n1=check(b);
int *aa=c.output();
int *bb=b.output();
bb[N]=10;
aa[N]=10;
if((aa[n0]<bb[n1])&&aa[n0]!=10)
{
temp=aa[n0];
aa[n0]=0;
bb[n1-1]=temp;
}
}
}
void Position::movehanoi(Disk a,Disk b)
{
int temp;
int n0=check(a);
int n1=check(b);
int *aa=a.output();
int *bb=b.output();
temp=aa[n0];
aa[n0]=0;
bb[n1-1]=temp;
time++;
}
//*********************************************************************************主函数
void main()
{
cout<<" **************************************"<<endl;
cout<<" **** HANOI塔游戏 ****"<<endl;
cout<<" **** copyright by birdwcp ^_^ ****"<<endl;
cout<<" **** QQ 315068385 ****"<<endl;
cout<<" **** in 7,10,2007 in my bedroom ****"<<endl;
cout<<" **************************************"<<endl<<endl<<endl;
do
{
cout<<endl<<" ***********************************"<<endl;
cout<<" **** 请输入选择: ****"<<endl;
cout<<" **** H 观看自动演示结果 ****"<<endl;
cout<<" **** G 进入游戏 ****"<<endl;
cout<<" **** Q 退出游戏 ****"<<endl;
cout<<" ***********************************"<<endl<<endl;
char h;
cin>>h;
if(h=='G'||h=='g')
{
Position ABC;
Disk A(ABC.output());
A.initializte(ABC.output());
Disk B(ABC.output());
Disk C(ABC.output());
cout<<" 游戏开始!"<<endl<<" GOOD LUCK HAVE FUN "<<endl<<endl;
do
{
ABC.show(A,B,C);
if(ABC.check(C)==0) //当C盘中非0数与n相等时表示用户成功
{
cout<<endl;
cout<<" ***********************"<<endl;
cout<<" *** **"<<endl;
cout<<" *** GOOD GAME **"<<endl;
cout<<" *** 你赢了!游戏结束。**"<<endl;
cout<<" *** **"<<endl;
cout<<" ***********************"<<endl;
break;
}
choose0();
choose1();
ABC.move(A,B,C);
}while(true);
}
if(h=='H'||h=='h')
{
Position ABC;
Disk A(ABC.output());
A.initializte(ABC.output());
Disk B(ABC.output());
Disk C(ABC.output());
int num=ABC.output();
ABC.show(A,B,C);
hanoi(num,A,B,C,ABC);
cout<<endl;
cout<<" ***********************"<<endl;
cout<<" ***********************"<<endl;
cout<<" 演示结束! "<<endl;
cout<<" 需要"<<time<<"次移动 "<<endl;
cout<<" ***********************"<<endl;
cout<<" ***********************"<<endl;
}
if(h=='Q'||h=='q')
break;
}while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -