My Project
fixedDepthSolverExt.cc
Go to the documentation of this file.
5
7{
8 static void setAttackLeaf(Move best_move, PieceStand& proof_pieces) {
9 proof_pieces = PieceStand();
10 if (best_move.isDrop())
11 proof_pieces.add(best_move.ptype());
12 }
13 static void attack(Move best_move, PieceStand stand, PieceStand& proof_pieces) {
14 proof_pieces = ProofPieces::attack(proof_pieces, best_move, stand);
15 }
16 static void setLeaf(const NumEffectState& state, Player P, PieceStand stand, PieceStand& proof_pieces) {
17 proof_pieces = ProofPieces::leaf(state, P, stand);
18 }
19 static void clear(PieceStand& proof_pieces) {
20 proof_pieces = PieceStand();
21 }
22 static void updateMax(PieceStand child, PieceStand& proof_pieces) {
23 proof_pieces = proof_pieces.max(child);
24 }
35};
36
40
45
46template <osl::Player P>
49hasEscapeByMove(Move next_move, int depth, Move& check_move,
50 PieceStand& proof_pieces)
51{
52 typedef FixedDefenseHelper<P,SetProofPieces,true> helper_t;
53 proof_pieces = PieceStand();
54 ProofDisproof pdp;
55 helper_t helper(*this, depth+1, pdp, proof_pieces);
56 state->makeUnmakeMove(Player2Type<alt(P)>(),next_move,helper);
57 check_move = helper.best_move;
58 return pdp;
59}
60
63hasCheckmateMoveOfTurn(int depth, Move& best_move, PieceStand& proof_pieces)
64{
65 if (state->turn() == BLACK)
66 return hasCheckmateMove<BLACK>(depth, best_move, proof_pieces);
67 else
68 return hasCheckmateMove<WHITE>(depth, best_move, proof_pieces);
69}
70
73hasCheckmateWithGuideOfTurn(int depth, Move& guide, PieceStand& proof_pieces)
74{
75 if (state->turn() == BLACK)
76 return hasCheckmateWithGuide<BLACK>(depth, guide, proof_pieces);
77 else
78 return hasCheckmateWithGuide<WHITE>(depth, guide, proof_pieces);
79}
80
83hasEscapeByMoveOfTurn(Move next_move, int depth,
84 Move& check_move, PieceStand& proof_pieces)
85{
86 if (state->turn() == BLACK)
87 return hasEscapeByMove<WHITE>(next_move, depth, check_move, proof_pieces);
88 else
89 return hasEscapeByMove<BLACK>(next_move, depth, check_move, proof_pieces);
90}
91
92template <osl::Player P>
95hasCheckmateWithGuide(int depth, Move& guide, PieceStand& proof_pieces)
96{
97 assert(guide.isNormal());
98 if (! guide.isDrop())
99 {
100 const Piece p=state->pieceOnBoard(guide.to());
101 if (!p.isPtype<KING>())
102 guide=guide.newCapture(p);
103 }
104 if (state->template isAlmostValidMove<false>(guide)
106 ::isMember(*state, guide.ptype(), guide.from(), guide.to()))
107 return attack<P,SetProofPieces,true>(depth, guide, proof_pieces);
108 return attack<P,SetProofPieces,false>(depth, guide, proof_pieces);
109}
110
111template <osl::Player P>
113FixedDepthSolverExt::hasCheckmateMove(int depth, Move& best_move,
114 PieceStand& proof_pieces) {
115 return attack<P,SetProofPieces,false>(depth, best_move, proof_pieces);
116}
117
118template <osl::Player P>
120FixedDepthSolverExt::hasEscapeMove(Move last_move,int depth,
121 PieceStand& proof_pieces) {
122 return defense<P,SetProofPieces>(last_move, depth, proof_pieces);
123}
124
125namespace osl
126{
127 template const checkmate::ProofDisproof checkmate::FixedDepthSolverExt::hasCheckmateMove<BLACK>(int, Move&, PieceStand&);
128 template const checkmate::ProofDisproof checkmate::FixedDepthSolverExt::hasCheckmateMove<WHITE>(int, Move&, PieceStand&);
129 template const checkmate::ProofDisproof checkmate::FixedDepthSolverExt::hasEscapeMove<BLACK>(Move, int, PieceStand&);
130 template const checkmate::ProofDisproof checkmate::FixedDepthSolverExt::hasEscapeMove<WHITE>(Move, int, PieceStand&);
131 template const checkmate::ProofDisproof checkmate::FixedDepthSolverExt::hasEscapeByMove<BLACK>(Move, int, Move&, PieceStand&);
132 template const checkmate::ProofDisproof checkmate::FixedDepthSolverExt::hasEscapeByMove<WHITE>(Move, int, Move&, PieceStand&);
133}
134
135// ;;; Local Variables:
136// ;;; mode:c++
137// ;;; c-basic-offset:2
138// ;;; End:
圧縮していない moveの表現 .
Ptype ptype() const
bool isDrop() const
const Move newCapture(Piece capture) const
bool isNormal() const
INVALID でも PASS でもない.
const Square to() const
const Square from() const
利きを持つ局面
片方の手番の持駒の枚数を記録するクラス.
void add(Ptype type, unsigned int num=1)
const PieceStand max(PieceStand other) const
種類毎に this と other の持駒の多い方を取る
bool isPtype() const
Definition basic_type.h:930
Square kingSquare() const
Definition simpleState.h:94
const King8Info resetEdgeFromLiberty(Player king_player, Square king, King8Info info) const
liberty から盤の淵(xかyが1か9)を取り除く.
深さ固定で,その深さまで depth first searchで読む詰将棋.
const PieceStand stand(Player P) const
const ProofDisproof hasEscapeByMove(Move next_move, int depth, Move &check_move, PieceStand &proof_pieces)
next_move を指して逃げられるかどうかを調べる
const ProofDisproof hasCheckmateMove(int depth, Move &best_move, PieceStand &proof_pieces)
stateがPから詰む局面かを返す.
const ProofDisproof hasCheckmateWithGuide(int depth, Move &guide, PieceStand &proof_pieces)
guide を最初に試す. guide.isNormal() である必要はあるが,その局面でvalid でなくても良い
const ProofDisproof hasEscapeByMoveOfTurn(Move next_move, int depth, Move &check_move, PieceStand &proof_pieces)
const ProofDisproof hasCheckmateMoveOfTurn(int depth, Move &best_move, PieceStand &proof_pieces)
const ProofDisproof hasEscapeMove(Move last_move, int depth, PieceStand &proof_pieces)
stateがPによって詰んでいる局面かを返す.
const ProofDisproof hasCheckmateWithGuideOfTurn(int depth, Move &guide, PieceStand &proof_pieces)
敵玉の8近傍の状態を表す.
Definition king8Info.h:29
証明数(proof number)と反証数(disproof number).
const ProofDisproof attackEstimation(const NumEffectState &state) const
全て
ProofNumberTable Proof_Number_Table
@ KING
Definition basic_type.h:93
Player
Definition basic_type.h:8
@ BLACK
Definition basic_type.h:9
constexpr Player alt(Player player)
Definition basic_type.h:13
static void updateMax(PieceStand child, PieceStand &proof_pieces)
static void setAttackLeaf(Move best_move, PieceStand &proof_pieces)
static ProofDisproof attackEstimation(const NumEffectState &state, Player P, King8Info info)
static void setLeaf(const NumEffectState &state, Player P, PieceStand stand, PieceStand &proof_pieces)
static void attack(Move best_move, PieceStand stand, PieceStand &proof_pieces)
static void addMonopolizedPieces(const NumEffectState &state, Player P, PieceStand stand, PieceStand &proof_pieces)
static void addMonopolizedPieces(const SimpleState &state, Player player, const PieceStand max, PieceStand &out)
alt(player) が持っていない種類の持駒を playerが持っていたら out に独占分を加算する.
static const PieceStand leaf(const NumEffectState &state, Player attacker, const PieceStand max)
Definition proofPieces.h:14
static const PieceStand attack(const PieceStand prev, Move move, const PieceStand max)
Definition proofPieces.h:24