drop.tcc
Go to the documentation of this file.
00001 #ifndef _GENERATE_DROP_MOVES_TCC
00002 #define _GENERATE_DROP_MOVES_TCC
00003 #include "osl/move_generator/drop.h"
00004 #include "osl/move_action/concept.h"
00005 namespace osl 
00006 {
00007   namespace move_generator
00008   {
00009     namespace drop
00010     {
00015       template<Player P,class Action,bool hasPawn,bool hasLance,bool hasKnight,int N>
00016       void 
00017       generateX(const NumEffectState& state,Action& action,int x,Move m1,Move m2,Move m3,Ptype t1,Ptype t2,Ptype t3)
00018       {
00019         assert(hasPawn || hasLance || hasKnight || N>0);
00020         if(P==BLACK){
00021           if(N>0){
00022             Square pos(x,1);
00023             Piece p=state.pieceAt(pos);
00024             if(p.isEmpty()){
00025               if(N==4){
00026                 action.dropMove(pos,ROOK,P);
00027                 action.dropMove(pos,BISHOP,P);
00028                 action.dropMove(pos,GOLD,P);
00029                 action.dropMove(pos,SILVER,P);
00030               }
00031               else{
00032                 if(N>=1) action.dropMove(pos,t1,P,m1.newAddTo(pos));
00033                 if(N>=2) action.dropMove(pos,t2,P,m2.newAddTo(pos));
00034                 if(N>=3) action.dropMove(pos,t3,P,m3.newAddTo(pos));
00035               }
00036             }
00037           }
00038           if(hasPawn || hasLance || N>0){
00039             Square pos(x,2);
00040             Piece p=state.pieceAt(pos);
00041             if(p.isEmpty()){
00042               if(N==4){
00043                 action.dropMove(pos,ROOK,P);
00044                 action.dropMove(pos,BISHOP,P);
00045                 action.dropMove(pos,GOLD,P);
00046                 action.dropMove(pos,SILVER,P);
00047               }
00048               else{
00049                 if(N>=1) action.dropMove(pos,t1,P,m1.newAddTo(pos));
00050                 if(N>=2) action.dropMove(pos,t2,P,m2.newAddTo(pos));
00051                 if(N>=3) action.dropMove(pos,t3,P,m3.newAddTo(pos));
00052               }
00053               if(hasLance)
00054                 action.dropMove(pos,LANCE,P);
00055               if(hasPawn)
00056                 action.dropMove(pos,PAWN,P);
00057             }
00058           }
00059           for(int y=3;y<=9;y++){
00060             Square pos(x,y);
00061             Piece p=state.pieceAt(pos);
00062             if(p.isEmpty()){
00063               if(N==4){
00064                 action.dropMove(pos,ROOK,P);
00065                 action.dropMove(pos,BISHOP,P);
00066                 action.dropMove(pos,GOLD,P);
00067                 action.dropMove(pos,SILVER,P);
00068               }
00069               else{
00070                 if(N>=1) action.dropMove(pos,t1,P,m1.newAddTo(pos));
00071                 if(N>=2) action.dropMove(pos,t2,P,m2.newAddTo(pos));
00072                 if(N>=3) action.dropMove(pos,t3,P,m3.newAddTo(pos));
00073               }
00074               if(hasKnight)
00075                 action.dropMove(pos,KNIGHT,P);
00076               if(hasLance)
00077                 action.dropMove(pos,LANCE,P);
00078               if(hasPawn)
00079                 action.dropMove(pos,PAWN,P);
00080             }
00081           }
00082         }
00083         else{
00084           if(N>0){
00085             Square pos(x,9);
00086             Piece p=state.pieceAt(pos);
00087             if(p.isEmpty()){
00088               if(N==4){
00089                 action.dropMove(pos,ROOK,P);
00090                 action.dropMove(pos,BISHOP,P);
00091                 action.dropMove(pos,GOLD,P);
00092                 action.dropMove(pos,SILVER,P);
00093               }
00094               else{
00095                 if(N>=1) action.dropMove(pos,t1,P,m1.newAddTo(pos));
00096                 if(N>=2) action.dropMove(pos,t2,P,m2.newAddTo(pos));
00097                 if(N>=3) action.dropMove(pos,t3,P,m3.newAddTo(pos));
00098               }
00099             }
00100           }
00101           if(hasPawn || hasLance || N>0){
00102             Square pos(x,8);
00103             Piece p=state.pieceAt(pos);
00104             if(p.isEmpty()){
00105               if(N==4){
00106                 action.dropMove(pos,ROOK,P);
00107                 action.dropMove(pos,BISHOP,P);
00108                 action.dropMove(pos,GOLD,P);
00109                 action.dropMove(pos,SILVER,P);
00110               }
00111               else{
00112                 if(N>=1) action.dropMove(pos,t1,P,m1.newAddTo(pos));
00113                 if(N>=2) action.dropMove(pos,t2,P,m2.newAddTo(pos));
00114                 if(N>=3) action.dropMove(pos,t3,P,m3.newAddTo(pos));
00115               }
00116               if(hasLance)
00117                 action.dropMove(pos,LANCE,P);
00118               if(hasPawn)
00119                 action.dropMove(pos,PAWN,P);
00120             }
00121           }
00122           for(int y=7;y>=1;y--){
00123             Square pos(x,y);
00124             Piece p=state.pieceAt(pos);
00125             if(p.isEmpty()){
00126               if(N==4){
00127                 action.dropMove(pos,ROOK,P);
00128                 action.dropMove(pos,BISHOP,P);
00129                 action.dropMove(pos,GOLD,P);
00130                 action.dropMove(pos,SILVER,P);
00131               }
00132               else{
00133                 if(N>=1) action.dropMove(pos,t1,P,m1.newAddTo(pos));
00134                 if(N>=2) action.dropMove(pos,t2,P,m2.newAddTo(pos));
00135                 if(N>=3) action.dropMove(pos,t3,P,m3.newAddTo(pos));
00136               }
00137               if(hasKnight)
00138                 action.dropMove(pos,KNIGHT,P);
00139               if(hasLance)
00140                 action.dropMove(pos,LANCE,P);
00141               if(hasPawn)
00142                 action.dropMove(pos,PAWN,P);
00143             }
00144           }
00145         }
00146       }
00147 
00148       template<Player P,class Action,bool hasPawn,bool hasLance,bool hasKnight,int N>
00149       void 
00150       generate(const NumEffectState& state,Action& action,Move m1,Move m2,Move m3,Ptype t1,Ptype t2,Ptype t3)
00151       {
00152         if(hasPawn || hasLance || hasKnight || N>0){
00153           if(hasPawn){
00154             if(hasLance || hasKnight || N>0){
00155               for(int x=9;x>0;x--){
00156                 if(state.isPawnMaskSet<P>(x))
00157                   generateX<P,Action,false,hasLance,hasKnight,N>(state,action,x,m1,m2,m3,t1,t2,t3);
00158                 else
00159                   generateX<P,Action,true,hasLance,hasKnight,N>(state,action,x,m1,m2,m3,t1,t2,t3);
00160               }
00161             }
00162             else{
00163               for(int x=9;x>0;x--){
00164                 if(!state.isPawnMaskSet<P>(x))
00165                   generateX<P,Action,true,hasLance,hasKnight,N>(state,action,x,m1,m2,m3,t1,t2,t3);
00166               }
00167             }
00168           }
00169           else{ // pawnなし
00170             for(int x=9;x>0;x--){
00171               generateX<P,Action,false,hasLance,hasKnight,N>(state,action,x,m1,m2,m3,t1,t2,t3);
00172             }
00173           }
00174         }
00175       }
00176 
00177 
00178       template<Player P,class Action,bool hasPawn,bool hasLance,bool hasKnight>
00179       static void checkSilver(const NumEffectState& state,Action& action)
00180       {
00181         if(state.template hasPieceOnStand<SILVER>(P)){
00182           if(state.template hasPieceOnStand<GOLD>(P)){
00183             if(state.template hasPieceOnStand<BISHOP>(P)){
00184               if(state.template hasPieceOnStand<ROOK>(P))
00185                 generate<P,Action,hasPawn,hasLance,hasKnight,4>(
00186                   state,action,
00187                   Move::makeDirect(0),Move::makeDirect(0),Move::makeDirect(0),
00188                   PTYPE_EMPTY,PTYPE_EMPTY,PTYPE_EMPTY);
00189               else
00190                 generate<P,Action,hasPawn,hasLance,hasKnight,3>(
00191                   state,action,
00192                   Move(Square::STAND(),BISHOP,P),
00193                   Move(Square::STAND(),GOLD,P),
00194                   Move(Square::STAND(),SILVER,P),
00195                   BISHOP,GOLD,SILVER);
00196             }
00197             else if(state.template hasPieceOnStand<ROOK>(P))
00198               generate<P,Action,hasPawn,hasLance,hasKnight,3>(
00199                 state,action,
00200                 Move(Square::STAND(),ROOK,P),
00201                 Move(Square::STAND(),GOLD,P),
00202                 Move(Square::STAND(),SILVER,P),
00203                 ROOK,GOLD,SILVER);
00204             else
00205               generate<P,Action,hasPawn,hasLance,hasKnight,2>(
00206                 state,action,
00207                 Move(Square::STAND(),GOLD,P),
00208                 Move(Square::STAND(),SILVER,P),
00209                 Move::makeDirect(0),
00210                 GOLD,SILVER,PTYPE_EMPTY);
00211           } 
00212           else if(state.template hasPieceOnStand<BISHOP>(P)){
00213             if(state.template hasPieceOnStand<ROOK>(P))
00214               generate<P,Action,hasPawn,hasLance,hasKnight,3>(
00215                 state,action,
00216                 Move(Square::STAND(),ROOK,P),
00217                 Move(Square::STAND(),BISHOP,P),
00218                 Move(Square::STAND(),SILVER,P),
00219                 ROOK,BISHOP,SILVER);
00220             else
00221               generate<P,Action,hasPawn,hasLance,hasKnight,2>(
00222                 state,action,
00223                 Move(Square::STAND(),BISHOP,P),
00224                 Move(Square::STAND(),SILVER,P),
00225                 Move::makeDirect(0),
00226                 BISHOP,SILVER,PTYPE_EMPTY);
00227             }
00228           else if(state.template hasPieceOnStand<ROOK>(P))
00229             generate<P,Action,hasPawn,hasLance,hasKnight,2>(
00230               state,action,
00231               Move(Square::STAND(),ROOK,P),
00232               Move(Square::STAND(),SILVER,P),
00233               Move::makeDirect(0),
00234               ROOK,SILVER,PTYPE_EMPTY);
00235           else
00236             generate<P,Action,hasPawn,hasLance,hasKnight,1>(
00237               state,action,
00238               Move(Square::STAND(),SILVER,P),
00239               Move::makeDirect(0),
00240               Move::makeDirect(0),
00241               SILVER,PTYPE_EMPTY,PTYPE_EMPTY);
00242         }
00243         else if(state.template hasPieceOnStand<GOLD>(P)){
00244           if(state.template hasPieceOnStand<BISHOP>(P)){
00245             if(state.template hasPieceOnStand<ROOK>(P))
00246               generate<P,Action,hasPawn,hasLance,hasKnight,3>(
00247                 state,action,
00248                 Move(Square::STAND(),ROOK,P),
00249                 Move(Square::STAND(),BISHOP,P),
00250                 Move(Square::STAND(),GOLD,P),
00251                 ROOK,BISHOP,GOLD);
00252             else
00253               generate<P,Action,hasPawn,hasLance,hasKnight,2>(
00254                 state,action,
00255                 Move(Square::STAND(),BISHOP,P),
00256                 Move(Square::STAND(),GOLD,P),
00257                 Move::makeDirect(0),
00258                 BISHOP,GOLD,PTYPE_EMPTY);
00259           }
00260           else if(state.template hasPieceOnStand<ROOK>(P))
00261             generate<P,Action,hasPawn,hasLance,hasKnight,2>(
00262               state,action,
00263               Move(Square::STAND(),ROOK,P),
00264               Move(Square::STAND(),GOLD,P),
00265               Move::makeDirect(0),
00266               ROOK,GOLD,PTYPE_EMPTY);
00267           else
00268             generate<P,Action,hasPawn,hasLance,hasKnight,1>(
00269               state,action,
00270               Move(Square::STAND(),GOLD,P),
00271               Move::makeDirect(0),
00272               Move::makeDirect(0),
00273               GOLD,PTYPE_EMPTY,PTYPE_EMPTY);
00274         } 
00275         else if(state.template hasPieceOnStand<BISHOP>(P)){
00276           if(state.template hasPieceOnStand<ROOK>(P))
00277             generate<P,Action,hasPawn,hasLance,hasKnight,2>(
00278               state,action,
00279               Move(Square::STAND(),ROOK,P),
00280               Move(Square::STAND(),BISHOP,P),
00281               Move::makeDirect(0),
00282               ROOK,BISHOP,PTYPE_EMPTY);
00283           else
00284             generate<P,Action,hasPawn,hasLance,hasKnight,1>(
00285               state,action,
00286               Move(Square::STAND(),BISHOP,P),
00287               Move::makeDirect(0),
00288               Move::makeDirect(0),
00289               BISHOP,PTYPE_EMPTY,PTYPE_EMPTY);
00290         }
00291         else if(state.template hasPieceOnStand<ROOK>(P))
00292           generate<P,Action,hasPawn,hasLance,hasKnight,1>(
00293             state,action,
00294             Move(Square::STAND(),ROOK,P),
00295             Move::makeDirect(0),
00296             Move::makeDirect(0),
00297             ROOK,PTYPE_EMPTY,PTYPE_EMPTY);
00298         else
00299           generate<P,Action,hasPawn,hasLance,hasKnight,0>(
00300             state,action,
00301             Move::makeDirect(0),
00302             Move::makeDirect(0),
00303             Move::makeDirect(0),
00304             PTYPE_EMPTY,PTYPE_EMPTY,PTYPE_EMPTY);
00305       }
00306 
00307       template<Player P,class Action,bool hasPawn,bool hasLance>
00308       static void checkKnight(const NumEffectState& state,Action& action)
00309       {
00310         if(state.template hasPieceOnStand<KNIGHT>(P))
00311           checkSilver<P,Action,hasPawn,hasLance,true>(state,action);
00312         else
00313           checkSilver<P,Action,hasPawn,hasLance,false>(state,action);
00314       }
00315 
00316       template<Player P,class Action,bool hasPawn>
00317       static void checkLance(const NumEffectState& state,Action& action)
00318       {
00319         if(state.template hasPieceOnStand<LANCE>(P))
00320           checkKnight<P,Action,hasPawn,true>(state,action);
00321         else
00322           checkKnight<P,Action,hasPawn,false>(state,action);
00323       }
00324 
00325     } // namespace drop
00326     using drop::checkLance;
00327 
00328     template<class Action>
00329     template<osl::Player P>
00330     void osl::move_generator::Drop<Action>::
00331     generate(const NumEffectState& state,Action& action)
00332     {
00333       if(state.template hasPieceOnStand<PAWN>(P))
00334         checkLance<P,Action,true>(state,action);
00335       else
00336         checkLance<P,Action,false>(state,action);
00337     }
00338   } // namespace move_generator
00339 } // namespace osl
00340 
00341 #endif /* _GENERATE_DROP_MOVES_TCC */
00342 // ;;; Local Variables:
00343 // ;;; mode:c++
00344 // ;;; c-basic-offset:2
00345 // ;;; End:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines