My Project
repetitionCounter.h
Go to the documentation of this file.
1 /* repetitionCounter.h
2  */
3 #ifndef OSL_REPETITIONCOUNTER_H
4 #define OSL_REPETITIONCOUNTER_H
5 
6 #include "osl/numEffectState.h"
8 #include "osl/sennichite.h"
9 #include <list>
10 #include <vector>
11 #include <cassert>
12 #include <iosfwd>
13 namespace osl
14 {
21  {
22  struct Table;
23  std::unique_ptr<Table> table;
26  int order() const { return hash_history.size(); }
27  public:
28  typedef std::list<int> list_t;
29 
32  explicit RepetitionCounter(const NumEffectState& initial);
34 
35  private:
36  void push(const HashKey& new_key, bool is_check);
37  public:
41  void push(const NumEffectState& state, Move move);
45  void push(const NumEffectState& state);
49  void push(const HashKey& key, const NumEffectState& state);
50  void pop();
51  void clear();
52 
53  const Sennichite isSennichite(const NumEffectState& state, Move move) const;
54  private:
55  const Sennichite isAlmostSennichiteUnsafe(int first_move) const
56  {
57  assert(first_move >= 0);
58  const int duration = (order() - first_move) / 2;
59  if (continuous_check[BLACK].back() >= duration)
60  return Sennichite::BLACK_LOSE();
61  if (continuous_check[WHITE].back() >= duration)
62  return Sennichite::WHITE_LOSE();
63  return Sennichite::DRAW();
64  }
65  public:
69  const Sennichite isAlmostSennichite(const HashKey& key) const
70  {
71  const int first_move = getFirstMove(key);
72  if (first_move < 0)
73  return Sennichite::NORMAL();
74  return isAlmostSennichiteUnsafe(first_move);
75  }
77  const std::pair<Sennichite,int> distanceToSennichite(const HashKey& key) const;
78  unsigned int countRepetition(const HashKey&) const;
79  const list_t getRepetitions(const HashKey&) const;
80  void printMatches(const HashKey& key) const;
85  int getLastMove(const HashKey& key) const;
90  int getFirstMove(const HashKey& key) const;
91  int checkCount(Player attack) const {
92  assert(! continuous_check[attack].empty());
93  return continuous_check[attack].back();
94  }
95  const HashKeyStack& history() const { return hash_history; }
96  bool isConsistent() const;
97 
98  static bool maybeEqual(const RepetitionCounter& l, const RepetitionCounter& r);
99  };
100 
101 }
102 
103 #endif /* OSL_REPETITIONCOUNTER_H */
104 // ;;; Local Variables:
105 // ;;; mode:c++
106 // ;;; c-basic-offset:2
107 // ;;; End:
T & back()
Definition: container.h:88
圧縮していない moveの表現 .
Definition: basic_type.h:1052
利きを持つ局面
千日手の検出.
const Sennichite isSennichite(const NumEffectState &state, Move move) const
std::unique_ptr< Table > table
int getLastMove(const HashKey &key) const
key の手を最後に登録した指手番号.
const HashKeyStack & history() const
const std::pair< Sennichite, int > distanceToSennichite(const HashKey &key) const
int checkCount(Player attack) const
void push(const HashKey &new_key, bool is_check)
std::list< int > list_t
const list_t getRepetitions(const HashKey &) const
unsigned int countRepetition(const HashKey &) const
CArray< std::vector< int >, 2 > continuous_check
const Sennichite isAlmostSennichite(const HashKey &key) const
このまま同形を繰り返したらどの結果になるかを返す
void printMatches(const HashKey &key) const
int getFirstMove(const HashKey &key) const
key の手を最初に登録した指手番号.
static bool maybeEqual(const RepetitionCounter &l, const RepetitionCounter &r)
const Sennichite isAlmostSennichiteUnsafe(int first_move) const
static Sennichite DRAW()
Definition: sennichite.h:22
static Sennichite BLACK_LOSE()
Definition: sennichite.h:23
static Sennichite WHITE_LOSE()
Definition: sennichite.h:24
static Sennichite NORMAL()
Definition: sennichite.h:21
size_t size() const
Definition: hashKeyStack.h:30
Player
Definition: basic_type.h:8
@ WHITE
Definition: basic_type.h:10
@ BLACK
Definition: basic_type.h:9
osl::RepetitionCounter::list_t list_t