From 1920250a25e6272b9e4515f853de03ffbe07e891 Mon Sep 17 00:00:00 2001 From: Tait Hoyem <44244401+TTWNO@users.noreply.github.com> Date: Thu, 25 Apr 2019 18:16:18 +0000 Subject: [PATCH] Put captured piece in move int --- src/all_moves_functions.cpp | 32 +++++++++++++++---------------- tests/main.cpp | 22 +++++++++++++++++++++ tests/valid_moves.h | 38 +++++++++++++++++++++++++++++-------- 3 files changed, 68 insertions(+), 24 deletions(-) diff --git a/src/all_moves_functions.cpp b/src/all_moves_functions.cpp index 34e0a2f..1c33ede 100644 --- a/src/all_moves_functions.cpp +++ b/src/all_moves_functions.cpp @@ -31,10 +31,10 @@ void _add_if_not_blocked(int pos, int from, std::vector *pns, std::arraypush_back(make_move(from, pos)); + pns->push_back(make_move(from, pos, (*board)[pos])); *is_not_blocked = false; } else { - pns->push_back(make_move(from, pos)); + pns->push_back(make_move(from, pos, (*board)[pos])); } } } @@ -49,10 +49,10 @@ void _king_add_if_not_blocked(int pos, int from, std::vector *pns, std::arr if (_xy_is_color(pos, board, color_of_piece)){ *is_not_blocked = false; } else if (_xy_is_color(pos, board, color_of_opposite)){ - pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::NONE, 0, 0, castle_flag)); + pns->push_back(make_move(from, pos, (*board)[pos], PieceType::NONE, 0, 0, castle_flag)); *is_not_blocked = false; } else { - pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::NONE, 0, 0, castle_flag)); + pns->push_back(make_move(from, pos, (*board)[pos], PieceType::NONE, 0, 0, castle_flag)); } } } @@ -65,7 +65,7 @@ void _add_if_not_blocked(int pos, int from, std::vector *pns, std::arraypush_back(make_move(from, pos)); + pns->push_back(make_move(from, pos, (*board)[pos])); } } @@ -76,21 +76,21 @@ void _pawn_diag_add_if_not_blocked(int pos, int from, std::vector *pns, std if (_xy_is_color(pos, board, color_of_opposite)){ if (promoting){ if (color_of_piece == Color::WHITE){ - pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::W_KNIGHT)); - pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::W_BISHOP)); - pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::W_ROOK)); - pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::W_QUEEN)); + pns->push_back(make_move(from, pos, (*board)[pos], PieceType::W_KNIGHT)); + pns->push_back(make_move(from, pos, (*board)[pos], PieceType::W_BISHOP)); + pns->push_back(make_move(from, pos, (*board)[pos], PieceType::W_ROOK)); + pns->push_back(make_move(from, pos, (*board)[pos], PieceType::W_QUEEN)); } else { - pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::B_KNIGHT)); - pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::B_BISHOP)); - pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::B_ROOK)); - pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::B_QUEEN)); + pns->push_back(make_move(from, pos, (*board)[pos], PieceType::B_KNIGHT)); + pns->push_back(make_move(from, pos, (*board)[pos], PieceType::B_BISHOP)); + pns->push_back(make_move(from, pos, (*board)[pos], PieceType::B_ROOK)); + pns->push_back(make_move(from, pos, (*board)[pos], PieceType::B_QUEEN)); } } else { - pns->push_back(make_move(from, pos)); + pns->push_back(make_move(from, pos, (*board)[pos])); } } else if (pos == en_passant){ - pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::NONE, 1)); + pns->push_back(make_move(from, pos, (*board)[en_passant], PieceType::NONE, 1)); } } } @@ -103,7 +103,7 @@ void _pawn_add_if_not_blocked(int pos, int from, std::vector *pns, std::arr (*board)[pos] == PieceType::INV){ *is_not_blocked = false; } else { - double_move?pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::NONE, PieceType::NONE, 1)):pns->push_back(make_move(from, pos)); + double_move?pns->push_back(make_move(from, pos, (*board)[pos], PieceType::NONE, 0, 1)):pns->push_back(make_move(from, pos, (*board)[pos])); } } } diff --git a/tests/main.cpp b/tests/main.cpp index a358a75..9a8e297 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -140,6 +140,28 @@ TEST_CASE("Test for pawn promotions.", "[get_all_moves]"){ CHECK(get_promoted_pieces(bprom_moves) == PROM_BPAWN_PROMS); } +TEST_CASE("Test that the captures moves are returned", "[get_all_moves]"){ + auto knight_moves = get_all_moves(KNIGHT_BLOCKED1_POS, KNIGHT_BLOCKED1_BOARD); + auto bishop_moves = get_all_moves(BISHOP_BLOCKED1_POS, BISHOP_BLOCKED1_BOARD); + auto rook_moves = get_all_moves(ROOK_BLOCKED1_POS, ROOK_BLOCKED1_BOARD); + auto pawn_moves = get_all_moves(PAWN_DIAG_TEST1_POS, PAWN_DIAG_TEST1_BOARD); + auto king_moves = get_all_moves(KING_CHECK_TEST_POS, KING_CHECK_TEST_BOARD); + CHECK(get_captured_pieces(knight_moves) == KNIGHT_BLOCKED1_CAPTS); + CHECK(get_captured_pieces(bishop_moves) == BISHOP_BLOCKED1_CAPTS); + CHECK(get_captured_pieces(rook_moves) == ROOK_BLOCKED1_CAPTS); + CHECK(get_captured_pieces(pawn_moves) == PAWN_DIAG_TEST1_CAPTS); + CHECK(get_captured_pieces(king_moves) == KING_CHECK_TEST_CAPTS); +} + +TEST_CASE("Test that being blocked, stops moves from generating", "[get_all_moves]"){ + auto knight_moves = get_all_moves(KNIGHT_BLOCKED1_POS, KNIGHT_BLOCKED1_BOARD); + auto bishop_moves = get_all_moves(BISHOP_BLOCKED1_POS, BISHOP_BLOCKED1_BOARD); + auto rook_moves = get_all_moves(ROOK_BLOCKED1_POS, ROOK_BLOCKED1_BOARD); + CHECK(get_to_squares(knight_moves) == KNIGHT_BLOCKED1_MOVES); + CHECK(get_to_squares(bishop_moves) == BISHOP_BLOCKED1_MOVES); + CHECK(get_to_squares(rook_moves) == ROOK_BLOCKED1_MOVES); +} + TEST_CASE("Test for castling moves.", "[get_all_moves]"){ std::vector cast_flags = {0, 0, 0, 0, 0, 1, 1}; auto cast_moves = get_all_moves(CASTLING_POS, CASTLING_BOARD, true, 0, 0xF); diff --git a/tests/valid_moves.h b/tests/valid_moves.h index 32c970c..421e162 100644 --- a/tests/valid_moves.h +++ b/tests/valid_moves.h @@ -40,6 +40,9 @@ const std::array KNIGHT_BLOCKED1_BOARD = { const std::vector KNIGHT_BLOCKED1_MOVES = { A6, C6 }; +const std::vector KNIGHT_BLOCKED1_CAPTS = { + NONE, W_PAWN +}; const int BISHOP_BLOCKED1_POS = D5; const std::array BISHOP_BLOCKED1_BOARD = { @@ -58,11 +61,16 @@ const std::array BISHOP_BLOCKED1_BOARD = { }; // Should NOT include A8, H8, G2, or H1 const std::vector BISHOP_BLOCKED1_MOVES = { - B7, - C6,E6, - C4,E4, - B3,F3, - A2 + C6, B7, + E6, + C4, B3, A2, + E4, F3 +}; +const std::vector BISHOP_BLOCKED1_CAPTS = { + NONE, B_QUEEN, + NONE, + NONE, NONE, NONE, + NONE, B_KING, }; // Should NOT include B2 (black queen) as it is obstructed by the bishop on D5 const std::vector BISHOP_BLOCKED1_CAN_MOVE_TO_B_KING = { @@ -70,7 +78,6 @@ const std::vector BISHOP_BLOCKED1_CAN_MOVE_TO_B_KING = { }; const int BISHOP_BLOCKED1_KING_POS = F3; - const int ROOK_BLOCKED1_POS = B7; const std::array ROOK_BLOCKED1_BOARD = { INV, INV, INV, INV, INV, INV, INV, INV, INV, INV, @@ -88,9 +95,16 @@ const std::array ROOK_BLOCKED1_BOARD = { }; // Should NOT include E-H2 or B3-1 const std::vector ROOK_BLOCKED1_MOVES = { + A7, B8, - A7, C7, D7, - B6,B5,B4 + C7, D7, + B6, B5, B4 +}; +const std::vector ROOK_BLOCKED1_CAPTS = { + NONE, + NONE, + NONE, B_PAWN, + NONE, NONE, NONE }; const int PAWN_DIAG_TEST1_POS = E7; @@ -111,6 +125,9 @@ const std::array PAWN_DIAG_TEST1_BOARD = { const std::vector PAWN_DIAG_TEST1_MOVES = { E6, E5, D6 }; +const std::vector PAWN_DIAG_TEST1_CAPTS = { + NONE, NONE, W_QUEEN +}; // For testing the invalidating of moves because of putting own king in check const int ROOK_CHECK_TEST_POS = D5; @@ -457,6 +474,11 @@ const std::vector KING_CHECK_TEST_MOVES = { D5, E6, C6 }; +const std::vector KING_CHECK_TEST_CAPTS = { + NONE, NONE, + B_ROOK, + NONE, NONE +}; const std::vector KING_CHECK_ROOK_MOVES = { C5, B5, A5, D6, E5, F5,