WIP
This commit is contained in:
parent
d5cdf273c8
commit
091cc99cb3
42 changed files with 805 additions and 1662 deletions
|
@ -4,10 +4,9 @@
|
|||
//! generating the possible moves for the king in the given position.
|
||||
|
||||
use super::{move_generator_declaration, MoveGeneratorInternal, MoveSet};
|
||||
use crate::Position;
|
||||
use chessfriend_bitboard::BitBoard;
|
||||
use chessfriend_board::{castle::Castle, Board};
|
||||
use chessfriend_core::{PlacedPiece, Shape};
|
||||
use chessfriend_moves::Castle;
|
||||
|
||||
move_generator_declaration!(KingMoveGenerator, struct);
|
||||
move_generator_declaration!(KingMoveGenerator, new);
|
||||
|
@ -19,7 +18,7 @@ impl MoveGeneratorInternal for KingMoveGenerator {
|
|||
}
|
||||
|
||||
fn move_set_for_piece(
|
||||
position: &Position,
|
||||
board: &Board,
|
||||
placed_piece: &PlacedPiece,
|
||||
_capture_mask: BitBoard,
|
||||
_push_mask: BitBoard,
|
||||
|
@ -28,13 +27,13 @@ impl MoveGeneratorInternal for KingMoveGenerator {
|
|||
let color = piece.color();
|
||||
let square = placed_piece.square();
|
||||
|
||||
let safe_squares = !position.king_danger(color);
|
||||
let safe_squares = BitBoard::FULL;
|
||||
let all_king_moves = BitBoard::king_moves(square);
|
||||
|
||||
let empty_squares = position.empty_squares();
|
||||
let empty_squares = board.empty_squares();
|
||||
let safe_empty_squares = empty_squares & safe_squares;
|
||||
|
||||
let opposing_pieces = position.bitboard_for_color(color.other());
|
||||
let opposing_pieces = board.bitboard_for_color(color.other());
|
||||
let opposing_pieces_on_safe_squares = opposing_pieces & safe_squares;
|
||||
|
||||
let quiet_moves = all_king_moves & safe_empty_squares;
|
||||
|
@ -44,10 +43,10 @@ impl MoveGeneratorInternal for KingMoveGenerator {
|
|||
.quiet_moves(quiet_moves)
|
||||
.capture_moves(capture_moves);
|
||||
|
||||
if position.player_can_castle(color, Castle::KingSide) {
|
||||
if board.player_can_castle(color, Castle::KingSide) {
|
||||
move_set.kingside_castle();
|
||||
}
|
||||
if position.player_can_castle(color, Castle::QueenSide) {
|
||||
if board.player_can_castle(color, Castle::QueenSide) {
|
||||
move_set.queenside_castle();
|
||||
}
|
||||
|
||||
|
@ -58,21 +57,23 @@ impl MoveGeneratorInternal for KingMoveGenerator {
|
|||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::{assert_move_list, position, test_position, testing::*, PositionBuilder};
|
||||
use crate::{assert_move_list, test_position, testing::*};
|
||||
use chessfriend_bitboard::bitboard;
|
||||
use chessfriend_board::castle::Castle;
|
||||
use chessfriend_core::{piece, Color, Square};
|
||||
use chessfriend_moves::{Builder as MoveBuilder, Castle, Move};
|
||||
use chessfriend_moves::{Builder as MoveBuilder, Move};
|
||||
use std::collections::HashSet;
|
||||
|
||||
#[test]
|
||||
fn one_king() -> TestResult {
|
||||
let pos = position![White King on E4];
|
||||
let pos = test_position![White King on E4];
|
||||
|
||||
let generator = KingMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
|
||||
let generator =
|
||||
KingMoveGenerator::new(&pos.board, Color::White, BitBoard::FULL, BitBoard::FULL);
|
||||
|
||||
assert_eq!(
|
||||
generator._test_bitboard(),
|
||||
bitboard![E5, F5, F4, F3, E3, D3, D4, D5]
|
||||
bitboard![E5 F5 F4 F3 E3 D3 D4 D5]
|
||||
);
|
||||
|
||||
let builder = MoveBuilder::push(&piece!(White King on E4));
|
||||
|
@ -96,15 +97,16 @@ mod tests {
|
|||
|
||||
#[test]
|
||||
fn one_king_corner() -> TestResult {
|
||||
let pos = position![White King on A1];
|
||||
let pos = test_position![White King on A1];
|
||||
|
||||
let generator = KingMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
|
||||
let generator =
|
||||
KingMoveGenerator::new(&pos.board, Color::White, BitBoard::FULL, BitBoard::FULL);
|
||||
|
||||
let generated_bitboard = generator._test_bitboard();
|
||||
let expected_bitboard = bitboard![A2, B2, B1];
|
||||
let expected_bitboard = bitboard![A2 B2 B1];
|
||||
assert_eq!(
|
||||
generator._test_bitboard(),
|
||||
bitboard![A2, B2, B1],
|
||||
bitboard![A2 B2 B1],
|
||||
"Generated:\n{generated_bitboard}\nExpected:\n{expected_bitboard}"
|
||||
);
|
||||
|
||||
|
@ -136,19 +138,19 @@ mod tests {
|
|||
|
||||
#[test]
|
||||
fn black_king_in_check_by_rook() {
|
||||
let pos = PositionBuilder::new()
|
||||
.place_piece(piece!(White King on E1))
|
||||
.place_piece(piece!(White Rook on E4))
|
||||
.place_piece(piece!(Black King on E7))
|
||||
.to_move(Color::Black)
|
||||
.build();
|
||||
let pos = test_position!(Black, [
|
||||
White King on E1,
|
||||
White Rook on E4,
|
||||
Black King on E7,
|
||||
]);
|
||||
|
||||
assert!(pos.is_king_in_check());
|
||||
|
||||
let generator = KingMoveGenerator::new(&pos, Color::Black, BitBoard::FULL, BitBoard::FULL);
|
||||
let generator =
|
||||
KingMoveGenerator::new(&pos.board, Color::Black, BitBoard::FULL, BitBoard::FULL);
|
||||
let generated_moves = generator._test_bitboard();
|
||||
|
||||
let expected_moves = bitboard![F8, F7, F6, D6, D7, D8];
|
||||
let expected_moves = bitboard![F8 F7 F6 D6 D7 D8];
|
||||
|
||||
assert_eq!(generated_moves, expected_moves);
|
||||
}
|
||||
|
@ -164,7 +166,8 @@ mod tests {
|
|||
assert!(pos.player_can_castle(Color::White, Castle::KingSide));
|
||||
assert!(pos.player_can_castle(Color::White, Castle::QueenSide));
|
||||
|
||||
let generator = KingMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
|
||||
let generator =
|
||||
KingMoveGenerator::new(&pos.board, Color::White, BitBoard::FULL, BitBoard::FULL);
|
||||
let generated_moves: HashSet<Move> = generator.iter().collect();
|
||||
|
||||
assert!(generated_moves
|
||||
|
@ -187,7 +190,8 @@ mod tests {
|
|||
assert!(pos.player_can_castle(Color::White, Castle::KingSide));
|
||||
assert!(!pos.player_can_castle(Color::White, Castle::QueenSide));
|
||||
|
||||
let generator = KingMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
|
||||
let generator =
|
||||
KingMoveGenerator::new(&pos.board, Color::White, BitBoard::FULL, BitBoard::FULL);
|
||||
let generated_moves: HashSet<Move> = generator.iter().collect();
|
||||
|
||||
assert!(generated_moves
|
||||
|
@ -210,7 +214,8 @@ mod tests {
|
|||
assert!(!pos.player_can_castle(Color::White, Castle::KingSide));
|
||||
assert!(pos.player_can_castle(Color::White, Castle::QueenSide));
|
||||
|
||||
let generator = KingMoveGenerator::new(&pos, Color::White, BitBoard::FULL, BitBoard::FULL);
|
||||
let generator =
|
||||
KingMoveGenerator::new(&pos.board, Color::White, BitBoard::FULL, BitBoard::FULL);
|
||||
let generated_moves: HashSet<Move> = generator.iter().collect();
|
||||
|
||||
assert!(!generated_moves
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue