Skip to content

Commit bc90bf5

Browse files
committed
Merge branch 'master' into serialization
Conflicts: include/GameBoard.h tests/test_GameBoard.cpp
2 parents aff7266 + 4fd81e5 commit bc90bf5

File tree

3 files changed

+224
-20
lines changed

3 files changed

+224
-20
lines changed

include/GameBoard.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,13 @@ class GameBoard {
2222
private:
2323
std::map<Coordinate, std::unique_ptr<GamePiece>> corners;
2424
std::map<Coordinate, std::unique_ptr<GamePiece>> resources;
25+
2526
std::vector<std::unique_ptr<Road>> roads;
2627
std::vector<std::unique_ptr<Player>> players;
2728

28-
void addResource(int x, int y, resourceType res, int val);
29+
void addResource(int x, int y, resourceType res, int val);
30+
bool checkRolls(int* rolls);
31+
2932

3033
public:
3134
GameBoard(std::vector<std::unique_ptr<Player>>&& players);
@@ -47,6 +50,8 @@ class GameBoard {
4750
void accept(GameVisitor& visitor);
4851

4952
bool operator==(const GameBoard& other) const;
53+
54+
bool testRollChecking(int* rolls);
5055
};
5156

5257
#endif

src/GameBoard.cpp

Lines changed: 190 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <ctime>
66
#include <algorithm>
77
#include <iostream>
8+
#include <stdexcept>
89

910
#include "GameVisitor.h"
1011
#include "Serialization.h"
@@ -103,7 +104,8 @@ std::vector<Settlement*> GameBoard::GetNeighboringSettlements(Coordinate locatio
103104
}
104105

105106
/*
106-
* Initialize board with a set of resources. Currently only the standard configuration (no custom shapes or expansion packs) is implemented.
107+
* Initialize board with a set of resources.
108+
* Currently only the standard configuration (no custom shapes or expansion packs) is implemented.
107109
* Board tiles and roll numbers are randomized.
108110
*/
109111

@@ -114,25 +116,28 @@ void GameBoard::init_resources()
114116
resourceType resources[] = {BRICK, BRICK, BRICK, STONE, STONE, STONE, WHEAT, WHEAT, WHEAT, WHEAT, WOOD, WOOD, WOOD, WOOD, SHEEP, SHEEP, SHEEP, SHEEP, DESERT};
115117
random_shuffle(&resources[0], &resources[19]);
116118

117-
int rolls[] = {2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11};
118-
random_shuffle(&rolls[0], &rolls[18]);
119+
int rolls[] = {0, 2, 3, 3, 4, 4, 5, 5, 6, 6, 8, 8, 9, 9, 10, 10, 11, 11, 12};
120+
while (!checkRolls(rolls))
121+
{
122+
random_shuffle(&rolls[0], &rolls[18]);
123+
}
119124

120-
int xcoords[] = {0, -2, 2, -3, -1, 1, 3, -4, -2, 0, 2, 4, -3, -1, 1, 3, -2, 0, 2};
121-
int ycoords[] = {1, 2, 0, 4, 3, 2, 1, 6, 5, 4, 3, 2, 7, 6, 5, 4, 8, 7, 6};
125+
int xcoords[] = {-2, 0, 2, -3, -1, 1, 3, -4, -2, 0, 2, 4, -3, -1, 1, 3, -2, 0, 2};
126+
int ycoords[] = { 2, 1, 0, 4, 3, 2, 1, 6, 5, 4, 3, 2, 7, 6, 5, 4, 8, 7, 6};
122127

123128

124129

125-
int rollCount = 0;
130+
int resourceCount = 0;
126131
for (int i = 0; i<19; i++)
127132
{
128-
if (resources[i]==DESERT)
133+
if (rolls[i] == 0)
129134
{
130-
addResource(xcoords[i], ycoords[i], resources[i], 0);
135+
addResource(xcoords[i], ycoords[i], resources[18], 0);
131136
}
132137
else
133138
{
134-
addResource(xcoords[i], ycoords[i], resources[i], rolls[rollCount]);
135-
rollCount++;
139+
addResource(xcoords[i], ycoords[i], resources[resourceCount], rolls[i]);
140+
resourceCount++;
136141
}
137142
}
138143

@@ -203,6 +208,7 @@ bool GameBoard::operator==(const GameBoard& other) const {
203208
}
204209
/*
205210
* Adds a resource and roll tile combo to the board
211+
*
206212
* @param x The first coordinate
207213
* @param y The second coordinate
208214
* @param res The resource type to be added
@@ -213,3 +219,177 @@ void GameBoard::addResource(int x, int y, resourceType res, int val)
213219
this->resources[Coordinate(x,y)] = std::unique_ptr<GamePiece>(new ResourceTile(*this, Coordinate(x,y), res, val));
214220
}
215221

222+
/*
223+
* This method checks the array of roll tiles
224+
* and makes sure that there are no 6s or 8s next to eachother
225+
* for the placement scheme defined in init_resources.
226+
*
227+
* P.S. It's a giant clusterf...well, if you have any ideas on refactoring, please do
228+
*
229+
* @param rolls The array to check
230+
*/
231+
bool GameBoard::checkRolls(int* rolls)
232+
{
233+
if (rolls[0] == 6 || rolls[0] == 8)
234+
{
235+
if (rolls[1] == 6 || rolls[1] == 8)
236+
return false;
237+
if (rolls[3] == 6 || rolls[3] == 8)
238+
return false;
239+
if (rolls[4] == 6 || rolls[4] == 8)
240+
return false;
241+
}
242+
243+
if (rolls[1] == 6 || rolls[1] == 8)
244+
{
245+
if (rolls[2] == 6 || rolls[2] == 8)
246+
return false;
247+
if (rolls[4] == 6 || rolls[4] == 8)
248+
return false;
249+
if (rolls[5] == 6 || rolls[5] == 8)
250+
return false;
251+
}
252+
253+
if (rolls[2] == 6 || rolls[2] == 8)
254+
{
255+
if (rolls[5] == 6 || rolls[5] == 8)
256+
return false;
257+
if (rolls[6] == 6 || rolls[6] == 8)
258+
return false;
259+
}
260+
261+
if (rolls[3] == 6 || rolls[3] == 8)
262+
{
263+
if (rolls[7] == 6 || rolls[7] == 8)
264+
return false;
265+
if (rolls[8] == 6 || rolls[8] == 8)
266+
return false;
267+
if (rolls[4] == 6 || rolls[4] == 8)
268+
return false;
269+
}
270+
271+
if (rolls[4] == 6 || rolls[4] == 8)
272+
{
273+
if (rolls[8] == 6 || rolls[8] == 8)
274+
return false;
275+
if (rolls[9] == 6 || rolls[9] == 8)
276+
return false;
277+
if (rolls[5] == 6 || rolls[5] == 8)
278+
return false;
279+
}
280+
281+
if (rolls[5] == 6 || rolls[5] == 8)
282+
{
283+
if (rolls[9] == 6 || rolls[9] == 8)
284+
return false;
285+
if (rolls[10] == 6 || rolls[10] == 8)
286+
return false;
287+
if (rolls[6] == 6 || rolls[6] == 8)
288+
return false;
289+
}
290+
291+
if (rolls[6] == 6 || rolls[6] == 8)
292+
{
293+
if (rolls[10] == 6 || rolls[10] == 8)
294+
return false;
295+
if (rolls[11] == 6 || rolls[11] == 8)
296+
return false;
297+
}
298+
299+
if (rolls[7] == 6 || rolls[7] == 8)
300+
{
301+
if (rolls[12] == 6 || rolls[12] == 8)
302+
return false;
303+
if (rolls[8] == 6 || rolls[8] == 8)
304+
return false;
305+
}
306+
307+
if (rolls[8] == 6 || rolls[8] == 8)
308+
{
309+
if (rolls[12] == 6 || rolls[12] == 8)
310+
return false;
311+
if (rolls[13] == 6 || rolls[13] == 8)
312+
return false;
313+
if (rolls[9] == 6 || rolls[9] == 8)
314+
return false;
315+
}
316+
317+
if (rolls[9] == 6 || rolls[9] == 8)
318+
{
319+
if (rolls[13] == 6 || rolls[13] == 8)
320+
return false;
321+
if (rolls[14] == 6 || rolls[14] == 8)
322+
return false;
323+
if (rolls[10] == 6 || rolls[10] == 8)
324+
return false;
325+
}
326+
327+
if (rolls[10] == 6 || rolls[10] == 8)
328+
{
329+
if (rolls[14] == 6 || rolls[14] == 8)
330+
return false;
331+
if (rolls[15] == 6 || rolls[15] == 8)
332+
return false;
333+
if (rolls[11] == 6 || rolls[11] == 8)
334+
return false;
335+
}
336+
337+
if (rolls[11] == 6 || rolls[11] == 8)
338+
{
339+
if (rolls[15] == 6 || rolls[15] == 8)
340+
return false;
341+
}
342+
343+
if (rolls[12] == 6 || rolls[12] == 8)
344+
{
345+
if (rolls[16] == 6 || rolls[16] == 8)
346+
return false;
347+
if (rolls[13] == 6 || rolls[13] == 8)
348+
return false;
349+
}
350+
351+
if (rolls[13] == 6 || rolls[13] == 8)
352+
{
353+
if (rolls[16] == 6 || rolls[16] == 8)
354+
return false;
355+
if (rolls[17] == 6 || rolls[17] == 8)
356+
return false;
357+
if (rolls[14] == 6 || rolls[14] == 8)
358+
return false;
359+
}
360+
361+
if (rolls[14] == 6 || rolls[14] == 8)
362+
{
363+
if (rolls[17] == 6 || rolls[17] == 8)
364+
return false;
365+
if (rolls[18] == 6 || rolls[18] == 8)
366+
return false;
367+
if (rolls[15] == 6 || rolls[15] == 8)
368+
return false;
369+
}
370+
371+
if (rolls[15] == 6 || rolls[15] == 8)
372+
{
373+
if (rolls[18] == 6 || rolls[18] == 8)
374+
return false;
375+
}
376+
377+
if (rolls[16] == 6 || rolls[16] == 8)
378+
{
379+
if (rolls[17] == 6 || rolls[17] == 8)
380+
return false;
381+
}
382+
383+
if (rolls[17] == 6 || rolls[17] == 8)
384+
{
385+
if (rolls[18] == 6 || rolls[18] == 8)
386+
return false;
387+
}
388+
389+
return true;
390+
}
391+
392+
bool GameBoard::testRollChecking(int* rolls)
393+
{
394+
return checkRolls(rolls);
395+
}

tests/test_GameBoard.cpp

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,28 @@
1-
/*
2-
* test_GameBoard.cpp
3-
*
4-
* Created on: Feb 22, 2014
5-
* Author: The Pickle
6-
*/
7-
8-
#include "GameBoard.h"
9-
#include "UnitTest++.h"
1+
/*
2+
* test_GameBoard.cpp
3+
*
4+
* Created on: Feb 22, 2014
5+
* Author: The Pickle
6+
*/
7+
8+
#include <vector>
9+
#include <memory>
10+
11+
#include "GameBoard.h"
12+
#include "UnitTest++.h"
13+
14+
TEST(randomize_rolls_fail)
15+
{
16+
GameBoard * test_board = new GameBoard(std::vector<std::unique_ptr<Player>>());
17+
int badRolls[] = {0, 2, 3, 3, 4, 4, 5, 5, 6, 6, 8, 8, 9, 9, 10, 10, 11, 11, 12};
18+
CHECK(test_board->testRollChecking(badRolls) == false);
19+
delete(test_board);
20+
}
21+
22+
TEST(randomize_rolls_pass)
23+
{
24+
GameBoard * test_board = new GameBoard(std::vector<std::unique_ptr<Player>>());
25+
int goodRolls[] = {9, 11, 5, 4, 0, 3, 4, 2, 10, 8, 3, 6, 9, 11, 5, 10, 6, 12, 8};
26+
CHECK(test_board->testRollChecking(goodRolls) == true);
27+
delete(test_board);
28+
}

0 commit comments

Comments
 (0)