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+ }
0 commit comments