这个估值算法能用..但是有没有更好的方式去估值
class Evaluation
{
public:
//我方路数和敌方路数
int MyRoadNumber[7], EnemyRoadNumber[7];
//评估函数
int Evaluate(char CheckerBoard[ROUTES][ROUTES], char side)
{
for (int i = 0; i < 7; i++)
{
MyRoadNumber[i] = 0;
EnemyRoadNumber[i] = 0;
}
//各路数的的价值
int ScoreOfRoad[7] = { 0,20,80,150,800,1000,100000 };
//估值分数
int score = 0;
//初始化敌我双方的路数信息!(是否有必要进行初始化?)
for (int i = 0; i < 7; i++)
{
MyRoadNumber[i] = 0;
EnemyRoadNumber[i] = 0;
}
//各个方向进行路数的计算
AnalysisHorizon(CheckerBoard, side);
AnalysisLeft(CheckerBoard, side);
AnalysisRight(CheckerBoard, side);
AnalysisVertical(CheckerBoard, side);
/*
for(int i = 0; i < 7 ; i++)
{
cout<<i<<"myroad"<<MyRoadNumber[i]<<endl;
cout<<i<<"enemyroad"<<EnemyRoadNumber[i]<<endl;
}
*/
//MyRoadNumber[1] /= 4;
//EnemyRoadNumber[1] /= 4;
//分数统计
for (int i = 1; i < 7; i++)
{
//cout<<i<<":"<<MyRoadNumber[i]<<" "<<EnemyRoadNumber[i]<<endl;
score += MyRoadNumber[i] * ScoreOfRoad[i] - EnemyRoadNumber[i] * ScoreOfRoad[i];
}
if (side == BLACKSIDE)
return score;
else
return -score;
}
private:
//计算水平方向双方每路具有的条数
int AnalysisHorizon(char CheckerBoard[ROUTES][ROUTES], char side)
{
for (int i = 0; i < ROUTES; i++)
{
for (int j = 0; j < ROUTES - 5; j++)
{
int number = CheckerBoard[i][j] + CheckerBoard[i][j + 1]
+ CheckerBoard[i][j + 2] + CheckerBoard[i][j + 3]
+ CheckerBoard[i][j + 4] + CheckerBoard[i][j + 5];
//cout<<"AnalysisHorizon number:"<<number<<endl;
if (number == 0 || (number > 6 && number % 7 != 0))
{
continue;
}
if (number < 7)
{
//如果side相反的话会在Evaluate上进行反转
//白棋的相应路数增加
EnemyRoadNumber[number]++;
}
else
{
//黑棋的相应路数增加
MyRoadNumber[number / 7]++;
}
}
}
//如果敌我双方四路和五路的数量大约0 返回1
if (side == BLACKSIDE && MyRoadNumber[4] + MyRoadNumber[5] > 0)
return 1;
if (side == WHITESIDE && EnemyRoadNumber[4] + EnemyRoadNumber[5] > 0)
return 1;
return 0;
}
//计算垂直方向双方每路具有的条数
int AnalysisVertical(char CheckerBoard[ROUTES][ROUTES], char side)
{
for (int i = 0; i < ROUTES - 5; i++)
{
for (int j = 0; j < ROUTES; j++)
{
//考虑的类型不周全 需要更改
int number = CheckerBoard[i][j] + CheckerBoard[i + 1][j]
+ CheckerBoard[i + 2][j] + CheckerBoard[i + 3][j]
+ CheckerBoard[i + 4][j] + CheckerBoard[i + 5][j];
//cout<<"AnalysisVertical number:"<<number<<endl;
if (number == 0 || (number > 6 && number % 7 != 0))
{
continue;
}
if (number < 7)
{
//如果side相反的话会在Evaluate上进行反转
//白棋的相应路数增加
EnemyRoadNumber[number]++;
}
else
{
//黑棋的相应路数增加
MyRoadNumber[number / 7]++;
}
}
}
//如果敌我双方四路和五路的数量大约0 返回1
if (side == BLACKSIDE && MyRoadNumber[4] + MyRoadNumber[5] > 0)
return 1;
if (side == WHITESIDE && EnemyRoadNumber[4] + EnemyRoadNumber[5] > 0)
return 1;
return 0;
}
//计算左斜方向双方每路具有的条数
int AnalysisLeft(char CheckerBoard[ROUTES][ROUTES], char side)
{
for (int i = 0; i < ROUTES - 5; i++)
{
for (int j = 0; j < ROUTES - 5; j++)
{
//考虑的类型不周全 需要更改
int number = CheckerBoard[i][j] + CheckerBoard[i + 1][j + 1]
+ CheckerBoard[i + 2][j + 2] + CheckerBoard[i + 3][j + 3]
+ CheckerBoard[i + 4][j + 4] + CheckerBoard[i + 5][j + 5];
//cout<<"AnalysisLeft number:"<<number<<endl;
if (number == 0 || (number > 6 && number % 7 != 0))
{
continue;
}
if (number < 7)
{
//如果side相反的话会在Evaluate上进行反转
//白棋的相应路数增加
EnemyRoadNumber[number]++;
}
else
{
//黑棋的相应路数增加
MyRoadNumber[number / 7]++;
}
}
}
//如果敌我双方四路和五路的数量大约0 返回1
if (side == BLACKSIDE && MyRoadNumber[4] + MyRoadNumber[5] > 0)
return 1;
if (side == WHITESIDE && EnemyRoadNumber[4] + EnemyRoadNumber[5] > 0)
return 1;
return 0;
}
//计算右斜方向双方每路具有的条数
int AnalysisRight(char CheckerBoard[ROUTES][ROUTES], char side)
{
for (int i = 0; i < ROUTES; i++)
{
for (int j = 0; j < ROUTES - 5; j++)
{
//考虑的类型不周全 需要更改
int number = CheckerBoard[ROUTES - j - 1][j] + CheckerBoard[ROUTES - j - 2][j + 1]
+ CheckerBoard[ROUTES - j - 3][j + 2] + CheckerBoard[ROUTES - j - 4][j + 3]
+ CheckerBoard[ROUTES - j - 5][j + 4] + CheckerBoard[ROUTES - j - 6][j + 5];
//cout<<"AnalysisRight number:"<<number<<endl;
if (number == 0 || (number > 6 && number % 7 != 0))
{
continue;
}
if (number < 7)
{
//如果side相反的话会在Evaluate上进行反转
//白棋的相应路数增加
EnemyRoadNumber[number]++;
}
else
{
//黑棋的相应路数增加
MyRoadNumber[number / 7]++;
}
}
}
//如果敌我双方四路和五路的数量大约0 返回1
if (side == BLACKSIDE && MyRoadNumber[4] + MyRoadNumber[5] > 0)
return 1;
if (side == WHITESIDE && EnemyRoadNumber[4] + EnemyRoadNumber[5] > 0)
return 1;
return 0;
}
};