📄 ai_kua.cpp
字号:
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 + -