Initiate end game psqt based on material scores

This commit is contained in:
stefiosif
2024-11-10 14:19:26 +02:00
parent e2d3185bbe
commit aba551ce7f

View File

@@ -17,23 +17,20 @@ const fn piece_score(piece_type: PieceType) -> i32 {
PieceType::Bishop => 330,
PieceType::Rook => 500,
PieceType::Queen => 900,
PieceType::King => 20000,
PieceType::King => 0,
}
}
// TODO: Use piece scores instead of piece count
fn is_end_game(board: &Board) -> bool {
let white_pieces_num = board
.white_pieces
.iter()
.fold(0, |acc, p| acc + bitboard::bit_count(p.bitboard));
let white_pieces = board.white_pieces.iter().fold(0, |acc, p| {
acc + bitboard::bit_count(p.bitboard) * piece_score(p.piece_type) as usize
});
let black_pieces_num = board
.black_pieces
.iter()
.fold(0, |acc, p| acc + bitboard::bit_count(p.bitboard));
let black_pieces = board.black_pieces.iter().fold(0, |acc, p| {
acc + bitboard::bit_count(p.bitboard) * piece_score(p.piece_type) as usize
});
white_pieces_num < 6 && black_pieces_num < 6
(white_pieces + black_pieces) < 2000
}
fn evaluate_side_for(board: &Board, color: Color) -> i32 {
@@ -43,10 +40,10 @@ fn evaluate_side_for(board: &Board, color: Color) -> i32 {
Color::Black => &board.black_pieces,
};
let psqt = if !is_end_game(board) {
piece_square_score
} else {
let psqt = if is_end_game(board) {
piece_square_score_endgame
} else {
piece_square_score
};
for piece in pieces {
@@ -99,7 +96,7 @@ mod tests {
assert_eq!(330, piece_score(PieceType::Bishop));
assert_eq!(500, piece_score(PieceType::Rook));
assert_eq!(900, piece_score(PieceType::Queen));
assert_eq!(20000, piece_score(PieceType::King));
assert_eq!(0, piece_score(PieceType::King));
Ok(())
}
@@ -117,8 +114,8 @@ mod tests {
let evaluate_white = evaluate_side_for(&game_2.board, Color::White);
let evaluate_black = evaluate_side_for(&game_2.board, Color::Black);
assert_eq!(24005, evaluate_white);
assert_eq!(23965, evaluate_black);
assert_eq!(4005, evaluate_white);
assert_eq!(3965, evaluate_black);
Ok(())
}