www.pudn.com > xiangqibiyesheji.rar > MantisChessStd.cpp


#include "MantisChessDef.h" 
#include "MantisChessStd.h" 
 
BOOL  CanGo(int manmap[11][12],int man,const POINT &from,const POINT &to) 
{ 
	static int i,j; 
 
	if(!IsNormal(ManToType[man],to))	//这个棋子不能放在目标位置 
	{ 
		//如果不是将/帅 (将/帅可以"照相") 
		if(ManToType[man]!=RED_K&& ManToType[man]!=BLACK_K)return FALSE; 
 
		else if(ManToType[man]==RED_K &&			//走的是帅 
			ManToType[manmap[to.x][to.y]]==BLACK_K)	//目标是将 
		{ 
			BOOL flag=FALSE; 
			for(j= from.y-1;j>0;j--) 
			{ 
				if (manmap[from.x][j]!=32) 
				{ 
					if(ManToType[manmap[from.x][j]]==BLACK_K)	//照相 
						flag=TRUE; 
					break;				 
				} 
			} 
			if(flag)return TRUE; 
			else return FALSE; 
		} 
		else if(ManToType[manmap[to.x][to.y]]==RED_K)	//走的是将,目标是帅							 
		{ 
			BOOL flag=FALSE; 
			for(j= from.y+1;j<11;j++) 
			{ 
				if (manmap[from.x][j]!=32) 
				{ 
					if(ManToType[manmap[from.x][j]]==RED_K)	//照相 
						flag=TRUE;	 
					break; 
				} 
			} 
			if(flag)return TRUE; 
			else return FALSE; 
		} 
		else return FALSE; 
	} 
 
	//下面几行判断目标点是否己方的棋子: 
	if(SideOfMan[man]==0) 
	{ 
		if(manmap[to.x][to.y]!=32&& SideOfMan[manmap[to.x][to.y]]==0)return FALSE;		 
	} 
	else if(SideOfMan[man]==1) 
	{ 
		if(manmap[to.x][to.y]!=32&& SideOfMan[manmap[to.x][to.y]]==1)return FALSE;		 
	} 
	//-------------------------------- 
 
	//以下是各棋子的规则: 
	switch(ManToType[man])	 
		{ 
		case RED_B: 
			//兵不回头: 
			if(to.y > from.y)return FALSE; 
			//兵只走一步直线: 
			if(from.y-to.y+abs(to.x-from.x)>1)return FALSE;	 
			break; 
 
		case BLACK_B: 
			//卒不回头: 
			if(to.y < from.y)return FALSE; 
			//卒只走一步直线: 
			if(to.y-from.y+abs(to.x-from.x)>1)return FALSE;	 
			break; 
 
		case RED_S: 
		case BLACK_S: 
			//士走斜线一步: 
			if(abs(from.y-to.y)>1||abs(to.x-from.x)>1)return FALSE;	 
			break; 
 
		case RED_X: 
		case BLACK_X: 
			//相走田: 
			if(abs(from.x-to.x)!=2||abs(from.y-to.y)!=2)return FALSE; 
			//相心: 
			if(manmap[(from.x+to.x)/2][(from.y+to.y)/2]!=32)return FALSE; 
			break; 
 
		case RED_K: 
		case BLACK_K: 
			//将帅只走一步直线: 
			if(abs(from.y-to.y)+abs(to.x-from.x)>1)return FALSE; 
			break; 
 
		case RED_J: 
		case BLACK_J: 
			//车只能走直线: 
			if(from.y!=to.y&&from.x!=to.x)return FALSE;	 
			//车经过的路线中不能有棋子: ----------- 
			if(from.y==to.y) 
			{ 
				if(from.x9||point.y<1||point.y>10)return FALSE; 
	switch(mantype) 
	{ 
	case RED_K:	 
		//帅不能在红方宫外: 
		if( point.x>6|| point.x<4|| point.y<8)return FALSE; 
		break; 
 
	case RED_S:	 
		//仕只能在宫内特定点: 
		if(!( 
			( point.x==4&& point.y==10)|| 
			( point.x==4&& point.y==8)|| 
			( point.x==5&& point.y==9)|| 
			( point.x==6&& point.y==10)|| 
			( point.x==6&& point.y==8) 
			))return FALSE; 
		break; 
 
	case RED_X: 
		//七个相位: 
		if(!( 
			( point.x==1&& point.y==8)|| 
			( point.x==3&& point.y==10)|| 
			( point.x==3&& point.y==6)|| 
			( point.x==5&& point.y==8)|| 
			( point.x==7&& point.y==10)|| 
			( point.x==7&& point.y==6)|| 
			( point.x==9&& point.y==8) 
			))return FALSE; 
		break; 
 
	case RED_B: 
		//兵不能在兵位后: 
		if( point.y>7)return FALSE; 
		//兵过河前不能左右移动: 
		if( point.y>5&& point.x%2==0)return FALSE; 
		break; 
 
	case BLACK_K: 
		//帅不能在红方宫外: 
		if( point.x>6|| point.x<4|| point.y>3)return FALSE; 
		break; 
 
	case BLACK_S: 
		//仕只能在宫内特定点: 
		if(!( 
			( point.x==4&& point.y==1)|| 
			( point.x==4&& point.y==3)|| 
			( point.x==5&& point.y==2)|| 
			( point.x==6&& point.y==1)|| 
			( point.x==6&& point.y==3) 
			))return FALSE; 
		break; 
 
	case BLACK_X: 
		//七个相位: 
		if(!( 
			( point.x==1&& point.y==3)|| 
			( point.x==3&& point.y==1)|| 
			( point.x==3&& point.y==5)|| 
			( point.x==5&& point.y==3)|| 
			( point.x==7&& point.y==1)|| 
			( point.x==7&& point.y==5)|| 
			( point.x==9&& point.y==3) 
			))return FALSE; 
		break; 
 
	case BLACK_B: 
		//兵不能在兵位后: 
		if( point.y<4)return FALSE; 
		//兵过河前不能左右移动: 
		if( point.y<6&& point.x%2==0)return FALSE; 
		break; 
 
	default: 
		break; 
	} 
	return TRUE; 
} 
 
void  FixManMap(int map[11][12],POINT manpoint[32],int side) 
{ 
	memcpy(map,_defaultmap,132*sizeof(int)); 
 
	static POINT * pman; 
	static int i; 
	for(i=0;i<32;i++) 
	{ 
		pman = & manpoint[i]; 
		if(pman->x) 
			map[pman->x][pman->y]=i; 
	} 
}