Try to track down a bug with checking kings. Add tests.

master
Tait Hoyem 5 years ago
parent 447e4a0f0d
commit da57a72a2e

@ -49,6 +49,7 @@ int main(){
// Gets all moves for color who's turn it is.
get_all_moves_for_pieces(my_pieces, &my_board, &all_moves, en_passant_square, castle_perms);
cout << "Castle perms: " << castle_perms << endl;
print_board(my_board);
// Gets a string from cin called input
string input;
@ -99,20 +100,29 @@ int main(){
if (moving_piece == W_ROOK){
if (moving_from_pos == Position::A1 &&
(castle_perms & CastlePerms::WQS == 1)){
castle_perms - CastlePerms::WQS;
castle_perms -= CastlePerms::WQS;
} else if (moving_from_pos == Position::H1 &&
(castle_perms & CastlePerms::WKS == 1)){
castle_perms - CastlePerms::WKS;
castle_perms -= CastlePerms::WKS;
}
} else if (moving_piece == B_ROOK){
if (moving_from_pos == Position::H8 &&
(castle_perms & CastlePerms::BKS == 1)){
castle_perms - CastlePerms::BKS;
castle_perms -= CastlePerms::BKS;
} else if (moving_from_pos == Position::A8 &&
(castle_perms & CastlePerms::BQS == 1)){
castle_perms - CastlePerms::BQS;
}
castle_perms -= CastlePerms::BQS;
}
}
// Removes castle perms after castling
if (is_white(moving_piece) &&
get_castle_flag(move_to_exec)){
castle_perms -= CastlePerms::WQS;
castle_perms -= CastlePerms::WKS;
} else if (is_black(moving_piece) &&
get_castle_flag(move_to_exec)) {
castle_perms -= CastlePerms::BQS;
castle_perms -= CastlePerms::BKS;
}
// This will keep the en passant sqaure for one whole turn.
if (reset_en_passant){

@ -129,7 +129,7 @@ TEST_CASE("Tests is_king_checked works", "[is_checked]"){
CHECK(is_checked(BLACK_CHECK_POS2, BLACK_CHECK_BOARD2));
}
TEST_CASE("Test that moves that put king in check are not returned", "[get_all_moves]"){
TEST_CASE("Test that moves that put own king in check are not returned", "[get_all_moves]"){
CHECK(get_to_squares(get_all_moves(ROOK_CHECK_TEST_POS, ROOK_CHECK_TEST_BOARD)) == ROOK_CHECK_TEST_MOVES);
CHECK(get_to_squares(get_all_moves(PAWN_CHECK_TEST_POS, PAWN_CHECK_TEST_BOARD)) == PAWN_CHECK_TEST_MOVES);
auto pawn_diag_moves = get_all_moves(PAWN_DIAG_TEST1_POS, PAWN_DIAG_TEST1_BOARD);
@ -287,3 +287,15 @@ TEST_CASE("Tests for check on square of queenside capture", "[get_all_moves]"){
CHECK(get_notations(cannot_queenside3, CASTLE_CHECK3_BOARD) == CASTLE_CHECK3_NOTATION);
CHECK(get_notations(cannot_queenside4, CASTLE_CHECK4_BOARD) == CASTLE_CHECK4_NOTATION);
}
TEST_CASE("Test that king check detection is working correctly.", "[is_checked]"){
CHECK(is_checked(ROOK_CHECK_KING_POS, ROOK_CHECK_MOVED_BOARD));
}
TEST_CASE("Test for add_checked_flags is working correctly.", "[get_all_moves][add_checked_flags]"){
auto rook_checked_flags = get_all_moves(ROOK_CHECK_POS, ROOK_CHECK_BOARD);
CHECK(get_notations(rook_checked_flags, ROOK_CHECK_BOARD) == ROOK_CHECK_NOTATION);
CHECK(get_checked_flags(rook_checked_flags) == ROOK_CHECK_FLAGS);
}

@ -55,6 +55,13 @@ std::vector<int> get_castle_flags(std::vector<int> moves){
}
return transformed;
}
std::vector<int> get_checked_flags(std::vector<int> moves){
std::vector<int> transformed;
for (int mv : moves){
transformed.push_back(get_check_flag(mv));
}
return transformed;
}
std::vector<std::string> get_notations(std::vector<int> moves, std::array<PieceType, 120> board){
std::vector<std::string> notations;
for (int move : moves){

@ -12,5 +12,6 @@ std::vector<int> get_promoted_pieces(std::vector<int> moves);
std::vector<int> get_en_passant_flags(std::vector<int> moves);
std::vector<int> get_pawn_start_flags(std::vector<int> moves);
std::vector<int> get_castle_flags(std::vector<int> moves);
std::vector<int> get_checked_flags(std::vector<int> moves);
std::vector<std::string> get_notations(std::vector<int> moves, std::array<PieceType, 120> board);
#endif

@ -871,3 +871,42 @@ const std::array<PieceType, 120> CASTLE_CHECK4_BOARD = {
const std::vector<std::string> CASTLE_CHECK4_NOTATION = {
"Kf8"
};
// This is a check that moves are being marked as "check moves" poperly
const int ROOK_CHECK_POS = H3;
const int ROOK_CHECK_KING_POS = H3;
const std::array<PieceType, 120> ROOK_CHECK_BOARD = {
INV, INV, INV, INV, INV, INV, INV, INV, INV, INV,
INV, INV, INV, INV, INV, INV, INV, INV, INV, INV,
INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, INV,
INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, INV,
INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, INV,
INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, INV,
INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, B_PAWN, INV,
INV, NONE, NONE, NONE, NONE, NONE, NONE, B_PAWN, B_ROOK, INV,
INV, NONE, NONE, NONE, NONE, NONE, W_PAWN, NONE, NONE, INV,
INV, NONE, NONE, NONE, NONE, NONE, W_ROOK, W_KING, NONE, INV,
INV, INV, INV, INV, INV, INV, INV, INV, INV, INV,
INV, INV, INV, INV, INV, INV, INV, INV, INV, INV
};
const std::array<PieceType, 120> ROOK_CHECK_MOVED_BOARD = {
INV, INV, INV, INV, INV, INV, INV, INV, INV, INV,
INV, INV, INV, INV, INV, INV, INV, INV, INV, INV,
INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, INV,
INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, INV,
INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, INV,
INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, INV,
INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, B_PAWN, INV,
INV, NONE, NONE, NONE, NONE, NONE, NONE, B_PAWN, NONE, INV,
INV, NONE, NONE, NONE, NONE, NONE, W_PAWN, NONE, NONE, INV,
INV, NONE, NONE, NONE, NONE, NONE, W_ROOK, W_KING, B_ROOK, INV,
INV, INV, INV, INV, INV, INV, INV, INV, INV, INV,
INV, INV, INV, INV, INV, INV, INV, INV, INV, INV
};
const std::vector<std::string> ROOK_CHECK_NOTATION = {
"Rh2", "Rh1+"
};
const std::vector<int> ROOK_CHECK_FLAGS = {
0, 1
};

Loading…
Cancel
Save