HexBoard.hpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006 #ifndef HEXBOARD_H
00007 #define HEXBOARD_H
00008
00009 #include <boost/scoped_ptr.hpp>
00010
00011 #include "ChangeLog.hpp"
00012 #include "VCBuilder.hpp"
00013 #include "Hex.hpp"
00014 #include "ICEngine.hpp"
00015 #include "PatternState.hpp"
00016 #include "VCPattern.hpp"
00017 #include "Groups.hpp"
00018
00019 _BEGIN_BENZENE_NAMESPACE_
00020
00021
00022
00023
00024
00025
00026
00027 class HexBoard
00028 {
00029 public:
00030
00031
00032 HexBoard(int width, int height, const ICEngine& ice,
00033 VCBuilderParam& param);
00034
00035
00036 HexBoard(const HexBoard& other);
00037
00038
00039 ~HexBoard();
00040
00041
00042
00043
00044
00045
00046
00047 bool UseVCs() const;
00048
00049
00050 void SetUseVCs(bool enable);
00051
00052
00053 bool UseICE() const;
00054
00055
00056 void SetUseICE(bool enable);
00057
00058
00059 bool UseDecompositions() const;
00060
00061
00062 void SetUseDecompositions(bool enable);
00063
00064
00065 bool BackupIceInfo() const;
00066
00067
00068 void SetBackupIceInfo(bool enable);
00069
00070
00071
00072
00073
00074
00075 void ComputeAll(HexColor color);
00076
00077
00078
00079
00080 void PlayMove(HexColor color, HexPoint cell);
00081
00082
00083
00084
00085
00086 void PlayStones(HexColor color, const bitset_t& played,
00087 HexColor color_to_move);
00088
00089
00090
00091
00092 void UndoMove();
00093
00094
00095
00096 StoneBoard& GetPosition();
00097
00098 const StoneBoard& GetPosition() const;
00099
00100 const ConstBoard& Const() const;
00101
00102
00103
00104
00105 bitset_t GetDead() const;
00106
00107
00108 const InferiorCells& GetInferiorCells() const;
00109
00110
00111 const ICEngine& ICE() const;
00112
00113 const Groups& GetGroups() const;
00114
00115 Groups& GetGroups();
00116
00117 const PatternState& GetPatternState() const;
00118
00119 PatternState& GetPatternState();
00120
00121
00122 const VCSet& Cons(HexColor color) const;
00123
00124
00125 VCSet& Cons(HexColor color);
00126
00127
00128 VCBuilder& Builder();
00129
00130
00131 const VCBuilder& Builder() const;
00132
00133
00134
00135 int Width() const;
00136
00137 int Height() const;
00138
00139 std::string Write() const;
00140
00141 std::string Write(const bitset_t& bs) const;
00142
00143 private:
00144
00145
00146 struct History
00147 {
00148
00149 StoneBoard board;
00150
00151
00152 Groups groups;
00153
00154
00155 InferiorCells inf;
00156
00157
00158 HexColor to_play;
00159
00160
00161 HexPoint last_played;
00162
00163 History(const StoneBoard& b, const Groups& g, const InferiorCells& i,
00164 HexColor tp, HexPoint lp)
00165 : board(b), groups(g), inf(i), to_play(tp), last_played(lp)
00166 { }
00167 };
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178 StoneBoard m_brd;
00179
00180
00181 const ICEngine* m_ice;
00182
00183 Groups m_groups;
00184
00185 PatternState m_patterns;
00186
00187
00188 VCBuilder m_builder;
00189
00190
00191 boost::scoped_ptr<VCSet> m_cons[BLACK_AND_WHITE];
00192
00193
00194 ChangeLog<VC> m_log[BLACK_AND_WHITE];
00195
00196
00197 std::vector<History> m_history;
00198
00199
00200 InferiorCells m_inf;
00201
00202
00203 bool m_use_vcs;
00204
00205
00206 bool m_use_ice;
00207
00208
00209 bool m_use_decompositions;
00210
00211
00212 bool m_backup_ice_info;
00213
00214
00215
00216
00217
00218
00219
00220
00221 void operator=(const HexBoard& other);
00222
00223 void Initialize();
00224
00225 void ComputeInferiorCells(HexColor color_to_move);
00226
00227 void BuildVCs();
00228
00229 void BuildVCs(const Groups& oldGroups, bitset_t added[BLACK_AND_WHITE],
00230 bool use_changelog);
00231
00232 void MarkChangeLog();
00233
00234 void RevertVCs();
00235
00236 void HandleVCDecomposition(HexColor color_to_move, bool use_changelog);
00237
00238 void AddStones(HexColor color, const bitset_t& played,
00239 HexColor color_to_move, bool use_changelog);
00240
00241 void ClearHistory();
00242
00243 void PushHistory(HexColor color, HexPoint cell);
00244
00245 void PopHistory();
00246 };
00247
00248 inline StoneBoard& HexBoard::GetPosition()
00249 {
00250 return m_brd;
00251 }
00252
00253 inline const StoneBoard& HexBoard::GetPosition() const
00254 {
00255 return m_brd;
00256 }
00257
00258 inline const ConstBoard& HexBoard::Const() const
00259 {
00260 return m_brd.Const();
00261 }
00262
00263 inline bitset_t HexBoard::GetDead() const
00264 {
00265 return m_inf.Dead();
00266 }
00267
00268 inline const InferiorCells& HexBoard::GetInferiorCells() const
00269 {
00270 return m_inf;
00271 }
00272
00273 inline const ICEngine& HexBoard::ICE() const
00274 {
00275 return *m_ice;
00276 }
00277
00278 inline const Groups& HexBoard::GetGroups() const
00279 {
00280 return m_groups;
00281 }
00282
00283 inline Groups& HexBoard::GetGroups()
00284 {
00285 return m_groups;
00286 }
00287
00288 inline const PatternState& HexBoard::GetPatternState() const
00289 {
00290 return m_patterns;
00291 }
00292
00293 inline PatternState& HexBoard::GetPatternState()
00294 {
00295 return m_patterns;
00296 }
00297
00298 inline const VCSet& HexBoard::Cons(HexColor color) const
00299 {
00300 return *m_cons[color].get();
00301 }
00302
00303 inline VCSet& HexBoard::Cons(HexColor color)
00304 {
00305 return *m_cons[color].get();
00306 }
00307
00308 inline VCBuilder& HexBoard::Builder()
00309 {
00310 return m_builder;
00311 }
00312
00313 inline const VCBuilder& HexBoard::Builder() const
00314 {
00315 return m_builder;
00316 }
00317
00318 inline bool HexBoard::UseVCs() const
00319 {
00320 return m_use_vcs;
00321 }
00322
00323 inline void HexBoard::SetUseVCs(bool enable)
00324 {
00325 m_use_vcs = enable;
00326 }
00327
00328 inline bool HexBoard::UseICE() const
00329 {
00330 return m_use_ice;
00331 }
00332
00333 inline void HexBoard::SetUseICE(bool enable)
00334 {
00335 m_use_ice = enable;
00336 }
00337
00338 inline bool HexBoard::UseDecompositions() const
00339 {
00340 return m_use_decompositions;
00341 }
00342
00343 inline void HexBoard::SetUseDecompositions(bool enable)
00344 {
00345 m_use_decompositions = enable;
00346 }
00347
00348 inline bool HexBoard::BackupIceInfo() const
00349 {
00350 return m_backup_ice_info;
00351 }
00352
00353 inline void HexBoard::SetBackupIceInfo(bool enable)
00354 {
00355 m_backup_ice_info = enable;
00356 }
00357
00358 inline int HexBoard::Width() const
00359 {
00360 return m_brd.Width();
00361 }
00362
00363 inline int HexBoard::Height() const
00364 {
00365 return m_brd.Height();
00366 }
00367
00368 inline std::string HexBoard::Write() const
00369 {
00370 return m_brd.Write();
00371 }
00372
00373 inline std::string HexBoard::Write(const bitset_t& bs) const
00374 {
00375 return m_brd.Write(bs);
00376 }
00377
00378
00379
00380 inline std::ostream& operator<<(std::ostream &os, const HexBoard& b)
00381 {
00382 os << b.Write();
00383 return os;
00384 }
00385
00386
00387
00388 _END_BENZENE_NAMESPACE_
00389
00390 #endif // HEXBOARD_H