亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? eveluation.cpp

?? 一個象棋AI的源代碼,帶游戲界面,其中可選擇多種AI引擎,從最基礎的深度跌代極大極小值搜索到使用開局庫,歷史啟發的極小窗搜索,具有很高的學習研究價值.
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// Eveluation.cpp: implementation of the CEveluation class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Chess.h"
#include "Eveluation.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//下面兩個常量數組存放了兵在不同位置的附加值
//基本上是過河之后越靠近老將分值越高
////紅兵的附加值矩陣
//const int BA0[10][9]=
//{
//	{0,0,0,0,0,0,0,0,0},
//	{90,90,110,120,120,120,110,90,90},
//	{90,90,110,120,120,120,110,90,90},
//	{70,90,110,110,110,110,110,90,70},
//	{70,70,70, 70,70, 70, 70,70,70},
//	{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},
//};
//
////黑卒的附加值矩陣
//const int BA1[10][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},
//	{70,70,70, 70,70, 70, 70,70,70},
//	{70,90,110,110,110,110,110,90,70},
//	{90,90,110,120,120,120,110,90,90},
//	{90,90,110,120,120,120,110,90,90},
//	{0,0,0,0,0,0,0,0,0},
//};

//紅兵的附加值矩陣
const int BA0[10][9]=
{
	{0,0,0,0,0,0,0,0,0},
	{120,120,140,150,150,150,140,120,120},
	{120,120,140,150,150,150,140,120,120},
	{100,120,140,140,140,140,140,120,100},
	{100,100,100,100,100,100,100,100,100},
	{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},
};

//黑卒的附加值矩陣
const int BA1[10][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},
	{100,100,100,100,100,100,100,100,100},
	{100,120,140,140,140,140,140,120,100},
	{120,120,140,150,150,150,140,120,120},
	{120,120,140,150,150,150,140,120,120},
	{0,0,0,0,0,0,0,0,0},
};

int CEveluation::GetBingValue(int x,int y,BYTE CurSituation[][9])
{
	if(CurSituation[y][x]==R_PAWN)
		return BA0[y][x];

	if(CurSituation[y][x]==B_PAWN)
		return BA1[y][x];

	return 0;
}

CEveluation::CEveluation()
{
	//初始化每種棋子的基本價值數組
	m_BaseValue[B_KING]=BASEVALUE_KING;
	m_BaseValue[B_CAR]=BASEVALUE_CAR;
	m_BaseValue[B_HORSE]=BASEVALUE_HORSE;
	m_BaseValue[B_BISHOP]=BASEVALUE_BISHOP;
	m_BaseValue[B_ELEPHANT]=BASEVALUE_ELEPHANT;
	m_BaseValue[B_CANON]=BASEVALUE_CANON;
	m_BaseValue[B_PAWN]=BASEVALUE_PAWN;

	m_BaseValue[R_KING]=BASEVALUE_KING;
	m_BaseValue[R_CAR]=BASEVALUE_CAR;
	m_BaseValue[R_HORSE]=BASEVALUE_HORSE;
	m_BaseValue[R_BISHOP]=BASEVALUE_BISHOP;
	m_BaseValue[R_ELEPHANT]=BASEVALUE_ELEPHANT;
	m_BaseValue[R_CANON]=BASEVALUE_CANON;
	m_BaseValue[R_PAWN]=BASEVALUE_PAWN;

	//初始化靈活性分值數組
	m_FlexValue[B_KING]=FLEXIBILITY_KING;
	m_FlexValue[B_CAR]=FLEXIBILITY_CAR;
	m_FlexValue[B_HORSE]=FLEXIBILITY_HORSE;
	m_FlexValue[B_BISHOP]=FLEXIBILITY_BISHOP;
	m_FlexValue[B_ELEPHANT]=FLEXIBILITY_ELEPHANT;
	m_FlexValue[B_CANON]=FLEXIBILITY_CANON;
	m_FlexValue[B_PAWN]=FLEXIBILITY_PAWN;

	m_FlexValue[R_KING]=FLEXIBILITY_KING;
	m_FlexValue[R_CAR]=FLEXIBILITY_CAR;
	m_FlexValue[R_HORSE]=FLEXIBILITY_HORSE;
	m_FlexValue[R_BISHOP]=FLEXIBILITY_BISHOP;
	m_FlexValue[R_ELEPHANT]=FLEXIBILITY_ELEPHANT;
	m_FlexValue[R_CANON]=FLEXIBILITY_CANON;
	m_FlexValue[R_PAWN]=FLEXIBILITY_PAWN;

	m_nAccessCount=0;
}

CEveluation::~CEveluation()
{

}

int CEveluation::Eveluate(BYTE position[][9], BOOL bIsRedTurn,int nUserChessColor)
{
	int i,j,k;
	int nChessType,nTargetType;
	
	m_nAccessCount++;//每調用一次就增加一次

	//初始化
	memset(m_chessValue,0,360);
	memset(m_AttackPos,0,180);
	memset(m_GuardPos,0,90);
	memset(m_FlexibilityPos,0,90);

	//掃描棋盤,找出每一個棋子,及其威脅/保護的棋子,還有其靈活性
	for(i=0;i<10;i++)
		for(j=0;j<9;j++)
		{
			if(position[i][j]!=NOCHESS)
			{
				nChessType=position[i][j];   //取棋子類型
				GetRelatePiece(position,j,i);//找出該棋子所有相關位置
				for(k=0;k<nPosCount;k++)     //對每一目標位置
				{				
					nTargetType=position[RelatePos[k].y][RelatePos[k].x];//取目標棋子類型
					if(nTargetType==NOCHESS)//如果是空白,靈活性增加
						m_FlexibilityPos[i][j]++;
					else//有棋子
					{
						if(IsSameSide(nChessType,nTargetType))
						{
							//己方棋子,目標受保護
							m_GuardPos[RelatePos[k].y][RelatePos[k].x]++;
						}
						else
						{
							//敵方棋子,目標受威脅
							m_AttackPos[RelatePos[k].y][RelatePos[k].x]++;
							m_FlexibilityPos[i][j]++;//靈活性增加
							switch(nTargetType)
							{
								case R_KING://紅帥
									if(!bIsRedTurn)//輪到黑棋走
										return 18888;//返回失敗極值
									break;
								
								case B_KING://黑將
									if(bIsRedTurn)//輪到紅棋走
										return 18888;//返回失敗極值
									break;
									
								default:
									//根據威脅的棋子加上威脅分值
									m_AttackPos[RelatePos[k].y][RelatePos[k].x]+=(30 +(m_BaseValue[nTargetType]- m_BaseValue[nChessType])/10)/10;
									break;
							}
						}
					}
				}
			}
		}

	//下面的循環統計掃描到的數據
	for(i=0;i<10;i++)
		for(j=0;j<9;j++)
		{
			if(position[i][j]!=NOCHESS)
			{
				nChessType=position[i][j];
				m_chessValue[i][j]++;
				//如果棋子存在其價值不為0,把每一棋子的靈活性價值加進棋子價值
				m_chessValue[i][j]+=m_FlexValue[nChessType]*m_FlexibilityPos[i][j];
				//加上兵的附加值
				m_chessValue[i][j]+=GetBingValue(j,i,position);
			}
		}

	//下面的循環繼續統計掃描到的數據
	int nHalfvalue;
	for(i=0;i<10;i++)
		for(j=0;j<9;j++)
		{
			if(position[i][j]!=NOCHESS)
			{
				nChessType=position[i][j];			
				nHalfvalue=m_BaseValue[nChessType]/16;      //棋子基本價值的1/16作為威脅/保護增量			
				m_chessValue[i][j]+=m_BaseValue[nChessType];//每個棋子的基本價值加入其總價值
				if(IsRed(nChessType))//紅棋
				{
					if(m_AttackPos[i][j])//當前紅棋如果被威脅
					{
						if(bIsRedTurn)//輪到紅棋走
						{						
							if(nChessType==R_KING)//如果是紅將
								m_chessValue[i][j]-=20;//價值降低20
							else
							{
								//價值減去2倍nHalfvalue
								m_chessValue[i][j]-=nHalfvalue*2;
								if(m_GuardPos[i][j])//是否被己方棋子保護
									m_chessValue[i][j]+=nHalfvalue;//被保護再加上nHalfvalue
							}
						}
						else//當前紅棋被威脅,輪到黑棋走
						{
							if(nChessType==R_KING)//是否是紅帥
								return 18888;//返回失敗極值	
							m_chessValue[i][j]-=nHalfvalue*10;//減去10倍的nHalfvalue,表示威脅程度高
							if(m_GuardPos[i][j])//如果被保護
								m_chessValue[i][j]+=nHalfvalue*9;//被保護再加上9倍的nHalfvalue
						}
						//被威脅的棋子加上威脅差,防止一個兵威脅
						//一個被保護的車,而估值函數沒有反映此類問題
						m_chessValue[i][j]-=m_AttackPos[i][j];
					}
					else
					{
						//沒受威脅
						if(m_GuardPos[i][j])
							m_chessValue[i][j]+=5;//受保護,加一點分
					}
				}
				else
				{
					//如果是黑棋
					if(m_AttackPos[i][j])
					{
						//受威脅
						if(!bIsRedTurn)
						{
							//輪到黑棋走
							if(nChessType==B_KING)//如果是黑將
								m_chessValue[i][j]-=20;//棋子價值降低20
							else
							{ 
								//棋子價值降低2倍nHalfvalue
								m_chessValue[i][j]-=nHalfvalue*2;
								if(m_GuardPos[i][j])//如果受保護									
									m_chessValue[i][j] +=nHalfvalue;//棋子價值增加nHalfvalue
							}
						}
						else
						{
							//輪到紅棋走
							if(nChessType==B_KING)//是黑將
								return 18888;//返回失敗極值							
							m_chessValue[i][j]-=nHalfvalue*10;//棋子價值減少10倍nHalfvalue
							if(m_GuardPos[i][j])//受保護
								m_chessValue[i][j]+=nHalfvalue*9;//被保護再加上9倍nHalfvalue
						}
						//被威脅的棋子再加上威脅差
						//防止一個兵威脅一個被保護的車,而估值函數沒有反映此類的問題
						m_chessValue[i][j]-=m_AttackPos[i][j];
					}
					else
					{
						//不受威脅
						if(m_GuardPos[i][j])
							m_chessValue[i][j]+=5;//受保護,加一點分
					}
				}
			}
		}
		
	//以上統計了每個棋子的總價值
	//下面統計紅黑兩方總分
	int nRedValue=0;int nBlackValue=0;
	for(i=0;i<10;i++)
		for(j=0;j<9;j++)
		{
			nChessType=position[i][j];
			if(nChessType!=NOCHESS)
			{
				if(IsRed(nChessType))
					nRedValue+=m_chessValue[i][j];  //把紅棋的值加總
				else
					nBlackValue+=m_chessValue[i][j];//把紅棋的值加總
			}
		}

	if(nUserChessColor==REDCHESS)
	{
		if(bIsRedTurn)
			return nRedValue-nBlackValue;//如果輪到紅棋走返回估值

		return nBlackValue-nRedValue;//如果輪到黑棋走返回負估值
	}

	if(bIsRedTurn)
		return nBlackValue-nRedValue;//如果輪到黑棋走返回負估值			
	
	return nRedValue-nBlackValue;//如果輪到紅棋走返回估值
}

int CEveluation::GetRelatePiece(BYTE position[][9], int j, int i)
{
	nPosCount=0;
	BYTE nChessID;
	BYTE flag;
	int x,y;
	
	nChessID=position[i][j];

	switch(nChessID)
	{
	case R_KING://紅帥
	case B_KING://黑將
		//循環檢查九宮之內哪些位置可到達/保護
		//掃描兩邊就宮包含了照像的情況
		for(y=0;y<3;y++)
			for(x=3;x<6;x++)
				if(CanTouch(position,j,i,x,y))//能否到達
					AddPoint(x,y);//可達到/保護的位置加入數組

		//循環檢查九宮之內哪些位置可到達/保護
		//掃描兩邊就宮包含了照像的情況
		for(y=7;y<10;y++)
			for(x=3;x<6;x++)
				if(CanTouch(position,j,i,x,y))//能否到達
					AddPoint(x,y);//可達到/保護的位置加入數組

		break;

	case R_BISHOP://紅士
		//循環檢查九宮之內哪些位置可到達/保護
		for(y=7;y<10;y++)
			for(x=3;x<6;x++)
				if(CanTouch(position,j,i,x,y))
					AddPoint(x,y);//可達到/保護的位置加入數組
		
		break;

	case B_BISHOP://黑士
		//循環檢查九宮之內哪些位置可到達/保護
		for(y=0;y<3;y++)
			for(x=3;x<6;x++)
				if(CanTouch(position,j,i,x,y))
					AddPoint(x,y);//可達到/保護的位置加入數組
		
		break;

	case R_ELEPHANT://紅相
	case B_ELEPHANT://黑象
		//右下
		x=j+2;
		y=i+2;
		if(x<9 && y<10 && CanTouch(position,j,i,x,y))
			AddPoint(x,y);

		//右上
		x=j+2;
		y=i-2;
		if(x<9 && y>=0 && CanTouch(position,j,i,x,y))
			AddPoint(x,y);

		//左下
		x=j-2;
		y=i+2;
		if(x>=0 && y<10 && CanTouch(position,j,i,x,y))
			AddPoint(x,y);

		//左上
		x=j-2;
		y=i-2;
		if(x>=0 && y>=0 && CanTouch(position,j,i,x,y))
			AddPoint(x,y);

		break;

		case R_HORSE://紅馬
		case B_HORSE://黑馬
			//檢查右下方能否到達/保護
			x=j+2;
			y=i+1;
			if((x<9 && y<10)&&CanTouch(position,j,i,x,y))
				AddPoint(x,y);

			//檢查右上方能否到達/保護
			x=j+2;
			y=i-1;
			if((x<9 && y>=0)&&CanTouch(position,j,i,x,y))
				AddPoint(x,y);

			//檢查左下方能否到達/保護
			x=j-2;
			y=i+1;
			if((x>=0 && y<10)&&CanTouch(position,j,i,x,y))
				AddPoint(x,y);

			//檢查左上方能否到達/保護
			x=j-2;
			y=i-1;
			if((x>=0 && y>=0)&&CanTouch(position,j,i,x,y))
				AddPoint(x,y);

			//檢查右下方能否到達/保護
			x=j+1;
			y=i+2;
			if((x<9 && y<10)&&CanTouch(position,j,i,x,y))
				AddPoint(x,y);

			//檢查右上方能否到達/保護
			x=j+1;
			y=i-2;
			if((x<9 && y>=0)&&CanTouch(position,j,i,x,y))
				AddPoint(x,y);

			//檢查左下方能否到達/保護
			x=j-1;
			y=i+2;
			if((x>=0 && y<10)&&CanTouch(position,j,i,x,y))
				AddPoint(x,y);

			//檢查左上方能否到達/保護
			x=j-1;
			y=i-2;
			if((x>=0 && y>=0)&&CanTouch(position,j,i,x,y))
				AddPoint(x,y);

			break;

		case R_CAR://紅車
		case B_CAR://黑車
			//檢查向右能否到達/保護
			x=j+1;
			y=i;
			while(x<9)
			{
				if(NOCHESS==position[y][x])//空白
					AddPoint(x,y);
				else{
					//碰到第一個棋子
					AddPoint(x,y);
					break;//后面的位置不能走了
				}
				x++;
			}

			//檢查向左能否到達/保護
			x=j-1;
			y=i;
			while(x>=0)
			{
				if(NOCHESS==position[y][x])//空白
					AddPoint(x,y);
				else{
					//碰到第一個棋子
					AddPoint(x,y);
					break;//后面的位置不能走了
				}
				x--;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区三区四区久久| |精品福利一区二区三区| 国产欧美一区二区精品仙草咪| 最新热久久免费视频| 日本v片在线高清不卡在线观看| 丁香六月综合激情| 日韩午夜在线播放| 亚洲综合无码一区二区| 国产不卡视频在线播放| 日韩精品一区二区在线观看| 亚洲精品videosex极品| 国产91精品精华液一区二区三区 | 日韩黄色免费电影| a级高清视频欧美日韩| 久久综合九色综合97_久久久| 亚洲二区在线观看| 色综合色综合色综合色综合色综合| 久久久久国色av免费看影院| 日韩中文字幕一区二区三区| 日本久久电影网| 亚洲色图在线播放| 99久久精品免费观看| 亚洲欧洲精品天堂一级 | 亚洲男女毛片无遮挡| 国产成人综合网| 久久伊99综合婷婷久久伊| 免费成人美女在线观看.| 3751色影院一区二区三区| 一级特黄大欧美久久久| 91极品美女在线| 亚洲欧美国产毛片在线| 在线观看日韩国产| 亚洲自拍偷拍九九九| 欧美少妇一区二区| 亚洲国产日产av| 欧美日韩精品一区二区在线播放| 亚洲最大色网站| 欧美视频一区二区三区| 亚洲成av人片在线观看| 91麻豆精品国产91久久久| 日本亚洲三级在线| www国产成人| 国产+成+人+亚洲欧洲自线| 国产精品免费网站在线观看| 91色婷婷久久久久合中文| 一区二区三区四区国产精品| 欧美色视频在线观看| 日韩高清不卡一区二区三区| 欧美成人bangbros| 成人免费毛片嘿嘿连载视频| 国产精品国产自产拍在线| 欧美综合欧美视频| 日本vs亚洲vs韩国一区三区二区| 精品国产乱码久久久久久图片| 激情综合色综合久久综合| 国产精品免费视频观看| 欧美午夜不卡视频| 老司机精品视频线观看86| 中文幕一区二区三区久久蜜桃| 99精品视频在线播放观看| 亚洲成av人片| 国产日韩视频一区二区三区| 欧美影院午夜播放| 久久精品国产99国产| **欧美大码日韩| 欧美一区二区三区视频免费播放| 国产传媒日韩欧美成人| 亚洲一区二区高清| 国产午夜精品在线观看| 欧美日韩一级视频| 成人国产免费视频| 日本va欧美va精品| 亚洲人成7777| 久久婷婷成人综合色| 欧洲中文字幕精品| 东方aⅴ免费观看久久av| 午夜国产不卡在线观看视频| 久久久亚洲综合| 在线免费一区三区| 成人一区二区三区在线观看| 天堂精品中文字幕在线| 综合久久综合久久| 久久精品亚洲精品国产欧美kt∨ | 久久老女人爱爱| 欧美精品久久99久久在免费线| 成人在线视频一区二区| 老司机精品视频导航| 亚洲国产日日夜夜| 亚洲人成网站色在线观看| 久久久精品黄色| 欧美一区二区三区性视频| 91高清视频在线| 成人一区二区三区视频| 激情五月播播久久久精品| 亚洲国产精品自拍| 一区二区三区蜜桃| 亚洲三级视频在线观看| 久久久99精品免费观看不卡| 日韩精品影音先锋| 欧美一区二区三区白人| 精品视频资源站| 欧美在线免费播放| 色婷婷精品久久二区二区蜜臀av| av一区二区久久| 丁香啪啪综合成人亚洲小说| 国产精一品亚洲二区在线视频| 美国毛片一区二区三区| 国产精品久久久久久亚洲毛片 | 天天爽夜夜爽夜夜爽精品视频| 亚洲三级久久久| 国产精品区一区二区三区| 国产三级精品三级在线专区| 久久综合色综合88| 久久这里只有精品首页| 精品福利av导航| 欧美精品一区二区三区在线播放| 日韩欧美在线观看一区二区三区| 欧美色老头old∨ideo| 欧美日韩国产a| 欧美一级免费大片| 精品奇米国产一区二区三区| 精品国产乱码久久久久久夜甘婷婷| 日韩视频免费直播| 久久久久9999亚洲精品| 国产精品素人视频| 国产精品国产三级国产| 亚洲美女在线国产| 亚洲成人av一区二区三区| 日本怡春院一区二区| 久久91精品久久久久久秒播| 另类小说欧美激情| 丁香婷婷综合色啪| 99久久国产综合精品麻豆| 91久久精品日日躁夜夜躁欧美| 欧日韩精品视频| 欧美电影免费观看高清完整版在线观看 | 一区二区激情视频| 五月婷婷综合激情| 九九**精品视频免费播放| 国产精品一二三| 色婷婷国产精品综合在线观看| 欧美人牲a欧美精品| 亚洲精品一区在线观看| 中文字幕一区二区不卡| 五月天一区二区三区| 激情文学综合丁香| 一本一道综合狠狠老| 欧美一区二区私人影院日本| 国产欧美日韩另类视频免费观看 | 在线欧美小视频| 日韩一级免费观看| 国产精品国产精品国产专区不蜜 | 亚洲色图在线看| 久久国产麻豆精品| 91视频在线观看免费| 欧美zozozo| 亚洲在线视频网站| 粉嫩久久99精品久久久久久夜| 欧美日韩精品综合在线| 国产欧美久久久精品影院| 午夜精品久久久久久久蜜桃app| 国产精品18久久久久| 欧美亚洲动漫精品| 国产精品美女久久久久久久网站| 日韩中文字幕1| 99re这里都是精品| 久久在线免费观看| 日韩电影免费在线看| 99re成人精品视频| 久久久久久久久久久久久女国产乱| 亚洲影院免费观看| 97成人超碰视| 久久久99久久精品欧美| 日韩中文字幕一区二区三区| 99热这里都是精品| 久久精品夜夜夜夜久久| 蜜臀久久久久久久| 欧美日韩一区二区三区免费看| 国产精品久久夜| 成人在线一区二区三区| xvideos.蜜桃一区二区| 日韩精品一卡二卡三卡四卡无卡 | 国产成人精品网址| 日韩欧美国产1| 免费在线观看成人| 欧美片网站yy| 亚洲成av人片www| 欧美在线色视频| 亚洲精品久久久蜜桃| 99久久99久久综合| 国产欧美一区二区三区在线看蜜臀 | 在线欧美一区二区| 自拍偷拍亚洲综合| 91在线观看成人| 中文字幕亚洲一区二区av在线| 成人激情午夜影院| 综合欧美亚洲日本| 91久久精品一区二区二区| 亚洲尤物在线视频观看| 欧美三级在线看|