From 8be2c483a1d71865cda6f737d72fa11b64f73dd5 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Fri, 17 Oct 2008 15:38:00 +0200 Subject: [PATCH] Unify black and white code in generate_move_if_legal() Signed-off-by: Marco Costalba --- src/movegen.cpp | 188 +++++++++++++++++++++--------------------------- 1 file changed, 80 insertions(+), 108 deletions(-) diff --git a/src/movegen.cpp b/src/movegen.cpp index fee25e28..a2e9c9c9 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -712,127 +712,99 @@ Move generate_move_if_legal(const Position &pos, Move m, Bitboard pinned) { return MOVE_NONE; // Proceed according to the type of the moving piece. - switch(type_of_piece(pc)) { - + switch (type_of_piece(pc)) + { case PAWN: - // Pawn moves, as usual, are somewhat messy. - if (us == WHITE) + // If the destination square is on the 8/1th rank, the move must + // be a promotion. + if ( ( (square_rank(to) == RANK_8 && us == WHITE) + ||(square_rank(to) == RANK_1 && us != WHITE)) + && !move_promotion(m)) + return MOVE_NONE; + + // Proceed according to the square delta between the source and + // destionation squares. + switch (to - from) { - // If the destination square is on the 8th rank, the move must - // be a promotion. - if (square_rank(to) == RANK_8 && !move_promotion(m)) - return MOVE_NONE; - - // Proceed according to the square delta between the source and - // destionation squares. - switch (to - from) - { - case DELTA_NW: - case DELTA_NE: - // Capture. The destination square must be occupied by an enemy - // piece (en passant captures was handled earlier). - if (pos.color_of_piece_on(to) != them) - return MOVE_NONE; - break; - - case DELTA_N: - // Pawn push. The destination square must be empty. - if (!pos.square_is_empty(to)) - return MOVE_NONE; - break; - - case DELTA_NN: - // Double pawn push. The destination square must be on the fourth - // rank, and both the destination square and the square between the - // source and destination squares must be empty. - if ( square_rank(to) != RANK_4 - || !pos.square_is_empty(to) - || !pos.square_is_empty(from + DELTA_N)) - return MOVE_NONE; - break; - - default: + case DELTA_NW: + case DELTA_NE: + case DELTA_SW: + case DELTA_SE: + // Capture. The destination square must be occupied by an enemy + // piece (en passant captures was handled earlier). + if (pos.color_of_piece_on(to) != them) return MOVE_NONE; - } - } - else // (us == BLACK) - { - // If the destination square is on the 1th rank, the move must - // be a promotion. - if (square_rank(to) == RANK_1 && !move_promotion(m)) + break; + + case DELTA_N: + case DELTA_S: + // Pawn push. The destination square must be empty. + if (!pos.square_is_empty(to)) return MOVE_NONE; - - // Proceed according to the square delta between the source and - // destionation squares. - switch (to - from) - { - case DELTA_SW: - case DELTA_SE: - // Capture. The destination square must be occupied by an enemy - // piece (en passant captures was handled earlier). - if (pos.color_of_piece_on(to) != them) - return MOVE_NONE; - break; - - case DELTA_S: - // Pawn push. The destination square must be empty. - if (!pos.square_is_empty(to)) - return MOVE_NONE; - break; - - case DELTA_SS: - // Double pawn push. The destination square must be on the fifth - // rank, and both the destination square and the square between the - // source and destination squares must be empty. - if ( square_rank(to) != RANK_5 - || !pos.square_is_empty(to) - || !pos.square_is_empty(from + DELTA_S)) - return MOVE_NONE; - break; - - default: + break; + + case DELTA_NN: + // Double white pawn push. The destination square must be on the fourth + // rank, and both the destination square and the square between the + // source and destination squares must be empty. + if ( square_rank(to) != RANK_4 + || !pos.square_is_empty(to) + || !pos.square_is_empty(from + DELTA_N)) + return MOVE_NONE; + break; + + case DELTA_SS: + // Double black pawn push. The destination square must be on the fifth + // rank, and both the destination square and the square between the + // source and destination squares must be empty. + if ( square_rank(to) != RANK_5 + || !pos.square_is_empty(to) + || !pos.square_is_empty(from + DELTA_S)) return MOVE_NONE; - } + break; + + default: + return MOVE_NONE; } // The move is pseudo-legal. Return it if it is legal. return (pos.move_is_legal(m) ? m : MOVE_NONE); break; - case KNIGHT: - return ( pos.knight_attacks_square(from, to) - && pos.move_is_legal(m) - && !move_promotion(m) ? m : MOVE_NONE); - break; - - case BISHOP: - return ( pos.bishop_attacks_square(from, to) - && pos.move_is_legal(m) - && !move_promotion(m) ? m : MOVE_NONE); - break; - - case ROOK: - return ( pos.rook_attacks_square(from, to) - && pos.move_is_legal(m) - && !move_promotion(m) ? m : MOVE_NONE); - break; - - case QUEEN: - return ( pos.queen_attacks_square(from, to) - && pos.move_is_legal(m) - && !move_promotion(m) ? m : MOVE_NONE); - break; + case KNIGHT: + return ( pos.knight_attacks_square(from, to) + && pos.move_is_legal(m) + && !move_promotion(m) ? m : MOVE_NONE); + break; + + case BISHOP: + return ( pos.bishop_attacks_square(from, to) + && pos.move_is_legal(m) + && !move_promotion(m) ? m : MOVE_NONE); + break; + + case ROOK: + return ( pos.rook_attacks_square(from, to) + && pos.move_is_legal(m) + && !move_promotion(m) ? m : MOVE_NONE); + break; - case KING: - return ( pos.king_attacks_square(from, to) - && pos.move_is_legal(m) - && !move_promotion(m) ? m : MOVE_NONE); - break; + case QUEEN: + return ( pos.queen_attacks_square(from, to) + && pos.move_is_legal(m) + && !move_promotion(m) ? m : MOVE_NONE); + break; - default: - assert(false); + case KING: + return ( pos.king_attacks_square(from, to) + && pos.move_is_legal(m) + && !move_promotion(m) ? m : MOVE_NONE); + break; + + default: + assert(false); } - assert(false); - return MOVE_NONE; + assert(false); + return MOVE_NONE; } -- 2.39.2