Update Pawn move generator

This commit is contained in:
Eryn Wells 2024-01-06 16:39:11 -08:00
parent c79c05ddb6
commit 46495ce581

View file

@ -18,9 +18,9 @@ struct MoveIterator(usize, usize);
struct MoveGenerationParameters { struct MoveGenerationParameters {
starting_rank: BitBoard, starting_rank: BitBoard,
promotion_rank: BitBoard, promotion_rank: BitBoard,
push_shift: fn(&BitBoard) -> BitBoard, push_shift: fn(BitBoard) -> BitBoard,
left_capture_shift: fn(&BitBoard) -> BitBoard, left_capture_shift: fn(BitBoard) -> BitBoard,
right_capture_shift: fn(&BitBoard) -> BitBoard, right_capture_shift: fn(BitBoard) -> BitBoard,
} }
pub(super) struct PawnMoveGenerator<'pos> { pub(super) struct PawnMoveGenerator<'pos> {
@ -106,7 +106,7 @@ impl<'pos> PawnMoveGenerator<'pos> {
let legal_1square_pushes = (parameters.push_shift)(bb) & empty_squares; let legal_1square_pushes = (parameters.push_shift)(bb) & empty_squares;
let legal_2square_pushes = let legal_2square_pushes =
(parameters.push_shift)(&(legal_1square_pushes & BitBoard::rank(2))) & empty_squares; (parameters.push_shift)(legal_1square_pushes & BitBoard::rank(2)) & empty_squares;
self.pushes = legal_1square_pushes | legal_2square_pushes; self.pushes = legal_1square_pushes | legal_2square_pushes;
} }
@ -145,9 +145,9 @@ impl<'pos> PawnMoveGenerator<'pos> {
let black_pieces = self.position.bitboard_for_color(self.color.other()); let black_pieces = self.position.bitboard_for_color(self.color.other());
for from_sq in bb.occupied_squares() { for from_sq in bb.occupied_squares() {
let pawn = BitBoard::from_square(from_sq); let pawn: BitBoard = from_sq.into();
let push = (parameters.push_shift)(&pawn); let push = (parameters.push_shift)(pawn);
if !(push & empty_squares).is_empty() { if !(push & empty_squares).is_empty() {
let to_sq = push.occupied_squares().next().unwrap(); let to_sq = push.occupied_squares().next().unwrap();
@ -162,7 +162,7 @@ impl<'pos> PawnMoveGenerator<'pos> {
} }
if !(pawn & parameters.starting_rank).is_empty() { if !(pawn & parameters.starting_rank).is_empty() {
let push = (parameters.push_shift)(&push); let push = (parameters.push_shift)(push);
if !(push & empty_squares).is_empty() { if !(push & empty_squares).is_empty() {
let to_sq = push.occupied_squares().next().unwrap(); let to_sq = push.occupied_squares().next().unwrap();
self.quiet_move_list() self.quiet_move_list()
@ -172,8 +172,8 @@ impl<'pos> PawnMoveGenerator<'pos> {
} }
for attack in [ for attack in [
(parameters.left_capture_shift)(&pawn), (parameters.left_capture_shift)(pawn),
(parameters.right_capture_shift)(&pawn), (parameters.right_capture_shift)(pawn),
] { ] {
if !(attack & black_pieces).is_empty() { if !(attack & black_pieces).is_empty() {
let to_sq = attack.occupied_squares().next().unwrap(); let to_sq = attack.occupied_squares().next().unwrap();
@ -254,7 +254,8 @@ mod tests {
#[test] #[test]
fn one_2square_push() { fn one_2square_push() {
let mut pos = Position::empty(); let mut pos = Position::empty();
pos.place_piece(&Piece::pawn(Color::White), &Square::e2())
pos.place_piece(Piece::pawn(Color::White), Square::E2)
.expect("Failed to place pawn on e2"); .expect("Failed to place pawn on e2");
let generator = PawnMoveGenerator::new(&pos, Color::White); let generator = PawnMoveGenerator::new(&pos, Color::White);
@ -275,7 +276,8 @@ mod tests {
#[test] #[test]
fn one_1square_push() { fn one_1square_push() {
let mut pos = Position::empty(); let mut pos = Position::empty();
pos.place_piece(&Piece::pawn(Color::White), &Square::e3())
pos.place_piece(Piece::pawn(Color::White), Square::E3)
.expect("Failed to place pawn on e3"); .expect("Failed to place pawn on e3");
let generator = PawnMoveGenerator::new(&pos, Color::White); let generator = PawnMoveGenerator::new(&pos, Color::White);
@ -297,9 +299,10 @@ mod tests {
#[test] #[test]
fn one_obstructed_2square_push() { fn one_obstructed_2square_push() {
let mut pos = Position::empty(); let mut pos = Position::empty();
pos.place_piece(&Piece::pawn(Color::White), &Square::e2())
pos.place_piece(Piece::pawn(Color::White), Square::E2)
.expect("Failed to place pawn on e2"); .expect("Failed to place pawn on e2");
pos.place_piece(&Piece::knight(Color::White), &Square::e4()) pos.place_piece(Piece::knight(Color::White), Square::E4)
.expect("Failed to place knight on e4"); .expect("Failed to place knight on e4");
println!("{}", DiagramFormatter::new(&pos)); println!("{}", DiagramFormatter::new(&pos));
@ -323,9 +326,10 @@ mod tests {
#[test] #[test]
fn one_obstructed_1square_push() { fn one_obstructed_1square_push() {
let mut pos = Position::empty(); let mut pos = Position::empty();
pos.place_piece(&Piece::pawn(Color::White), &Square::e2())
pos.place_piece(Piece::pawn(Color::White), Square::E2)
.expect("Failed to place pawn on e2"); .expect("Failed to place pawn on e2");
pos.place_piece(&Piece::knight(Color::White), &Square::e3()) pos.place_piece(Piece::knight(Color::White), Square::E3)
.expect("Failed to place knight on e4"); .expect("Failed to place knight on e4");
println!("{}", DiagramFormatter::new(&pos)); println!("{}", DiagramFormatter::new(&pos));
@ -340,11 +344,11 @@ mod tests {
#[test] #[test]
fn one_attack() { fn one_attack() {
let mut pos = Position::empty(); let mut pos = Position::empty();
pos.place_piece(&Piece::pawn(Color::White), &Square::e4()) pos.place_piece(Piece::pawn(Color::White), Square::E4)
.expect("Failed to place pawn on e4"); .expect("Failed to place pawn on e4");
pos.place_piece(&Piece::bishop(Color::White), &Square::e5()) pos.place_piece(Piece::bishop(Color::White), Square::E5)
.expect("Failed to place pawn on e4"); .expect("Failed to place pawn on e4");
pos.place_piece(&Piece::knight(Color::Black), &Square::d5()) pos.place_piece(Piece::knight(Color::Black), Square::D5)
.expect("Failed to place knight on d5"); .expect("Failed to place knight on d5");
println!("{}", DiagramFormatter::new(&pos)); println!("{}", DiagramFormatter::new(&pos));
@ -367,13 +371,13 @@ mod tests {
#[test] #[test]
fn one_double_attack() { fn one_double_attack() {
let mut pos = Position::empty(); let mut pos = Position::empty();
pos.place_piece(&Piece::pawn(Color::White), &Square::e4()) pos.place_piece(Piece::pawn(Color::White), Square::E4)
.expect("Failed to place pawn on e4"); .expect("Failed to place pawn on e4");
pos.place_piece(&Piece::bishop(Color::White), &Square::e5()) pos.place_piece(Piece::bishop(Color::White), Square::E5)
.expect("Failed to place pawn on e4"); .expect("Failed to place pawn on e4");
pos.place_piece(&Piece::knight(Color::Black), &Square::d5()) pos.place_piece(Piece::knight(Color::Black), Square::D5)
.expect("Failed to place knight on d5"); .expect("Failed to place knight on d5");
pos.place_piece(&Piece::queen(Color::Black), &Square::f5()) pos.place_piece(Piece::queen(Color::Black), Square::F5)
.expect("Failed to place knight on f5"); .expect("Failed to place knight on f5");
println!("{}", DiagramFormatter::new(&pos)); println!("{}", DiagramFormatter::new(&pos));