chess_move_gen/mv_list/
piece_square_table.rs

1use crate::castle::Castle;
2use crate::castle::*;
3use crate::piece::*;
4use crate::square::*;
5
6/// PieceSquareTable gives scores for pieces on squares from the perspective
7/// of white. See https://www.chessprogramming.org/Piece-Square_Tables
8#[derive(Clone)]
9pub struct PieceSquareTable {
10    piece_square_values: [[i16; 64]; 6],
11    castle_values: [i16; 2],
12}
13
14impl PieceSquareTable {
15    /// piece_square_values should encode positional _and_ material value of
16    /// piece on each square. eg if pawn is worth +100 material value and pawn on D4 is worth +20
17    /// as positional value, entry for pawn on D4 should equal 100 + 20 = +120.
18    pub fn new(piece_square_values: [[i16; 64]; 6]) -> PieceSquareTable {
19        let mut castle_values = [0i16; 2];
20
21        castle_values[QUEEN_SIDE.to_usize()] = piece_square_values[KING.to_usize()][C1.to_usize()]
22            + piece_square_values[ROOK.to_usize()][D1.to_usize()]
23            - piece_square_values[KING.to_usize()][E1.to_usize()]
24            - piece_square_values[ROOK.to_usize()][A1.to_usize()];
25
26        castle_values[KING_SIDE.to_usize()] = piece_square_values[KING.to_usize()][G1.to_usize()]
27            + piece_square_values[ROOK.to_usize()][F1.to_usize()]
28            - piece_square_values[KING.to_usize()][E1.to_usize()]
29            - piece_square_values[ROOK.to_usize()][H1.to_usize()];
30
31        PieceSquareTable {
32            piece_square_values,
33            castle_values,
34        }
35    }
36
37    pub fn castle_score(&self, castle: Castle) -> i16 {
38        unsafe { *self.castle_values.get_unchecked(castle.to_usize()) }
39    }
40
41    /// Score relative to white. use crate::square#from_side to convert a square
42    /// to the perspective of a given player (ie flip board if black)
43    pub fn score(&self, kind: Kind, sq: Square) -> i16 {
44        unsafe {
45            *self
46                .piece_square_values
47                .get_unchecked(kind.to_usize())
48                .get_unchecked(sq.to_usize())
49        }
50    }
51}