12 typedef std::bitset<8> bs_t;
33template<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());
65template<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);
106template<osl::Player P>
108#if (defined __GNUC__) && (! defined GPSONE) && (! defined GPSUSIONE)
109__attribute__ ((noinline))
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);
137template <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
bool hasEffectAt(Square target) const
対象とするマスにあるプレイヤーの利きがあるかどうか.
const PieceMask pin(Player king) const
const mask_t longEffectAt(Square target) const
const PieceMask & piecesOnBoard(Player p) 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)
const BoardTable Board_Table
const PtypeO PTYPEO_EDGE __attribute__((unused))
constexpr Player alt(Player player)