[position] Plumb capture mask and push mask arguments through all move generators
These masks will help when generating moves that address checks. Create BitBoard::EMPTY and BitBoard::FULL.
This commit is contained in:
		
							parent
							
								
									9c4360c886
								
							
						
					
					
						commit
						b93f8684fa
					
				
					 9 changed files with 111 additions and 46 deletions
				
			
		| 
						 | 
					@ -18,6 +18,9 @@ macro_rules! moves_getter {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl BitBoard {
 | 
					impl BitBoard {
 | 
				
			||||||
 | 
					    pub const EMPTY: BitBoard = BitBoard(0);
 | 
				
			||||||
 | 
					    pub const FULL: BitBoard = BitBoard(0xFFFFFFFFFFFFFFFF);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub const fn empty() -> BitBoard {
 | 
					    pub const fn empty() -> BitBoard {
 | 
				
			||||||
        BitBoard(0)
 | 
					        BitBoard(0)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,6 +17,7 @@ use self::{
 | 
				
			||||||
    rook::ClassicalMoveGenerator as RookMoveGenerator,
 | 
					    rook::ClassicalMoveGenerator as RookMoveGenerator,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
use crate::{Move, Position};
 | 
					use crate::{Move, Position};
 | 
				
			||||||
 | 
					use chessfriend_bitboard::BitBoard;
 | 
				
			||||||
use chessfriend_core::{Color, Piece, PlacedPiece, Shape, Square};
 | 
					use chessfriend_core::{Color, Piece, PlacedPiece, Shape, Square};
 | 
				
			||||||
use std::collections::BTreeMap;
 | 
					use std::collections::BTreeMap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,10 +48,12 @@ macro_rules! move_generator_declaration {
 | 
				
			||||||
            pub(super) fn new(
 | 
					            pub(super) fn new(
 | 
				
			||||||
                position: &$crate::Position,
 | 
					                position: &$crate::Position,
 | 
				
			||||||
                color: chessfriend_core::Color,
 | 
					                color: chessfriend_core::Color,
 | 
				
			||||||
 | 
					                capture_mask: chessfriend_bitboard::BitBoard,
 | 
				
			||||||
 | 
					                push_mask: chessfriend_bitboard::BitBoard,
 | 
				
			||||||
            ) -> $name {
 | 
					            ) -> $name {
 | 
				
			||||||
                $name {
 | 
					                $name {
 | 
				
			||||||
                    color,
 | 
					                    color,
 | 
				
			||||||
                    move_sets: Self::move_sets(position, color),
 | 
					                    move_sets: Self::move_sets(position, color, capture_mask, push_mask),
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -83,21 +86,32 @@ pub(self) use move_generator_declaration;
 | 
				
			||||||
trait MoveGeneratorInternal {
 | 
					trait MoveGeneratorInternal {
 | 
				
			||||||
    fn piece(color: Color) -> Piece;
 | 
					    fn piece(color: Color) -> Piece;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn move_sets(position: &Position, color: Color) -> BTreeMap<Square, MoveSet> {
 | 
					    fn move_sets(
 | 
				
			||||||
 | 
					        position: &Position,
 | 
				
			||||||
 | 
					        color: Color,
 | 
				
			||||||
 | 
					        capture_mask: BitBoard,
 | 
				
			||||||
 | 
					        push_mask: BitBoard,
 | 
				
			||||||
 | 
					    ) -> BTreeMap<Square, MoveSet> {
 | 
				
			||||||
        let piece = Self::piece(color);
 | 
					        let piece = Self::piece(color);
 | 
				
			||||||
        BTreeMap::from_iter(
 | 
					        BTreeMap::from_iter(
 | 
				
			||||||
            position
 | 
					            position
 | 
				
			||||||
                .bitboard_for_piece(piece)
 | 
					                .bitboard_for_piece(piece)
 | 
				
			||||||
                .occupied_squares()
 | 
					                .occupied_squares()
 | 
				
			||||||
                .map(|sq| {
 | 
					                .map(|square| {
 | 
				
			||||||
                    let placed_piece = PlacedPiece::new(piece, sq);
 | 
					                    let piece = PlacedPiece::new(piece, square);
 | 
				
			||||||
                    let move_set = Self::move_set_for_piece(position, placed_piece);
 | 
					                    let move_set =
 | 
				
			||||||
                    (sq, move_set)
 | 
					                        Self::move_set_for_piece(position, piece, capture_mask, push_mask);
 | 
				
			||||||
 | 
					                    (square, move_set)
 | 
				
			||||||
                }),
 | 
					                }),
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn move_set_for_piece(position: &Position, placed_piece: PlacedPiece) -> MoveSet;
 | 
					    fn move_set_for_piece(
 | 
				
			||||||
 | 
					        position: &Position,
 | 
				
			||||||
 | 
					        piece: PlacedPiece,
 | 
				
			||||||
 | 
					        capture_mask: BitBoard,
 | 
				
			||||||
 | 
					        push_mask: BitBoard,
 | 
				
			||||||
 | 
					    ) -> MoveSet;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Clone, Debug, Eq, PartialEq)]
 | 
					#[derive(Clone, Debug, Eq, PartialEq)]
 | 
				
			||||||
| 
						 | 
					@ -111,14 +125,19 @@ pub struct Moves {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl Moves {
 | 
					impl Moves {
 | 
				
			||||||
    pub fn new(position: &Position, color: Color) -> Moves {
 | 
					    pub fn new(
 | 
				
			||||||
 | 
					        position: &Position,
 | 
				
			||||||
 | 
					        color: Color,
 | 
				
			||||||
 | 
					        capture_mask: BitBoard,
 | 
				
			||||||
 | 
					        push_mask: BitBoard,
 | 
				
			||||||
 | 
					    ) -> Moves {
 | 
				
			||||||
        Moves {
 | 
					        Moves {
 | 
				
			||||||
            pawn_moves: PawnMoveGenerator::new(position, color),
 | 
					            pawn_moves: PawnMoveGenerator::new(position, color, capture_mask, push_mask),
 | 
				
			||||||
            knight_moves: KnightMoveGenerator::new(position, color),
 | 
					            knight_moves: KnightMoveGenerator::new(position, color, capture_mask, push_mask),
 | 
				
			||||||
            bishop_moves: BishopMoveGenerator::new(position, color),
 | 
					            bishop_moves: BishopMoveGenerator::new(position, color, capture_mask, push_mask),
 | 
				
			||||||
            rook_moves: RookMoveGenerator::new(position, color),
 | 
					            rook_moves: RookMoveGenerator::new(position, color, capture_mask, push_mask),
 | 
				
			||||||
            queen_moves: QueenMoveGenerator::new(position, color),
 | 
					            queen_moves: QueenMoveGenerator::new(position, color, capture_mask, push_mask),
 | 
				
			||||||
            king_moves: KingMoveGenerator::new(position, color),
 | 
					            king_moves: KingMoveGenerator::new(position, color, capture_mask, push_mask),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,7 +12,12 @@ impl MoveGeneratorInternal for ClassicalMoveGenerator {
 | 
				
			||||||
        Piece::bishop(color)
 | 
					        Piece::bishop(color)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn move_set_for_piece(position: &Position, placed_piece: PlacedPiece) -> MoveSet {
 | 
					    fn move_set_for_piece(
 | 
				
			||||||
 | 
					        position: &Position,
 | 
				
			||||||
 | 
					        placed_piece: PlacedPiece,
 | 
				
			||||||
 | 
					        capture_mask: BitBoard,
 | 
				
			||||||
 | 
					        push_mask: BitBoard,
 | 
				
			||||||
 | 
					    ) -> MoveSet {
 | 
				
			||||||
        let piece = placed_piece.piece();
 | 
					        let piece = placed_piece.piece();
 | 
				
			||||||
        let square = placed_piece.square();
 | 
					        let square = placed_piece.square();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -64,7 +69,8 @@ mod tests {
 | 
				
			||||||
            White Bishop on A1,
 | 
					            White Bishop on A1,
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = ClassicalMoveGenerator::new(&pos, Color::White);
 | 
					        let generator =
 | 
				
			||||||
 | 
					            ClassicalMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert_eq!(
 | 
					        assert_eq!(
 | 
				
			||||||
            generator.bitboard(),
 | 
					            generator.bitboard(),
 | 
				
			||||||
| 
						 | 
					@ -84,7 +90,8 @@ mod tests {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        println!("{}", DiagramFormatter::new(&pos));
 | 
					        println!("{}", DiagramFormatter::new(&pos));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = ClassicalMoveGenerator::new(&pos, Color::White);
 | 
					        let generator =
 | 
				
			||||||
 | 
					            ClassicalMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert_eq!(
 | 
					        assert_eq!(
 | 
				
			||||||
            generator.bitboard(),
 | 
					            generator.bitboard(),
 | 
				
			||||||
| 
						 | 
					@ -102,7 +109,8 @@ mod tests {
 | 
				
			||||||
            Black Knight on C3,
 | 
					            Black Knight on C3,
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = ClassicalMoveGenerator::new(&pos, Color::White);
 | 
					        let generator =
 | 
				
			||||||
 | 
					            ClassicalMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert_eq!(
 | 
					        assert_eq!(
 | 
				
			||||||
            generator.bitboard(),
 | 
					            generator.bitboard(),
 | 
				
			||||||
| 
						 | 
					@ -120,7 +128,8 @@ mod tests {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        println!("{}", DiagramFormatter::new(&pos));
 | 
					        println!("{}", DiagramFormatter::new(&pos));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = ClassicalMoveGenerator::new(&pos, Color::White);
 | 
					        let generator =
 | 
				
			||||||
 | 
					            ClassicalMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
        let bitboard = generator.bitboard();
 | 
					        let bitboard = generator.bitboard();
 | 
				
			||||||
        let expected = BitBoard::new(
 | 
					        let expected = BitBoard::new(
 | 
				
			||||||
            0b00000001_10000010_01000100_00101000_00000000_00101000_01000100_10000010,
 | 
					            0b00000001_10000010_01000100_00101000_00000000_00101000_01000100_10000010,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,12 @@ impl MoveGeneratorInternal for KingMoveGenerator {
 | 
				
			||||||
        Piece::king(color)
 | 
					        Piece::king(color)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn move_set_for_piece(position: &Position, placed_piece: PlacedPiece) -> MoveSet {
 | 
					    fn move_set_for_piece(
 | 
				
			||||||
 | 
					        position: &Position,
 | 
				
			||||||
 | 
					        placed_piece: PlacedPiece,
 | 
				
			||||||
 | 
					        capture_mask: BitBoard,
 | 
				
			||||||
 | 
					        push_mask: BitBoard,
 | 
				
			||||||
 | 
					    ) -> MoveSet {
 | 
				
			||||||
        let piece = placed_piece.piece();
 | 
					        let piece = placed_piece.piece();
 | 
				
			||||||
        let color = piece.color();
 | 
					        let color = piece.color();
 | 
				
			||||||
        let square = placed_piece.square();
 | 
					        let square = placed_piece.square();
 | 
				
			||||||
| 
						 | 
					@ -61,7 +66,7 @@ mod tests {
 | 
				
			||||||
    fn one_king() {
 | 
					    fn one_king() {
 | 
				
			||||||
        let pos = position![White King on E4];
 | 
					        let pos = position![White King on E4];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = KingMoveGenerator::new(&pos, Color::White);
 | 
					        let generator = KingMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert_eq!(
 | 
					        assert_eq!(
 | 
				
			||||||
            generator.bitboard(),
 | 
					            generator.bitboard(),
 | 
				
			||||||
| 
						 | 
					@ -88,7 +93,7 @@ mod tests {
 | 
				
			||||||
    fn one_king_corner() {
 | 
					    fn one_king_corner() {
 | 
				
			||||||
        let pos = position![White King on A1];
 | 
					        let pos = position![White King on A1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = KingMoveGenerator::new(&pos, Color::White);
 | 
					        let generator = KingMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generated_bitboard = generator.bitboard();
 | 
					        let generated_bitboard = generator.bitboard();
 | 
				
			||||||
        let expected_bitboard = bitboard![A2, B2, B1];
 | 
					        let expected_bitboard = bitboard![A2, B2, B1];
 | 
				
			||||||
| 
						 | 
					@ -132,7 +137,7 @@ mod tests {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert!(pos.is_king_in_check());
 | 
					        assert!(pos.is_king_in_check());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = KingMoveGenerator::new(&pos, Color::Black);
 | 
					        let generator = KingMoveGenerator::new(&pos, Color::Black, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
        let generated_moves = generator.bitboard();
 | 
					        let generated_moves = generator.bitboard();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let expected_moves = bitboard![F8, F7, F6, D6, D7, D8];
 | 
					        let expected_moves = bitboard![F8, F7, F6, D6, D7, D8];
 | 
				
			||||||
| 
						 | 
					@ -151,7 +156,7 @@ mod tests {
 | 
				
			||||||
        assert!(pos.player_can_castle(Color::White, Castle::KingSide));
 | 
					        assert!(pos.player_can_castle(Color::White, Castle::KingSide));
 | 
				
			||||||
        assert!(pos.player_can_castle(Color::White, Castle::QueenSide));
 | 
					        assert!(pos.player_can_castle(Color::White, Castle::QueenSide));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = KingMoveGenerator::new(&pos, Color::White);
 | 
					        let generator = KingMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
        let generated_moves: HashSet<Move> = generator.iter().collect();
 | 
					        let generated_moves: HashSet<Move> = generator.iter().collect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let king = piece!(White King);
 | 
					        let king = piece!(White King);
 | 
				
			||||||
| 
						 | 
					@ -179,7 +184,7 @@ mod tests {
 | 
				
			||||||
        assert!(pos.player_can_castle(Color::White, Castle::KingSide));
 | 
					        assert!(pos.player_can_castle(Color::White, Castle::KingSide));
 | 
				
			||||||
        assert!(!pos.player_can_castle(Color::White, Castle::QueenSide));
 | 
					        assert!(!pos.player_can_castle(Color::White, Castle::QueenSide));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = KingMoveGenerator::new(&pos, Color::White);
 | 
					        let generator = KingMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
        let generated_moves: HashSet<Move> = generator.iter().collect();
 | 
					        let generated_moves: HashSet<Move> = generator.iter().collect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let king = piece!(White King);
 | 
					        let king = piece!(White King);
 | 
				
			||||||
| 
						 | 
					@ -207,7 +212,7 @@ mod tests {
 | 
				
			||||||
        assert!(!pos.player_can_castle(Color::White, Castle::KingSide));
 | 
					        assert!(!pos.player_can_castle(Color::White, Castle::KingSide));
 | 
				
			||||||
        assert!(pos.player_can_castle(Color::White, Castle::QueenSide));
 | 
					        assert!(pos.player_can_castle(Color::White, Castle::QueenSide));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = KingMoveGenerator::new(&pos, Color::White);
 | 
					        let generator = KingMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
        let generated_moves: HashSet<Move> = generator.iter().collect();
 | 
					        let generated_moves: HashSet<Move> = generator.iter().collect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let king = piece!(White King);
 | 
					        let king = piece!(White King);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,7 +12,12 @@ impl MoveGeneratorInternal for KnightMoveGenerator {
 | 
				
			||||||
        Piece::knight(color)
 | 
					        Piece::knight(color)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn move_set_for_piece(position: &Position, placed_piece: PlacedPiece) -> MoveSet {
 | 
					    fn move_set_for_piece(
 | 
				
			||||||
 | 
					        position: &Position,
 | 
				
			||||||
 | 
					        placed_piece: PlacedPiece,
 | 
				
			||||||
 | 
					        capture_mask: BitBoard,
 | 
				
			||||||
 | 
					        push_mask: BitBoard,
 | 
				
			||||||
 | 
					    ) -> MoveSet {
 | 
				
			||||||
        let opposing_pieces = position.bitboard_for_color(placed_piece.piece().color().other());
 | 
					        let opposing_pieces = position.bitboard_for_color(placed_piece.piece().color().other());
 | 
				
			||||||
        let empty_squares = position.empty_squares();
 | 
					        let empty_squares = position.empty_squares();
 | 
				
			||||||
        let knight_moves = BitBoard::knight_moves(placed_piece.square());
 | 
					        let knight_moves = BitBoard::knight_moves(placed_piece.square());
 | 
				
			||||||
| 
						 | 
					@ -39,7 +44,8 @@ mod tests {
 | 
				
			||||||
            White Knight on E4,
 | 
					            White Knight on E4,
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = KnightMoveGenerator::new(&pos, Color::White);
 | 
					        let generator =
 | 
				
			||||||
 | 
					            KnightMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /*
 | 
					        /*
 | 
				
			||||||
        let bb = generator.bitboard();
 | 
					        let bb = generator.bitboard();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,7 +15,12 @@ impl MoveGeneratorInternal for PawnMoveGenerator {
 | 
				
			||||||
        Piece::pawn(color)
 | 
					        Piece::pawn(color)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn move_set_for_piece(position: &Position, placed_piece: PlacedPiece) -> MoveSet {
 | 
					    fn move_set_for_piece(
 | 
				
			||||||
 | 
					        position: &Position,
 | 
				
			||||||
 | 
					        placed_piece: PlacedPiece,
 | 
				
			||||||
 | 
					        capture_mask: BitBoard,
 | 
				
			||||||
 | 
					        push_mask: BitBoard,
 | 
				
			||||||
 | 
					    ) -> MoveSet {
 | 
				
			||||||
        let capture_moves = Self::attacks(position, placed_piece);
 | 
					        let capture_moves = Self::attacks(position, placed_piece);
 | 
				
			||||||
        let quiet_moves = Self::pushes(position, placed_piece);
 | 
					        let quiet_moves = Self::pushes(position, placed_piece);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -65,7 +70,7 @@ mod tests {
 | 
				
			||||||
    fn one_2square_push() {
 | 
					    fn one_2square_push() {
 | 
				
			||||||
        let pos = test_position![White Pawn on E2];
 | 
					        let pos = test_position![White Pawn on E2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = PawnMoveGenerator::new(&pos, Color::White);
 | 
					        let generator = PawnMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let expected_moves = HashSet::from_iter([
 | 
					        let expected_moves = HashSet::from_iter([
 | 
				
			||||||
            MoveBuilder::new(piece!(White Pawn), Square::E2, Square::E3).build(),
 | 
					            MoveBuilder::new(piece!(White Pawn), Square::E2, Square::E3).build(),
 | 
				
			||||||
| 
						 | 
					@ -81,7 +86,7 @@ mod tests {
 | 
				
			||||||
    fn one_1square_push() {
 | 
					    fn one_1square_push() {
 | 
				
			||||||
        let pos = test_position![White Pawn on E3];
 | 
					        let pos = test_position![White Pawn on E3];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = PawnMoveGenerator::new(&pos, Color::White);
 | 
					        let generator = PawnMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let expected_moves = HashSet::from_iter([MoveBuilder::new(
 | 
					        let expected_moves = HashSet::from_iter([MoveBuilder::new(
 | 
				
			||||||
            Piece::pawn(Color::White),
 | 
					            Piece::pawn(Color::White),
 | 
				
			||||||
| 
						 | 
					@ -104,7 +109,7 @@ mod tests {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        println!("{}", DiagramFormatter::new(&pos));
 | 
					        println!("{}", DiagramFormatter::new(&pos));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = PawnMoveGenerator::new(&pos, Color::White);
 | 
					        let generator = PawnMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let expected_moves = HashSet::from_iter([MoveBuilder::new(
 | 
					        let expected_moves = HashSet::from_iter([MoveBuilder::new(
 | 
				
			||||||
            Piece::pawn(Color::White),
 | 
					            Piece::pawn(Color::White),
 | 
				
			||||||
| 
						 | 
					@ -125,7 +130,7 @@ mod tests {
 | 
				
			||||||
            White Knight on E3,
 | 
					            White Knight on E3,
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = PawnMoveGenerator::new(&pos, Color::White);
 | 
					        let generator = PawnMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generated_moves: HashSet<Move> = generator.iter().collect();
 | 
					        let generated_moves: HashSet<Move> = generator.iter().collect();
 | 
				
			||||||
        let expected_moves: HashSet<Move> = HashSet::new();
 | 
					        let expected_moves: HashSet<Move> = HashSet::new();
 | 
				
			||||||
| 
						 | 
					@ -141,7 +146,7 @@ mod tests {
 | 
				
			||||||
            Black Knight on D5,
 | 
					            Black Knight on D5,
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = PawnMoveGenerator::new(&pos, Color::White);
 | 
					        let generator = PawnMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let expected_moves =
 | 
					        let expected_moves =
 | 
				
			||||||
            HashSet::from_iter(
 | 
					            HashSet::from_iter(
 | 
				
			||||||
| 
						 | 
					@ -164,7 +169,7 @@ mod tests {
 | 
				
			||||||
            Black Queen on F5,
 | 
					            Black Queen on F5,
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = PawnMoveGenerator::new(&pos, Color::White);
 | 
					        let generator = PawnMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let expected_moves = HashSet::from_iter([
 | 
					        let expected_moves = HashSet::from_iter([
 | 
				
			||||||
            MoveBuilder::new(piece!(White Pawn), Square::E4, Square::D5)
 | 
					            MoveBuilder::new(piece!(White Pawn), Square::E4, Square::D5)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,7 +12,12 @@ impl MoveGeneratorInternal for ClassicalMoveGenerator {
 | 
				
			||||||
        Piece::queen(color)
 | 
					        Piece::queen(color)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn move_set_for_piece(position: &Position, placed_piece: PlacedPiece) -> MoveSet {
 | 
					    fn move_set_for_piece(
 | 
				
			||||||
 | 
					        position: &Position,
 | 
				
			||||||
 | 
					        placed_piece: PlacedPiece,
 | 
				
			||||||
 | 
					        capture_mask: BitBoard,
 | 
				
			||||||
 | 
					        push_mask: BitBoard,
 | 
				
			||||||
 | 
					    ) -> MoveSet {
 | 
				
			||||||
        let piece = placed_piece.piece();
 | 
					        let piece = placed_piece.piece();
 | 
				
			||||||
        let color = piece.color();
 | 
					        let color = piece.color();
 | 
				
			||||||
        let square = placed_piece.square();
 | 
					        let square = placed_piece.square();
 | 
				
			||||||
| 
						 | 
					@ -68,7 +73,8 @@ mod tests {
 | 
				
			||||||
    fn classical_single_queen_bitboard() {
 | 
					    fn classical_single_queen_bitboard() {
 | 
				
			||||||
        let pos = position![White Queen on B2];
 | 
					        let pos = position![White Queen on B2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = ClassicalMoveGenerator::new(&pos, Color::White);
 | 
					        let generator =
 | 
				
			||||||
 | 
					            ClassicalMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
        let bitboard = generator.bitboard();
 | 
					        let bitboard = generator.bitboard();
 | 
				
			||||||
        let expected = bitboard![
 | 
					        let expected = bitboard![
 | 
				
			||||||
            A2, C2, D2, E2, F2, G2, H2, // Rank
 | 
					            A2, C2, D2, E2, F2, G2, H2, // Rank
 | 
				
			||||||
| 
						 | 
					@ -94,7 +100,8 @@ mod tests {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        println!("{}", DiagramFormatter::new(&pos));
 | 
					        println!("{}", DiagramFormatter::new(&pos));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = ClassicalMoveGenerator::new(&pos, Color::White);
 | 
					        let generator =
 | 
				
			||||||
 | 
					            ClassicalMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
        let bitboard = generator.bitboard();
 | 
					        let bitboard = generator.bitboard();
 | 
				
			||||||
        let expected = BitBoard::new(
 | 
					        let expected = BitBoard::new(
 | 
				
			||||||
            0b10000001_01000001_00100001_00010001_00001001_00000101_00000011_00001110,
 | 
					            0b10000001_01000001_00100001_00010001_00001001_00000101_00000011_00001110,
 | 
				
			||||||
| 
						 | 
					@ -116,7 +123,8 @@ mod tests {
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
        println!("{}", DiagramFormatter::new(&pos));
 | 
					        println!("{}", DiagramFormatter::new(&pos));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = ClassicalMoveGenerator::new(&pos, Color::White);
 | 
					        let generator =
 | 
				
			||||||
 | 
					            ClassicalMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert_eq!(
 | 
					        assert_eq!(
 | 
				
			||||||
            generator.bitboard(),
 | 
					            generator.bitboard(),
 | 
				
			||||||
| 
						 | 
					@ -134,7 +142,8 @@ mod tests {
 | 
				
			||||||
        let pos = position![White Queen on D3];
 | 
					        let pos = position![White Queen on D3];
 | 
				
			||||||
        println!("{}", DiagramFormatter::new(&pos));
 | 
					        println!("{}", DiagramFormatter::new(&pos));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = ClassicalMoveGenerator::new(&pos, Color::White);
 | 
					        let generator =
 | 
				
			||||||
 | 
					            ClassicalMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert_eq!(
 | 
					        assert_eq!(
 | 
				
			||||||
            generator.bitboard(),
 | 
					            generator.bitboard(),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,7 +12,12 @@ impl MoveGeneratorInternal for ClassicalMoveGenerator {
 | 
				
			||||||
        Piece::rook(color)
 | 
					        Piece::rook(color)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn move_set_for_piece(position: &Position, placed_piece: PlacedPiece) -> MoveSet {
 | 
					    fn move_set_for_piece(
 | 
				
			||||||
 | 
					        position: &Position,
 | 
				
			||||||
 | 
					        placed_piece: PlacedPiece,
 | 
				
			||||||
 | 
					        capture_mask: BitBoard,
 | 
				
			||||||
 | 
					        push_mask: BitBoard,
 | 
				
			||||||
 | 
					    ) -> MoveSet {
 | 
				
			||||||
        let piece = placed_piece.piece();
 | 
					        let piece = placed_piece.piece();
 | 
				
			||||||
        let color = piece.color();
 | 
					        let color = piece.color();
 | 
				
			||||||
        let square = placed_piece.square();
 | 
					        let square = placed_piece.square();
 | 
				
			||||||
| 
						 | 
					@ -64,7 +69,8 @@ mod tests {
 | 
				
			||||||
    fn classical_single_rook_bitboard() {
 | 
					    fn classical_single_rook_bitboard() {
 | 
				
			||||||
        let pos = test_position![White Rook on A2];
 | 
					        let pos = test_position![White Rook on A2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = ClassicalMoveGenerator::new(&pos, Color::White);
 | 
					        let generator =
 | 
				
			||||||
 | 
					            ClassicalMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert_eq!(
 | 
					        assert_eq!(
 | 
				
			||||||
            generator.bitboard(),
 | 
					            generator.bitboard(),
 | 
				
			||||||
| 
						 | 
					@ -82,7 +88,8 @@ mod tests {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        println!("{}", DiagramFormatter::new(&pos));
 | 
					        println!("{}", DiagramFormatter::new(&pos));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = ClassicalMoveGenerator::new(&pos, Color::White);
 | 
					        let generator =
 | 
				
			||||||
 | 
					            ClassicalMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert_eq!(
 | 
					        assert_eq!(
 | 
				
			||||||
            generator.bitboard(),
 | 
					            generator.bitboard(),
 | 
				
			||||||
| 
						 | 
					@ -100,7 +107,8 @@ mod tests {
 | 
				
			||||||
            Black Knight on E1,
 | 
					            Black Knight on E1,
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = ClassicalMoveGenerator::new(&pos, Color::White);
 | 
					        let generator =
 | 
				
			||||||
 | 
					            ClassicalMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert_eq!(
 | 
					        assert_eq!(
 | 
				
			||||||
            generator.bitboard(),
 | 
					            generator.bitboard(),
 | 
				
			||||||
| 
						 | 
					@ -112,7 +120,8 @@ mod tests {
 | 
				
			||||||
    fn classical_single_rook_in_center() {
 | 
					    fn classical_single_rook_in_center() {
 | 
				
			||||||
        let pos = test_position![White Rook on D4];
 | 
					        let pos = test_position![White Rook on D4];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let generator = ClassicalMoveGenerator::new(&pos, Color::White);
 | 
					        let generator =
 | 
				
			||||||
 | 
					            ClassicalMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert_eq!(
 | 
					        assert_eq!(
 | 
				
			||||||
            generator.bitboard(),
 | 
					            generator.bitboard(),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -136,7 +136,7 @@ impl Position {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn moves(&self) -> &Moves {
 | 
					    pub fn moves(&self) -> &Moves {
 | 
				
			||||||
        self.moves
 | 
					        self.moves
 | 
				
			||||||
            .get_or_init(|| Moves::new(self, self.color_to_move))
 | 
					            .get_or_init(|| Moves::new(self, self.color_to_move, BitBoard::FULL, BitBoard::FULL))
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Return a BitBoard representing the set of squares containing a piece.
 | 
					    /// Return a BitBoard representing the set of squares containing a piece.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue