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


#include "MantisChessDef.h" 
#include "MantisChessThink.h" 
//------------------------------------------- 
#define S_WIDTH 7 
#define S_DEPTH 6 
//                 将  士  象  马  车  炮 兵 
const int BV1[7]={  0,190,190,250,360,310,80};//基本价值 
const int BV2[7]={1  ,  1,  1, 16, 10,  2,15};//活跃度 
const int BV3[5]={50,80,100,120,140};//兵在不同位置的价值附加 
const int contactpercent1=25;//防守的重视程度(百分比) 
const int contactpercent2=30;//进攻的重视程度(百分比) 
 
#define NORED(i,j) (SideOfMan[tmap[i][j]]!=0) 
#define NOBLACK(i,j) (SideOfMan[tmap[i][j]]!=1) 
#define NOMAN(i,j) (tmap[i][j]==32) 
 
 
//				   k,  s,  x,  m,  j,  p,  b 
const int ManBPlus[2][12][11]= 
{ 
	{ 
		{  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0}, 
		{  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0}, 
		{  0,  1,  2,  3,  4,  4,  4,  3,  2,  1,  0}, 
		{  0,  1,  2,  3,  4,  4,  4,  3,  2,  1,  0}, 
		{  0,  1,  2,  3,  3,  3,  3,  3,  2,  1,  0}, 
		{  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0}, 
		{  0,  0,  0,  1,  0,  0,  0,  1,  0,  0,  0}, 
		{  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0}, 
		{  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0}, 
		{  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0}, 
		{  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0}, 
		{  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0} 
	}, 
	{ 
		{  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0}, 
		{  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0}, 
		{  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0}, 
		{  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0}, 
		{  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0}, 
		{  0,  0,  0,  1,  0,  0,  0,  1,  0,  0,  0}, 
		{  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0}, 
		{  0,  1,  2,  3,  3,  3,  3,  3,  2,  1,  0}, 
		{  0,  1,  2,  3,  4,  4,  4,  3,  2,  1,  0}, 
		{  0,  1,  2,  3,  4,  4,  4,  3,  2,  1,  0}, 
		{  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0}, 
		{  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0} 
	} 
}; 
 
//------------------------------------------- 
static void ContactV(int tmap[11][12],POINT tmanposition[32],int &tside,int activity[32],int contact[32][32]); 
 
 
void Mantis_QuickSort(int A[],int chessman[],POINT targetpoint[],int low,int high) 
{ 
	int pivot; 
	int pivot_man; 
	POINT pivot_point; 
	int scanUp,scanDown; 
	int mid,k; 
	POINT point; 
	if(high-low<=0) 
	{ 
		return; 
	} 
	else 
	{ 
		if(high-low==1) 
		{ 
			if(A[high]>A[low]) 
			{ 
				k=A[high]; 
				A[high]=A[low]; 
				A[low]=k; 
				k=chessman[high]; 
				chessman[high]=chessman[low]; 
				chessman[low]=k; 
				point=targetpoint[high]; 
				targetpoint[high]=targetpoint[low]; 
				targetpoint[low]=point; 
				return; 
			} 
		} 
	} 
	mid=(low +high)/2; 
	pivot=A[mid]; 
	pivot_man=chessman[mid]; 
	pivot_point=targetpoint[mid]; 
	k=A[mid]; 
	A[mid]=A[low]; 
	A[low]=k; 
	k=chessman[mid]; 
	chessman[mid]=chessman[low]; 
	chessman[low]=k; 
	point=targetpoint[mid]; 
	targetpoint[mid]=targetpoint[low]; 
	targetpoint[low]=point; 
	scanUp =low+1; 
	scanDown = high; 
	do{ 
		while(scanUp<=scanDown && A[scanUp]>=pivot) 
			scanUp++; 
		while(pivot>A[scanDown]) 
			scanDown--; 
		if(scanUp=0)//被将,所将军的棋子不能被吃掉 
	{ 
		j=0; 
		for(i=FistOfSide[tside];i<=LastOfSide[tside];i++) 
		{ 
			if(BeAteCount[i]<0 && ManBaseValue[i]>j) 
				j=ManBaseValue[i]; 
		} 
		maxvalue -=j; 
	} 
	else 
	{ 
		j=0; 
		for(i=FistOfSide[!tside];i<=LastOfSide[!tside];i++) 
		{ 
			if(BeAteCount[i]<0 && ManBaseValue[i]>j) 
				j=ManBaseValue[i]; 
		} 
		maxvalue +=j; 
	} 
	return maxvalue; 
} 
 
BOOL EnumList(int tmap[11][12],POINT tmanposition[32],int &tside,int *chessman,POINT *move,int &count) 
{ 
	#define ADD(man,tx,ty) {chessman[count]=man;move[count].x=tx;move[count].y=ty;count++;if(tmap[tx][ty]==FistOfSide[!tside])goto _NOKING;} 
	static int i,j,n,x,y; 
	static BOOL	flag; 
	count=0; 
	for(n=FistOfSide[tside];n<=LastOfSide[tside];n++) 
	{ 
		x=tmanposition[n].x; 
		if(!x)continue; 
		y=tmanposition[n].y; 
		switch(n) 
		{ 
		case 0: 
			if(tmanposition[0].x==tmanposition[16].x)		//将帅在同一列 
			{ 
				flag=FALSE; 
				for(j=tmanposition[16].y+1;j=8  && NORED(x,j))	ADD(0,x,j) 
			i=x+1;if(i<=6  && NORED(i,y))	ADD(0,i,y) 
			i=x-1;if(i>=4  && NORED(i,y))	ADD(0,i,y) 
			break; 
		case 16: 
			if(tmanposition[0].x==tmanposition[16].x)		//将帅在同一列 
			{ 
				flag=FALSE; 
				for(j=tmanposition[16].y+1;j=1  && NOBLACK(x,j))	ADD(16,x,j) 
			i=x+1;if(i<=6  && NOBLACK(i,y))	ADD(16,i,y) 
			i=x-1;if(i>=4  && NOBLACK(i,y))	ADD(16,i,y) 
			break; 
		case 1: 
		case 2: 
			i=x+1;j=y+1;if(i<=6 && j<=10 && NORED(i,j))	ADD(n,i,j) 
			i=x+1;j=y-1;if(i<=6 && j>=8  && NORED(i,j))	ADD(n,i,j) 
			i=x-1;j=y+1;if(i>=4 && j<=10 && NORED(i,j))	ADD(n,i,j) 
			i=x-1;j=y-1;if(i>=4 && j>=8  && NORED(i,j))	ADD(n,i,j) 
			break; 
		case 17: 
		case 18: 
			i=x+1;j=y+1;if(i<=6 && j<=3 && NOBLACK(i,j))	ADD(n,i,j) 
			i=x+1;j=y-1;if(i<=6 && j>=1 && NOBLACK(i,j))	ADD(n,i,j) 
			i=x-1;j=y+1;if(i>=4 && j<=3	&& NOBLACK(i,j))	ADD(n,i,j) 
			i=x-1;j=y-1;if(i>=4 && j>=1 && NOBLACK(i,j))	ADD(n,i,j) 
			break; 
		case 3: 
		case 4: 
			i=x+2;j=y+2;if(i<=9 && j<=10   && NORED(i,j))	if(NOMAN(x+1,y+1))	ADD(n,i,j) 
			i=x+2;j=y-2;if(i<=9 && j>=6    && NORED(i,j))	if(NOMAN(x+1,y-1))	ADD(n,i,j) 
			i=x-2;j=y+2;if(i>=1 && j<=10   && NORED(i,j))	if(NOMAN(x-1,y+1))	ADD(n,i,j) 
			i=x-2;j=y-2;if(i>=1 && j>=6    && NORED(i,j))	if(NOMAN(x-1,y-1))	ADD(n,i,j) 
			break; 
		case 19: 
		case 20: 
			i=x+2;j=y+2;if(i<=9 && j<=5  && NOBLACK(i,j))	if(NOMAN(x+1,y+1))	ADD(n,i,j) 
			i=x+2;j=y-2;if(i<=9 && j>=1  && NOBLACK(i,j))	if(NOMAN(x+1,y-1))	ADD(n,i,j) 
			i=x-2;j=y+2;if(i>=1 && j<=5  && NOBLACK(i,j))	if(NOMAN(x-1,y+1))	ADD(n,i,j) 
			i=x-2;j=y-2;if(i>=1 && j>=1  && NOBLACK(i,j))	if(NOMAN(x-1,y-1))	ADD(n,i,j) 
			break; 
		case 5: 
		case 6: 
			i=x+1; 
			if(NOMAN(i,y)) 
			{ 
				i=x+2;j=y+1;if(i<=9 && j<=10 && NORED(i,j))	ADD(n,i,j) 
				i=x+2;j=y-1;if(i<=9 && j>=1  && NORED(i,j))	ADD(n,i,j) 
			} 
			i=x-1; 
			if(NOMAN(i,y)) 
			{ 
				i=x-2;j=y+1;if(i>=1 && j<=10 && NORED(i,j))	ADD(n,i,j) 
				i=x-2;j=y-1;if(i>=1 && j>=1  && NORED(i,j))	ADD(n,i,j) 
			} 
			j=y+1; 
			if(NOMAN(x,j)) 
			{ 
				i=x+1;j=y+2;if(i<=9 && j<=10 && NORED(i,j))	ADD(n,i,j) 
				i=x-1;j=y+2;if(i>=1 && j<=10 && NORED(i,j))	ADD(n,i,j) 
			} 
			j=y-1; 
			if(NOMAN(x,j)) 
			{ 
				i=x+1;j=y-2;if(i<=9 && j>=1 && NORED(i,j))	ADD(n,i,j) 
				i=x-1;j=y-2;if(i>=1 && j>=1 && NORED(i,j))	ADD(n,i,j) 
			} 
			break; 
		case 21: 
		case 22: 
			i=x+1; 
			if(NOMAN(i,y)) 
			{ 
				i=x+2;j=y+1;if(i<=9 && j<=10 && NOBLACK(i,j))	ADD(n,i,j) 
				i=x+2;j=y-1;if(i<=9 && j>=1  && NOBLACK(i,j))	ADD(n,i,j) 
			} 
			i=x-1; 
			if(NOMAN(i,y)) 
			{ 
				i=x-2;j=y+1;if(i>=1 && j<=10 && NOBLACK(i,j))	ADD(n,i,j) 
				i=x-2;j=y-1;if(i>=1 && j>=1  && NOBLACK(i,j))	ADD(n,i,j) 
			} 
			j=y+1; 
			if(NOMAN(x,j)) 
			{ 
				i=x+1;j=y+2;if(i<=9 && j<=10 && NOBLACK(i,j))	ADD(n,i,j) 
				i=x-1;j=y+2;if(i>=1 && j<=10 && NOBLACK(i,j))	ADD(n,i,j) 
			} 
			j=y-1; 
			if(NOMAN(x,j)) 
			{ 
				i=x+1;j=y-2;if(i<=9 && j>=1 && NOBLACK(i,j))	ADD(n,i,j) 
				i=x-1;j=y-2;if(i>=1 && j>=1 && NOBLACK(i,j))	ADD(n,i,j) 
			} 
			break; 
 
		case 7: 
		case 8: 
				i=x+1; 
				while(i<=9) 
				{ 
					if (NOMAN(i,y))	ADD(n,i,y) 
					else 
					{ 
						if(NORED(i,y))	ADD(n,i,y) 
						break; 
					} 
					i++; 
				} 
				i=x-1; 
				while(i>=1) 
				{ 
					if (NOMAN(i,y))	ADD(n,i,y) 
					else 
					{ 
						if(NORED(i,y))	ADD(n,i,y) 
						break; 
					} 
					i--; 
				} 
				j=y+1; 
				while(j<=10) 
				{ 
					if (NOMAN(x,j))	ADD(n,x,j) 
					else 
					{ 
						if(NORED(x,j))	ADD(n,x,j) 
						break; 
					} 
					j++; 
				} 
				j=y-1; 
				while(j>=1) 
				{ 
					if (NOMAN(x,j))	ADD(n,x,j) 
					else 
					{ 
						if(NORED(x,j))	ADD(n,x,j) 
						break; 
					} 
					j--; 
				} 
				break; 
		case 23: 
		case 24: 
				i=x+1; 
				while(i<=9) 
				{ 
					if (NOMAN(i,y))	ADD(n,i,y) 
					else 
					{ 
						if(NOBLACK(i,y))	ADD(n,i,y) 
						break; 
					} 
					i++; 
				} 
				i=x-1; 
				while(i>=1) 
				{ 
					if (NOMAN(i,y))	ADD(n,i,y) 
					else 
					{ 
						if(NOBLACK(i,y))	ADD(n,i,y) 
						break; 
					} 
					i--; 
				} 
				j=y+1; 
				while(j<=10) 
				{ 
					if (NOMAN(x,j))	ADD(n,x,j)					 
					else 
					{ 
						if(NOBLACK(x,j))	ADD(n,x,j) 
						break; 
					} 
					j++; 
				} 
				j=y-1; 
				while(j>=1) 
				{ 
					if (NOMAN(x,j))	ADD(n,x,j) 
					else 
					{ 
						if(NOBLACK(x,j))	ADD(n,x,j) 
						break; 
					} 
					j--; 
				} 
				break; 
		case 9: 
		case 10: 
			i=x+1;flag=FALSE; 
			while(i<=9) 
			{ 
				if(NOMAN(i,y)) 
				{ 
					if(!flag)	ADD(n,i,y) 
				} 
				else 
				{ 
					if(!flag)flag=TRUE; 
					else  
					{ 
						if(NORED(i,y))	ADD(n,i,y) 
						break; 
					} 
				} 
				i++; 
			} 
 
			i=x-1;flag=FALSE; 
			while(i>=1) 
			{ 
				if(NOMAN(i,y))  
				{ 
					if(!flag)	ADD(n,i,y) 
				} 
				else 
				{ 
					if(!flag)flag=TRUE; 
					else  
					{ 
						if(NORED(i,y))	ADD(n,i,y) 
						break; 
					} 
				} 
				i--; 
			} 
 
			j=y+1;flag=FALSE; 
			while(j<=10) 
			{ 
				if(NOMAN(x,j))  
				{ 
					if(!flag)	ADD(n,x,j) 
				} 
				else 
				{ 
					if(!flag)flag=TRUE; 
					else  
					{ 
						if(NORED(x,j))	ADD(n,x,j) 
						break; 
					} 
				} 
				j++; 
			} 
 
			j=y-1;flag=FALSE; 
			while(j>=1) 
			{ 
				if(NOMAN(x,j))  
				{ 
					if(!flag)	ADD(n,x,j) 
				} 
				else 
				{ 
					if(!flag)flag=TRUE; 
					else  
					{ 
						if(NORED(x,j))	ADD(n,x,j) 
						break; 
					} 
				} 
				j--; 
			} 
			break; 
 
		case 25: 
		case 26: 
			i=x+1;flag=FALSE; 
			while(i<=9) 
			{ 
				if(NOMAN(i,y)) 
				{ 
					if(!flag)	ADD(n,i,y) 
				} 
				else 
				{ 
					if(!flag)flag=TRUE; 
					else 
					{ 
						if(NOBLACK(i,y))	ADD(n,i,y) 
						break; 
					} 
				} 
				i++; 
			} 
 
			i=x-1;flag=FALSE; 
			while(i>=1) 
			{ 
				if(NOMAN(i,y))  
				{ 
					if(!flag)	ADD(n,i,y) 
				} 
				else 
				{ 
					if(!flag)flag=TRUE; 
					else  
					{ 
						if(NOBLACK(i,y))	ADD(n,i,y) 
						break; 
					} 
				} 
				i--; 
			} 
 
			j=y+1;flag=FALSE; 
			while(j<=10) 
			{ 
				if(NOMAN(x,j)) 
				{ 
					if(!flag)	ADD(n,x,j) 
				} 
				else 
				{ 
					if(!flag)flag=TRUE; 
					else  
					{ 
						if(NOBLACK(x,j))	ADD(n,x,j) 
						break; 
					} 
				} 
				j++; 
			} 
 
			j=y-1;flag=FALSE; 
			while(j>=1) 
			{ 
				if(NOMAN(x,j)) 
				{ 
					if(!flag)	ADD(n,x,j) 
				} 
				else 
				{ 
					if(!flag)flag=TRUE; 
					else  
					{ 
						if(NOBLACK(x,j))	ADD(n,x,j) 
						break; 
					} 
				} 
				j--; 
			} 
			break; 
		case 11: 
		case 12: 
		case 13: 
		case 14: 
		case 15: 
			j=y-1; 
			if(j>=1 && NORED(x,j))	ADD(n,x,j) 
			if(y<=5) 
			{ 
				i=x+1;if(i<=9 && NORED(i,y))	ADD(n,i,y) 
				i=x-1;if(i>=1 && NORED(i,y))	ADD(n,i,y) 
			} 
			break; 
 
		case 27: 
		case 28: 
		case 29: 
		case 30: 
		case 31: 
			j=y+1; 
			if(j<=10 && NOBLACK(x,j))	ADD(n,x,j) 
			if(y>=6) 
			{ 
				i=x+1;if(i<=9 && NOBLACK(i,y))	ADD(n,i,y) 
				i=x-1;if(i>=1 && NOBLACK(i,y))	ADD(n,i,y) 
			} 
			break; 
		default : 
			break; 
		} 
	} 
	return TRUE; 
_NOKING: 
	return FALSE; 
} 
 
void ContactV(int tmap[11][12],POINT tmanposition[32],int &tside,int activity[32],int contact[32][32]) 
{ 
 
	#define CV(man,tx,ty) {k=tmap[tx][ty];activity[man]+=1;if(k!=32)contact[man][k]=1;} 
 
	static int k; 
	static int i,j,n,x,y; 
	static BOOL	flag; 
 
	for(n=0;n<=31;n++) 
	{ 
		x=tmanposition[n].x; 
		if(!x)continue; 
		y=tmanposition[n].y; 
		switch(n) 
		{ 
		case 0: 
			if(tmanposition[0].x==tmanposition[16].x)		//将帅在同一列 
			{ 
				flag=FALSE; 
				for(j=tmanposition[16].y+1;j=8  )	CV(0,x,j) 
			i=x+1;if(i<=6  )	CV(0,i,y) 
			i=x-1;if(i>=4  )	CV(0,i,y) 
			break; 
		case 16: 
			if(tmanposition[0].x==tmanposition[16].x)		//将帅在同一列 
			{ 
				flag=FALSE; 
				for(j=tmanposition[16].y+1;j=1 )	CV(16,x,j) 
			i=x+1;if(i<=6 )	CV(16,i,y) 
			i=x-1;if(i>=4 )	CV(16,i,y) 
			break; 
		case 1: 
		case 2: 
			i=x+1;j=y+1;if(i<=6 && j<=10 )	CV(n,i,j) 
			i=x+1;j=y-1;if(i<=6 && j>=8  )	CV(n,i,j) 
			i=x-1;j=y+1;if(i>=4 && j<=10 )	CV(n,i,j) 
			i=x-1;j=y-1;if(i>=4 && j>=8  )	CV(n,i,j) 
			break; 
		case 17: 
		case 18: 
			i=x+1;j=y+1;if(i<=6 && j<=3 )	CV(n,i,j) 
			i=x+1;j=y-1;if(i<=6 && j>=1 )	CV(n,i,j) 
			i=x-1;j=y+1;if(i>=4 && j<=3	)	CV(n,i,j) 
			i=x-1;j=y-1;if(i>=4 && j>=1 )	CV(n,i,j) 
			break; 
		case 3: 
		case 4: 
			i=x+2;j=y+2;if(i<=9 && j<=10  )	if(NOMAN(x+1,y+1))	CV(n,i,j) 
			i=x+2;j=y-2;if(i<=9 && j>=6   )	if(NOMAN(x+1,y-1))	CV(n,i,j) 
			i=x-2;j=y+2;if(i>=1 && j<=10  )	if(NOMAN(x-1,y+1))	CV(n,i,j) 
			i=x-2;j=y-2;if(i>=1 && j>=6   )	if(NOMAN(x-1,y-1))	CV(n,i,j) 
			break; 
		case 19: 
		case 20: 
			i=x+2;j=y+2;if(i<=9 && j<=5 )	if(NOMAN(x+1,y+1))	CV(n,i,j) 
			i=x+2;j=y-2;if(i<=9 && j>=1 )	if(NOMAN(x+1,y-1))	CV(n,i,j) 
			i=x-2;j=y+2;if(i>=1 && j<=5 )	if(NOMAN(x-1,y+1))	CV(n,i,j) 
			i=x-2;j=y-2;if(i>=1 && j>=1 )	if(NOMAN(x-1,y-1))	CV(n,i,j) 
			break; 
		case 5: 
		case 6: 
			i=x+1; 
			if(NOMAN(i,y)) 
			{ 
				i=x+2;j=y+1;if(i<=9 && j<=10 )	CV(n,i,j) 
				i=x+2;j=y-1;if(i<=9 && j>=1  )	CV(n,i,j) 
			} 
			i=x-1; 
			if(NOMAN(i,y)) 
			{ 
				i=x-2;j=y+1;if(i>=1 && j<=10 )	CV(n,i,j) 
				i=x-2;j=y-1;if(i>=1 && j>=1  )	CV(n,i,j) 
			} 
			j=y+1; 
			if(NOMAN(x,j)) 
			{ 
				i=x+1;j=y+2;if(i<=9 && j<=10 )	CV(n,i,j) 
				i=x-1;j=y+2;if(i>=1 && j<=10 )	CV(n,i,j) 
			} 
			j=y-1; 
			if(NOMAN(x,j)) 
			{ 
				i=x+1;j=y-2;if(i<=9 && j>=1 )	CV(n,i,j) 
				i=x-1;j=y-2;if(i>=1 && j>=1 )	CV(n,i,j) 
			} 
			break; 
		case 21: 
		case 22: 
			i=x+1; 
			if(NOMAN(i,y)) 
			{ 
				i=x+2;j=y+1;if(i<=9 && j<=10 )	CV(n,i,j) 
				i=x+2;j=y-1;if(i<=9 && j>=1  )	CV(n,i,j) 
			} 
			i=x-1; 
			if(NOMAN(i,y)) 
			{ 
				i=x-2;j=y+1;if(i>=1 && j<=10 )	CV(n,i,j) 
				i=x-2;j=y-1;if(i>=1 && j>=1  )	CV(n,i,j) 
			} 
			j=y+1; 
			if(NOMAN(x,j)) 
			{ 
				i=x+1;j=y+2;if(i<=9 && j<=10 )	CV(n,i,j) 
				i=x-1;j=y+2;if(i>=1 && j<=10 )	CV(n,i,j) 
			} 
			j=y-1; 
			if(NOMAN(x,j)) 
			{ 
				i=x+1;j=y-2;if(i<=9 && j>=1 )	CV(n,i,j) 
				i=x-1;j=y-2;if(i>=1 && j>=1 )	CV(n,i,j) 
			} 
			break; 
 
		case 7: 
		case 8: 
				i=x+1; 
				while(i<=9) 
				{ 
					if (NOMAN(i,y))	CV(n,i,y) 
					else 
					{ 
						CV(n,i,y) 
						break; 
					} 
					i++; 
				} 
				i=x-1; 
				while(i>=1) 
				{ 
					if (NOMAN(i,y))	CV(n,i,y) 
					else 
					{ 
						CV(n,i,y) 
						break; 
					} 
					i--; 
				} 
				j=y+1; 
				while(j<=10) 
				{ 
					if (NOMAN(x,j))	CV(n,x,j) 
					else 
					{ 
						CV(n,x,j) 
						break; 
					} 
					j++; 
				} 
				j=y-1; 
				while(j>=1) 
				{ 
					if (NOMAN(x,j))	CV(n,x,j) 
					else 
					{ 
						CV(n,x,j) 
						break; 
					} 
					j--; 
				} 
				break; 
		case 23: 
		case 24: 
				i=x+1; 
				while(i<=9) 
				{ 
					if (NOMAN(i,y))	CV(n,i,y) 
					else 
					{ 
						CV(n,i,y) 
						break; 
					} 
					i++; 
				} 
				i=x-1; 
				while(i>=1) 
				{ 
					if (NOMAN(i,y))	CV(n,i,y) 
					else 
					{ 
						CV(n,i,y) 
						break; 
					} 
					i--; 
				} 
				j=y+1; 
				while(j<=10) 
				{ 
					if (NOMAN(x,j))	CV(n,x,j)					 
					else 
					{ 
						CV(n,x,j) 
						break; 
					} 
					j++; 
				} 
				j=y-1; 
				while(j>=1) 
				{ 
					if (NOMAN(x,j))	CV(n,x,j) 
					else 
					{ 
						CV(n,x,j) 
						break; 
					} 
					j--; 
				} 
				break; 
		case 9: 
		case 10: 
			i=x+1;flag=FALSE; 
			while(i<=9) 
			{ 
				if(NOMAN(i,y)) 
				{ 
					if(!flag)	CV(n,i,y) 
				} 
				else 
				{ 
					if(!flag)flag=TRUE; 
					else  
					{ 
						CV(n,i,y) 
						break; 
					} 
				} 
				i++; 
			} 
 
			i=x-1;flag=FALSE; 
			while(i>=1) 
			{ 
				if(NOMAN(i,y))  
				{ 
					if(!flag)	CV(n,i,y) 
				} 
				else 
				{ 
					if(!flag)flag=TRUE; 
					else  
					{ 
						CV(n,i,y) 
						break; 
					} 
				} 
				i--; 
			} 
 
			j=y+1;flag=FALSE; 
			while(j<=10) 
			{ 
				if(NOMAN(x,j))  
				{ 
					if(!flag)	CV(n,x,j) 
				} 
				else 
				{ 
					if(!flag)flag=TRUE; 
					else  
					{ 
						CV(n,x,j) 
						break; 
					} 
				} 
				j++; 
			} 
 
			j=y-1;flag=FALSE; 
			while(j>=1) 
			{ 
				if(NOMAN(x,j))  
				{ 
					if(!flag)	CV(n,x,j) 
				} 
				else 
				{ 
					if(!flag)flag=TRUE; 
					else  
					{ 
						CV(n,x,j) 
						break; 
					} 
				} 
				j--; 
			} 
			break; 
 
		case 25: 
		case 26: 
			i=x+1;flag=FALSE; 
			while(i<=9) 
			{ 
				if(NOMAN(i,y)) 
				{ 
					if(!flag)	CV(n,i,y) 
				} 
				else 
				{ 
					if(!flag)flag=TRUE; 
					else 
					{ 
						CV(n,i,y) 
						break; 
					} 
				} 
				i++; 
			} 
 
			i=x-1;flag=FALSE; 
			while(i>=1) 
			{ 
				if(NOMAN(i,y))  
				{ 
					if(!flag)	CV(n,i,y) 
				} 
				else 
				{ 
					if(!flag)flag=TRUE; 
					else  
					{ 
						CV(n,i,y) 
						break; 
					} 
				} 
				i--; 
			} 
 
			j=y+1;flag=FALSE; 
			while(j<=10) 
			{ 
				if(NOMAN(x,j)) 
				{ 
					if(!flag)	CV(n,x,j) 
				} 
				else 
				{ 
					if(!flag)flag=TRUE; 
					else  
					{ 
						CV(n,x,j) 
						break; 
					} 
				} 
				j++; 
			} 
 
			j=y-1;flag=FALSE; 
			while(j>=1) 
			{ 
				if(NOMAN(x,j)) 
				{ 
					if(!flag)	CV(n,x,j) 
				} 
				else 
				{ 
					if(!flag)flag=TRUE; 
					else  
					{ 
						CV(n,x,j) 
						break; 
					} 
				} 
				j--; 
			} 
			break; 
		case 11: 
		case 12: 
		case 13: 
		case 14: 
		case 15: 
			j=y-1; 
			if(j>=1 )	CV(n,x,j) 
			if(y<=5) 
			{ 
				i=x+1;if(i<=9 )	CV(n,i,y) 
				i=x-1;if(i>=1 )	CV(n,i,y) 
			} 
			break; 
 
		case 27: 
		case 28: 
		case 29: 
		case 30: 
		case 31: 
			j=y+1; 
			if(j<=10 )	CV(n,x,j) 
			if(y>=6) 
			{ 
				i=x+1;if(i<=9 )	CV(n,i,y) 
				i=x-1;if(i>=1 )	CV(n,i,y) 
			} 
			break; 
		default : 
			break; 
		} 
	} 
} 
int Search(int tmap[11][12],POINT tmanposition[32],int &tside,int man, POINT point,int upmax,int depth) 
{ 
 
	int ate,cur,maxvalue,curvalue,xs,ys; 
	int count; 
 
	ate=32; 
	//移动棋子: 
	xs=tmanposition[man].x;ys=tmanposition[man].y;				//原坐标 
	if (SideOfMan[tmap[point.x][point.y]]==!tside)	//目标点有对方的棋子 
	{ 
		ate=tmap[point.x][point.y];					//记录下被吃掉的棋子 
		if(ate==0 || ate==16) 
		{ 
			return 9999; 
		} 
		tmanposition[ate].x=0;						//目标点的棋子被吃掉 
//		tmancount--; 
	} 
	depth--; 
	tmap[point.x][point.y]=man;						//这两行是: 
	tmap[xs][ys]=32;							//在map上的移动 
	tmanposition[man]=point;							//这两行是: 
	tside=!tside; 
 
	if(depth>0) 
	{ 
		int chessman[125]; 
		POINT targetpoint[125]; 
		if(EnumList(tmap,tmanposition,tside,chessman,targetpoint,count)) 
		{ 
			if(depth>=2) 
			{ 
				int value[125]; 
				cur=0; 
				maxvalue=-10000; 
				while(cur< count) 
				{ 
					curvalue=Search(tmap,tmanposition,tside,chessman[cur],targetpoint[cur],-10000,depth-2); 
					value[cur]=curvalue; 
					if(curvalue>maxvalue)maxvalue=curvalue; 
					cur ++; 
				} 
				::Mantis_QuickSort(value,chessman,targetpoint,0,count-1); 
				count=S_WIDTH; 
			} 
 
			maxvalue=-10000; 
			cur=0; 
			while(cur< count) 
			{ 
				curvalue=Search(tmap,tmanposition,tside,chessman[cur],targetpoint[cur],maxvalue,depth); 
				if(curvalue>maxvalue)maxvalue=curvalue; 
				if(curvalue>=-upmax)goto _ENDSUB; 
				cur ++; 
			} 
		} 
		else maxvalue=9800; 
	} 
	else 
	{ 
		maxvalue=Envalue(tmap,tmanposition,tside); 
	} 
 
_ENDSUB: 
	tmanposition[man].x=xs;							//这两行是: 
	tmanposition[man].y=ys;							//在face上的恢复 
	tmap[xs][ys]=man;									//在map上的恢复 
	if(ate!=32) 
	{ 
		tmanposition[ate]=point; 
		tmap[point.x][point.y]=ate; 
//		tmancount++; 
	} 
	else tmap[point.x][point.y]=32; 
 
	tside=!tside; 
	return -maxvalue; 
} 
BOOL Think(int tmap[11][12],POINT tmanposition[32],int &tside,int &resultman, POINT &resultpoint) 
{ 
	int chessman[125]; 
	POINT targetpoint[125]; 
	int count; 
	int maxvalue; 
	int cur; 
	int curvalue; 
	if(EnumList(tmap,tmanposition,tside,chessman,targetpoint,count)) 
	{ 
		if(S_DEPTH>=2) 
		{ 
			int value[125]; 
			cur=0; 
			maxvalue=-10000; 
			while(cur< count) 
			{ 
				curvalue=Search(tmap,tmanposition,tside,chessman[cur],targetpoint[cur],-10000,S_DEPTH-2); 
				value[cur]=curvalue; 
				if(curvalue>maxvalue)maxvalue=curvalue; 
				cur ++; 
			} 
			::Mantis_QuickSort(value,chessman,targetpoint,0,count-1); 
			count=S_WIDTH; 
		} 
		maxvalue=-10000; 
		cur=0; 
		while(cur< count) 
		{ 
			curvalue=Search(tmap,tmanposition,tside,chessman[cur],targetpoint[cur],maxvalue,S_DEPTH); 
			if(curvalue>maxvalue) 
			{ 
				maxvalue=curvalue; 
				resultman=chessman[cur]; 
				resultpoint=targetpoint[cur]; 
			} 
			cur ++; 
		} 
		return TRUE; 
	} 
	else 
	{ 
		if(count>0) 
		{ 
			resultman=chessman[count-1]; 
			resultpoint=targetpoint[count-1]; 
			return TRUE; 
		} 
		else 
		{ 
			resultman=32; 
			resultpoint.x=0; 
			return FALSE; 
		} 
	} 
}