📄 thinker.cpp
字号:
{
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;
}
#define CV(man,tx,ty) {k=tmap[tx][ty];v1[man]+=1;if(k!=32)v2[man][k]=1;}
void CThinker::ContactV()
{
static int i,j,n,x,y;
static BOOL flag;
for(n=0;n<=31;n++)
{
x=tmanx[n];
if(!x)continue;
y=tmany[n];
switch(n)
{
case 0:
if(tmanx[0]==tmanx[16]) //将帅在同一列
{
flag=FALSE;
for(j=tmany[16]+1;j<tmany[0];j++)
{
if(tmap[x][j]!=32)
{
flag=TRUE;
break;
}
}
if (!flag)
{
CV(0,x,tmany[16]);
}
}
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(tmanx[0]==tmanx[16]) //将帅在同一列
{
flag=FALSE;
for(j=tmany[16]+1;j<tmany[0];j++)
{
if(tmap[x][j]!=32)
{
flag=TRUE;
break;
}
}
if (!flag)
{
CV(16,x,tmany[0]);
}
}
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;
}
}
}
int CThinker::SubThink(int man, int tx, int ty)
{
int ate,i,j,cur,maxvalue,curvalue,xs,ys;
char *bman,*btox,*btoy;
int *pcount;
ate=32;
tdeep++;
//
//移动棋子:
xs=tmanx[man];ys=tmany[man]; //原坐标
if (SideOfMan[tmap[tx][ty]]==!tside) //目标点有对方的棋子
{
ate=tmap[tx][ty]; //记录下被吃掉的棋子
if(ate==0 || ate==16)
{
tdeep--;
return 9999;
}
tmanx[ate]=0; //目标点的棋子被吃掉
}
tmap[tx][ty]=man; //这两行是:
tmap[xs][ys]=32; //在map上的移动
tmanx[man]=tx; //这两行是:
tmany[man]=ty; //在face上的移动
tside=!tside;
if(tdeep != tlevel)
{
//初始化:
bman=tman[tdeep];
btox=ttox[tdeep];
btoy=ttoy[tdeep];
pcount=& tcount[tdeep];
*pcount=0;
cur=0;
if(EnumList())
{
maxvalue=-10000;
i=*pcount;
while(cur< i)
{
curvalue=SubThink(bman[cur],btox[cur],btoy[cur]);
if(curvalue>maxvalue)maxvalue=curvalue;
cur ++;
}
}
else maxvalue=9800;
}
else
{
memset(v2,0,sizeof(int)<<10);
memset(v1,0,sizeof(int)<<5);
memset(v3,0,sizeof(int)<<5);
memset(v4,0,sizeof(int)<<5);
maxvalue=0;
ContactV();
//己方将军
for(i=FistOfSide[tside];i<=LastOfSide[tside];i++)
{
if(v2[i][FistOfSide[!tside]])
{
maxvalue=9700;
goto _ENDSUB;
}
}
for(i=0;i<32;i++)
{
k=ManToType7[i];
v1[i]=BV1[k]+v1[i]*BV2[k];
if(k==6) v1[i]+=BV3[ BA[SideOfMan[i]][tmany[i]][tmanx[i]] ];
}
for(i=0;i<32;i++)
{
for(j=0;j<32;j++)
{
if(v2[i][j])
{
if(SideOfMan[i]==SideOfMan[j])
{
v3[i]+=v1[j]>>5;//己方
v4[j]++;
}
else
{
v3[i]+=v1[j]>>3;//对方
v4[j]--;
}
}
}
}
for(i=FistOfSide[tside];i<=LastOfSide[tside];i++)
{
if(tmanx[i])maxvalue+=v1[i]+v3[i];
}
static BOOL flag;
flag=FALSE;k=32;
for(i=FistOfSide[!tside];i<=LastOfSide[!tside];i++)
{
if(tmanx[i])maxvalue-=v1[i]+v3[i];
//对方将军
if(v2[i][FistOfSide[tside]])
{
flag=TRUE;
k=i;
break;
}
}
if(flag)//被将
{
if(v4[k]>=0)//所将军的棋子不能被吃掉
{
j=0;
for(i=FistOfSide[tside];i<=LastOfSide[tside];i++)
{
if(v4[i]<0 && v1[i]>j) j=v1[i];
}
maxvalue -=j;
}
}
else
{
j=0;
for(i=FistOfSide[!tside];i<=LastOfSide[!tside];i++)
{
if(v4[i]<0 && v1[i]>j)
j=v1[i];
}
maxvalue +=j;
}
}
_ENDSUB: tmanx[man]=xs; //这两行是:
tmany[man]=ys; //在face上的恢复
tmap[xs][ys]=man; //在map上的恢复
if(ate!=32)
{
tmanx[ate]=tx;
tmany[ate]=ty;
tmap[tx][ty]=ate;
}
else tmap[tx][ty]=32;
tside=!tside;
tdeep--;
return -maxvalue;
}
BOOL CThinker::LoadThinkSetting()
{
CFile file;
if(file.Open( "Thinker.set",CFile::modeRead))
{
file.SeekToBegin();
file.Read(BV1,7*sizeof(int));
file.Read(BV2,7*sizeof(int));
file.Read(BV3,5*sizeof(int));
file.Close();
if(BVIsNormal())return TRUE;
else
{
ResetBV();
SaveThinkSetting();
return FALSE;
}
}
MessageBox(NULL, "没找到 Thinker.set 文件\n\n这个文件并不是必需的,但它记录了你的设置内容,\n\n请不要删掉\n\n你现在可以通过菜单 \"文件\" -> \"参数\" 重新设定.","提醒",MB_OK|MB_ICONINFORMATION);
ResetBV();
SaveThinkSetting();
return FALSE;
}
void CThinker::ResetBV()
{
BV1[0]=0; BV2[0]=0;
BV1[1]=250; BV2[1]=1;
BV1[2]=250; BV2[2]=1;
BV1[3]=300; BV2[3]=12;
BV1[4]=400; BV2[4]=6;
BV1[5]=300; BV2[5]=6;
BV1[6]=100; BV2[6]=15;
BV3[0]=0;
BV3[1]=70;
BV3[2]=90;
BV3[3]=110;
BV3[4]=120;
}
BOOL CThinker::BVIsNormal()
{
int i;
for(i=0;i<=6;i++)
{
if(BV1[i]<0||BV1[i]>1000||BV2[i]<0||BV2[i]>1000)return FALSE;
}
for(i=0;i<=4;i++)
{
if(BV3[i]<0||BV3[i]>1000)return FALSE;
}
return TRUE;
}
BOOL CThinker::SaveThinkSetting()
{
CFile file;
if(file.Open("Thinker.set",CFile::modeWrite|CFile::modeCreate))
{
file.SeekToBegin();
file.Write(BV1,7*sizeof(int));
file.Write(BV2,7*sizeof(int));
file.Write(BV3,5*sizeof(int));
file.Close();
return TRUE;
}
else return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -