-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPrivateCardsManager.cpp
98 lines (83 loc) · 3.75 KB
/
PrivateCardsManager.cpp
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
//
// Created by Xuefeng Huang on 2020/1/31.
//
#include "include/ranges/PrivateCardsManager.h"
PrivateCardsManager::PrivateCardsManager() {
}
PrivateCardsManager::PrivateCardsManager(vector<vector<PrivateCards>> private_cards, int player_number,
uint64_t initialboard) {
this->private_cards = private_cards;
this->player_number = player_number;
this->card_player_index = vector<vector<int>>(52 * 52);
for(int i = 0;i < 52 * 52;i ++){
this->card_player_index[i] = vector<int>(this->player_number,-1);
}
// 用一个二维数组记录每个Private Combo的对应index,方便从一方的手牌找对方的同名卡牌的index
for(int player_id = 0;player_id < player_number;player_id ++){
vector<PrivateCards> privateCombos = private_cards[player_id];
for(int i = 0;i < privateCombos.size();i ++){
PrivateCards one_private_combo = privateCombos[i];
this->card_player_index[one_private_combo.hashCode()][player_id] = i;
}
}
this->initialboard = initialboard;
this->setRelativeProbs();
}
vector<PrivateCards>& PrivateCardsManager::getPreflopCards(int player) {
return this->private_cards[player];
}
int PrivateCardsManager::indPlayer2Player(int from_player, int to_player, int index) {
if(index < 0 || index >= this->getPreflopCards(from_player).size()) throw runtime_error("index out of range");
//PrivateCards player_combo = this->getPreflopCards(from_player)[index];
int to_player_index = this->card_player_index[this->private_cards[from_player][index].hashCode()][to_player];
if(to_player_index == -1){
return -1;
}else {
return to_player_index;
}
}
vector<float> PrivateCardsManager::getInitialReachProb(int player, uint64_t initialboard) {
int cards_len = this->private_cards[player].size();
vector<float> probs = vector<float>(cards_len);
for(int i = 0;i < cards_len;i ++){
PrivateCards pc = this->private_cards[player][i];
if(Card::boardsHasIntercept(initialboard,Card::boardInts2long(pc.get_hands()))) {
probs[i] = 0;
}else{
probs[i] = this->private_cards[player][i].weight;
}
}
return probs;
}
void PrivateCardsManager::setRelativeProbs() {
int players = this->private_cards.size();
for(int player_id = 0; player_id < players;player_id ++){
// TODO 这里只考虑了两个玩家的情况
int oppo = 1 - player_id;
float player_prob_sum = 0;
for(int i = 0;i < this->private_cards[player_id].size();i ++) {
float oppo_prob_sum = 0;
PrivateCards* player_card = &this->private_cards[player_id][i];
uint64_t player_long = Card::boardInts2long(player_card->get_hands());
//
if (Card::boardsHasIntercept(player_long,this->initialboard)){
continue;
}
for (auto oppo_card : this->private_cards[oppo]) {
uint64_t oppo_long = Card::boardInts2long(oppo_card.get_hands());
if (Card::boardsHasIntercept(oppo_long,this->initialboard)
|| Card::boardsHasIntercept(oppo_long,player_long)
){
continue;
}
oppo_prob_sum += oppo_card.weight;
}
player_card->relative_prob = oppo_prob_sum * player_card->weight;
player_prob_sum += player_card->relative_prob;
}
for(int i = 0;i < this->private_cards[player_id].size();i ++) {
this->private_cards[player_id][i].relative_prob = this->private_cards[player_id][i].relative_prob / player_prob_sum;
//player_card.relative_prob = player_card.relative_prob / player_prob_sum;
}
}
}