-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtreenode.h
55 lines (43 loc) · 1.56 KB
/
treenode.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#ifndef __treenode_h__
#define __treenode_h__
#include "board.h"
#include <unordered_map>
#define NEXT_BOARDS ALL_PIECE_PATTERNS // TODO: 減らせるかどうか検討
enum Result {
RESULT_UNKNOWN = 0,
RESULT_WIN,
RESULT_DRAW,
RESULT_LOSE
};
class TreeNode {
protected:
static unsigned int count;
static std::unordered_map<Board, TreeNode*> map; // 重複チェック用のハッシュマップ
unsigned int indexNumber; // 通し番号
int refCount; // 親ノードの数
bool isExpanded; // 子ノードを展開済みかどうか
int nextCount; // 合法手の数
TreeNode *nextNode[NEXT_BOARDS]; // 次のノード
Piece nextPiece[NEXT_BOARDS]; // 駒の置き方
int nextPieceIndex[NEXT_BOARDS]; // 駒の置き方の通し番号
int turnFlag[NEXT_BOARDS]; // 回転フラグ
Result result; // 勝敗 (手番側)
int steps; // 勝ち局面の場合は最短手数、負け局面の場合は最長手数
int totalCount; // 到達回数
int totalCountOrig; // 到達回数 (「待った」の回数も含む)
int winCount; // 勝利回数 (手番側)
int selectCount[NEXT_BOARDS]; // 子ノードを選択した回数
static bool staticEnumNextCallback(Board *orig, Board *b, Piece p, int pindex, bool judge, int tflag, void *args);
bool enumNextCallback(Board *orig, Board *b, Piece p, int pindex, bool judge, int tflag);
void deleteChildNodes(Board *board);
public:
TreeNode();
~TreeNode();
void expand(Board *board);
int select(Board *board);
int selectWhenWin(int offset = 0);
int selectWhenLose();
void rollout(Board *board);
void test();
};
#endif