[bitboard, core, position] Implement proper castle move generation
Add a field to MoveSet called special that flags special moves that should be generated in the iter() method. This field is a u8. It only tracks castles in the first and second bits (kingside and queenside, respectively). The move iterator chains two maps over Option<()> that produce the kingside and queenside castle moves. With that done, finish the implementation of Position::player_can_castle by adding checks for whether the squares between the rook and king are clear, and that the king would not pass through a check. This is done with BitBoards! Finally, implement some logic in PositionBuilder that updates the position's castling flags based on the positions of king and rooks. Supporting changes: - Add Color:ALL and iterate on that slice - Add Castle::ALL and iterator on that slice - Add a CastlingParameters struct that contains BitBoard properties that describe squares that should be clear of pieces and squares that should not be attacked.
This commit is contained in:
parent
83a4e47e56
commit
1d7dada987
6 changed files with 234 additions and 60 deletions
|
@ -10,8 +10,10 @@ pub enum Color {
|
|||
}
|
||||
|
||||
impl Color {
|
||||
pub fn iter() -> impl Iterator<Item = Color> {
|
||||
[Color::White, Color::Black].into_iter()
|
||||
pub const ALL: [Color; 2] = [Color::White, Color::Black];
|
||||
|
||||
pub fn iter() -> impl Iterator<Item = &'static Color> {
|
||||
Color::ALL.iter()
|
||||
}
|
||||
|
||||
pub fn other(&self) -> Color {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue