My Project
pawnDropCheckmate.h
Go to the documentation of this file.
1/* pawnDropCheckmate.h
2 */
3#ifndef OSL_MOVE_CLASSIFIER_PAWNDROPCHECKMATE_H
4#define OSL_MOVE_CLASSIFIER_PAWNDROPCHECKMATE_H
5
8
9namespace osl
10{
11 namespace move_classifier
12 {
17 template <Player P>
19 {
23 static bool canEscape(const NumEffectState& state, Square kingSquare,
24 Direction dir, Square dropAt);
26 static bool escape7(const NumEffectState& state,
27 Square kingSquare, Square to);
28 static bool isMember(const NumEffectState& state,
29 Ptype ptype,Square from,Square to)
30 {
31 // 打歩
32 if (! from.isPieceStand())
33 return false;
34 if (ptype != PAWN)
35 return false;
36 const Player Opponent = alt(P);
37 const Piece king = state.template kingPiece<Opponent>();
38 const Square king_position = king.square();
39 // DirectionPlayerTraits?
40 // 玉頭
41 if (king_position != (to + DirectionPlayerTraits<U,P>::offset()))
42 return false;
43 // 玉で取れない
44 if (! state.hasEffectAt(P, to))
45 return false;
46 if (King8Info(state.Iking8Info(Opponent)).liberty() != 0)
47 return false;
48 // 玉以外の駒で取れない
49 if (state.safeCaptureNotByKing<Opponent>(to, king)
50 != Piece::EMPTY())
51 return false;
52 // どこにも逃げられない
53 return escape7(state, king_position, to);
54 }
55 };
56 } // namespace move_classifier
57} // namespace osl
58
59template <osl::Player P>
60bool
61#ifdef __GNUC__
62 __attribute__ ((pure))
63#endif
65canEscape(const NumEffectState& state, Square kingSquare,
66 Direction dir, Square dropAt)
67{
68 const Player Opponent = alt(P);
69 const Square target
70 = kingSquare + Board_Table.getOffset(Opponent, dir);
71 const Piece p = state.pieceAt(target);
72 if (p.isOnBoardByOwner<Opponent>())
73 return false; // 自分の駒がいたら移動不能
74 if (target.isEdge())
75 return false;
76 Piece attacker;
77 if (! state.template hasEffectAt<P>(target, attacker))
78 return true; // 利きがない
79 if (attacker == Piece::EMPTY())
80 return false; // 攻撃側に複数の利き
81 assert(attacker.owner() == P);
82 // drop によりふさがれた利きなら逃げられる
83 // -OU
84 // XXX+FU+HI
85 // の場合のXXXなど.
86 const Offset shortOffset
88 if (shortOffset.zero())
89 return false;
90 const Square attackFrom = attacker.square();
91 return shortOffset
92 == Board_Table.getShortOffsetNotKnight(Offset32(dropAt,attackFrom));
93}
94
95template <osl::Player P>
96bool
97#ifdef __GNUC__
98 __attribute__ ((pure))
99#endif
101escape7(const NumEffectState& state, Square king_position, Square to)
102{
103 // U は歩
104 if (canEscape(state, king_position, UL, to))
105 return false;
106 if (canEscape(state, king_position, UR, to))
107 return false;
108 if (canEscape(state, king_position, L, to))
109 return false;
110 if (canEscape(state, king_position, R, to))
111 return false;
112 if (canEscape(state, king_position, DL, to))
113 return false;
114 if (canEscape(state, king_position, D, to))
115 return false;
116 if (canEscape(state, king_position, DR, to))
117 return false;
118 return true;
119}
120
121
122#endif /* OSL_MOVE_CLASSIFIER_PAWNDROPCHECKMATE_H */
123// ;;; Local Variables:
124// ;;; mode:c++
125// ;;; c-basic-offset:2
126// ;;; End:
const Offset getOffset(Direction dir) const
Definition boardTable.h:47
const Offset getShortOffsetNotKnight(Offset32 offset32) const
Longの利きの可能性のあるoffsetの場合は, 反復に使う offsetを Knight以外のShortの利きのoffsetの場合はそれ自身を返す.
Definition boardTable.h:119
利きを持つ局面
bool hasEffectAt(Square target) const
対象とするマスにあるプレイヤーの利きがあるかどうか.
Piece safeCaptureNotByKing(Square target, Piece king) const
玉の素抜きなしに合法手でtargetに移動可能かを判定
uint64_t Iking8Info(Player king) const
差が uniqになるような座標の差分.
Definition offset32.h:17
座標の差分
Definition basic_type.h:430
bool zero() const
Definition basic_type.h:502
const Square square() const
Definition basic_type.h:832
Player owner() const
Definition basic_type.h:963
bool isOnBoardByOwner() const
piece がプレイヤーPの持ち物でかつボード上にある駒の場合は true.
Definition basic_type.h:852
static const Piece EMPTY()
Definition basic_type.h:797
const Piece pieceAt(Square sq) const
bool isPieceStand() const
Definition basic_type.h:576
bool isEdge() const
onBoardから8近傍のオフセットを足した点がedgeかどうかの判定 そこそこ速くなった.
Definition basic_type.h:591
敵玉の8近傍の状態を表す.
Definition king8Info.h:29
unsigned int liberty() const
8-15 bit 目を 0-7bitにshiftして返す
Definition king8Info.h:54
long long v2di __attribute__((vector_size(16)))
Ptype
駒の種類を4ビットでコード化する
Definition basic_type.h:84
@ PAWN
Definition basic_type.h:95
const BoardTable Board_Table
Definition tables.cc:95
Direction
Definition basic_type.h:310
Player
Definition basic_type.h:8
constexpr Player alt(Player player)
Definition basic_type.h:13
static bool canEscape(const NumEffectState &state, Square kingSquare, Direction dir, Square dropAt)
kingSquare に居る alt(P)の玉が dir 方向に逃げられるか.
static bool escape7(const NumEffectState &state, Square kingSquare, Square to)
王が前以外に移動可能か
static bool isMember(const NumEffectState &state, Ptype ptype, Square from, Square to)