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

📄 thinker.cpp

📁 VC各工程的源码集合
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			{
				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 + -