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

📄 mantischessthink.cpp

📁 学习VC++游戏编程的 好程序 象棋代码 算法比较复杂
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				}
				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 + -