ntesukiMoveGeneratorDefense.cc
Go to the documentation of this file.
00001 /* ntesukiMoveGenerator.cc
00002  */
00003 #include "osl/ntesuki/ntesukiMoveGenerator.h"
00004 #include "osl/state/numEffectState.h"
00005 #include "osl/effect_util/neighboring8Direct.h"
00006 #include "osl/move_generator/escape.h"
00007 #include "osl/move_classifier/canAttackInNMoves.h"
00008 #include "osl/move_classifier/moveAdaptor.h"
00009 #include "osl/move_classifier/safeMove.h"
00010 #include "osl/move_classifier/check.h"
00011 #include "osl/move_generator/legalMoves.h"
00012 #include "osl/move_generator/addEffect.h"
00013 #include "osl/move_generator/drop.h"
00014 #include "osl/move_generator/addEffect8.h"
00015 #include "osl/move_generator/kingWalk.h"
00016 #include "osl/move_generator/openKingRoad.h"
00017 #include "osl/move_generator/dropAroundKing8.h"
00018 #include "osl/move_generator/captureEffectToAroundKing8.h"
00019 #include "osl/move_generator/addEffect8Defense.h"
00020 #include "osl/move_action/store.h"
00021 #include <iostream>
00022 
00023 /*
00024  * n 手すき探索で用いる move generator.
00025  */
00026 
00027 namespace osl
00028 {
00029   namespace ntesuki
00030   {
00031     /* ----------------------------------------------------------------------
00032      * DEFENSE
00033      * ----------------------------------------------------------------------
00034      */
00035     /* GetAllDefenseMoves
00036      */
00037     GetAllDefenseMoves::GetAllDefenseMoves(bool verbose)
00038       : NtesukiDefenseMoveGenerator(verbose) {}
00039     GetAllDefenseMoves::~GetAllDefenseMoves() {}
00040     template <Player P>
00041     void GetAllDefenseMoves::
00042     generate(const NumEffectState& state,
00043              NtesukiMoveList& moves,
00044              const Square& last_to)
00045     {
00046       assert (state.turn() == P);
00047       MoveVector move_candidates;
00048       LegalMoves::generate(state, move_candidates);
00049       moves = NtesukiMoveList(state, move_candidates);
00050     }
00051     template void GetAllDefenseMoves::generate<BLACK>(const NumEffectState& state,
00052                                                       NtesukiMoveList& moves,
00053                                                       const Square& last_to);
00054     template void GetAllDefenseMoves::generate<WHITE>(const NumEffectState& state,
00055                                                       NtesukiMoveList& moves,
00056                                                       const Square& last_to);
00057 
00058     /* GetDefenseMoves
00059      * - 実装済み
00060      * -- 玉を動かす
00061      * -- 玉のまわり 8近傍に駒を打つ
00062      * -- 玉の逃げ道を空ける     
00063      * -- 玉のまわり8近傍に利きをつけている駒(を取る
00064      * -- 玉のまわり 8近傍に(守りの)利きをつけるによる defense
00065      * -- 直前に動いた駒を取る手
00066      * - 未実装
00067      * -- 玉のまわり 8近傍の駒を取る
00068      * -- 最後に動かした大駒から八近傍へ利きがある場合、
00069      *    その利きの途中のマスで、自分が利きがあるところに駒を打つ
00070      * - 相手からの反撃のうち
00071      * -- 駒を取りつつ王手(特に銀がないときの銀取りのような手)
00072      */
00073     GetDefenseMoves::GetDefenseMoves(bool verbose)
00074       : NtesukiDefenseMoveGenerator(verbose) {}
00075     GetDefenseMoves::~GetDefenseMoves(){}
00076     template <Player P>
00077     void GetDefenseMoves::
00078     generate(const NumEffectState& state,
00079              NtesukiMoveList& moves,
00080              const Square& last_to)
00081     {
00082       MoveVector move_candidates;
00083 
00084       const Square pos = state.template kingSquare<P>();
00085       const bool check = state.hasEffectAt(PlayerTraits<P>::opponent, pos);
00086 
00087       if (check)
00088       {
00089         GenerateEscapeKing::generate(state, move_candidates);
00090         moves = NtesukiMoveList(state, move_candidates);
00091         return;
00092       }
00093 
00094       typedef move_action::Store action_t;
00095       assert (state.turn() == P);
00096 
00097       move_action::Store store_candidates(move_candidates);
00098 
00099       move_generator::KingWalk<P>::
00100 	generate(static_cast<const SimpleState &>(state),
00101                  store_candidates);
00102       move_generator::OpenKingRoad<P>::
00103 	generate(static_cast<const SimpleState &>(state),
00104                  store_candidates);
00105       move_generator::CaptureEffectToAroundKing8<P>::
00106 	generate(state, store_candidates);
00107       move_generator::GenerateCapture::
00108 	generate(state.turn(), state, last_to, store_candidates);
00109       //these are non drop moves that could be 'non safe moves'
00110       MoveVector move_safe;
00111       using namespace osl::move_classifier;
00112       for (unsigned int i = 0; i < move_candidates.size(); ++i)
00113       {
00114         const Move m = move_candidates[i];
00115 
00116         if (PlayerMoveAdaptor<SafeMove>::isMember(state, m))
00117         {
00118           move_safe.push_back(m);
00119         }
00120       }
00121 
00122       move_action::Store store_safe(move_safe);
00123       move_generator::AddEffect8Defense<P>::
00124 	generate(state, store_safe);
00125       //drop moves that are always safe
00126       move_generator::DropAroundKing8<P>::
00127 	generate(static_cast<const SimpleState &>(state),
00128                  store_safe);
00129       move_safe.unique();
00130       moves = NtesukiMoveList(state, move_safe);
00131     }
00132     template void GetDefenseMoves::generate<BLACK>(const NumEffectState& state,
00133                                                    NtesukiMoveList& moves,
00134                                                    const Square& last_to);
00135     template void GetDefenseMoves::generate<WHITE>(const NumEffectState& state,
00136                                                    NtesukiMoveList& moves,
00137                                                    const Square& last_to);
00138   }//ntesuki
00139 }//osl
00140 
00141 
00142 // ;;; Local Variables:
00143 // ;;; mode:c++
00144 // ;;; c-basic-offset:2
00145 // ;;; End:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines