00001 #ifndef _GENERATE_DROP_MOVES_H
00002 #define _GENERATE_DROP_MOVES_H
00003
00004 #include "osl/player.h"
00005 #include "osl/ptype.h"
00006 #include "osl/position.h"
00007 #include "osl/direction.h"
00008 #include "osl/piece.h"
00009 #include "osl/move_action/concept.h"
00010 #include "osl/container/bitXmask.h"
00011 #include <boost/static_assert.hpp>
00012
00013 namespace osl
00014 {
00015 namespace move_generator
00016 {
00020 template<class State,class Action>
00021 class Drop
00022 {
00023 BOOST_CLASS_REQUIRE(Action,osl::move_action,Concept);
00024 BOOST_STATIC_ASSERT(sizeof(typename State::simple_board_t));
00025
00026 private:
00027 template<Player P,bool hasPawn,bool hasLance,bool hasKnight,bool hasSilver,bool hasGold,bool hasBishop,bool hasRook>
00028 static void generateDropMovesX(const State& state,Action& action,int x);
00029
00030 template<Player P,typename PawnMaskT,bool hasPawn,bool hasLance,bool hasKnight,bool hasSilver,bool hasGold,bool hasBishop,bool hasRook>
00031 static void generateDropMoves(const State& state,Action& action,PawnMaskT pawnMask);
00032
00033 template<Player P,typename PawnMaskT,bool hasPawn,bool hasLance,bool hasKnight,bool hasSilver,bool hasGold,bool hasBishop>
00034 static void generateDropMovesBishop(const State& state,Action& action,PawnMaskT pawnMask){
00035 if(state.template hasPieceOnStand<P,ROOK>())
00036 generateDropMoves<P,PawnMaskT,hasPawn,hasLance,hasKnight,hasSilver,hasGold,hasBishop,true>(state,action,pawnMask);
00037 else
00038 generateDropMoves<P,PawnMaskT,hasPawn,hasLance,hasKnight,hasSilver,hasGold,hasBishop,false>(state,action,pawnMask);
00039 }
00040
00041 template<Player P,typename PawnMaskT,bool hasPawn,bool hasLance,bool hasKnight,bool hasSilver,bool hasGold>
00042 static void generateDropMovesGold(const State& state,Action& action,PawnMaskT pawnMask);
00043
00044 template<Player P,typename PawnMaskT,bool hasPawn,bool hasLance,bool hasKnight,bool hasSilver>
00045 static void generateDropMovesSilver(const State& state,Action& action,PawnMaskT pawnMask){
00046 if(state.template hasPieceOnStand<P,GOLD>())
00047 generateDropMovesGold<P,PawnMaskT,hasPawn,hasLance,hasKnight,hasSilver,true>(state,action,pawnMask);
00048 else
00049 generateDropMovesGold<P,PawnMaskT,hasPawn,hasLance,hasKnight,hasSilver,false>(state,action,pawnMask);
00050 }
00051
00052 template<Player P,typename PawnMaskT,bool hasPawn,bool hasLance,bool hasKnight>
00053 static void generateDropMovesKnight(const State& state,Action& action,PawnMaskT pawnMask){
00054 if(state.template hasPieceOnStand<P,SILVER>())
00055 generateDropMovesSilver<P,PawnMaskT,hasPawn,hasLance,hasKnight,true>(state,action,pawnMask);
00056 else
00057 generateDropMovesSilver<P,PawnMaskT,hasPawn,hasLance,hasKnight,false>(state,action,pawnMask);
00058 }
00059
00060 template<Player P,typename PawnMaskT,bool hasPawn,bool hasLance>
00061 static void generateDropMovesLance(const State& state,Action& action,PawnMaskT pawnMask){
00062 if(state.template hasPieceOnStand<P,KNIGHT>())
00063 generateDropMovesKnight<P,PawnMaskT,hasPawn,hasLance,true>(state,action,pawnMask);
00064 else
00065 generateDropMovesKnight<P,PawnMaskT,hasPawn,hasLance,false>(state,action,pawnMask);
00066 }
00067
00068 template<Player P,typename PawnMaskT,bool hasPawn>
00069 static void generateDropMovesPawn(const State& state,Action& action,PawnMaskT pawnMask){
00070 if(state.template hasPieceOnStand<P,LANCE>())
00071 generateDropMovesLance<P,PawnMaskT,hasPawn,true>(state,action,pawnMask);
00072 else
00073 generateDropMovesLance<P,PawnMaskT,hasPawn,false>(state,action,pawnMask);
00074 }
00075 public:
00076 template<Player P>
00077 static void generateMoves(const State& state,Action& action);
00078 template<Player P>
00079 static void generateMovesWithPawnMask(const State& state,Action& action,BitXmask pawnMask);
00080 };
00081 }
00082 }
00083
00084 #endif
00085
00086
00087
00088