aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreug-vs <eugene@eug-vs.xyz>2023-08-15 03:32:02 +0300
committereug-vs <eugene@eug-vs.xyz>2023-08-15 03:59:38 +0300
commit2120ff5c2118f49bc17ad18d429c344f199e2da1 (patch)
treefc2e13d9d59cd58f483a2de0bb6c3a76be335001
parent369f52284a6443c599c15bf9d0bf2206a489452d (diff)
downloadchessnost-2120ff5c2118f49bc17ad18d429c344f199e2da1.tar.gz
feat: move king to center in the endgame
-rw-r--r--src/grossmeister/evaluation.rs49
1 files changed, 48 insertions, 1 deletions
diff --git a/src/grossmeister/evaluation.rs b/src/grossmeister/evaluation.rs
index 308f320..eb59b92 100644
--- a/src/grossmeister/evaluation.rs
+++ b/src/grossmeister/evaluation.rs
@@ -76,7 +76,24 @@ const KING_BONUS: [f32; 64] = [
0.20, 0.10, 0.30, -0.20, 0.00, 0.10, 0.30, 0.20
];
+const KING_BONUS_ENGAME: [f32; 64] = [
+ // A B C D E F G H
+ -0.50, -0.40, -0.30, -0.20, -0.20, -0.30, -0.40, -0.50,
+ -0.30, -0.20, -0.10, 0.00, 0.00, -0.10, -0.20, -0.30,
+ -0.30, -0.10, 0.20, 0.30, 0.30, 0.20, -0.10, -0.30,
+ -0.30, -0.10, 0.30, 0.40, 0.40, 0.30, -0.10, -0.30,
+ -0.30, -0.10, 0.30, 0.40, 0.40, 0.30, -0.10, -0.30,
+ -0.30, -0.10, 0.20, 0.30, 0.30, 0.20, -0.10, -0.30,
+ -0.30, -0.30, 0.00, 0.00, 0.00, 0.00, -0.30, -0.30,
+ -0.50, -0.30, -0.30, -0.30, -0.30, -0.30, -0.30, -0.50
+];
+
impl Grossmeister {
+ pub fn is_endgame(&self) -> bool {
+ // No queens on the board
+ self.board.piece_sets[Piece::Queen as usize].pop_count() == 0 &&
+ self.board.piece_sets[Piece::QueenBlack as usize].pop_count() == 0
+ }
/// Evaluate a position relative to the current player
pub fn evaluate(&self) -> f32 {
let color = self.board.color();
@@ -99,6 +116,7 @@ impl Grossmeister {
/// Count player pieces' material, giving bonus for pieces standing well
pub fn material(&self, color: Color) -> f32 {
+ let is_endgame = self.is_endgame();
let mut material = 0f32;
for (piece_index, bitboard) in self.board.pieces_by_color(color).iter().enumerate() {
let piece_type = Piece::from(piece_index);
@@ -108,7 +126,11 @@ impl Grossmeister {
Piece::Knight => KNIGHT_BONUS,
Piece::Bishop => BISHOP_BONUS,
Piece::Rook => ROOK_BONUS,
- Piece::King => KING_BONUS,
+ Piece::King => if is_endgame {
+ KING_BONUS_ENGAME
+ } else {
+ KING_BONUS
+ },
Piece::Queen => QUEEN_BONUS,
_ => panic!("Unreachable")
};
@@ -463,4 +485,29 @@ mod tests {
assert_eq!(score1.abs(), score2.abs());
}
+ #[test]
+ fn not_endgame() {
+ let board = Board::new();
+ let gm = Grossmeister::new(board);
+ let is_endgame = gm.is_endgame();
+ assert!(!is_endgame);
+ }
+
+ #[test]
+ fn is_endgame() {
+ let fen = String::from("8/1p6/p4k1K/6r1/8/8/8/8 w - - 10 49");
+ let board = Board::from_FEN(fen);
+ let gm = Grossmeister::new(board);
+ let is_endgame = gm.is_endgame();
+ assert!(is_endgame);
+ }
+
+ #[test]
+ fn is_endgame_no_queens() {
+ let fen = String::from("rnb1kbnr/pppppppp/8/8/8/8/PPPPPPPP/RNB1KBNR w KQkq - 0 1");
+ let board = Board::from_FEN(fen);
+ let gm = Grossmeister::new(board);
+ let is_endgame = gm.is_endgame();
+ assert!(is_endgame);
+ }
}