00001 #include "osl/move_classifier/kingOpenMove.h"
00002 #include "osl/state/simpleState.h"
00003
00004 template <osl::Player P>
00005 template <bool hasException>
00006 bool osl::move_classifier::KingOpenMove<P>::
00007 isMember(const SimpleState& state, Ptype, Position from, Position to,
00008 Position exceptFor)
00009 {
00010 assert(! from.isPieceStand());
00011 Position king_position=state.template getKingPosition<P>();
00012 if (king_position.isPieceStand())
00013 return false;
00017 assert(king_position != from);
00021 Offset offset=Board_Table.getShortOffsetNotKnight(Offset32(king_position,from));
00026 if(offset.zero() ||
00027 offset==Board_Table.getShortOffsetNotKnight(Offset32(king_position,to)))
00028 return false;
00029 if(!state.isEmptyBetween(from,king_position,offset,true)) return false;
00030 Position pos=from;
00031 Piece p;
00032 for(pos-=offset;;pos-=offset){
00033
00034 if (! ((hasException && (pos == exceptFor))
00035 || (p=state.getPieceAt(pos), p.isEmpty())))
00036 break;
00037 assert(pos.isOnBoard());
00038 }
00043 if (! p.isOnBoardByOwner<PlayerTraits<P>::opponent>())
00044 return false;
00045 return Ptype_Table.getEffect(p.ptypeO(),pos,king_position).hasEffect();
00046 }
00047 template <osl::Player P>
00048 bool osl::move_classifier::KingOpenMove<P>::
00049 isMember(const SimpleState& state, Ptype ptype,Position from,Position to)
00050 {
00051 return isMember<false>(state, ptype, from, to, Position::STAND());
00052 }
00053
00054 template <osl::Player P>
00055 bool osl::move_classifier::KingOpenMove<P>::
00056 isMember(const SimpleState& state, Ptype ptype,Position from,
00057 Position to, Position exceptFor)
00058 {
00059 return isMember<true>(state, ptype, from, to, exceptFor);
00060 }
00061 namespace osl
00062 {
00063
00064 template struct move_classifier::KingOpenMove<BLACK>;
00065 template struct move_classifier::KingOpenMove<WHITE>;
00066 }
00067
00068
00069
00070
00071