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

📄 cchessevaluate.h

📁 中国象棋人机对弈
💻 H
📖 第 1 页 / 共 2 页
字号:
// CChessEvaluate.h


////////////////////// Type Define /////////////////////////////////////////////

typedef struct _relationtable{

	BYTE nCChessID ;
	int nUAttackCount ;
	int nUGuardCount ;
	BYTE UnderAttack[5];
	BYTE UnderGurad[5];

} RelationTable;



/////////////////// Data Define ////////////////////////////////////////////////

POINT PointList[20];		// 目标点队列
int nPointCount;			// 目标点数目

RelationTable RelationOfMan[9][10];	// 关系表

const int MaxValue = 10000;	// 最大极值(最小极值为最大极值的负值)


//各子的基本价值(子力价值)
//								将, 士, 象, 马, 车, 炮, 卒
const int BasicValues[15] = { 0,0, 250, 250, 300, 500, 300,  80, 
								0, 250, 250, 300, 500, 300,  80 };

//各子的机动性价值(每多一步走法所加的分)
//									将, 士, 象, 马, 车, 炮, 卒
const int MobilityValues[8] = {  0,  0,   1,   1,  12,   6,   6,  15 };


//各子的控制区域价值(所在的位置的价值)
const int PositionValues[8][90] = {
	{
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0
	}, 
	{ // 帅
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		1, -8, -9,  0,  0,  0,  0,  0,  0,  0,
		5, -8, -9,  0,  0,  0,  0,  0,  0,  0,
		1, -8, -9,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0
	}, 
	{ // 士
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  3,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0
	}, 
	{ // 相  
		0,  0, -2,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  3,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		0,  0, -2,  0,  0,  0,  0,  0,  0,  0
	}, 
	{ // 马
		 0, -3,  5,  4,  2,  2,  5,  4,  2,  2,
		-3,  2,  4,  6, 10, 12, 20, 10,  8,  2,
		 2,  4,  6, 10, 13, 11, 12, 11, 15,  2,
		 0,  5,  7,  7, 14, 15, 19, 15,  9,  8,
		 2,-10,  4, 10, 15, 16, 12, 11,  6,  2,
		 0,  5,  7,  7, 14, 15, 19, 15,  9,  8,
		 2,  4,  6, 10, 13, 11, 12, 11, 15,  2,
		-3,  2,  4,  6, 10, 12, 20, 10,  8,  2,
		 0, -3,  5,  4,  2,  2,  5,  4,  2,  2
	}, 
	{ // 车
		-6,  5, -2,  4,  8,  8,  6,  6,  6,  6,
		 6,  8,  8,  9, 12, 11, 13,  8, 12,  8,
		 4,  6,  4,  4, 12, 11, 13,  7,  9,  7,
		12, 12, 12, 12, 14, 14, 16, 14, 16, 13,
		 0,  0, 12, 14, 15, 15, 16, 16, 33, 14,
		12, 12, 12, 12, 14, 14, 16, 14, 16, 13,
		 4,  6,  4,  4, 12, 11, 13,  7,  9,  7,
		 6,  8,  8,  9, 12, 11, 13,  8, 12,  8,
		-6,  5, -2,  4,  8,  8,  6,  6,  6,  6
	}, 
	{ // 炮
		0,  0,  1,  0, -1,  0,  0,  1,  2,  4,
		0,  1,  0,  0,  0,  0,  3,  1,  2,  4,
		1,  2,  4,  0,  3,  0,  3,  0,  0,  0,
		3,  2,  3,  0,  0,  0,  2, -5, -4, -5,
		3,  2,  5,  0,  4,  4,  4, -4, -7, -6,
		3,  2,  3,  0,  0,  0,  2, -5, -4, -5,
		1,  2,  4,  0,  3,  0,  3,  0,  0,  0,
		0,  1,  0,  0,  0,  0,  3,  1,  2,  4,
		0,  0,  1,  0, -1,  0,  0,  1,  2,  4
	}, 
	{ // 兵
		0,  0,  0, -2,  3, 10, 20, 20, 20,  0,
		0,  0,  0,  0,  0, 18, 27, 30, 30,  0,
		0,  0,  0, -2,  4, 22, 30, 45, 50,  0,
		0,  0,  0,  0,  0, 35, 40, 55, 65,  2,
		0,  0,  0,  6,  7, 40, 42, 55, 70,  4,
		0,  0,  0,  0,  0, 35, 40, 55, 65,  2,
		0,  0,  0, -2,  4, 22, 30, 45, 50,  0,
		0,  0,  0,  0,  0, 18, 27, 30, 30,  0,
		0,  0,  0, -2,  3, 10, 20, 20, 20,  0
	}
};


/////////////////// Function Prototype /////////////////////////////////////////

// 估值函数,返回对当前局面的估值。fWhoseTurn标志当前轮到哪一方走棋
int Eveluate( int fWhoseTurn );

// 将目标点加入PointList队列
inline void AddPointToQueue( BYTE x, BYTE y );



////////////////// Programmer-Defined Function //////////////////////////////////

int Eveluate( int fWhoseTurn )
{
	int RedValues	= 0;	// 红方总的分值
	int BlackValues	= 0;	// 黑方总的分值

	int nBasicVal[2]	= { 0 , 0 };	// 双方的子力值
	int nMobilityVal[2]	= { 0 , 0 };	// 双方的机动性值
	int nPositionVal[2]	= { 0 , 0 };	// 双方的控制区域值
	int nRelationVal[2]	= { 0 , 0 };	// 双方的关系值(攻击或保护)

	BYTE nCChessID;
	BYTE nTargetType;
	int fSide;
	int nPosition;
	int i;
	bool bHaveHalf;


	//**** Reset RelationTable ****
	memset( RelationOfMan, 0, sizeof(RelationTable)*90 );

	int x, y;
	for( x = 0; x <= 8; x ++ )
		for( y = 0; y <= 9; y ++ )
		{
			if( CChessBoard[x][y] != 0 )
			{
				nCChessID = CChessBoard[x][y];
				fSide = SideOfMan[ nCChessID ];


//++++++++++++++求得棋子的基本价值以及它所占据的位置的价值+++++++++++++++++++++++++++++++++++++++++++++++
				nPosition = x * 10 + y * 9 ;

				if( fSide == RED )
				{
					nBasicVal[fSide]	+= BasicValues[nCChessID];
					nPositionVal[fSide]	+= PositionValues[nCChessID][nPosition];
				}
				else
				{
					nBasicVal[fSide]	+= BasicValues[nCChessID];
					nPositionVal[fSide]	+= PositionValues[nCChessID - 7][89 - nPosition];
				}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


				//求得棋子的所有目标位置(移动到的、攻击的、保护的)
				nPointCount = 0;

				switch( nCChessID )
				{

				case RED_K:

					// 将帅碰面
					i = IsKingFaceToFace( x, y, fSide );
					if( i != -1 )
						AddPointToQueue( x, i );

					//向前
					if( y < 2 )
						AddPointToQueue( x, y + 1 );

					//向后
					if( y > 0 )
						AddPointToQueue( x, y - 1 );

					//向左
					if( x > 3 )
						AddPointToQueue( x - 1, y );

					//向右
					if( x < 5 )
						AddPointToQueue( x + 1, y );

					break;


				case BLACK_K:

					// 将帅碰面
					i = IsKingFaceToFace( x, y, fSide );
					if( i != -1 )
						AddPointToQueue( x, i );

					//向前
					if( y > 7 )
						AddPointToQueue( x, y - 1 );

					//向后
					if( y < 9 )
						AddPointToQueue( x, y + 1 );

					//向左
					if( x < 5 )
						AddPointToQueue( x + 1, y );

					//向右
					if( x > 3 )
						AddPointToQueue( x - 1, y );

					break;


				case RED_J:					// fall through
				case BLACK_J:

					//纵向
					for( i = y + 1; i <= 9; i ++ )
					{
						AddPointToQueue( x, i );

						if( HaveMan( x, i ) )
							break;
					}

					for( i = y - 1; i >= 0; i -- )
					{
						AddPointToQueue( x, i );

						if( HaveMan( x, i ) )
							break;
					}

					//横向
					for( i = x - 1; i >= 0; i -- )
					{
						AddPointToQueue( i, y );

						if( HaveMan( i, y ) )
							break;
					}

					for( i = x + 1; i <= 8; i ++ )
					{
						AddPointToQueue( i, y );

						if( HaveMan( i, y ) )
							break;
					}

					break;


				case RED_M:					// fall through
				case BLACK_M:

					if( y <= 7 && ! HaveMan( x, y + 1 ) )
					{
						//11点方向(相对红马)
						if( x > 0 )
							AddPointToQueue( x - 1, y + 2 );

						//1点方向
						if( x < 8 )
							AddPointToQueue( x + 1, y + 2 );
					}

					if( x <= 6 && ! HaveMan( x + 1, y ) )
					{
						//2点方向
						if( y < 9 )
							AddPointToQueue( x + 2, y + 1 );

						//4点方向
						if( y > 0 )
							AddPointToQueue( x + 2, y - 1 );
					}

					if( y >= 2 && ! HaveMan( x, y - 1 ) )
					{		
						//5点方向
						if( x < 8 )
							AddPointToQueue( x + 1, y - 2 );

						//7点方向
						if( x > 0 )
							AddPointToQueue( x - 1, y - 2 );
					}

					if( x >= 2 && ! HaveMan( x - 1, y ) )
					{
						//8点方向
						if( y > 0 )
							AddPointToQueue( x - 2, y - 1 );

						//10点方向
						if( y < 9 )
							AddPointToQueue( x - 2, y + 1 );
					}

					break;


				case RED_P:				// fall through
				case BLACK_P:
					
					//纵向
					bHaveHalf = false;	//标志尚未发现中间子
					for( i = y + 1; i <= 9; i ++ )
					{
						if( ! bHaveHalf ) // 无中间子
						{
							if( ! HaveMan( x, i ) )
							{
								AddPointToQueue( x, i );
							}
							else // if( HaveMan( x, i ) )
							{
								bHaveHalf = true;
							}
						}
						else // 已有中间子
						{
							if( HaveMan( x, i ) )
							{
								AddPointToQueue( x, i );
								break;
							}
						}
					}

					bHaveHalf = false;	//标志尚未发现中间子
					for( i = y - 1; i >= 0; i -- )
					{
						if( ! bHaveHalf ) // 无中间子
						{
							if( ! HaveMan( x, i ) )
							{
								AddPointToQueue( x, i );
							}
							else // if( HaveMan( x, i ) )
							{
								bHaveHalf = true;
							}
						}
						else // 已有中间子
						{
							if( HaveMan( x, i ) )
							{
								AddPointToQueue( x, i );
								break;
							}
						}
					}


					//横向
					bHaveHalf = false;	//标志尚未发现中间子
					for( i = x - 1; i >= 0; i -- )
					{
						if( ! bHaveHalf ) // 无中间子
						{
							if( ! HaveMan( i, y ) )
							{
								AddPointToQueue( i, y );
							}
							else // if( HaveMan( i, y ) )
							{
								bHaveHalf = true;
							}
						}
						else // 已有中间子
						{
							if( HaveMan( i, y ) )
							{
								AddPointToQueue( i, y );
								break;
							}
						}
					}
 
					bHaveHalf = false;	//标志尚未发现中间子
					for( i = x + 1; i <= 8; i ++ )
					{
						if( ! bHaveHalf ) // 无中间子
						{
							if( ! HaveMan( i, y ) )
							{
								AddPointToQueue( i, y );
							}
							else // if( HaveMan( i, y ) )
							{
								bHaveHalf = true;
							}
						}
						else // 已有中间子
						{
							if( HaveMan( i, y ) )
							{
								AddPointToQueue( i, y );
								break;
							}
						}
					}

					break;


				case RED_X:

					if( x == 0 )
					{
						if( ! HaveMan(1, 3) )
							AddPointToQueue( 2, 4 );

						if( ! HaveMan(1, 1) )
							AddPointToQueue( 2, 0 );
					}
					else if( x == 2 )
					{
						if( y == 4 )
						{
							if( ! HaveMan(1, 3) )
								AddPointToQueue( 0, 2 );

							if( ! HaveMan(3, 3) )
								AddPointToQueue( 4, 2 );
						}
						else // y == 0 
						{
							if( ! HaveMan(1, 1) )
								AddPointToQueue( 0, 2 );

							if( ! HaveMan(3, 1) )
								AddPointToQueue( 4, 2 );
						}	
					}
					else if( x == 4 )
					{
						if( ! HaveMan(3, 3) )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -