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 
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:
osl::UR
@ UR
Definition: basic_type.h:315
osl::SimpleState::pieceAt
const Piece pieceAt(Square sq) const
Definition: simpleState.h:167
osl::Square
Definition: basic_type.h:532
osl::checkmate::King8Info::liberty
unsigned int liberty() const
8-15 bit 目を 0-7bitにshiftして返す
Definition: king8Info.h:54
osl::Board_Table
const BoardTable Board_Table
Definition: tables.cc:95
osl::R
@ R
Definition: basic_type.h:317
osl::NumEffectState::safeCaptureNotByKing
Piece safeCaptureNotByKing(Square target, Piece king) const
玉の素抜きなしに合法手でtargetに移動可能かを判定
osl::NumEffectState::Iking8Info
uint64_t Iking8Info(Player king) const
Definition: numEffectState.h:78
osl::alt
constexpr Player alt(Player player)
Definition: basic_type.h:13
osl::Offset32
Offset32Base< 8, 9 > Offset32
Definition: offset32.h:63
osl::Piece::EMPTY
static const Piece EMPTY()
Definition: basic_type.h:797
osl::Offset
座標の差分
Definition: basic_type.h:430
osl::Ptype
Ptype
駒の種類を4ビットでコード化する
Definition: basic_type.h:84
osl::move_classifier::PawnDropCheckmate::canEscape
static bool canEscape(const NumEffectState &state, Square kingSquare, Direction dir, Square dropAt)
kingSquare に居る alt(P)の玉が dir 方向に逃げられるか.
Definition: pawnDropCheckmate.h:65
osl::NumEffectState::hasEffectAt
bool hasEffectAt(Square target) const
対象とするマスにあるプレイヤーの利きがあるかどうか.
Definition: numEffectState.h:324
osl::D
@ D
Definition: basic_type.h:319
osl::DirectionPlayerTraits
Definition: directionTraits.h:242
osl::Piece
駒.
Definition: basic_type.h:788
osl::Offset::zero
bool zero() const
Definition: basic_type.h:502
osl::DR
@ DR
Definition: basic_type.h:320
osl::Square::isPieceStand
bool isPieceStand() const
Definition: basic_type.h:576
osl::move_classifier::PawnDropCheckmate
打歩詰の判定.
Definition: pawnDropCheckmate.h:19
osl::PAWN
@ PAWN
Definition: basic_type.h:95
osl::move_classifier::PawnDropCheckmate::isMember
static bool isMember(const NumEffectState &state, Ptype ptype, Square from, Square to)
Definition: pawnDropCheckmate.h:28
osl::Piece::isOnBoardByOwner
bool isOnBoardByOwner() const
piece がプレイヤーPの持ち物でかつボード上にある駒の場合は true.
Definition: basic_type.h:852
osl::L
@ L
Definition: basic_type.h:316
osl::BoardTable::getShortOffsetNotKnight
const Offset getShortOffsetNotKnight(Offset32 offset32) const
Longの利きの可能性のあるoffsetの場合は, 反復に使う offsetを Knight以外のShortの利きのoffsetの場合はそれ自身を返す.
Definition: boardTable.h:119
osl::Piece::owner
Player owner() const
Definition: basic_type.h:963
osl::move_classifier::PawnDropCheckmate::escape7
static bool escape7(const NumEffectState &state, Square kingSquare, Square to)
王が前以外に移動可能か
Definition: pawnDropCheckmate.h:101
osl::NumEffectState
利きを持つ局面
Definition: numEffectState.h:34
osl::BoardTable::getOffset
const Offset getOffset(Direction dir) const
Definition: boardTable.h:47
osl::Direction
Direction
Definition: basic_type.h:310
osl::Square::isEdge
bool isEdge() const
onBoardから8近傍のオフセットを足した点がedgeかどうかの判定 そこそこ速くなった.
Definition: basic_type.h:591
king8Info.h
osl::mobility::__attribute__
long long v2di __attribute__((vector_size(16)))
Definition: kingMobility.h:22
osl::Piece::square
const Square square() const
Definition: basic_type.h:832
osl::DL
@ DL
Definition: basic_type.h:318
osl::Player
Player
Definition: basic_type.h:8
numEffectState.h
osl::UL
@ UL
Definition: basic_type.h:313
osl::checkmate::King8Info
敵玉の8近傍の状態を表す.
Definition: king8Info.h:29
osl
Definition: additionalEffect.h:6