00001
00002
00003 #include "osl/checkmate/king8Info.h"
00004 #include "osl/effect_util/additionalEffect.h"
00005 #include "osl/effect_util/pin.h"
00006 #include <bitset>
00007 #include <iostream>
00008
00009 std::ostream& osl::checkmate::operator<<(std::ostream& os, King8Info info)
00010 {
00011 typedef std::bitset<8> bs_t;
00012 os << bs_t(info.moveCandidate()) << " "
00013 << bs_t(info.libertyCandidate()) << " "
00014 << bs_t(info.liberty()) << " "
00015 << bs_t(info.dropCandidate());
00016 return os;
00017 }
00018
00019 namespace osl
00020 {
00021 namespace
00022 {
00030 template<Player P>
00031 bool hasEnoughEffect(NumEffectState const& state,Position target,Position pos,PieceMask pinned)
00032 {
00033 assert(state.getKingPosition(P)==target);
00034 assert(pos.isOnBoard());
00035 PieceMask pieceMask=state.getEffect(pos)&state.getOnBoardMask(P);
00036 pieceMask.reset(KingTraits<P>::index);
00037 if(pieceMask.none()) return false;
00038 PieceMask pieceMask1=pieceMask&~pinned;
00039 if(pieceMask1.any()) return true;
00040 PieceMask pieceMask2=pieceMask&pinned;
00041 while(pieceMask2.any()){
00042 int num=pieceMask2.takeOneBit();
00043 Piece p=state.getPieceOf(num);
00044 assert(p.isOnBoardByOwner(P));
00045 Position pos1=p.position();
00046 if(Board_Table.getShortOffset(Offset32(pos1,target))==
00047 Board_Table.getShortOffset(Offset32(pos,target))) return true;
00048 }
00049 return false;
00050 }
00051 }
00052 }
00053
00054 template<osl::Player P,osl::Direction Dir>
00055 unsigned int osl::checkmate::
00056 King8Info::hasEffectMask(NumEffectState const& state,Position target,PieceMask pinned)
00057 {
00058 const Player altP=PlayerTraits<P>::opponent;
00059 Position pos=target-DirectionPlayerTraits<Dir,P>::offset();
00060 Piece p=state.getPieceAt(pos);
00061 if(p.canMoveOn<altP>()){
00062 if(!state.hasEffectBy(P,pos))
00063 return 0x10100u<<static_cast<int>(Dir);
00064 else if(p.isEmpty() &&
00065 !hasEnoughEffect<altP>(state,target,pos,pinned)){
00066
00067 if(state.countEffect(P,pos)>=2 ||
00068 effect_util::AdditionalEffect::hasEffect(state,pos,P))
00069 return 0x1010001u<<static_cast<int>(Dir);
00070 else
00071 return 0x10001u<<static_cast<int>(Dir);
00072 }
00073 else{
00074 return 0x10000u<<static_cast<int>(Dir);
00075 }
00076 }
00077 else if(!p.isEdge()){
00078 if(hasEnoughEffect<altP>(state,target,pos,pinned)) return 0;
00079 if(state.countEffect(P,pos)>=2 ||
00080 effect_util::AdditionalEffect::hasEffect(state,pos,P))
00081 return 0x1000000u<<static_cast<int>(Dir);
00082 else
00083 return 0;
00084 }
00085 return 0u;
00086 }
00087
00088 template<osl::Player P>
00089 const osl::checkmate::King8Info
00090 #ifdef __GNUC__
00091 __attribute__ ((noinline))
00092 #endif
00093 osl::checkmate::King8Info::make(NumEffectState const& state,Position target,PieceMask pinned)
00094 {
00095 unsigned int canMoveMask=hasEffectMask<P,UR>(state,target,pinned);
00096 canMoveMask|=hasEffectMask<P,R>(state,target,pinned);
00097 canMoveMask|=hasEffectMask<P,DR>(state,target,pinned);
00098 canMoveMask|=hasEffectMask<P,U>(state,target,pinned);
00099 canMoveMask|=hasEffectMask<P,D>(state,target,pinned);
00100 canMoveMask|=hasEffectMask<P,UL>(state,target,pinned);
00101 canMoveMask|=hasEffectMask<P,L>(state,target,pinned);
00102 canMoveMask|=hasEffectMask<P,DL>(state,target,pinned);
00103 return King8Info(canMoveMask);
00104 }
00105
00106 template <osl::Player P>
00107 const osl::checkmate::King8Info
00108 #ifdef __GNUC__
00109 __attribute__ ((noinline))
00110 #endif
00111 osl::checkmate::
00112 King8Info::make(NumEffectState const& state, Position target)
00113 {
00114 const Player altP=PlayerTraits<P>::opponent;
00115 PieceMask pins = effect_util::Pin::make(state,target,altP);
00116 return make<P>(state,target,pins);
00117 }
00118
00119 const osl::checkmate::King8Info osl::checkmate::
00120 King8Info::make(Player attack, NumEffectState const& state)
00121 {
00122 const Position king=state.getKingPosition(alt(attack));
00123 if (attack == BLACK)
00124 return make<BLACK>(state, king);
00125 else
00126 return make<WHITE>(state, king);
00127 }
00128
00129 const osl::checkmate::King8Info osl::checkmate::
00130 King8Info::makeWithPin(Player attack, NumEffectState const& state,
00131 const PieceMask& pins)
00132 {
00133 const Position king=state.getKingPosition(alt(attack));
00134 if (attack == BLACK)
00135 return make<BLACK>(state, king, pins);
00136 else
00137 return make<WHITE>(state, king, pins);
00138 }
00139
00140
00141
00142
00143
00144
00145
00146