14 template<Player P,Ptype Type>
24 direct->push_back(std::make_pair(p.ptypeO(), p.square()));
28 template <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) {
64 template <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);
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) {
110 template <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--)
236 template <osl::Player P>
247 if (from.isPieceStand())
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)
void push_back(const T &e)
int countEffect(Player player, Square target) const
利きの数を数える.
int max(Player p, int v1, int v2)
const NumEffectState * state
static int see(const NumEffectState &state, Move move, const PieceMask &my_pin=PieceMask(), const PieceMask &op_pin=PieceMask(), const PtypeEvalTable *table=0)
move_action::Store store_t
constexpr Player alt(Player player)
void sort()
駒の価値の小さい順に並び替える
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 をもとに取り返し値を計算する
bool hasEffect() const
短い利きがあるか,間がemptyなら長い利きがある
const Piece pieceAt(Square sq) const
const Piece pieceOnBoard(Square sq) const
PtypeO ptypeO() const
移動後のPtype, i.e., 成る手だった場合成った後
const Offset getShortOffsetNotKnight(Offset32 offset32) const
Longの利きの可能性のあるoffsetの場合は, 反復に使う offsetを Knight以外のShortの利きのoffsetの場合はそ...
static int seeInternal(const NumEffectState &state, Move move, const PieceMask &my_pin, const PieceMask &op_pin, const PtypeEvalTable &table)
Offset32Base< 8, 9 > Offset32
Ptype promote(Ptype ptype)
promote可能なptypeに対して,promote後の型を返す promote不可のptypeを与えてはいけない. ...
PtypeO newPtypeO(Player player, Ptype ptype)
const PtypeTable Ptype_Table
void doActionPtype(Piece p)
const Square from() const
const EffectContent getEffect(PtypeO ptypeo, Square from, Square to) const
fromにいるptypeoがtoに利きを持つか?
void doAction(Piece p, Square)
bool isAlmostValidMove(Move move) const
合法手かどうかを簡単に検査する.局面に依存するチェックのみ. ルール上指せない手である可能性がある場合...
Piece pinAttacker(Piece pinned) const
Pのpinされた駒から,そのpinの原因となっている長い利きを持つ駒を得る.
int captureValue(PtypeO ptypeO) const
ownerのptypeOがcaptureされた時の評価値の増減
bool canPromote(Ptype ptype)
ptypeがpromote可能な型かどうかのチェック promote済みの場合はfalseを返す
const PtypeEvalTable Ptype_Eval_Table
static void findEffectPiecesAfterMove(const NumEffectState &state, Move move, PtypeOSquareVector &my_pieces, PtypeOSquareVector &op_pieces)
const Square square() const
PtypeO
Player + Ptype [-15, 15] PtypeO の O は Owner の O.
int diffWithMove(const NumEffectState &, Move move) const
bool pinnedCanMoveTo(Piece p, Square to) const
pinされた駒pがtoに動けるか? pinに関係がなければtoへ動けるという前提
int promoteValue(PtypeO ptypeO) const
ptypeOにpromoteした時の評価値の増減
Piece nextPiece(Square cur, Offset diff) const
diff方向にあるPiece を求める.
static void findAdditionalPieces(const NumEffectState &state, Player attack, Square target, Square direct_attack_from, PtypeOSquareVector &out)
static void findEffectPieces(const NumEffectState &state, Square effect_to, PtypeOSquareVector &my_pieces, PtypeOSquareVector &op_pieces)
PtypeOSquareVector * direct
const BoardTable Board_Table
void forEachEffect(const PieceMask &pieces, Square sq, Action &action) const
PtypeOSquareVector * more