⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hanoi.cpp

📁 我编写的c++汉诺塔游戏程序 ( 字符显示 ) 面向对象的思想编写
💻 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 + -