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 {
starting_rank: BitBoard,
promotion_rank: BitBoard,
push_shift: fn(&BitBoard) -> BitBoard,
left_capture_shift: fn(&BitBoard) -> BitBoard,
right_capture_shift: fn(&BitBoard) -> BitBoard,
push_shift: fn(BitBoard) -> BitBoard,
left_capture_shift: fn(BitBoard) -> BitBoard,
right_capture_shift: fn(BitBoard) -> BitBoard,
}
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_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;
}
@ -145,9 +145,9 @@ impl<'pos> PawnMoveGenerator<'pos> {
let black_pieces = self.position.bitboard_for_color(self.color.other());
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() {
let to_sq = push.occupied_squares().next().unwrap();
@ -162,7 +162,7 @@ impl<'pos> PawnMoveGenerator<'pos> {
}
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() {
let to_sq = push.occupied_squares().next().unwrap();
self.quiet_move_list()
@ -172,8 +172,8 @@ impl<'pos> PawnMoveGenerator<'pos> {
}
for attack in [
(parameters.left_capture_shift)(&pawn),
(parameters.right_capture_shift)(&pawn),
(parameters.left_capture_shift)(pawn),
(parameters.right_capture_shift)(pawn),
] {
if !(attack & black_pieces).is_empty() {
let to_sq = attack.occupied_squares().next().unwrap();
@ -254,7 +254,8 @@ mod tests {
#[test]
fn one_2square_push() {
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");
let generator = PawnMoveGenerator::new(&pos, Color::White);
@ -275,7 +276,8 @@ mod tests {
#[test]
fn one_1square_push() {
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");
let generator = PawnMoveGenerator::new(&pos, Color::White);
@ -297,9 +299,10 @@ mod tests {
#[test]
fn one_obstructed_2square_push() {
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");
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");
println!("{}", DiagramFormatter::new(&pos));
@ -323,9 +326,10 @@ mod tests {
#[test]
fn one_obstructed_1square_push() {
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");
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");
println!("{}", DiagramFormatter::new(&pos));
@ -340,11 +344,11 @@ mod tests {
#[test]
fn one_attack() {
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");
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");
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");
println!("{}", DiagramFormatter::new(&pos));
@ -367,13 +371,13 @@ mod tests {
#[test]
fn one_double_attack() {
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");
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");
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");
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");
println!("{}", DiagramFormatter::new(&pos));