1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
#include "osl/move_classifier/kingOpenMove.h"
#include "osl/state/numEffectState.h"
template <osl::Player P>
template <bool hasException>
bool osl::move_classifier::KingOpenMove<P>::
isMemberMain(const NumEffectState& state, Ptype, Square from, Square to,
Square exceptFor)
{
assert(! from.isPieceStand());
Square king_position=state.template kingSquare<P>();
if (king_position.isPieceStand())
return false;
/**
* 守っている玉が動く状況では呼ばない
*/
assert(king_position != from);
/**
* openになってしまうかどうかのチェック
*/
Offset offset=Board_Table.getShortOffsetNotKnight(Offset32(king_position,from));
/**
* 移動元が王の8方向でないか
* openにならない
*/
if(offset.zero() ||
offset==Board_Table.getShortOffsetNotKnight(Offset32(king_position,to)))
return false;
if(!state.isEmptyBetween(from,king_position,offset,true)) return false;
Square pos=from;
Piece p;
for(pos-=offset;;pos-=offset){
// TODO: exceptFor を毎回チェックする必要があるのはoffset方向の時だけ
if (! ((hasException && (pos == exceptFor))
|| (p=state.pieceAt(pos), p.isEmpty())))
break;
assert(pos.isOnBoard());
}
/**
* そのptypeoがそのoffsetを動きとして持つか
* 注: 持つ => safe でない => false を返す
*/
if (! p.isOnBoardByOwner<PlayerTraits<P>::opponent>())
return false;
return Ptype_Table.getEffect(p.ptypeO(),pos,king_position).hasEffect();
}
namespace osl
{
// explicit template instantiation
template struct move_classifier::KingOpenMove<BLACK>;
template struct move_classifier::KingOpenMove<WHITE>;
template bool move_classifier::KingOpenMove<BLACK>::isMemberMain<true>(const NumEffectState&, Ptype,Square,Square,Square);
template bool move_classifier::KingOpenMove<BLACK>::isMemberMain<false>(const NumEffectState&, Ptype,Square,Square,Square);
template bool move_classifier::KingOpenMove<WHITE>::isMemberMain<true>(const NumEffectState&, Ptype,Square,Square,Square);
template bool move_classifier::KingOpenMove<WHITE>::isMemberMain<false>(const NumEffectState&, Ptype,Square,Square,Square);
}
// ;;; Local Variables:
// ;;; mode:c++
// ;;; c-basic-offset:2
// ;;; End:
|