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 {
|
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));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue