📄 thinker.cs
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace GameWorld.ChineseChess
{
class CThinker
{
public int BV1=new int[7];
public int BV2=new int[7];
public int BV3=new int[5];
protected CMove m_moveResult;
protected bool m_bThinking;
protected bool m_bThinkOver;
protected bool m_bWaitForExit;
protected bool m_bWaitForCut;
protected bool m_bExited;
protected uint m_nLevel;
protected uint m_nPercent;
protected CFace m_FaceToThink;
// protected CCriticalSection cs;
// protected EventWaitHandle m_Stoped;
// protected EventWaitHandle m_Cut;
// protected Thread m_pThinkThread;
// object LoclObject =new object();
public CThinker()
{
ResetBV();
m_nLevel = 1;
m_nPercent = 0;
m_bExited = false;
m_bWaitForExit = false;
m_bWaitForCut = false;
m_bThinking = false;
m_bThinkOver = false;
// m_pThinkThread=AfxBeginThread(_bogusthreadfunc,this,THREAD_PRIORITY_NORMAL); //构造器中启动线程
}
public uint ThinkProc() //思考线程生存期与类对象生存期相同
{
int i,cur,maxvalue=new int[3],curvalue;
char bman,btox,btoy;
int pcount;
CMove maxmove=new CMove[3];
const char[,] strman=new char[14,3]
{"帅","仕","相","马","车","炮","兵","将","士","象","马","车","炮","卒"};
TRACE("进入思考线程\n");
while(1)
{
//Monitor.Enter(LoclObject);
if(m_bWaitForExit)
{
//Monitor.Exit(LoclObject);
goto _EXIT;
}
//Monitor.Exit(LoclObject);
//Monitor.Enter(LoclObject);
if(m_bWaitForCut)
{
//Monitor.Exit(LoclObject);
goto _CUT;
}
//Monitor.Exit(LoclObject);
//Monitor.Enter(LoclObject);
if(!m_bThinking)
{
//Monitor.Exit(LoclObject);
continue;
}
//Monitor.Exit(LoclObject);
curvalue=-10000;
maxvalue[0]=-10000;
maxvalue[1]=-10001;
maxvalue[2]=-10002;
//Monitor.Enter(LoclObject);
tlevel = m_nLevel;
//Monitor.Exit(LoclObject);
tdeep =0;
bman=tman[0];
btox=ttox[0];
btoy=ttoy[0];
pcount=& tcount[0];
*pcount=0;
for(int i=0;i<32;i++)
{
tmanx[i]=m_FaceToThink.man[i].x;
tmany[i]=m_FaceToThink.man[i].y;
}
tside=m_FaceToThink.side;
FixManMap(m_FaceToThink,tmap);
cur=0;
EnumList();
i=*pcount;
while(cur<i)
{
curvalue=SubThink(bman[cur],btox[cur],btoy[cur]);
//---------------------------
bman=tman[0];
btox=ttox[0];
btoy=ttoy[0];
//----------------------------
//防止兑子过快:
if(tmap[btox[cur]][btoy[cur]]!=32) curvalue-=BV1[4]/18;
//TRACE("%2d: %s(%2d,%2d) - (%2d,%2d) =%4d\n"
// ,cur
// ,strman[ManToType[bman[cur]]]
// ,tmanx[bman[cur]]
// ,tmany[bman[cur]]
// ,btox[cur]
// ,btoy[cur]
// ,curvalue);
if(curvalue >maxvalue[0])
{
maxmove[2]=maxmove[1]; maxvalue[2]=maxvalue[1];
maxmove[1]=maxmove[0]; maxvalue[1]=maxvalue[0];
maxmove[0].man=bman[cur];
maxmove[0].x=btox[cur];
maxmove[0].y=btoy[cur];
maxvalue[0]=curvalue;
}
else if(curvalue >maxvalue[1])
{
maxmove[2]=maxmove[1]; maxvalue[2]=maxvalue[1];
maxmove[1].man=bman[cur];
maxmove[1].x=btox[cur];
maxmove[1].y=btoy[cur];
maxvalue[1]=curvalue;
}
else if(curvalue >maxvalue[2])
{
maxmove[2].man=bman[cur];
maxmove[2].x=btox[cur];
maxmove[2].y=btoy[cur];
maxvalue[2]=curvalue;
}
cur ++;
//Monitor.Enter(LoclObject);
m_nPercent=((cur+1)*100)/i;
//Monitor.Exit(LoclObject);
//----------这一段要保证随时能调用
//Monitor.Enter(LoclObject);
if(m_bWaitForExit)
{
//Monitor.Exit(LoclObject);
goto _EXIT;
}
//Monitor.Exit(LoclObject);
//Monitor.Enter(LoclObject);
if(m_bWaitForCut)
{
//Monitor.Exit(LoclObject);
goto _CUT;
}
//Monitor.Exit(LoclObject);
// --------------------------------
}
//结束一次计算:
//Monitor.Enter(LoclObject);
float f;
f=((float)(maxvalue[0]-maxvalue[2])/((float)(maxvalue[0]+maxvalue[1]+maxvalue[2])/3));
if(f<0.1 && f>-0.1)
m_moveResult=maxmove[rnd(3)];
else
{
f=((float)(maxvalue[0]-maxvalue[1])/((float)(maxvalue[0]+maxvalue[1])/2));
if(f<0.1 && f>-0.1) m_moveResult=maxmove[rnd(2)];
else m_moveResult=maxmove[0];
}
//TRACE("结果: %s(%2d,%2d) - (%2d,%2d)\n"
// ,strman[ManToType[m_moveResult.man]]
// ,m_FaceToThink.man[m_moveResult.man].x
// ,m_FaceToThink.man[m_moveResult.man].y
// ,m_moveResult.x
// ,m_moveResult.y);
m_bThinkOver=true;
//-------------------------
for(int i=0;i<32;i++)
{
m_FaceToThink.man[i].x=tmanx[i];
m_FaceToThink.man[i].y=tmany[i];
}
m_FaceToThink.side=tside;
//-------------------------------
//Monitor.Exit(LoclObject);
goto _DDD;
_CUT: //Monitor.Enter(LoclObject);
m_Cut.SetEvent();
if(m_bWaitForCut)
m_bWaitForCut=false;
//Monitor.Exit(LoclObject);
_DDD: //Monitor.Enter(LoclObject);
m_bThinking=false;
//Monitor.Exit(LoclObject);
}
_EXIT: TRACE("退出思考线程\n");
//Monitor.Enter(LoclObject);
m_Stoped.Set();
//Monitor.Exit(LoclObject);
return 0;
}
//public uint _bogusthreadfunc(LPVOID lpparam)//线程函数不能是普通的类成员函数
//{ //所以通过这个static类型的函数启动线程
// CThinker* This=(CThinker*)(lpparam); //lpparam为构造器中传过来的"this"指针
// return This->ThinkProc();
//}
public bool GetMove(CMove move,CFace facetothink)
{
//TRACE("Enter GetMove()\n");
if(!IsThinkOver())return false;
//Monitor.Enter(LoclObject);
if(facetothink==m_FaceToThink)
{
move=m_moveResult;
//Monitor.Exit(LoclObject);
return true;
}
//Monitor.Exit(LoclObject);
TRACE("GetMove() 发现两次的棋局不同\n");
return false;
}
void SetLevel(int level)
{
//Monitor.Enter(LoclObject);
m_nLevel=level;
TRACE("设置电脑等级为 %d\n",level);
//Monitor.Exit(LoclObject);
}
void Exit()
{
//Monitor.Enter(LoclObject);
m_bWaitForExit=true;
//Monitor.Exit(LoclObject);
WaitHandle.SignalAndWait(m_Stoped,);
m_bExited=true;
Sleep(300);
}
void Think(CFace face)
{
//TRACE("Enter Think()\n");
if(m_bThinking)Cut();
//Monitor.Enter(LoclObject);
m_nPercent = 0;
m_FaceToThink = face;
m_bThinking = true;
m_bThinkOver = false;
TRACE("计算 side = %d\n",face.side);
//Monitor.Exit(LoclObject);
//TRACE("Leave Think()\n");
}
bool IsThinkOver()
{
//TRACE("Enter IsThinkOver()\n");
bool flag;
//Monitor.Enter(LoclObject);
flag=m_bThinkOver;
//Monitor.Exit(LoclObject);
//TRACE("Leave IsThinkOver()\n");
return flag;
}
void Cut()
{
//Monitor.Enter(LoclObject);
m_bWaitForCut=true;
//Monitor.Exit(LoclObject);
::WaitForSingleObject(m_Cut,INFINITE);
//Monitor.Enter(LoclObject);
m_bThinkOver=false;
m_nPercent=0;
//Monitor.Exit(LoclObject);
TRACE("中止计算\n");
}
uint GetPercent()
{
int val;
//Monitor.Enter(LoclObject);
val=m_nPercent;
//Monitor.Exit(LoclObject);
return val;
}
//#define ADD(man,tx,ty) {*lman=man;*ltox=tx;*ltoy=ty;lman++;ltox++;ltoy++;(*pcount)++;if(tmap[tx][ty]==FistOfSide[!tside])goto _NOKING;}
bool EnumList()
{
static int i,j,n,x,y,* pcount;
static bool flag;
lman=tman[tdeep];
ltox=ttox[tdeep];
ltoy=ttoy[tdeep];
pcount=&tcount[tdeep];
for(n=FistOfSide[tside];n<=LastOfSide[tside];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)
{
ADD(0,x,tmany[16]);
}
}
j=y+1;if(j<=10 && NORED(x,j)) ADD(0,x,j)
j=y-1;if(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(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)
{
ADD(16,x,tmany[0]);
}
}
j=y+1;if(j<=3 && NOBLACK(x,j)) ADD(16,x,j)
j=y-1;if(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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -