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
8#include "osl/sennichite.h"
9#include <list>
10#include <vector>
11#include <cassert>
12#include <iosfwd>
13namespace 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)
61 if (continuous_check[WHITE].back() >= duration)
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の表現 .
利きを持つ局面
千日手の検出.
const Sennichite isSennichite(const NumEffectState &state, Move move) const
std::unique_ptr< Table > table
int getLastMove(const HashKey &key) const
key の手を最後に登録した指手番号.
const std::pair< Sennichite, int > distanceToSennichite(const HashKey &key) const
int checkCount(Player attack) const
void push(const HashKey &new_key, bool is_check)
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 HashKeyStack & history() const
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
Player
Definition basic_type.h:8
@ WHITE
Definition basic_type.h:10
@ BLACK
Definition basic_type.h:9
osl::RepetitionCounter::list_t list_t