-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathai.h
160 lines (113 loc) · 3.63 KB
/
ai.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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#ifndef AI_H
#define AI_H
#include "player.h"
/**
* Ai类
*/
class Ai : public Player {
private:
/**
* 一套牌(包含5张),可计算该套牌的大小,表示为十进制数abcdef。
* 1<=a<=9:用1~9分别表示高牌,一对,两对,三条,顺子,同花,葫芦,四条,同花顺
* 2<=(b-f)<=14:用2~14分别表示牌的点数,从2-10和J-A
*
*/
class CardGroup {
private:
//5张牌,需要点数从大到小排序
PokerHeap pokers;
//牌型 从大到小(皇家同花顺->单牌)为 0->10
int type;
//牌的大小
long long power;
/**
* 为当前牌组计算power
* @return
*/
long long computePower();
long long computeCardPoint();
/**
* 判断5张牌是否为同花
* @return
*/
bool isFlush();
/**
* 判断5张牌是否为顺子
* @return
*/
bool isStraight();
/**
* 判断5张牌为同花和顺子以外的其他具体牌型
* @return
*/
int getOtherType();
//为“四条“牌型修正牌的顺序
void changeCardPositionForFourKind();
//为“葫芦“牌型修正牌的顺序
void changeCardPositionForFullHouse();
//为“三条“牌型修正牌的顺序
void changeCardPositionForThreeKind();
//为“两对“牌型修正牌的顺序
void changeCardPositionForTwoPair();
//为“一对“牌型修正牌的顺序
void changeCardPositionForOnePair();
public:
CardGroup(PokerHeap pokers);
CardGroup();
int getPower();
PokerHeap getPokers();
int getType();
};
/**
* 用于从当前牌中提取最大牌
* @author wangtao
*
*/
class MaxCardComputer {
private:
//自己可用的所有牌
PokerHeap pokers;
CardGroup maxGroup;
/**
* 计算最大的五张牌
*/
void computeMaxCardGroup();
void computeMaxCardGroup_New(Poker poker);
public:
MaxCardComputer(PokerHeap &handCard, PokerHeap &publicCard);
MaxCardComputer(MaxCardComputer oldComputer, Poker poker);
PokerHeap getPokers();
CardGroup getMaxCardGroup();
};
//战胜对手的概率
float winProb;
//判断手牌是否相差小于等于4(有可能组成顺子)
bool isHoldLessThanFour();
//手牌都大于或等于10
bool isHoldBig();
//判断手牌是否同花色
bool isHoldSameColor();
//获取公共牌与手牌组成的对子的value
vector<int> getHoldPubPairValue(PokerHeap &publicPoker);
//获取公共牌中组成对子的值,返回的vector包含的是这些对子的value
vector<int> getPubPairValue(PokerHeap &publicPoker);
//判断手牌是否是大对:AA, KK, QQ, JJ, 1010等
bool isHoldBigPair();
//判断手牌是否是小对:2~9中的一对
bool isHoldSmallPair();
//计算当前牌组成同花最少还差多少张
int computeFlush(PokerHeap &publicPoker);
//计算当前牌组成顺子最少需要多少张牌
int computeStraight(PokerHeap &publicPoker);
public:
Ai(int id);
//收到两张牌之后思考策略
void thinkAfterHold(Table &desk,int bet);
//发出三张公共牌之后思考策略
void thinkAfterFlop(Table &desk,int bet);
//发出一张转牌之后思考策略
void thinkAfterTurn(Table &desk,int bet);
//发出一张河牌之后思考策略
void thinkAfterRiver(Table &desk,int bet);
};
#endif // AI_H