Move a whole bunch of stuff to the new chessfriend_board package

This commit is contained in:
Eryn Wells 2024-04-25 13:28:24 -07:00
parent 797606785e
commit 1d82d27f84
12 changed files with 1130 additions and 41 deletions

121
board/src/castle.rs Normal file
View file

@ -0,0 +1,121 @@
// Eryn Wells <eryn@erynwells.me>
use chessfriend_bitboard::BitBoard;
use chessfriend_core::{Color, Square};
#[repr(u8)]
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum Castle {
KingSide = 0,
QueenSide = 1,
}
pub struct Parameters {
/// Origin squares of the king and rook.
origin: Squares,
/// Target or destination squares for the king and rook.
target: Squares,
/// The set of squares that must be clear of any pieces in order to perform this castle.
clear: BitBoard,
/// The set of squares that must not be attacked in order to perform this castle.
check: BitBoard,
}
impl Parameters {
pub fn king_origin_square(&self) -> Square {
self.origin.king
}
pub fn rook_origin_square(&self) -> Square {
self.origin.rook
}
pub fn king_target_square(&self) -> Square {
self.target.king
}
pub fn rook_target_square(&self) -> Square {
self.target.rook
}
pub fn clear_squares(&self) -> &BitBoard {
&self.clear
}
pub fn check_squares(&self) -> &BitBoard {
&self.check
}
}
#[derive(Debug)]
struct Squares {
king: Square,
rook: Square,
}
impl Castle {
pub const ALL: [Castle; 2] = [Castle::KingSide, Castle::QueenSide];
/// Parameters for each castling move, organized by color and board-side.
const PARAMETERS: [[Parameters; 2]; 2] = [
[
Parameters {
origin: Squares {
king: Square::E1,
rook: Square::H1,
},
target: Squares {
king: Square::G1,
rook: Square::F1,
},
clear: BitBoard::new(0b0110_0000),
check: BitBoard::new(0b0111_0000),
},
Parameters {
origin: Squares {
king: Square::E1,
rook: Square::A1,
},
target: Squares {
king: Square::C1,
rook: Square::D1,
},
clear: BitBoard::new(0b0000_1110),
check: BitBoard::new(0b0001_1100),
},
],
[
Parameters {
origin: Squares {
king: Square::E8,
rook: Square::H8,
},
target: Squares {
king: Square::G8,
rook: Square::F8,
},
clear: BitBoard::new(0b0110_0000 << (8 * 7)),
check: BitBoard::new(0b0111_0000 << (8 * 7)),
},
Parameters {
origin: Squares {
king: Square::E8,
rook: Square::A8,
},
target: Squares {
king: Square::C8,
rook: Square::D8,
},
clear: BitBoard::new(0b0000_1110 << (8 * 7)),
check: BitBoard::new(0b0001_1100 << (8 * 7)),
},
],
];
pub fn parameters(self, color: Color) -> &'static Parameters {
&Castle::PARAMETERS[color as usize][self as usize]
}
}