14 template<Player P,Ptype Type>
22FindEffectMore::store(Piece p)
24 direct->push_back(std::make_pair(p.ptypeO(), p.square()));
25 findAdditionalPieces(*state, p.owner(), target, p.square(), *more);
28template <osl::Player P>
35 store_t op_pieces_store(&op_pieces, effect_to);
37 if (op_pieces.
empty())
42 store_t my_pieces_store(&my_pieces, effect_to);
48 FindEffectMore action = { &my_pieces, &my_pieces_more, effect_to, &state };
54 if (op_pieces.
size() <= my_pieces.
size())
56 my_pieces_more.
clear();
58 for (
size_t i=0; i<op_pieces.
size(); ++i) {
59 findAdditionalPieces(state, P, effect_to, op_pieces[i].second, my_pieces_more);
64template <osl::Player P>
74 store_t op_pieces_store(&op_pieces, to);
76 if (op_pieces.
empty())
85 store_t my_pieces_store(&my_pieces, to);
92 findAdditionalPieces(state, move.
player(), to, moved.
square(), my_pieces_more);
94 FindEffectMore action = { &my_pieces, &my_pieces_more, to, &state };
100 if (op_pieces.
size() < my_pieces.
size())
102 my_pieces_more.
clear();
104 for (
size_t i=0; i<op_pieces.
size(); ++i) {
105 findAdditionalPieces(state, P, to, op_pieces[i].second, my_pieces_more);
110template <osl::Player P>
126 bool op_deleted=
false, my_deleted=
false;
127 for (i=0;i<op_pieces.
size();i++,c++)
131 Square from=op_pieces[i].second;
135 assert(p.
owner()==Opponent);
139 assert(attacker.
owner()==P);
141 if(attacker_sq != move_from){
143 for(;j<my_pieces.
size();j++)
if(my_pieces[j].second==attacker_sq)
break;
145 if(j==my_pieces.
size() || op_pieces.
size()<=j+1 ){
146 for(
size_t k=i;k<op_pieces.
size()-1;k++)
147 op_pieces[k]=op_pieces[k+1];
152 std::pair<PtypeO,Square> v=op_pieces[i];
153 for(
size_t k=i;k<=j;k++)
154 op_pieces[k]=op_pieces[k+1];
168 ptypeO = op_pieces[i].first;
171 || op_pieces[i].second.canPromote<Opponent>());
181 if (i>=my_pieces.
size()){
185 Square from=my_pieces[i].second;
188 assert(p.
owner()==P);
193 assert(attacker.
owner()==Opponent);
196 for(;j<op_pieces.
size();j++)
if(op_pieces[j].second==attacker_sq)
break;
198 if(j==op_pieces.
size() || my_pieces.
size()<=j ){
199 for(
size_t k=i;k<my_pieces.
size()-1;k++)
200 my_pieces[k]=my_pieces[k+1];
205 std::pair<PtypeO,Square> v=my_pieces[i];
206 for(
size_t k=i;k<j;k++)
207 my_pieces[k]=my_pieces[k+1];
217 ptypeO=my_pieces[i].first;
220 || my_pieces[i].second.canPromote<P>());
228 for (
int j=i-1;j>=0;j--)
236template <osl::Player P>
249 findEffectPieces<P>(state, to, my_pieces, op_pieces);
254 findEffectPiecesAfterMove<P>(state, move, my_pieces, op_pieces);
256 if (op_pieces.
empty())
258 return val + computeValue<P>(state, move, my_pieces, op_pieces, my_pin, op_pin, table);
268 return seeInternal<BLACK>(state, move, my_pin, op_pin, *table);
270 return -seeInternal<WHITE>(state, move, my_pin, op_pin, *table);
291 if (candidate.
owner() != attack)
const Offset getShortOffsetNotKnight(Offset32 offset32) const
Longの利きの可能性のあるoffsetの場合は, 反復に使う offsetを Knight以外のShortの利きのoffsetの場合はそれ自身を返す.
bool hasEffect() const
短い利きがあるか,間がemptyなら長い利きがある
void push_back(const T &e)
PtypeO ptypeO() const
移動後のPtype, i.e., 成る手だった場合成った後
const Square from() const
bool pinnedCanMoveTo(Piece p, Square to) const
pinされた駒pがtoに動けるか? pinに関係がなければtoへ動けるという前提
void forEachEffect(const PieceMask &pieces, Square sq, Action &action) const
int countEffect(Player player, Square target) const
利きの数を数える.
bool isAlmostValidMove(Move move) const
合法手かどうかを簡単に検査する.局面に依存するチェックのみ. ルール上指せない手である可能性がある場合は,isValidMove を用いる.
Piece pinAttacker(Piece pinned) const
Pのpinされた駒から,そのpinの原因となっている長い利きを持つ駒を得る.
const Square square() const
void sort()
駒の価値の小さい順に並び替える
const EffectContent getEffect(PtypeO ptypeo, Square from, Square to) const
fromにいるptypeoがtoに利きを持つか?
Piece nextPiece(Square cur, Offset diff) const
diff方向にあるPiece を求める.
const Piece pieceOnBoard(Square sq) const
const Piece pieceAt(Square sq) const
bool isPieceStand() const
int captureValue(PtypeO ptypeO) const
ownerのptypeOがcaptureされた時の評価値の増減
int diffWithMove(const NumEffectState &, Move move) const
int promoteValue(PtypeO ptypeO) const
ptypeOにpromoteした時の評価値の増減
const PtypeEvalTable Ptype_Eval_Table
const PtypeTable Ptype_Table
bool canPromote(Ptype ptype)
ptypeがpromote可能な型かどうかのチェック promote済みの場合はfalseを返す
const BoardTable Board_Table
Offset32Base< 8, 9 > Offset32
PtypeO
Player + Ptype [-15, 15] PtypeO の O は Owner の O.
constexpr Player alt(Player player)
PtypeO newPtypeO(Player player, Ptype ptype)
Ptype promote(Ptype ptype)
promote可能なptypeに対して,promote後の型を返す promote不可のptypeを与えてはいけない.
void doAction(Piece p, Square)
PtypeOSquareVector * direct
void doActionPtype(Piece p)
const NumEffectState * state
PtypeOSquareVector * more
static void findEffectPiecesAfterMove(const NumEffectState &state, Move move, PtypeOSquareVector &my_pieces, PtypeOSquareVector &op_pieces)
static int seeInternal(const NumEffectState &state, Move move, const PieceMask &my_pin, const PieceMask &op_pin, const PtypeEvalTable &table)
static void findEffectPieces(const NumEffectState &state, Square effect_to, PtypeOSquareVector &my_pieces, PtypeOSquareVector &op_pieces)
static int see(const NumEffectState &state, Move move, const PieceMask &my_pin=PieceMask(), const PieceMask &op_pin=PieceMask(), const PtypeEvalTable *table=0)
static int computeValue(const NumEffectState &state, Move move, PtypeOSquareVector &my_pieces, PtypeOSquareVector &op_pieces, const PieceMask &my_pin, const PieceMask &op_pin, const PtypeEvalTable &table)
PtypeOSquareVector をもとに取り返し値を計算する
static void findAdditionalPieces(const NumEffectState &state, Player attack, Square target, Square direct_attack_from, PtypeOSquareVector &out)