combat.cpp (节选)
int score(int length, int free);
Coord Solution::placing(void)
{
assignWeight();
return pickupBestCoord();
}
void Solution::assignWeight(void)
{
for(int i = 0; i < EDGE_LENGTH; i++) {
for(int j = 0; j < EDGE_LENGTH; j++) {
if(weight[i][j] == 0) {
weight[i][j] = assignWeight_signle(Coord(i, j));
}
}
}
return;
}
assignWeight
函数,给权重表赋上权重。pickupBestCoord
函数,从棋盘上选择一个最好(权重值最高)的位置,返回。
combat.cpp (节选)
int Solution::assignWeight_signle(Coord coord)
{
Player enumPlayers[2] = {
Player::P1, Player::P2
};
int result = 0;
for(int i = 0; i < 2; i++) {
Player baseMover = enumPlayers[i];
chessboard.setPieceToCoord(coord, Piece(baseMover));
for(int direction = HORIZONTAL; direction <= RIGHT_OBLIQUE; direction++) {
result += score(chessboard.checkGameover_singleDirection(direction, coord),
chessboard.amountOfFreeExtremePoint(direction, coord));
}
}
chessboard.setPieceToCoord(coord, Piece(Player::Invalid));
return result;
}
assignWeight_signle
函数计算每一个位置的权重。先后分别放入己方和对方两色棋子,然后用 Chessboard
类的函数计算四个方向下连续同色子长度和活端个数,并且进入 score
函数中赋分。赋分结束后试验放入的棋子需要拿走。
score
函数如下:
combat.cpp (节选)
int score(int length, int free)
{
int scoreTable[3][4] =
{
{1, 1, 1, 1}, {5, 10, 50, 200}, {10, 80, 320, 4000}
};
if(length >= 5) {
return 4000;
}
return scoreTable[free][length-1];
}