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;
}
}
}