12 typedef std::bitset<8> bs_t;
33 template<Player P>
inline 45 if(pieceMask.none())
return false;
47 if(pieceMask1.
any())
return true;
49 assert(pieceMask.any());
58 if(dir1==dir)
return true;
59 }
while(pieceMask.any());
65 template<osl::Player P,osl::Direction Dir>
78 return 0x1000000000000ull+(0x100010100ull<<static_cast<int>(Dir));
80 return 0x1000000000000ull+(0x10100ull<<static_cast<int>(Dir));
85 const bool has_enough_effect = hasEnoughEffect<altP>(state,target,pos,pinned,on_board_defense,Dir);
86 if(has_enough_effect){
89 return 0x10100010000ull<<static_cast<int>(Dir);
91 return 0x10000ull<<static_cast<int>(Dir);
94 return 0x10000000000ull<<static_cast<int>(Dir);
98 return 0x10101010001ull<<static_cast<int>(Dir);
100 return 0x10000ull<<static_cast<int>(Dir);
102 return 0x10001000000ull<<static_cast<int>(Dir);
106 template<osl::Player P>
108 #if (defined __GNUC__) && (! defined GPSONE) && (! defined GPSUSIONE) 115 uint64_t canMoveMask=
116 hasEffectMask<P,UR>(state,target,pinned,on_board_defense)+
117 hasEffectMask<P,R>(state,target,pinned,on_board_defense)+
118 hasEffectMask<P,DR>(state,target,pinned,on_board_defense)+
119 hasEffectMask<P,U>(state,target,pinned,on_board_defense)+
120 hasEffectMask<P,D>(state,target,pinned,on_board_defense)+
121 hasEffectMask<P,UL>(state,target,pinned,on_board_defense)+
122 hasEffectMask<P,L>(state,target,pinned,on_board_defense)+
123 hasEffectMask<P,DL>(state,target,pinned,on_board_defense);
124 mask_t longMask=state.longEffectAt(target,P);
125 while(longMask.any()){
127 Piece attacker=state.pieceOf(num);
130 if((canMoveMask&(0x100<<d))!=0){
131 canMoveMask-=((0x100<<d)+0x1000000000000ull);
137 template <osl::Player P>
139 #if (defined __GNUC__) && (! defined GPSONE) && (! defined GPSUSIONE) 145 return make<P>(state,target,state.pin(
alt(P)));
153 return make<BLACK>(state, king);
155 return make<WHITE>(state, king);
164 return make<BLACK>(state, king, pins);
166 return make<WHITE>(state, king, pins);
unsigned int libertyCandidate() const
16-23 bit 目を 0-7bitにshiftして返す
bool isOnBoardByOwner() const
piece がプレイヤーPの持ち物でかつボード上にある駒の場合は true.
GeneralMask< mask_int_t > mask_t
bool hasEffectAt(Square target) const
対象とするマスにあるプレイヤーの利きがあるかどうか.
bool canMoveOn() const
Player Pの駒が,thisの上に移動できるか? PIECE_EMPTY 0x00008000 BLACK_PIECE 0x000XxxYY X>=2...
constexpr Player alt(Player player)
const PtypeO PTYPEO_EDGE __attribute__((unused))
std::ostream & operator<<(std::ostream &, King8Info)
const Piece pieceAt(Square sq) const
const Piece pieceOf(int num) const
Square kingSquare() const
bool isOnBoard() const
盤面上を表すかどうかの判定. 1<=x() && x()<=9 && 1<=y() && y()<=9 Squareの内部表現に依存する. ...
static const King8Info makeWithPin(Player attack, NumEffectState const &state, const PieceMask &pinned)
alt(attack) のking について計算.
static uint64_t hasEffectMask(NumEffectState const &state, Square target, PieceMask pinned, PieceMask on_board_defense)
alt(P)の玉にDirの方向で迫るcanMoveMaskを計算する.
const NumBitmapEffect effectSetAt(Square sq) const
unsigned int dropCandidate() const
0-7 bit 目を返す
unsigned int liberty() const
8-15 bit 目を 0-7bitにshiftして返す
const Square square() const
unsigned int moveCandidate2() const
24-31 bit 目を 0-7bitにshiftして返す
static const King8Info make(NumEffectState const &state, Square king, PieceMask pinned)
const Offset getShortOffset(Offset32 offset32) const
Longの利きの可能性のあるoffsetの場合は, 反復に使う offsetを Shortの利きのoffsetの場合はそれ自身を返す...
const PieceMask & piecesOnBoard(Player p) const
Direction getShort8(Square from, Square to) const
const BoardTable Board_Table