Put captured piece in move int

master
Tait Hoyem 5 years ago
parent b53c46cb63
commit 1920250a25

@ -31,10 +31,10 @@ void _add_if_not_blocked(int pos, int from, std::vector<int> *pns, std::array<Pi
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));
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<int> *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<int> *pns, std::array<Pi
_xy_is_color(pos, board, color_of_piece)){
return;
} else {
pns->push_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<int> *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<int> *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]));
}
}
}

@ -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<int> cast_flags = {0, 0, 0, 0, 0, 1, 1};
auto cast_moves = get_all_moves(CASTLING_POS, CASTLING_BOARD, true, 0, 0xF);

@ -40,6 +40,9 @@ const std::array<PieceType, 120> KNIGHT_BLOCKED1_BOARD = {
const std::vector<int> KNIGHT_BLOCKED1_MOVES = {
A6, C6
};
const std::vector<int> KNIGHT_BLOCKED1_CAPTS = {
NONE, W_PAWN
};
const int BISHOP_BLOCKED1_POS = D5;
const std::array<PieceType, 120> BISHOP_BLOCKED1_BOARD = {
@ -58,11 +61,16 @@ const std::array<PieceType, 120> BISHOP_BLOCKED1_BOARD = {
};
// Should NOT include A8, H8, G2, or H1
const std::vector<int> BISHOP_BLOCKED1_MOVES = {
B7,
C6,E6,
C4,E4,
B3,F3,
A2
C6, B7,
E6,
C4, B3, A2,
E4, F3
};
const std::vector<int> 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<int> BISHOP_BLOCKED1_CAN_MOVE_TO_B_KING = {
@ -70,7 +78,6 @@ const std::vector<int> BISHOP_BLOCKED1_CAN_MOVE_TO_B_KING = {
};
const int BISHOP_BLOCKED1_KING_POS = F3;
const int ROOK_BLOCKED1_POS = B7;
const std::array<PieceType, 120> ROOK_BLOCKED1_BOARD = {
INV, INV, INV, INV, INV, INV, INV, INV, INV, INV,
@ -88,9 +95,16 @@ const std::array<PieceType, 120> ROOK_BLOCKED1_BOARD = {
};
// Should NOT include E-H2 or B3-1
const std::vector<int> ROOK_BLOCKED1_MOVES = {
A7,
B8,
A7, C7, D7,
B6,B5,B4
C7, D7,
B6, B5, B4
};
const std::vector<int> 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<PieceType, 120> PAWN_DIAG_TEST1_BOARD = {
const std::vector<int> PAWN_DIAG_TEST1_MOVES = {
E6, E5, D6
};
const std::vector<int> 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<int> KING_CHECK_TEST_MOVES = {
D5,
E6, C6
};
const std::vector<int> KING_CHECK_TEST_CAPTS = {
NONE, NONE,
B_ROOK,
NONE, NONE
};
const std::vector<int> KING_CHECK_ROOK_MOVES = {
C5, B5, A5,
D6, E5, F5,

Loading…
Cancel
Save