説明を見る。00001
00002
00003 #ifndef OSL_MOVE_CLASSIFIER_PAWNDROPCHECKMATE_H
00004 #define OSL_MOVE_CLASSIFIER_PAWNDROPCHECKMATE_H
00005
00006 #include "osl/numEffectState.h"
00007 #include "osl/bits/king8Info.h"
00008
00009 namespace osl
00010 {
00011 namespace move_classifier
00012 {
00017 template <Player P>
00018 struct PawnDropCheckmate
00019 {
00023 static bool canEscape(const NumEffectState& state, Square kingSquare,
00024 Direction dir, Square dropAt);
00026 static bool escape7(const NumEffectState& state,
00027 Square kingSquare, Square to);
00028 static bool isMember(const NumEffectState& state,
00029 Ptype ptype,Square from,Square to)
00030 {
00031
00032 if (! from.isPieceStand())
00033 return false;
00034 if (ptype != PAWN)
00035 return false;
00036 const Player Opponent = alt(P);
00037 const Piece king = state.template kingPiece<Opponent>();
00038 const Square king_position = king.square();
00039
00040
00041 if (king_position != (to + DirectionPlayerTraits<U,P>::offset()))
00042 return false;
00043
00044 if (! state.hasEffectAt(P, to))
00045 return false;
00046 if (King8Info(state.Iking8Info(Opponent)).liberty() != 0)
00047 return false;
00048
00049 if (state.safeCaptureNotByKing<Opponent>(to, king)
00050 != Piece::EMPTY())
00051 return false;
00052
00053 return escape7(state, king_position, to);
00054 }
00055 };
00056 }
00057 }
00058
00059 template <osl::Player P>
00060 bool
00061 #ifdef __GNUC__
00062 __attribute__ ((pure))
00063 #endif
00064 osl::move_classifier::PawnDropCheckmate<P>::
00065 canEscape(const NumEffectState& state, Square kingSquare,
00066 Direction dir, Square dropAt)
00067 {
00068 const Player Opponent = alt(P);
00069 const Square target
00070 = kingSquare + Board_Table.getOffset(Opponent, dir);
00071 const Piece p = state.pieceAt(target);
00072 if (p.isOnBoardByOwner<Opponent>())
00073 return false;
00074 if (target.isEdge())
00075 return false;
00076 Piece attacker;
00077 if (! state.template hasEffectAt<P>(target, attacker))
00078 return true;
00079 if (attacker == Piece::EMPTY())
00080 return false;
00081 assert(attacker.owner() == P);
00082
00083
00084
00085
00086 const Offset shortOffset
00087 = Board_Table.getShortOffsetNotKnight(Offset32(target,dropAt));
00088 if (shortOffset.zero())
00089 return false;
00090 const Square attackFrom = attacker.square();
00091 return shortOffset
00092 == Board_Table.getShortOffsetNotKnight(Offset32(dropAt,attackFrom));
00093 }
00094
00095 template <osl::Player P>
00096 bool
00097 #ifdef __GNUC__
00098 __attribute__ ((pure))
00099 #endif
00100 osl::move_classifier::PawnDropCheckmate<P>::
00101 escape7(const NumEffectState& state, Square king_position, Square to)
00102 {
00103
00104 if (canEscape(state, king_position, UL, to))
00105 return false;
00106 if (canEscape(state, king_position, UR, to))
00107 return false;
00108 if (canEscape(state, king_position, L, to))
00109 return false;
00110 if (canEscape(state, king_position, R, to))
00111 return false;
00112 if (canEscape(state, king_position, DL, to))
00113 return false;
00114 if (canEscape(state, king_position, D, to))
00115 return false;
00116 if (canEscape(state, king_position, DR, to))
00117 return false;
00118 return true;
00119 }
00120
00121
00122 #endif
00123
00124
00125
00126