⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 thinker.cs

📁 Visual studio 2005,C#开发 具有人工智能
💻 CS
📖 第 1 页 / 共 3 页
字号:
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 + -