📄 mantischessthink.cpp
字号:
}
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;
}
/******************************************************************
ContactV: 计算个棋子的活跃度和棋子间的联系值,为Value函数的子函数
参数:
tmap: 各棋位状态
tmanposition: 32棋子的坐标
tside: 轮到哪一放走
activity: 棋子的活跃度(存放结果)
contact: 棋子间的联系值(存放结果)
返回值: 无
******************************************************************/
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<tmanposition[0].y;j++)
{
if(tmap[x][j]!=32)
{
flag=TRUE;
break;
}
}
if (!flag)
{
CV(0,x,tmanposition[16].y);
}
}
j=y+1;if(j<=10 ) CV(0,x,j)
j=y-1;if(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<tmanposition[0].y;j++)
{
if(tmap[x][j]!=32)
{
flag=TRUE;
break;
}
}
if (!flag)
{
CV(16,x,tmanposition[0].y);
}
}
j=y+1;if(j<=3 ) CV(16,x,j)
j=y-1;if(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;
}
}
}
/******************************************************************
Search: α-β递归搜索,求man,point组成的走法的价值
参数:
tmap: 各棋位状态
tmanposition: 32棋子的坐标
tside: 轮到哪一放走
man: 所移动的棋子
point: 目标位置,与man组成走法
upmax: 上一层的最大值,用来做α-β剪枝
depth: 搜索的深度
返回值: 这种走法的价值
******************************************************************/
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=Value(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;
}
/******************************************************************
Think: 求最佳走法
参数:
tmap: 各棋位状态
tmanposition: 32棋子的坐标
tside: 轮到哪一放走
resultman: 结果移动的棋子
resultpoint: 结果移动目标位置
返回值: 成功返回TRUE,否则返回FALSE
******************************************************************/
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;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -