📄 ai_kua.cpp
字号:
// AI_kua.cpp: implementation of the CAI_kua class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Othello.h"
#include "AI_kua.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
// AI_kua.cpp: implementation of the CAI_kua class.
//
//////////////////////////////////////////////////////////////////////
#define N1 39
#define N2 37
#define N3 29
#define N4 26
CAI_kua::CAI_kua()
{
SetZero();
}
CAI_kua::~CAI_kua()
{
}
//终局搜索,采用黑白子个数的评估函数
int CAI_kua::EvaluateEnd(int blackorwhite)
{
int minus;
if(blackorwhite==1)
minus=2;
else
minus=1;
int value;
int valuepositive=0;
int valueminus=0;
for(int i=1;i<9;i++)
for(int j=1;j<9;j++)
{
if(attribute[i][j]==blackorwhite)
valuepositive++;
if(attribute[i][j]==minus)
valueminus++;
}
value=valuepositive-valueminus;
return value;
}
// 稳定子法的评估函数
int CAI_kua::EvaluateStable(int blackorwhite)
{
int minus;
if(blackorwhite==1)
minus=2;
else
minus=1;
int value;
int valuepositive=0;
int valueminus=0;
int i,j,k,k1,k2;
for(i=1;i<9;i++)
for(j=1;j<9;j++)
valueAI[i][j]=5;
//初级设定,位置值
valueAI[1][1]=valueAI[1][8]=valueAI[8][1]=valueAI[8][8]=600;
valueAI[2][2]=valueAI[2][7]=valueAI[7][2]=valueAI[7][7]=-51;
valueAI[1][2]=valueAI[1][7]=valueAI[2][1]=valueAI[2][8]=valueAI[7][1]=valueAI[7][8]=valueAI[8][2]=valueAI[8][7]=4;
valueAI[3][3]=valueAI[3][6]=valueAI[6][3]=valueAI[6][6]=4;
valueAI[1][3]=valueAI[1][6]=valueAI[3][1]=valueAI[3][8]=valueAI[6][1]=valueAI[6][8]=valueAI[8][3]=valueAI[8][6]=16;
valueAI[1][4]=valueAI[1][5]=valueAI[4][1]=valueAI[4][8]=valueAI[5][1]=valueAI[5][8]=valueAI[8][4]=valueAI[8][5]=12;
valueAI[2][3]=valueAI[2][6]=valueAI[3][2]=valueAI[3][7]=valueAI[6][2]=valueAI[6][7]=valueAI[7][3]=valueAI[7][6]=-4;
valueAI[2][4]=valueAI[2][5]=valueAI[4][2]=valueAI[4][7]=valueAI[5][2]=valueAI[5][7]=valueAI[7][4]=valueAI[7][5]=-5;
valueAI[4][4]=valueAI[4][5]=valueAI[5][4]=valueAI[5][5]=8;
//横方向保证稳定的子评分
for(i=1;i<9;i++)
for(j=1;j<9;j++)
{
if(attribute[i][1]==blackorwhite&&attribute[i][8]==blackorwhite)
{
bool control1=true;
for(k=1;k<9;k++)
{
if(attribute[i][k]==0)
control1=false;
}
if(control1==true)
valueAI[i][j]+=N1;
}
else
{
bool control2=true;
for(k=j;k<9;k++)
{
if(attribute[i][k]!=blackorwhite)
control2=false;
}
if(control2==true)
valueAI[i][j]+=N1;
if(control2!=true)
{
bool control3=true;
for(k=j;k>0;k--)
{
if(attribute[i][k]!=blackorwhite)
control3=false;
}
if(control3==true)
valueAI[i][j]+=N1;
}
}
}
//纵向保证稳定的子评分
for(j=1;j<9;j++)
for(i=1;i<9;i++)
{
if(attribute[1][j]==blackorwhite&&attribute[8][j]==blackorwhite)
{
bool control1=true;
for(k=1;k<9;k++)
{
if(attribute[k][j]==0)
control1=false;
}
if(control1==true)
valueAI[i][j]+=N2;
}
else
{
bool control2=true;
for(k=i;k<9;k++)
{
if(attribute[k][j]!=blackorwhite)
control2=false;
}
if(control2==true)
valueAI[i][j]+=N2;
if(control2!=true)
{
bool control3=true;
for(k=i;k>0;k--)
{
if(attribute[k][j]!=blackorwhite)
control3=false;
}
if(control3==true)
valueAI[i][j]+=N2;
}
}
}
//左上至右下斜方向稳定子评分
for(i=1;i<9;i++) //右上半部分
for(j=i;j<9;j++)
{
if(attribute[1][j-i+1]==blackorwhite&&attribute[8-j+i][8]==blackorwhite)
{
bool control1=true;
for(k1=1,k2=j-i+1;k1<=8-j+i,k2<=8;k1++,k2++)
{
if(attribute[k1][k2]==0)
control1=false;
}
if(control1==true)
valueAI[i][j]+=N3;
}
else
{
bool control2=true;
for(k1=i,k2=j;k1>=1,k2>=j-i+1;k1--,k2--)
{
if(attribute[k1][k2]!=blackorwhite)
control2=false;
}
if(control2==true)
valueAI[i][j]+=N3;
if(control2==false)
{
bool control3=true;
for(k1=i,k2=j;k1<=8-j+i,k2<=8;k1++,k2++)
{
if(attribute[k1][k]!=blackorwhite)
control3=false;
}
if(control3==true)
valueAI[i][j]+=N3;
}
}
}
//左下半部分
for(i=1;i<9;i++)
for(j=1;j<i;j++)
{
if(attribute[i-j+1][1]==blackorwhite&&attribute[8][j+8-i]==blackorwhite)
{
bool control1=true;
for(k1=i-j+1,k2=1;k1<=8,k2<=j+8-i;k1++,k2++)
{
if(attribute[k1][k2]==0)
control1=false;
}
if(control1==true)
valueAI[i][j]+=N3;
}
else
{
bool control2=true;
for(k1=i,k2=j;k1>=i-j+1,k2>=1;k1--,k2--)
{
if(attribute[k1][k2]!=blackorwhite)
control2=false;
}
if(control2==true)
valueAI[i][j]+=N3;
if(control2==false)
{
bool control3=true;
for(k1=i,k2=j;k1<=8,k2<=j+8-i;k1++,k2++)
{
if(attribute[k1][k]!=blackorwhite)
control3=false;
}
if(control3==true)
valueAI[i][j]+=N3;
}
}
}
//////////////////////////////////////////////////////////////////////////////////
//左下至右上稳定子评分
for(i=1;i<9;i++) //左半部分
for(j=1;(i+j)<=9;j++)
{
if(attribute[i+j-1][1]==blackorwhite&&attribute[1][j+i-1]==blackorwhite)
{
bool control1=true;
for(k1=i+j-1,k2=1;k1>=1,k2<=j+i-1;k1--,k2++)
{
if(attribute[k1][k2]==0)
control1=false;
}
if(control1==true)
valueAI[i][j]+=N4;
}
else
{
bool control2=true;
for(k1=i,k2=j;k1<=i+j-1,k2>=1;k1++,k2--)
{
if(attribute[k1][k2]!=blackorwhite)
control2=false;
}
if(control2==true)
valueAI[i][j]+=N4;
if(control2==false)
{
bool control3=true;
for(k1=i,k2=j;k1>=1,k2<=j+i-1;k1--,k2++)
{
if(attribute[k1][k]!=blackorwhite)
control3=false;
}
if(control3==true)
valueAI[i][j]+=N4;
}
}
}
//右半部分
for(i=1;i<9;i++)
for(j=8;(i+j)>9;j--)
{
if(attribute[8][j+i-8]==blackorwhite&&attribute[i+j-8][8]==blackorwhite)
{
bool control1=true;
for(k1=8,k2=j+i-8;k1>=i+j-8,k2<=8;k1--,k2++)
{
if(attribute[k1][k2]==0)
control1=false;
}
if(control1==true)
valueAI[i][j]+=N4;
}
else
{
bool control2=true;
for(k1=i,k2=j;k1<=8,k2>=j+i-8;k1++,k2--)
{
if(attribute[k1][k2]!=blackorwhite)
control2=false;
}
if(control2==true)
valueAI[i][j]+=N4;
if(control2==false)
{
bool control3=true;
for(k1=i,k2=j;k1>=i+j-8,k2<=8;k1--,k2++)
{
if(attribute[k1][k]!=blackorwhite)
control3=false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -