AI: 摆子阶段将棋子摆放在星点和成三的优先级一样

This commit is contained in:
Calcitem 2019-10-20 00:39:52 +08:00
parent 95ea8a2c5d
commit 969aee6c4c
3 changed files with 11 additions and 5 deletions

View File

@ -233,21 +233,25 @@ struct AIAlgorithm::Node *AIAlgorithm::addNode(
// 检测落子点是否能使得本方成三
int nMills = tempGame.position.board.inHowManyMills((square_t)(move & 0x00ff), tempGame.position.sideToMove);
if (nMills > 0) {
newNode->rating = static_cast<rating_t>(RATING_ONE_MILL * nMills);
newNode->rating += static_cast<rating_t>(RATING_ONE_MILL * nMills);
} else {
// 检测落子点是否能阻止对方成三
int nopponentMills = tempGame.position.board.inHowManyMills((square_t)(move & 0x00ff), tempGame.position.opponent);
newNode->rating = static_cast<rating_t>(RATING_BLOCK_ONE_MILL * nopponentMills);
newNode->rating += static_cast<rating_t>(RATING_BLOCK_ONE_MILL * nopponentMills);
}
if (tempGame.getPhase() == PHASE_PLACING && Board::isStar(static_cast<square_t>(move))) {
newNode->rating += RATING_STAR_SQUARE;
}
} else if (move < 0) {
// 检测吃子点是否处于对方的三连中
int nopponentMills = tempGame.position.board.inHowManyMills((square_t)((-move) & 0x00ff), tempGame.position.opponent);
newNode->rating = static_cast<rating_t>(RATING_CAPTURE_ONE_MILL * nopponentMills);
newNode->rating += static_cast<rating_t>(RATING_CAPTURE_ONE_MILL * nopponentMills);
}
#endif // MILL_FIRST
} else {
// 如果启用了置换表并且不是叶子结点
newNode->rating = RATING_TT;
newNode->rating += RATING_TT;
}
return newNode;

View File

@ -39,7 +39,7 @@ value_t TT::probeHash(const hash_t &hash,
if ((hashValue.type == hashfALPHA) && // 最多是 hashValue.value
(hashValue.value <= alpha)) {
return alpha;
return alpha; // TODO: https://github.com/calcitem/NineChess/issues/25
}
if ((hashValue.type == hashfBETA) && // 至少是 hashValue.value

View File

@ -142,6 +142,7 @@ enum rating_t : int8_t
// 正值
RATING_BLOCK_ONE_MILL = 10,
RATING_ONE_MILL = 11,
RATING_STAR_SQUARE = 11,
RATING_BLOCK_TWO_MILLS = RATING_BLOCK_ONE_MILL * 2,
RATING_TWO_MILLS = RATING_ONE_MILL * 2,
RATING_BLOCK_THREE_MILLS = RATING_BLOCK_ONE_MILL * 3,
@ -235,6 +236,7 @@ inline T& operator*=(T& d, int i) { return d = T(int(d) * i); } \
inline T& operator/=(T& d, int i) { return d = T(int(d) / i); }
ENABLE_FULL_OPERATORS_ON(value_t)
ENABLE_FULL_OPERATORS_ON(rating_t)
ENABLE_FULL_OPERATORS_ON(direction_t)
ENABLE_INCR_OPERATORS_ON(direction_t)