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

📄 ai_kua.cpp

📁 搜索算法部分使用minmax递归
💻 CPP
📖 第 1 页 / 共 2 页
字号:
							if(control3==true)
								valueAI[i][j]+=N4;
						}
					}
				}

//计算当前局面下的blackorwhite子的总分
	for(i=1;i<9;i++)
		for(j=1;j<9;j++)
		{
			if(attribute[i][j]==blackorwhite)
				valuepositive+=valueAI[i][j];
			if(attribute[i][j]==minus)
				valueminus+=valueAI[i][j];
		}
	value=valuepositive-valueminus;
	return value;			
			
}



int CAI_kua::EvaluateDrop(int blackorwhite)
{
	int minus;
	if(blackorwhite==1)
		minus=2;
	else
		minus=1;
	int	value;
	value=15*TestDropAll(blackorwhite);
	return value;

}


//评估函数,给出该局面下的评估值,返回所有黑棋减去白棋的位置值
//位置值法
//位置值从-10到20不等,根据游戏的进程发生变化,分开局,中局,终局situation各点位置值会发生变化

int CAI_kua::EvaluatePosition(int blackorwhite)   //positive=1 or 2  1:black 2:white
{
	//设置位置值
	valueAI[1][1]=valueAI[1][8]=valueAI[8][1]=valueAI[8][8]=800;
	valueAI[1][2]=valueAI[1][7]=valueAI[2][1]=valueAI[2][8]=valueAI[7][1]=valueAI[7][8]=valueAI[8][2]=valueAI[8][7]=-71;
	valueAI[2][2]=valueAI[2][7]=valueAI[7][2]=valueAI[7][7]=19;
	valueAI[1][3]=valueAI[1][6]=valueAI[3][1]=valueAI[3][8]=valueAI[6][1]=valueAI[6][8]=valueAI[8][3]=valueAI[8][6]=25;		//		
	valueAI[1][4]=valueAI[1][5]=valueAI[4][1]=valueAI[4][8]=valueAI[5][1]=valueAI[5][8]=valueAI[8][4]=valueAI[8][5]=27;
	valueAI[2][3]=valueAI[2][6]=valueAI[3][2]=valueAI[3][7]=valueAI[6][2]=valueAI[6][7]=valueAI[7][3]=valueAI[7][6]=10;		//	
	valueAI[2][4]=valueAI[2][5]=valueAI[4][2]=valueAI[4][7]=valueAI[5][2]=valueAI[5][7]=valueAI[7][4]=valueAI[7][5]=1;
	valueAI[3][4]=valueAI[3][5]=valueAI[4][3]=valueAI[4][6]=valueAI[5][3]=valueAI[5][6]=valueAI[6][4]=valueAI[6][5]=5;
	valueAI[4][4]=valueAI[4][5]=valueAI[5][4]=valueAI[5][5]=11;
	valueAI[3][3]=valueAI[3][6]=valueAI[6][3]=valueAI[6][6]=5;																//
	////////////////////////////////////////////////////////////////////////////////////////////////////////////

	int value;				//这个局面下的节点的评估值(所有AI棋的位置值和-所有HI棋的位置值)
	int valuepositive=0;
	int valueminus=0;
	int minus;
	if(blackorwhite==1)
		minus=2;
	else
		minus=1;

	for(int i=1;i<9;i++)
		for(int j=1;j<9;j++)
		{
			if(attribute[i][j]==blackorwhite)
				valuepositive+=valueAI[i][j];
			if(attribute[i][j]==minus)
				valueminus+=valueAI[i][j];
		}
	value=valuepositive-valueminus;
	return value;
}



int CAI_kua::EvaluatePosition2(int blackorwhite)
{
		//设置位置值
	valueAI[1][1]=valueAI[1][8]=valueAI[8][1]=valueAI[8][8]=800;
	valueAI[1][2]=valueAI[1][7]=valueAI[2][1]=valueAI[2][8]=valueAI[7][1]=valueAI[7][8]=valueAI[8][2]=valueAI[8][7]=-71;
	valueAI[2][2]=valueAI[2][7]=valueAI[7][2]=valueAI[7][7]=20;
	valueAI[1][3]=valueAI[1][6]=valueAI[3][1]=valueAI[3][8]=valueAI[6][1]=valueAI[6][8]=valueAI[8][3]=valueAI[8][6]=26;		//		
	valueAI[1][4]=valueAI[1][5]=valueAI[4][1]=valueAI[4][8]=valueAI[5][1]=valueAI[5][8]=valueAI[8][4]=valueAI[8][5]=22;
	valueAI[2][3]=valueAI[2][6]=valueAI[3][2]=valueAI[3][7]=valueAI[6][2]=valueAI[6][7]=valueAI[7][3]=valueAI[7][6]=13;		//	
	valueAI[2][4]=valueAI[2][5]=valueAI[4][2]=valueAI[4][7]=valueAI[5][2]=valueAI[5][7]=valueAI[7][4]=valueAI[7][5]=1;
	valueAI[3][4]=valueAI[3][5]=valueAI[4][3]=valueAI[4][6]=valueAI[5][3]=valueAI[5][6]=valueAI[6][4]=valueAI[6][5]=4;
	valueAI[4][4]=valueAI[4][5]=valueAI[5][4]=valueAI[5][5]=10;
	valueAI[3][3]=valueAI[3][6]=valueAI[6][3]=valueAI[6][6]=16;																//
	////////////////////////////////////////////////////////////////////////////////////////////////////////////

	int value;				//这个局面下的节点的评估值(所有AI棋的位置值和-所有HI棋的位置值)
	int valuepositive=0;
	int valueminus=0;
	int minus;
	if(blackorwhite==1)
		minus=2;
	else
		minus=1;

	for(int i=1;i<9;i++)
		for(int j=1;j<9;j++)
		{
			if(attribute[i][j]==blackorwhite)
				valuepositive+=valueAI[i][j];
			if(attribute[i][j]==minus)
				valueminus+=valueAI[i][j];
		}
	value=valuepositive-valueminus;
	return value;

}





///////////////////////////////////////////// 产生当前局面下的所有可走着法
int CAI_kua::GenerateMove(int AIrow[64],int AIcolumn[64],int positive)
{
	int m=0;
	int s=0;
	s=TestDropAll(positive);
	for(int i1=1;i1<9;i1++)
		for(int j1=1;j1<9;j1++)
			if(whetherdrop[i1][j1]==positive)
				{
					AIrow[m]=i1;
					AIcolumn[m]=j1;
					m++;
				}							
	return s;                            //成功
}


////////////////////////////////////////////////执行第i个走法
int CAI_kua::MakeMove(int m, int n,int positive,int attributecopy[9][9])
{
	for(int i=1;i<9;i++)
		for(int j=1;j<9;j++)
			attributecopy[i][j]=attribute[i][j];
	TestDropCurrent(m,n,positive);
	return 0;

}

////////////////////////////////////////////////
int CAI_kua::UnMakeMove(int attributecopy[9][9])
{
	for(int i=1;i<9;i++)
		for(int j=1;j<9;j++)
		{
			attribute[i][j]=attributecopy[i][j];
		}

		return 0;

}

/////////////////////////////////////////////////
int CAI_kua::MinMax(int depth, bool type, int positive,int situation,int alpha,int beta)
{
	int i;
	int  s=0;                   //s 用来存放测试一次,可走子的个数
	int value;
	int bestvalue;               // bestValue 用来存放子节点中最佳的估值
	int MinMaxrow[64],MinMaxcolumn[64];
	int attributecopy2[9][9];
	if(depth==0)
	{
		if(situation==1)
			return EvaluatePosition(blackorwhite);										//位置值评估
		if(situation==2)
			return EvaluateStable(blackorwhite);										//稳定子评估
		if(situation==3)
			return (EvaluateDrop(blackorwhite)+EvaluatePosition(blackorwhite));			//初期评估
		if(situation==4)
			return (EvaluateDrop(blackorwhite)+EvaluatePosition2(blackorwhite));		//中期评估
		if(situation==5)
			return EvaluateEnd(blackorwhite);											//终局搜索
	}
	if(type==1)
		bestvalue=-65535;    // 最大值节点, 令初始值为极小
	else
		bestvalue=65535;     // 最小值节点, 令初始值为极大

	// 产生当前局面下的所有可走着法
	s=GenerateMove(MinMaxrow,MinMaxcolumn,positive);      // 调用产生着法的函数
	
	// 对每一种着法...
	for(i=0;i<s;i++)
	{
		MakeMove(MinMaxrow[i],MinMaxcolumn[i],positive,attributecopy2);        // 执行第i个走法

	 	value = MinMax(depth-1,!type,1+positive%2,situation,alpha,beta);   // 在新的局面下搜索(depth - 1)层
		UnMakeMove(attributecopy2);	// 恢复局面

		// 确定目前为止最好的分数
		if (type == 1)
		{
			if(value>=beta)			
				return beta;					//发生beta剪枝
			if(value>=bestvalue)				// 最大值节点取最大值
				alpha=bestvalue=value;			// 子节点的值大于当前节点的值, 更新
		}

		if (type ==0)
		{
			if(value<=alpha)				
				return alpha;					//发生alpha剪枝
			if(value<=bestvalue)				// 最小值节点取最小值
				beta=bestvalue=value;			// 子节点的值大于当前节点的值, 更新
		}
	}
	return bestvalue;
}

////////////////////////////////////////////////////////
int CAI_kua::Implementation(int depth,int  type,int positive,int situation)
{
	int alpha=-65535;
	int	beta=65535;
	int attributecopy1[9][9];
	int AIrow[64];
	int AIcolumn[64];
	int save[64];                                 //保存每种走法的m值,即保存第一步以下每种走法的返回值
	int s=0;
	int i;
	s=GenerateMove(AIrow,AIcolumn,positive);
	for(i=0;i<s;i++)
	{
		MakeMove(AIrow[i],AIcolumn[i],positive,attributecopy1);        // 执行第i个走法
		save[i]=MinMax(depth-1,!type,1+positive%2,situation,alpha,beta);
		UnMakeMove(attributecopy1);	// 恢复局面
	}
	i=SearchMax(save,s);
	row=AIrow[i];
	column=AIcolumn[i];	
	return save[i];
}




int CAI_kua::ThinkPad(int depth,int type,int positive,int EvaluateType)
{
	Initialize();
//	EvaluateType=2;
	blackchessnumber=0;
	whitechessnumber=0;
	int s=0;
	for(int i=1;i<9;i++)
		for(int j=1;j<9;j++)
		{
			if(attribute[i][j]==1)
				blackchessnumber++;
			if(attribute[i][j]==2)
				whitechessnumber++;
		}
	if(EvaluateType==1)
		Implementation(depth,type,positive,2);
	else
	{
		if((blackchessnumber+whitechessnumber)>=50)		//alpha,beta剪枝,16层
			s=Implementation(64-blackchessnumber-whitechessnumber,type,positive,5);
	//situation=1,2,3,4,5  1:位置值评估  2:稳定子评估  3:初期评估 4:中期评估 5:终局搜索
		if((blackchessnumber+whitechessnumber)>=42&&(blackchessnumber+whitechessnumber)<50)				
			Implementation(depth,type,positive,4);		//中期搜索	

		if((blackchessnumber+whitechessnumber)<42)
			Implementation(depth,type,positive,3);		//前期搜索
	}
	return s;
}


int CAI_kua::SearchMax(int array[], int n)
{
	int max=array[0];
	int maxnumber=0;
	for(int i=0;i<n;i++)
		if(max<array[i])
		{
			max=array[i];
			maxnumber=i;
		}
		return maxnumber;

}


int CAI_kua::Think(int turn,int depth,int EvaluateType)
{
	int s=0;
	int maxdepth=depth;
	blackorwhite=turn;
	s=ThinkPad(maxdepth,1,turn,EvaluateType);
	m_X=row-1;
	m_Y=column-1;
	if(s>0)
		return 1;
	else 
		return 0;

}


void CAI_kua::Initialize()
{
		for(int i=0;i<9;i++)
		for(int j=0;j<9;j++)
			attribute[i][j]=m_State[i][j];

}


⌨️ 快捷键说明

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