Update Pawn move generator
This commit is contained in:
parent
c79c05ddb6
commit
46495ce581
1 changed files with 26 additions and 22 deletions
|
@ -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));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue