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

📄 qishu.cpp

📁 一款用C++编写的网络版中国象棋对弈程序源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// qishu.cpp: implementation of the qishu class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "chineseqi.h"
#include "qishu.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

qishu::qishu()
{

clearqi();
}

qishu::~qishu()
{

}
void qishu:: clearqi()
{
	int i,j;
	mydeadcount=0;
	otherdeadcount=0;
	for (i=0;i<9;i++)
		for(j=0;j<10;j++)
			qi[j][i]=0;
	for(i=0;i<16;i++)
	{
		mydead[i]=0;
		otherdead[i]=0;
	}
	makedead.x=-1;
	makedead.y=-1;
	jiang=FALSE;
}
void qishu::initqi()
{
	clearqi();
	qi[0][0]=-1;
	qi[0][8]=-1;
	qi[0][1]=-2;
	qi[0][7]=-2;
	qi[0][2]=-4;
	qi[0][6]=-4;
	qi[0][3]=-5;
	qi[0][5]=-5;
	qi[0][4]=-6;
	qi[2][1]=qi[2][7]=-3;
	qi[3][0]=qi[3][2]=qi[3][4]=qi[3][6]=qi[3][8]=-7;
	qi[6][0]=qi[6][2]=qi[6][4]=qi[6][6]=qi[6][8]=7;
	qi[7][1]=qi[7][7]=3;
	qi[9][0]=qi[9][8]=1;
	qi[9][1]=qi[9][7]=2;
	qi[9][2]=qi[9][6]=4;
	qi[9][3]=qi[9][5]=5;
	qi[9][4]=6;
	suaiwei.x=4;
	suaiwei.y=9;
}
BOOL qishu:: movbin(int fx,int fy,int tx,int ty)
{
	if (ty==fy&&fx==tx) return FALSE;
	if (tx<0|| ty<0 ) return FALSE;
	if (tx>8 || ty>9) return FALSE;
	if( qi[ty][tx]>0 ) return FALSE;
	if (abs(ty-fy)>1||abs(tx-fx)>1) return FALSE;
	if (ty!=fy&&fx!=tx) return FALSE;
	if ( ty>fy) return FALSE;
	if (fy>4)
	{
		if (fx!=tx) return FALSE;
	}
	return TRUE;
}
BOOL qishu::movma(int fx,int fy,int tx,int ty)
{
	if (ty==fy&&fx==tx) return FALSE;
	if (tx>8 || ty>9) return FALSE;
	if (tx<0|| ty<0 ) return FALSE;
	if(abs(fx-tx)>2||abs(fy-ty)>2) return FALSE;
	if(qi[ty][tx]>0) return FALSE;
	if(abs(fy-ty)==2)
	{
		if(abs(fx-tx)!=1) return FALSE;
		if(fy>ty)
		{
			if(qi[fy-1][fx]!=0)
				return FALSE;
		}
		else
		{
			if (qi[fy+1][fx]!=0)
				return FALSE;
		}
	}
	else if (abs(fx-tx)==2)
	{
		if(abs(fy-ty)!=1) return FALSE;
		if(fx>tx)
		{
			if(qi[fy][fx-1]!=0)
				return FALSE;
		}
		else
		{
			if (qi[fy][fx+1]!=0)
				return FALSE;
		}
	}
	else
	{
		return FALSE;
	}
	return TRUE;
}
BOOL qishu::movxiang(int fx,int fy,int tx,int ty)
{
	if (tx>8 || ty>9) return FALSE;
	if (tx<0|| ty<0 ) return FALSE;
	if (ty==fy&&fx==tx) return FALSE;
	if(ty<5) return FALSE;
	if (qi[ty][tx]>0) return FALSE;
	if(abs(fx-tx)!=2||abs(fy-ty)!=2) return FALSE;
	if(qi[(ty+fy)/2][(tx+fx)/2]!=0) return FALSE;
	return TRUE;
}
	BOOL qishu:: movshi(int fx,int fy,int tx,int ty)
	{
		if (tx>8 || ty>9) return FALSE;
		if (tx<0|| ty<0 ) return FALSE;
		if (ty==fy&&fx==tx) return FALSE;
		if (qi[ty][tx]>0) return FALSE;
		if (abs(tx-fx)>1|| abs(ty-fy)>1) return FALSE;
		if (ty<7||tx<3||tx>5) return FALSE;
		if(ty==fy||tx==fx) return FALSE;
		return TRUE;
	}
	BOOL qishu::win()
	{
		int i,j;
		for(i=0;i<9;i++)
			for(j=0;j<10;j++)
			{
				if(qi[j][i]==-6)
					return FALSE;
			}
		return TRUE;
	}
BOOL qishu::lose()
{
	int i,j;
	int x,y;
	int tmp;
	for(i=0;i<9;i++)
		for(j=0;j<10;j++)
		{
			if(qi[j][i]>0)
			{
				switch (qi[j][i])
				{
				case 1:
					for(x=0;x<9;x++)
					{
						for(y=0;y<10;y++)
							if(movzhu(i,j,x,y))
							{
								tmp=qi[y][x];
								qi[y][x]=1;
								qi[j][i]=0;
								if(!willdead())
								{
									qi[y][x]=tmp;
									qi[j][i]=1;
									return FALSE;
								}
								jiang=FALSE;
								qi[j][i]=1;
								qi[y][x]=tmp;
							}
					}
					break;
				case 2:
					for(x=0;x<9;x++)
					{
						for(y=0;y<10;y++)
							if(movma(i,j,x,y))
							{
								tmp=qi[y][x];
								qi[y][x]=2;
								qi[j][i]=0;
								if(!willdead())
								{
									qi[y][x]=tmp;
									qi[j][i]=2;
									return FALSE;
								}
								jiang=FALSE;
								qi[j][i]=2;
								qi[y][x]=tmp;
							}
					}
					break;
				case 3:
					for(x=0;x<9;x++)
					{
						for(y=0;y<10;y++)
							if(movpao(i,j,x,y))
							{
								tmp=qi[y][x];
								qi[y][x]=3;
								qi[j][i]=0;
								if(!willdead())
								{
									qi[y][x]=tmp;
									qi[j][i]=3;
									return FALSE;
								}
								jiang=FALSE;
								qi[y][x]=tmp;
								qi[j][i]=3;
							}
					}
					break;
				case 4:
					for(x=0;x<9;x++)
					{
						for(y=0;y<10;y++)
							if(movxiang(i,j,x,y))
							{
								tmp=qi[y][x];
								qi[y][x]=4;
								qi[j][i]=0;
								if(!willdead())
								{
									qi[y][x]=tmp;
									qi[j][i]=4;
									return FALSE;
								}
								jiang=FALSE;
								qi[y][x]=tmp;
								qi[j][i]=4;
							}
					}
					break;
				case 5:
					for(x=0;x<9;x++)
					{
						for(y=0;y<10;y++)
							if(movshi(i,j,x,y))
							{
								tmp=qi[y][x];
								qi[y][x]=5;
								qi[j][i]=0;
								if(!willdead())
								{
									qi[y][x]=tmp;
									qi[j][i]=5;
									return FALSE;
								}
								jiang=FALSE;
								qi[y][x]=tmp;
								qi[j][i]=5;
							}
					}
					break;
				case 6:
					for(x=0;x<9;x++)
					{
						for(y=0;y<10;y++)
							if(movsuai(i,j,x,y))
							{
								tmp=qi[y][x];
								qi[y][x]=6;
								qi[j][i]=0;
								if(!willdead())
								{
									qi[y][x]=tmp;
									qi[j][i]=6;
									return FALSE;
								}
								jiang=FALSE;
								qi[y][x]=tmp;
								qi[j][i]=6;
							}
					}
					break;
				case 7:
					for(x=0;x<9;x++)
					{
						for(y=0;y<10;y++)
							if(movbin(i,j,x,y))
							{
								tmp=qi[y][x];
								qi[y][x]=7;
								qi[j][i]=0;
								if(!willdead())
								{
									qi[y][x]=tmp;
									qi[j][i]=7;
									return FALSE;
								}
								jiang=FALSE;
								qi[y][x]=tmp;
								qi[j][i]=7;
							}
					}
					break;
				}
			}
		}
	return TRUE;
}
	BOOL qishu:: movpao(int fx,int fy,int tx,int ty)
	{
		int has;
		int i;
		if (tx>8 || ty>9) return FALSE;
		if (tx<0|| ty<0 ) return FALSE;
		if (ty==fy&&fx==tx) return FALSE;
		if (qi[ty][tx]>0) return FALSE;
		if(fx!=tx && ty!=fy) return FALSE;
		has=0;
		if(fy!=ty)
		{
			if(fy>ty)
			{
				for(i=ty+1;i<fy;i++)
				{
					if(qi[i][fx]!=0)
						has++;
				}
				if (has>1)  return FALSE;
				if (has==1 )
				{
					if (qi[ty][tx]<0) return TRUE;
					else return FALSE;
				}
				if (qi[ty][tx]!=0) return FALSE;
			}
			else
			{
				for(i=fy+1;i<ty;i++)
				{
					if(qi[i][fx]!=0)
						has++;
				}
				if (has>1)  return FALSE;
				if (has==1 )
				{
					if (qi[ty][tx]<0) return TRUE;
					else return FALSE;
				}
				if (qi[ty][tx]!=0) return FALSE;
			}
		}
		else
		{
		     if(fx>tx)
			{
				for(i=tx+1;i<fx;i++)
				{
					if(qi[fy][i]!=0)
						has++;
				}
				if (has>1)  return FALSE;
				if (has==1 )
				{
					if (qi[ty][tx]<0) return TRUE;
					else return FALSE;
				}
				if (qi[ty][tx]!=0) return FALSE;
			}
			else
			{
				for(i=fx+1;i<tx;i++)
				{
					if(qi[fy][i]!=0)
						has++;
				}
				if (has>1)  return FALSE;
				if (has==1 )
				{
					if (qi[ty][tx]<0) return TRUE;
					else return FALSE;
				}
				if (qi[ty][tx]!=0) return FALSE;
			}
		}
		return TRUE;
	}
BOOL qishu::movzhu(int fx,int fy,int tx,int ty)
{
	int i;
		if (tx>8 || ty>9) return FALSE;
		if (tx<0|| ty<0 ) return FALSE;
		if (qi[ty][tx]>0) return FALSE;
		if (ty==fy&&fx==tx) return FALSE;
		if(fx!=tx && ty!=fy) return FALSE;
		if(fy!=ty)
		{
			if(fy>ty)
			{
				for(i=ty+1;i<fy;i++)
				{
					if(qi[i][fx]!=0)
						return FALSE;
				}
			}
			else
			{
				for(i=fy+1;i<ty;i++)
				{
					if(qi[i][fx]!=0)
						return FALSE;
				}
			}
		}
		else
		{
		     if(fx>tx)
			{
				for(i=tx+1;i<fx;i++)
				{
					if(qi[fy][i]!=0)
						return FALSE;
				}
			}
			else
			{
				for(i=fx+1;i<tx;i++)
				{
					if(qi[fy][i]!=0)
						return FALSE;
				}
			}
		}
		return TRUE;
}
BOOL qishu::movsuai(int fx,int fy,int tx,int ty)
{
	int i;
	if (tx>8 || ty>9) return FALSE;
	if (tx<0|| ty<0 ) return FALSE;
	if( qi[ty][tx]>0 )return FALSE;
	if (ty==fy&&fx==tx) return FALSE;
	if(ty<7 && qi[ty][tx]==-6 && tx==fx)
	{
		for(i=ty+1;i<fy;i++)
			if (qi[i][fx]!=0) return FALSE;
		return TRUE;
	}
	if (ty<7 || tx<3 || tx>5 ) return FALSE;
	if (abs(tx-fx)>1|| abs(ty-fy)>1) return FALSE;
	if(fx!=tx && ty!=fy) return FALSE;
	suaiwei.x=tx;
	suaiwei.y=ty;
	return TRUE;
}
BOOL qishu::save(int x,int y)
{
	int i;
	for(i=x+1;i<9;i++)
	{
		if(qi[y][i]==1) 
		{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -