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);
125 while(longMask.any()){
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);
const Offset getShortOffset(Offset32 offset32) const
Longの利きの可能性のあるoffsetの場合は, 反復に使う offsetを Shortの利きのoffsetの場合はそれ自身を返す.
Direction getShort8(Square from, Square to) const
const NumBitmapEffect effectSetAt(Square sq) const
const PieceMask & piecesOnBoard(Player p) const
bool hasEffectAt(Square target) const
対象とするマスにあるプレイヤーの利きがあるかどうか.
const PieceMask pin(Player king) const
const mask_t longEffectAt(Square target) const
const Square square() const
bool canMoveOn() const
Player Pの駒が,thisの上に移動できるか? PIECE_EMPTY 0x00008000 BLACK_PIECE 0x000XxxYY X>=2, YY>0 PIECE_EDGE 0xfff1...
bool isOnBoardByOwner() const
piece がプレイヤーPの持ち物でかつボード上にある駒の場合は true.
const Piece pieceOf(int num) const
Square kingSquare() const
const Piece pieceAt(Square sq) const
bool isOnBoard() const
盤面上を表すかどうかの判定. 1<=x() && x()<=9 && 1<=y() && y()<=9 Squareの内部表現に依存する.
unsigned int libertyCandidate() const
16-23 bit 目を 0-7bitにshiftして返す
unsigned int liberty() const
8-15 bit 目を 0-7bitにshiftして返す
unsigned int moveCandidate2() const
24-31 bit 目を 0-7bitにshiftして返す
static const King8Info makeWithPin(Player attack, NumEffectState const &state, const PieceMask &pinned)
alt(attack) のking について計算.
unsigned int dropCandidate() const
0-7 bit 目を返す
static const King8Info make(NumEffectState const &state, Square king, PieceMask pinned)
static uint64_t hasEffectMask(NumEffectState const &state, Square target, PieceMask pinned, PieceMask on_board_defense)
alt(P)の玉にDirの方向で迫るcanMoveMaskを計算する.
std::ostream & operator<<(std::ostream &, King8Info)
GeneralMask< mask_int_t > mask_t
long long v2di __attribute__((vector_size(16)))
const BoardTable Board_Table
const PtypeO PTYPEO_EDGE __attribute__((unused))
constexpr Player alt(Player player)