00001
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
00025
00026
00027 namespace osl
00028 {
00029 namespace ntesuki
00030 {
00031
00032
00033
00034
00035
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 Position& last_to)
00045 {
00046 assert (state.getTurn() == 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 Position& last_to);
00054 template void GetAllDefenseMoves::generate<WHITE>(const NumEffectState& state,
00055 NtesukiMoveList& moves,
00056 const Position& last_to);
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
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 Position& last_to)
00081 {
00082 MoveVector move_candidates;
00083
00084 const Position pos = state.template getKingPosition<P>();
00085 const bool check = state.hasEffectBy(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.getTurn() == 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.getTurn(), state, last_to, store_candidates);
00109
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
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 Position& last_to);
00135 template void GetDefenseMoves::generate<WHITE>(const NumEffectState& state,
00136 NtesukiMoveList& moves,
00137 const Position& last_to);
00138 }
00139 }
00140
00141
00142
00143
00144
00145