-
Notifications
You must be signed in to change notification settings - Fork 1
/
Deck.cpp
113 lines (97 loc) · 1.94 KB
/
Deck.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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include "pch.h"
#include "Deck.h"
#include "AllHands.h"
#include "BurnAndTurn.h"
#include "Community.h"
Deck::iterator Deck::begin()
{
return cards.begin();
}
Deck::iterator Deck::end()
{
return begin() + size;
}
void Deck::Remove(iterator which)
{
rotate(which, which + 1, end());
--size;
}
void Deck::Remove(int card)
{
auto e = end();
auto iter = find(begin(), e, card);
if (iter != e)
Remove(iter);
}
void Deck::Remove(const HoleCards& hole)
{
Remove(hole.GetCard1());
Remove(hole.GetCard2());
}
void Deck::Remove(const HoleCards& hole, int c1, int c2, int c3, int c4, int c5)
{
Remove(hole);
Remove(c1);
Remove(c2);
Remove(c3);
Remove(c4);
Remove(c5);
}
void Deck::Remove(const BurnAndTurn& cards)
{
for (auto card : cards)
Remove(card);
}
void Deck::Remove(const Community& community)
{
for (auto card : community)
Remove(card);
}
void Deck::RemoveSingleCardLosses(const AllHands& allHands, int bestHand, int c1, int c2, int c3, int c4, int c5)
{
for (auto iter = begin(); iter != end(); )
if (allHands.BeatenByOneCard(bestHand, *iter, c1, c2, c3, c4, c5))
Remove(iter);
else
++iter;
}
vector<HoleCards> Deck::FindTwoCardLosses(const AllHands& allHands, int bestHand, int c1, int c2, int c3, int c4, int c5)
{
vector<HoleCards> losses;
auto end = this->end();
for (auto o1 = begin(); o1 != end; ++o1)
for (auto o2 = o1 + 1; o2 != end; ++o2)
if (allHands.BeatenByTwoCards(bestHand, *o1, *o2, c1, c2, c3, c4, c5))
losses.emplace_back(*o1, *o2);
return losses;
}
void Deck::Add(int card)
{
if (size == DeckSize)
throw runtime_error{ "Full deck." };
cards[size++] = card;
}
int Deck::GetSize() const
{
return size;
}
void Deck::Clear()
{
size = 0;
}
void Deck::NewDeck()
{
for (auto card = 0; card < DeckSize; ++card)
cards[card] = card;
size = DeckSize;
}
void Deck::Shuffle()
{
::shuffle(begin(), end(), random_device{});
}
int Deck::DealCard()
{
auto result = *begin();
Remove(begin());
return result;
}