-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathplayer.cc
More file actions
138 lines (121 loc) · 4.4 KB
/
Copy pathplayer.cc
File metadata and controls
138 lines (121 loc) · 4.4 KB
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
#include "player.h"
Player::Player(std::vector<Card*> cards, int id)
: playerScore{0}, id{id}, playerHand{cards} {}
Player::Player(const Player &other)
: playerScore{other.playerScore}, id{other.id},
playerHand{other.playerHand}, discards{other.discards} {}
Player::~Player() {}
std::vector<Card*> Player::getPlayerHand() {
return playerHand;
}
std::vector<Card*> Player::getDiscards() {
return discards;
}
int Player::findIndex(Suit suit, Rank rank) {
for (int i = 0; i < 13; i++) {
if (playerHand[i]->getSuit() == suit && playerHand[i]->getRank() == rank) {
return i;
}
}
return -1;
}
void Player::deal(std::vector<Card*> cards) {
playerHand.clear();
discards.clear();
playerHand = cards;
}
int Player::calculateScore() {
int score = 0;
for (unsigned i = 0; i < discards.size(); i++) {
score += discards[i]->getRank() + 1;
}
playerScore += score;
return score;
}
int Player::getPlayerScore() {
return playerScore;
}
HumanPlayer::HumanPlayer(std::vector<Card*> cards, int id) : Player{cards,id} {}
char HumanPlayer::getPlayerType() {
return 'h';
}
void HumanPlayer::play(Table* table, std::string card) {
Rank rank = seven; // assumes card has valid syntax, and that the specified card is in the players hand
Suit suit = spade; // assumes card has valid syntax, and that the specified card is in the players hand
std::vector<char> suits = { 'C', 'D', 'H', 'S' };
std::vector<char> ranks = { 'A', '2', '3', '4', '5', '6',
'7', '8', '9', 'T', 'J', 'Q', 'K' };
for (unsigned i = 0; i < ranks.size(); i++) {
if (card[0] == ranks[i]) {
rank = static_cast<Rank>(i);
break;
}
}
for (unsigned i = 0; i < suits.size(); i++) {
if (card[1] == suits[i]) {
suit = static_cast<Suit>(i);
break;
}
}
int index = findIndex(suit, rank);
if (table->isLegal(playerHand[index])) {
table->addCard(playerHand[index]);
std::cout << "Player" << id+1 << " plays " << *playerHand[index] << "." << std::endl;
playerHand.erase(playerHand.begin()+index);
} else {
throw std::invalid_argument {"This is not a legal play."};
}
}
void HumanPlayer::discard(Table* table, std::string card) {
Rank rank = seven; // assumes card has valid syntax, and that the specified card is in the players hand
Suit suit = spade; // assumes card has valid syntax, and that the specified card is in the players hand
std::vector<char> suits = { 'C', 'D', 'H', 'S' };
std::vector<char> ranks = { 'A', '2', '3', '4', '5', '6',
'7', '8', '9', 'T', 'J', 'Q', 'K' };
if (table->getLegalPlays().empty()) {
for (unsigned i = 0; i < ranks.size(); i++) {
if (card[0] == ranks[i]) {
rank = static_cast<Rank>(i);
break;
}
}
for (unsigned i = 0; i < suits.size(); i++) {
if (card[1] == suits[i]) {
suit = static_cast<Suit>(i);
break;
}
}
int index = findIndex(suit, rank);
discards.emplace_back(playerHand[index]);
std::cout << "Player" << id+1 << " discards " << *playerHand[index] << "." << std::endl;
playerHand.erase(playerHand.begin()+index);
} else {
throw std::invalid_argument {"You have a legal play. You may not discard."};
}
}
ComputerPlayer::ComputerPlayer(std::vector<Card*> cards, int id) : Player{cards,id} {}
ComputerPlayer::ComputerPlayer(Player & oldPlayer) : Player {oldPlayer} {}
char ComputerPlayer::getPlayerType() {
return 'c';
}
void ComputerPlayer::play(Table* table, std::string card) {
if (table->getLegalPlays().empty()) {
discard(table, card);
} else {
int index = 0;
for (unsigned i = 0; i < playerHand.size(); i++) {
if (playerHand[i] == table->getLegalPlays()[0]) {
index = i;
break;
}
}
table->addCard(table->getLegalPlays()[0]);
std::cout << "Player" << id+1 << " plays " << *table->getLegalPlays()[0] << "." << std::endl;
playerHand.erase(playerHand.begin()+index);
}
}
void ComputerPlayer::discard(Table*, std::string card) {
discards.emplace_back(playerHand[0]);
std::cout << "Player" << id+1 << " discards " << *playerHand[0] << "." << std::endl;
playerHand.erase(playerHand.begin());
}