From: Fabian Fichter Date: Fri, 24 Apr 2020 15:31:22 +0000 (+0200) Subject: Consider sideway attacks of soldiers in mobility X-Git-Url: http://winboard.nl/cgi-bin?a=commitdiff_plain;h=871bd753e09a1d022cb75e0a26e2f830e176d07d;p=fairystockfish.git Consider sideway attacks of soldiers in mobility janggi Total: 200 W: 89 L: 92 D: 19 xiangqi Total: 200 W: 61 L: 57 D: 82 --- diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 50692b9..c1b2b7b 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -245,7 +245,10 @@ namespace { if (pos.must_capture()) mobilityArea[Us] = AllSquares; else - mobilityArea[Us] = ~(b | pos.pieces(Us, KING, QUEEN) | pos.blockers_for_king(Us) | pe->pawn_attacks(Them) | shift(pos.pieces(Them, SHOGI_PAWN, SOLDIER))); + mobilityArea[Us] = ~(b | pos.pieces(Us, KING, QUEEN) | pos.blockers_for_king(Us) | pe->pawn_attacks(Them) + | shift(pos.pieces(Them, SHOGI_PAWN, SOLDIER)) + | shift(pos.promoted_soldiers(Them)) + | shift(pos.promoted_soldiers(Them))); // Initialize attackedBy[] for king and pawns attackedBy[Us][KING] = pos.count(Us) ? pos.attacks_from(ksq, Us) : Bitboard(0); diff --git a/src/position.cpp b/src/position.cpp index 228cf7a..32e1934 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -801,7 +801,7 @@ Bitboard Position::attackers_to(Square s, Bitboard occupied, Color c, Bitboard j b |= diags & diagonal_lines(); } - if (unpromoted_soldier(c, s)) + if (b & pieces(SOLDIER) && relative_rank(c, s, max_rank()) < var->soldierPromotionRank) b ^= b & pieces(SOLDIER) & ~PseudoAttacks[~c][SHOGI_PAWN][s]; return b; diff --git a/src/position.h b/src/position.h index 8b3824d..b77f286 100644 --- a/src/position.h +++ b/src/position.h @@ -145,7 +145,7 @@ public: Bitboard diagonal_lines() const; bool king_pass() const; bool king_pass_on_stalemate() const; - bool unpromoted_soldier(Color c, Square s) const; + Bitboard promoted_soldiers(Color c) const; bool makpong() const; // winning conditions int n_move_rule() const; @@ -591,9 +591,9 @@ inline bool Position::king_pass_on_stalemate() const { return var->kingPassOnStalemate; } -inline bool Position::unpromoted_soldier(Color c, Square s) const { +inline Bitboard Position::promoted_soldiers(Color c) const { assert(var != nullptr); - return relative_rank(c, s, var->maxRank) < var->soldierPromotionRank; + return pieces(c, SOLDIER) & promotion_zone_bb(c, var->soldierPromotionRank, max_rank()); } inline bool Position::makpong() const { @@ -848,7 +848,7 @@ inline Bitboard Position::attacks_from(Color c, PieceType pt, Square s) const { PieceType movePt = pt == KING ? king_type() : pt; Bitboard b = attacks_bb(c, movePt, s, byTypeBB[ALL_PIECES]); // Xiangqi soldier - if (pt == SOLDIER && unpromoted_soldier(c, s)) + if (pt == SOLDIER && !(promoted_soldiers(c) & s)) b &= file_bb(file_of(s)); // Janggi cannon restrictions if (pt == JANGGI_CANNON) @@ -876,7 +876,7 @@ inline Bitboard Position::moves_from(Color c, PieceType pt, Square s) const { PieceType movePt = pt == KING ? king_type() : pt; Bitboard b = moves_bb(c, movePt, s, byTypeBB[ALL_PIECES]); // Xiangqi soldier - if (pt == SOLDIER && unpromoted_soldier(c, s)) + if (pt == SOLDIER && !(promoted_soldiers(c) & s)) b &= file_bb(file_of(s)); // Janggi cannon restrictions if (pt == JANGGI_CANNON)