diff --git a/src/all_moves_functions.cpp b/src/all_moves_functions.cpp index 7ede64e..200e8ff 100644 --- a/src/all_moves_functions.cpp +++ b/src/all_moves_functions.cpp @@ -129,19 +129,6 @@ void _get_all_moves_rook(int pos, std::vector *pns, std::array *pns, std::array* board, Color pc, Color rc){ @@ -151,37 +138,12 @@ void _get_all_moves_bishop(int pos, std::vector *pns, std::array *pns, std::array* board, Color pc, Color rc){ for (int kn_off : KNIGHT_PIECE_OFFSETS){ _add_if_not_blocked(pos+kn_off, pos, pns, board, pc, rc); } - /* - for (int xo=1;xo<=2;xo++){ - int yo=(xo==1)?2:1; - _add_if_not_blocked(x+xo, y+yo, pns, board, pc, rc); - _add_if_not_blocked(x-xo, y+yo, pns, board, pc, rc); - _add_if_not_blocked(x+xo, y-yo, pns, board, pc, rc); - _add_if_not_blocked(x-xo, y-yo, pns, board, pc, rc); - } - */ } void _get_all_moves_king(int pos, std::vector *pns, std::array* board, Color pc, Color rc, int castle_perms){ @@ -212,16 +174,6 @@ void _get_all_moves_king(int pos, std::vector *pns, std::array *pns, std::array* board, Color pc, Color rc, int en_passant){ diff --git a/src/functions.cpp b/src/functions.cpp index ee1fdc1..c275e44 100644 --- a/src/functions.cpp +++ b/src/functions.cpp @@ -133,25 +133,31 @@ void filter_checked_moves(PieceType pt, std::array *board, std:: for (auto p_pn= pns->begin(); p_pn!=pns->end();){ if (get_castle_flag(*p_pn) == 1){ // If moved left - // B1 - A1 = -1 - // A1 - B1 = +1 + // Queenside if ((get_from_sq(*p_pn) - get_to_sq(*p_pn)) > 0){ int right_move = make_move(get_from_sq(*p_pn), get_to_sq(*p_pn)+1); + int full_move = make_move(get_from_sq(*p_pn), get_to_sq(*p_pn)); auto right_board = dumb_move(right_move, *board); - if (is_checked(get_to_sq(*p_pn)+1, right_board)){ - p_pn = pns->erase(p_pn); + auto full_board = dumb_move(full_move, *board); + if (is_checked(get_to_sq(*p_pn)+1, right_board) || + is_checked(get_to_sq(*p_pn), full_board)){ + p_pn = pns->erase(p_pn); } else { ++p_pn; break; } + // Kingside } else { int left_move = make_move(get_from_sq(*p_pn), get_to_sq(*p_pn)-1); + int full_move = make_move(get_from_sq(*p_pn), get_to_sq(*p_pn)); auto left_board = dumb_move(left_move, *board); - if (is_checked(get_to_sq(*p_pn)-1, left_board)){ + auto full_board = dumb_move(full_move, *board); + if (is_checked(get_to_sq(*p_pn)-1, left_board) || + is_checked(get_to_sq(*p_pn), full_board)){ p_pn = pns->erase(p_pn); } else { ++p_pn; - continue; + break; } } } else { diff --git a/tests/main.cpp b/tests/main.cpp index 08f9b82..7c28a2f 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -277,9 +277,11 @@ TEST_CASE("Test for promotions on empty squares", "[get_all_moves]"){ } TEST_CASE("Tests for check on square of queenside capture", "[get_all_moves]"){ - auto cannot_queenside = get_all_moves(CASTLE_CHECK1_POS, CASTLE_CHECK1_BOARD); - auto cannot_queenside2 = get_all_moves(CASTLE_CHECK2_POS, CASTLE_CHECK2_BOARD); + auto cannot_queenside = get_all_moves(CASTLE_CHECK1_POS, CASTLE_CHECK1_BOARD, true, 0, 0xF); + auto cannot_queenside2 = get_all_moves(CASTLE_CHECK2_POS, CASTLE_CHECK2_BOARD, true, 0, 0xF); + auto cannot_queenside3 = get_all_moves(CASTLE_CHECK3_POS, CASTLE_CHECK3_BOARD, true, 0, 0xF); CHECK(get_notations(cannot_queenside, CASTLE_CHECK1_BOARD) == CASTLE_CHECK1_NOTATION); CHECK(get_notations(cannot_queenside2, CASTLE_CHECK2_BOARD) == CASTLE_CHECK2_NOTATION); + CHECK(get_notations(cannot_queenside3, CASTLE_CHECK3_BOARD) == CASTLE_CHECK3_NOTATION); } diff --git a/tests/valid_moves.h b/tests/valid_moves.h index f515433..0b8fdfd 100644 --- a/tests/valid_moves.h +++ b/tests/valid_moves.h @@ -835,5 +835,23 @@ const std::array CASTLE_CHECK2_BOARD = { const std::vector CASTLE_CHECK2_NOTATION = { "Kd8" }; +const int CASTLE_CHECK3_POS = E8; +const std::array CASTLE_CHECK3_BOARD = { + INV, INV, INV, INV, INV, INV, INV, INV, INV, INV, + INV, INV, INV, INV, INV, INV, INV, INV, INV, INV, + INV, B_ROOK, NONE, NONE, B_PAWN, B_KING, NONE, NONE, B_ROOK, INV, + INV, NONE, NONE, NONE, B_QUEEN, B_PAWN, B_PAWN, 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, W_ROOK, 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, 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::vector CASTLE_CHECK3_NOTATION = { + "Kf8" +};