std::string to_usi_string(Move m) { std::stringstream ss; if (!is_ok(m)) { ss <<((m == MOVE_RESIGN) ? "resign" : (m == MOVE_WIN ) ? "win" : (m == MOVE_NULL ) ? "null" : (m == MOVE_NONE ) ? "none" : ""); } else if (is_drop(m)) { ss << Piece(move_from(m)); ss << '*'; ss << move_to(m); } else { ss << move_from(m); ss << move_to(m); if (is_promote(m)) ss << '+'; } return ss.str(); }
std::string pretty(Move m) { if (is_drop(m)) return (pretty(move_to(m)) + pretty2(Piece(move_from(m))) + (pretty_jp ? "打" : "*")); else return pretty(move_from(m)) + pretty(move_to(m)) + (is_promote(m) ? (pretty_jp ? "成" : "+") : ""); }
std::string pretty(Move m, Piece movedPieceType) { if (is_drop(m)) return (pretty(move_to(m)) + pretty2(movedPieceType) + (pretty_jp ? "打" : "*")); else return pretty(move_to(m)) + pretty2(movedPieceType) + (is_promote(m) ? (pretty_jp ? "成" : "+") : "") + "["+ pretty(move_from(m))+"]"; }
void MovePicker::score<CAPTURES>() { // Position::see()を用いると遅い。単に取る駒の価値順に調べたほうがパフォーマンス的にもいい。 // 歩が成る指し手もあるのでこれはある程度優先されないといけない。 // CAPTURE系である以上、打つ指し手は除外されている。 for (auto& m : *this) { // CAPTURES_PRO_PLUSで生成しているので歩の成る指し手が混じる。これは金と歩の価値の差の点数とする。 // 移動させる駒の駒種。駒取りなので移動元は盤上であることは保証されている。 auto pt = type_of(pos.piece_on(move_from(m))); bool pawn_promo = is_promote(m) && pt == PAWN; // MVV-LVAに、歩の成りに加点する形にしておく。 // → 歩の成りは加点しないほうがよさげ? m.value =// (pawn_promo ? (Value)(Eval::ProDiffPieceValue[PAWN]) : VALUE_ZERO) + (Value)Eval::CapturePieceValue[pos.piece_on(move_to(m))] - LVA(pt); // 盤の上のほうの段にあるほど価値があるので下の方の段に対して小さなペナルティを課す。 // (基本的には取る駒の価値が大きいほど優先であるから..) // m.value -= Value(1 * relative_rank(pos.side_to_move(), rank_of(move_to(m)))); // → 将棋ではあまりよくないアイデア。 } }