- // evaluate_trapped_bishop_a7h7() determines whether a bishop on a7/h7
- // (a2/h2 for black) is trapped by enemy pawns, and assigns a penalty
- // if it is.
-
- void evaluate_trapped_bishop_a7h7(const Position& pos, Square s, Color us, EvalInfo &ei) {
-
- assert(square_is_ok(s));
- assert(pos.piece_on(s) == piece_of_color_and_type(us, BISHOP));
-
- Square b6 = relative_square(us, (square_file(s) == FILE_A) ? SQ_B6 : SQ_G6);
- Square b8 = relative_square(us, (square_file(s) == FILE_A) ? SQ_B8 : SQ_G8);
-
- if ( pos.piece_on(b6) == piece_of_color_and_type(opposite_color(us), PAWN)
- && pos.see(s, b6) < 0
- && pos.see(s, b8) < 0)
- {
- ei.value -= Sign[us] * TrappedBishopA7H7Penalty;
- }
- }
-
-
- // evaluate_trapped_bishop_a1h1() determines whether a bishop on a1/h1
- // (a8/h8 for black) is trapped by a friendly pawn on b2/g2 (b7/g7 for
- // black), and assigns a penalty if it is. This pattern can obviously
- // only occur in Chess960 games.
-
- void evaluate_trapped_bishop_a1h1(const Position& pos, Square s, Color us, EvalInfo& ei) {
-
- Piece pawn = piece_of_color_and_type(us, PAWN);
- Square b2, b3, c3;
-
- assert(Chess960);
- assert(square_is_ok(s));
- assert(pos.piece_on(s) == piece_of_color_and_type(us, BISHOP));
-
- if (square_file(s) == FILE_A)
- {
- b2 = relative_square(us, SQ_B2);
- b3 = relative_square(us, SQ_B3);
- c3 = relative_square(us, SQ_C3);
- }
- else
- {
- b2 = relative_square(us, SQ_G2);
- b3 = relative_square(us, SQ_G3);
- c3 = relative_square(us, SQ_F3);
- }
-
- if (pos.piece_on(b2) == pawn)
- {
- Score penalty;
-
- if (!pos.square_is_empty(b3))
- penalty = 2 * TrappedBishopA1H1Penalty;
- else if (pos.piece_on(c3) == pawn)
- penalty = TrappedBishopA1H1Penalty;
- else
- penalty = TrappedBishopA1H1Penalty / 2;
-
- ei.value -= Sign[us] * penalty;
- }
- }
-
-