Skip to content

Commit c16982d

Browse files
committed
All Dev cards are now implemented with tests except for Knight. That is
blocked because getNeighboringCorners() does not work and is untested.
1 parent 2223a6d commit c16982d

File tree

7 files changed

+218
-14
lines changed

7 files changed

+218
-14
lines changed

include/GameBoard.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ class GameBoard {
114114

115115
void moveRobber(Coordinate newRobber);
116116
Coordinate getRobber() const;
117+
bool canRobberRob(Player& opponent, Coordinate location);
117118

118119
};
119120

include/Player.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@
1717
#include "Util.h"
1818
#include "GameVisitor.h"
1919

20-
const int WOOD_INDEX = 0;
21-
const int BRICK_INDEX = 1;
20+
// WHEAT, SHEEP, STONE, BRICK, WOOD is the order because it matches the enum in GamePiece.h
21+
const int WHEAT_INDEX = 0;
22+
const int WOOL_INDEX = 1;
2223
const int ORE_INDEX = 2;
23-
const int WHEAT_INDEX = 3;
24-
const int WOOL_INDEX = 4;
24+
const int BRICK_INDEX = 3;
25+
const int WOOD_INDEX = 4;
2526

2627

2728
class DevelopmentCard;
@@ -79,7 +80,7 @@ class Player {
7980

8081
//KNIGHT, VICTORYPOINT, YEAROFPLENTY, MONOPOLY, ROADBUILDING
8182
bool playVictoryCard();
82-
bool playKnight(Coordinate location);
83+
bool playKnight(Coordinate location, Player& opponent);
8384
bool playYearOfPlenty(int resource);
8485
bool playMonopoly(int resource);
8586
bool playRoadBuilding(Coordinate start1, Coordinate end1, Coordinate start2, Coordinate end2);

src/GameBoard.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -422,11 +422,27 @@ bool GameBoard::verifyRoadPlacement(Coordinate start, Coordinate end, Player& Ow
422422
*/
423423
void GameBoard::moveRobber(Coordinate newRobber) {
424424

425-
robber = newRobber;
425+
//Bounds check
426+
if(resources.count(newRobber) > 0)
427+
robber = newRobber;
428+
}
429+
430+
/**
431+
* DOES NOT WORK BECAUSE getNeighboringCorners() does not work
432+
*/
433+
bool GameBoard::canRobberRob(Player& opponent, Coordinate location){
434+
std::cout << GetNeighboringCorners(location).size() << "\n";
426435

427-
//force trade
436+
for(auto corner : GetNeighboringCorners(location)){
437+
std::cout << corner->getOwner().getName() << "derp\n";
438+
if(corner->getOwner() == opponent){
439+
return true;
440+
}
441+
}
442+
return false;
428443
}
429444

445+
430446
/**
431447
* The robber's location on the board.
432448
* @return The robber's location.

src/GameController.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ bool GameController::handleBoardEvent(ScreenCoordinate screenCoord) {
131131
}
132132
break;
133133
case KNIGHT_DEVCARD:
134-
model.getCurrentPlayer().playKnight(coord);
134+
//model.getCurrentPlayer().playKnight(coord, opponent);
135135
break;
136136
case YEAROFPLENTY_DEVCARD:
137137
//@ TODO Need to select a resource

src/Player.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -320,18 +320,25 @@ bool Player::playVictoryCard(){
320320
return false;
321321
}
322322

323-
bool Player::playKnight(Coordinate location){
324-
if(developmentCards[KNIGHT] > 0){
325-
developmentCards[KNIGHT]--;
326-
armySize++;
327-
board.moveRobber(location);
328-
//@ TODO need to steal resources
323+
bool Player::playKnight(Coordinate location, Player& opponent){
324+
if(developmentCards[KNIGHT] > 0 && board.canRobberRob(opponent, location)){
325+
board.moveRobber(location);
326+
int resourceToSteal = opponent.getRandomResource();
327+
if(resourceToSteal >= 0){
328+
addResource(resourceToSteal, 1);
329+
opponent.addResource(resourceToSteal, -1);
330+
}
329331

332+
armySize++;
333+
developmentCards[KNIGHT]--;
330334
return true;
331335
}
332336
return false;
333337
}
334338
bool Player::playYearOfPlenty(int resourceType){
339+
if(resourceType >= 5)
340+
return false;
341+
335342
if(developmentCards[YEAROFPLENTY] > 0){
336343
developmentCards[YEAROFPLENTY]--;
337344
addResource(resourceType, 2);
@@ -340,6 +347,9 @@ bool Player::playYearOfPlenty(int resourceType){
340347
return false;
341348
}
342349
bool Player::playMonopoly(int resourceType){
350+
if (resourceType >= 5)
351+
return false;
352+
343353
if(developmentCards[MONOPOLY] > 0){
344354
developmentCards[MONOPOLY]--;
345355
for(auto& player : board.getPlayers()) {

tests/test_DevelopmentCards.cpp

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,167 @@ TEST(VictoryPointCard){
139139
testVictoryPointCard(test_player, false);
140140
}
141141

142+
void testMonopolyCard(Player& test_player, bool correct_result, int resource_type, int expected_gain){
143+
int prevCard = test_player.getMonopolyCards();int prevReso = -1;
144+
try{
145+
prevReso = test_player.getResource(resource_type);
146+
}catch (std::runtime_error & e){
147+
CHECK(resource_type >= 5);
148+
return;
149+
}
150+
151+
CHECK(test_player.playMonopoly(resource_type) == correct_result);
152+
if(correct_result){
153+
CHECK(prevCard == test_player.getMonopolyCards()+1);
154+
CHECK(prevReso == test_player.getResource(resource_type)-expected_gain);
155+
}else{
156+
CHECK(prevCard == test_player.getMonopolyCards());
157+
CHECK(prevReso == test_player.getResource(resource_type));
158+
}
159+
160+
}
161+
162+
163+
TEST(MonopolyCard){
164+
GameBoard test_board({"tester1", "tester2", "tester3"});
165+
Player& test_player1 = test_board.getPlayer(0);
166+
Player& test_player2 = test_board.getPlayer(1);
167+
Player& test_player3 = test_board.getPlayer(2);
168+
169+
std::unique_ptr<DevelopmentCard> test_card = std::unique_ptr<DevelopmentCard>(new MonopolyCard());
170+
171+
test_player1.addOre(3);
172+
test_player1.addWheat(3);
173+
test_player1.addWool(3);
174+
test_player1.buyCard(test_card);
175+
test_player1.buyCard(test_card);
176+
test_player1.buyCard(test_card);
177+
178+
testMonopolyCard(test_player1, true, ORE_INDEX, 0);
179+
180+
test_player2.addWool(7);
181+
test_player3.addWool(28);
182+
testMonopolyCard(test_player1, true, WOOL_INDEX, 35);
183+
184+
test_player2.addWood(5);
185+
test_player3.addOre(10);
186+
testMonopolyCard(test_player1, false, 300, 0);
187+
testMonopolyCard(test_player1, true, WOOD_INDEX, 5);
188+
189+
testMonopolyCard(test_player1, false, WHEAT_INDEX, 0);
190+
}
191+
192+
193+
void testYearOfPlenty(Player& test_player, bool correct_result, int resource_type){
194+
int prevCard = test_player.getYearOfPlentyCards();
195+
int prevReso = -1;
196+
try{
197+
prevReso = test_player.getResource(resource_type);
198+
}catch (std::runtime_error & e){
199+
CHECK(resource_type >= 5);
200+
return;
201+
}
202+
203+
CHECK(test_player.playYearOfPlenty(resource_type) == correct_result);
204+
if(correct_result){
205+
CHECK(prevCard == test_player.getYearOfPlentyCards()+1);
206+
CHECK(prevReso == test_player.getResource(resource_type)-2);
207+
}else{
208+
CHECK(prevCard == test_player.getYearOfPlentyCards());
209+
CHECK(prevReso == test_player.getResource(resource_type));
210+
}
211+
212+
213+
}
214+
215+
TEST(YearOfPlentyCard){
216+
GameBoard test_board({"tester1"});
217+
Player& test_player = test_board.getPlayer(0);
218+
219+
std::unique_ptr<DevelopmentCard> test_card = std::unique_ptr<YearOfPlentyCard>(new YearOfPlentyCard());
220+
221+
test_player.addOre(2);
222+
test_player.addWheat(2);
223+
test_player.addWool(2);
224+
test_player.buyCard(test_card);
225+
test_player.buyCard(test_card);
226+
227+
testYearOfPlenty(test_player, true, ORE_INDEX);
228+
testYearOfPlenty(test_player, false, 300);
229+
testYearOfPlenty(test_player, true, WOOD_INDEX);
230+
testYearOfPlenty(test_player, false, WOOL_INDEX);
231+
}
232+
233+
234+
int getResourceSum(Player& player){
235+
int sum = 0;
236+
for(int i = 0; i < 5; i++){
237+
sum += player.getResource(i);
238+
}
239+
return sum;
240+
}
241+
242+
void testKnightCard(Player& test_player, bool correct_result, GameBoard& test_board, Coordinate newLocation, Player& opponent, int gain_expected){
243+
Coordinate prevRobber = test_board.getRobber();
244+
int prevArmy = test_player.getArmySize();
245+
int prevCards = test_player.getKnightCards();
246+
int player_prevResourceSum = getResourceSum(test_player);
247+
int opponent_prevResourceSum = getResourceSum(opponent);
248+
249+
std::cout << test_player.getName() << "| NL:(" << newLocation.first << ", " << newLocation.second << ") O:" << opponent.getName() << "\n";
250+
251+
CHECK(test_player.playKnight(newLocation, opponent) == correct_result);
252+
if(correct_result){
253+
CHECK(newLocation == test_board.getRobber());
254+
CHECK(prevArmy+1 == test_player.getArmySize());
255+
CHECK(prevCards-1 == test_player.getKnightCards());
256+
CHECK(player_prevResourceSum+gain_expected == getResourceSum(test_player));
257+
CHECK(opponent_prevResourceSum-gain_expected == getResourceSum(opponent));
258+
}else{
259+
CHECK(prevRobber == test_board.getRobber());
260+
CHECK(prevArmy == test_player.getArmySize());
261+
CHECK(prevCards == test_player.getKnightCards());
262+
CHECK(player_prevResourceSum == getResourceSum(test_player));
263+
CHECK(opponent_prevResourceSum == getResourceSum(opponent));
264+
}
265+
266+
267+
}
268+
269+
TEST(KnightCard){
270+
GameBoard test_board({"tester1", "tester2", "tester3"});
271+
Player& test_player1 = test_board.getPlayer(0);
272+
Player& test_player2 = test_board.getPlayer(1);
273+
Player& test_player3 = test_board.getPlayer(2);
274+
275+
std::unique_ptr<DevelopmentCard> test_card = std::unique_ptr<DevelopmentCard>(new KnightCard());
276+
277+
test_player1.addOre(3);
278+
test_player1.addWheat(3);
279+
test_player1.addWool(3);
280+
test_player1.buyCard(test_card);
281+
test_player1.buyCard(test_card);
282+
test_player1.buyCard(test_card);
283+
284+
test_board.moveRobber(Coordinate(0,1));
285+
286+
testKnightCard(test_player1, false, test_board, Coordinate(0,4), test_player2, 0);
287+
/**DOES NOT WORK BECAUSE getNeighboringCorners() does not work
288+
test_player2.addWood(1);
289+
test_board.PlaceSettlement(Coordinate(0,3), test_player2);
290+
testKnightCard(test_player1, true, test_board, Coordinate(0,4), test_player2, 1);
291+
292+
test_player3.addWood(1);
293+
test_player3.addOre(1);
294+
test_board.PlaceSettlement(Coordinate(0,0), test_player3);
295+
testKnightCard(test_player1, true, test_board, Coordinate(0,1), test_player3, 1);
296+
297+
testKnightCard(test_player1, true, test_board, Coordinate(0,4), test_player2, 0);
298+
**/
299+
300+
testKnightCard(test_player1, false, test_board, Coordinate(0,4), test_player3, 0);
301+
}
302+
142303

143304

144305

tests/test_GameBoard.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,9 @@ TEST(buy_road_good){
259259

260260

261261
test_board.PlaceSettlement(start, test_player);
262+
263+
test_player.addBrick(1);
264+
test_player.addWood(1);
262265
test_board.buyRoad(start, end, test_player);
263266

264267
std::shared_ptr<Road> test_road = test_board.getRoad(start, end);
@@ -354,8 +357,20 @@ TEST(updateLongestRoadPlayer){
354357
CHECK(test_player2.hasLongestRoad() == false);
355358
}
356359

360+
/**
361+
TEST(canRobberRob){
362+
GameBoard test_board({"tester1", "tester2"});
363+
Player& test_player1 = test_board.getPlayer(0);
364+
Player& test_player2 = test_board.getPlayer(1);
357365
358366
367+
CHECK(test_board.canRobberRob(test_player1, Coordinate(0,1)) == false);
368+
369+
test_board.PlaceSettlement(Coordinate(0,0), test_player1);
370+
CHECK(test_board.canRobberRob(test_player1, Coordinate(0,1)) == true);
371+
}
372+
**/
373+
359374

360375

361376

0 commit comments

Comments
 (0)