All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
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 
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 = PlayerTraits<P>::opponent;
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 (EffectUtil::template safeCaptureNotByKing<Opponent>
50  (state, to, king)
51  != Piece::EMPTY())
52  return false;
53  // どこにも逃げられない
54  return escape7(state, king_position, to);
55  }
56  };
57  } // namespace move_classifier
58 } // namespace osl
59 
60 template <osl::Player P>
61 bool
62 #ifdef __GNUC__
63  __attribute__ ((pure))
64 #endif
66 canEscape(const NumEffectState& state, Square kingSquare,
67  Direction dir, Square dropAt)
68 {
69  const Player Opponent = PlayerTraits<P>::opponent;
70  const Square target
71  = kingSquare + Board_Table.getOffset(Opponent, dir);
72  const Piece p = state.pieceAt(target);
73  if (p.isOnBoardByOwner<Opponent>())
74  return false; // 自分の駒がいたら移動不能
75  if (target.isEdge())
76  return false;
77  Piece attacker;
78  if (! state.template hasEffectAt<P>(target, attacker))
79  return true; // 利きがない
80  if (attacker == Piece::EMPTY())
81  return false; // 攻撃側に複数の利き
82  assert(attacker.owner() == P);
83  // drop によりふさがれた利きなら逃げられる
84  // -OU
85  // XXX+FU+HI
86  // の場合のXXXなど.
87  const Offset shortOffset
89  if (shortOffset.zero())
90  return false;
91  const Square attackFrom = attacker.square();
92  return shortOffset
93  == Board_Table.getShortOffsetNotKnight(Offset32(dropAt,attackFrom));
94 }
95 
96 template <osl::Player P>
97 bool
98 #ifdef __GNUC__
99  __attribute__ ((pure))
100 #endif
102 escape7(const NumEffectState& state, Square king_position, Square to)
103 {
104  // U は歩
105  if (canEscape(state, king_position, UL, to))
106  return false;
107  if (canEscape(state, king_position, UR, to))
108  return false;
109  if (canEscape(state, king_position, L, to))
110  return false;
111  if (canEscape(state, king_position, R, to))
112  return false;
113  if (canEscape(state, king_position, DL, to))
114  return false;
115  if (canEscape(state, king_position, D, to))
116  return false;
117  if (canEscape(state, king_position, DR, to))
118  return false;
119  return true;
120 }
121 
122 
123 #endif /* OSL_MOVE_CLASSIFIER_PAWNDROPCHECKMATE_H */
124 // ;;; Local Variables:
125 // ;;; mode:c++
126 // ;;; c-basic-offset:2
127 // ;;; End: