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 
6 #include "osl/numEffectState.h"
7 #include "osl/bits/king8Info.h"
8 
9 namespace 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 
59 template <osl::Player P>
60 bool
61 #ifdef __GNUC__
62  __attribute__ ((pure))
63 #endif
65 canEscape(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 
95 template <osl::Player P>
96 bool
97 #ifdef __GNUC__
98  __attribute__ ((pure))
99 #endif
101 escape7(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:
bool isOnBoardByOwner() const
piece がプレイヤーPの持ち物でかつボード上にある駒の場合は true.
Definition: basic_type.h:852
bool hasEffectAt(Square target) const
対象とするマスにあるプレイヤーの利きがあるかどうか.
constexpr Player alt(Player player)
Definition: basic_type.h:13
const PtypeO PTYPEO_EDGE __attribute__((unused))
座標の差分
Definition: basic_type.h:429
const Piece pieceAt(Square sq) const
Definition: simpleState.h:167
static const Piece EMPTY()
Definition: basic_type.h:797
const Offset getShortOffsetNotKnight(Offset32 offset32) const
Longの利きの可能性のあるoffsetの場合は, 反復に使う offsetを Knight以外のShortの利きのoffsetの場合はそ...
Definition: boardTable.h:119
Offset32Base< 8, 9 > Offset32
Definition: offset32.h:63
Ptype
駒の種類を4ビットでコード化する
Definition: basic_type.h:83
敵玉の8近傍の状態を表す.
Definition: king8Info.h:28
利きを持つ局面
Piece safeCaptureNotByKing(Square target, Piece king) const
玉の素抜きなしに合法手でtargetに移動可能かを判定
uint64_t Iking8Info(Player king) const
const Square square() const
Definition: basic_type.h:832
Direction
Definition: basic_type.h:310
Player
Definition: basic_type.h:8
static bool escape7(const NumEffectState &state, Square kingSquare, Square to)
王が前以外に移動可能か
const Offset getOffset(Direction dir) const
Definition: boardTable.h:47
static bool isMember(const NumEffectState &state, Ptype ptype, Square from, Square to)
static bool canEscape(const NumEffectState &state, Square kingSquare, Direction dir, Square dropAt)
kingSquare に居る alt(P)の玉が dir 方向に逃げられるか.
bool isPieceStand() const
Definition: basic_type.h:576
bool isEdge() const
onBoardから8近傍のオフセットを足した点がedgeかどうかの判定 そこそこ速くなった.
Definition: basic_type.h:591
const BoardTable Board_Table
Definition: tables.cc:95
Player owner() const
Definition: basic_type.h:963