-
Notifications
You must be signed in to change notification settings - Fork 0
/
Game.cpp
426 lines (391 loc) · 11.6 KB
/
Game.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
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
/** Program Name: Game.cpp
** Author: Thomas Fattah
** Date: 2019-08-06
** Description: Definition file for Game class, which simulates a Game of Earl. #includes Earl class, Space class, and
** all classes derived from Space. Contains data members for an Earl object, Space pointers, and a boolean to continue
** or stop gameplay.
*/
#include "inputValidation.hpp"
#include "Game.hpp"
using std::cout;
using std::endl;
// default constructor which sets all Space pointers to nullptr and keepPlaying to true
Game::Game()
: head(nullptr), tail(nullptr), tailWest(nullptr), current(nullptr), keepPlaying(true)
{
}
// Calls generateWorld(), couts some game info, and calls gamePlay()
void Game::start()
{
generateWorld();
displayStats();
cout << "The objective is to make it to Taco Terrace with at least 3 bucks. You'll need money to buy tacos. Earl's "
"an honest man. He's not about to steal. You'll have various opportunities to earn more cash." << endl;
cout << "\nEarl's main stat is hunger. Every time Earl enters a new space, he loses 5 hunger. If it falls to 0, "
"it's game over. Throughout the game, you might find snacks to help stave off hunger. Don't let Earl down."
<< endl;
cout << "\nEarl's primary attack method is flinging boogers. It's not very painful, but it usually makes Earl's "
"enemies leave him alone. Boogers can be found in a variety of places. Earl can carry at most 5 boogers."
<< endl;
cout << "\nEarl's health stat shows how much health he has remaining. Earl will face various obstacles which will"
" diminish his health. If it falls to 0, it's game over. Earl doesn't like blood, so be careful, ok?" << endl;
cout << "\nFinally, there's Earl's confidence. If you finish the game with a high level of confidence, you'll get"
" a higher score. Plus, Earl will feel really great about himself, and you can't put a metric on that, can "
"you?" << endl;
gamePlay();
}
// Works with current Space*, which is used to traverse through each Space. While keepPlaying is true, calls
// displayLocationInfo(), interact(), and fight() on most Spaces. If Space is Bus Station, checks whether earl's
// busTicket boolean is true before allowing earl to move to Bus Space. If location is Taco Terrace, sets keepPlaying
// to false, to break out of while loop. Otherwise, calls move(), showMap(), quitMenu(), and displayStats(). Checks
// whether earl has enough hunger and health to continue playing.
void Game::gamePlay()
{
while(keepPlaying)
{
current->displayLocationInfo();
current->interact(earl);
if(earl.getHealth() < 1)
{
cout << "Earl has died :(" << endl;
keepPlaying = false;
}
current->fight(earl);
if(earl.getHealth() < 1)
{
cout << "Earl has died :(" << endl;
keepPlaying = false;
}
if(current->getLocation() == "Taco Terrace")
{
keepPlaying = false;
}
if(current->getLocation() == "Bus Station")
{
if(!earl.getBusTicket())
{
int busChoice = 0;
cout << "\nPlease purchase a bus ticket if you wish to board the bus." << endl;
cout << "You have " << earl.getCash() << " bucks. What do you want to do?" << endl;
cout << "1. Buy a bus ticket and board the bus" << endl;
cout << "2. Go back to Old New Mexico Street" << endl;
while(busChoice < 1 || busChoice > 2)
{
busChoice = getInt();
if(busChoice < 1 || busChoice > 2)
{
cout << "Enter only 1 or 2." << endl;
}
if(busChoice == 1 && earl.getCash() < 5)
{
cout << "Earl doesn't have enough money, dude!" << endl;
busChoice = 0;
}
}
if(busChoice == 1)
{
earl.buyBusTicket();
current = current->getNorth();
earl.setHunger(-5);
}
else if(busChoice == 2)
{
current = current->getWest();
earl.setHunger(-5);
}
}
else
{
if(keepPlaying)
{
move();
showMap();
}
}
}
else
{
if(keepPlaying)
{
move();
showMap();
}
}
if(earl.getHunger() < 1)
{
cout << "Earl is too hungry to carry on." << endl;
keepPlaying = false;
}
if(keepPlaying)
{
keepPlaying = quitMenu();
}
displayStats();
}
}
// Called at the beginning of each new location. Prompts the user if they would like to keep playing. If no, is used
// to set keepPlaying to false in gamePlay(). Validates input with getInt() from inputValidation.hpp
bool Game::quitMenu()
{
int quit = 0;
cout << "Keep playing?" << endl;
cout << "1. Yes" << endl;
cout << "2. No" << endl;
while(quit < 1 || quit > 2)
{
quit = getInt();
if(quit < 1 || quit > 2)
{
cout << "Enter 1 or 2 only." << endl;
}
}
if(quit == 1)
{
return true;
}
else if(quit == 2)
{
return false;
}
}
// users earl's getter functions to display his stats at the start of each level
void Game::displayStats()
{
cout << "=============================" << endl;
cout << "These are Earl's stats: " << endl;
cout << "Cash: " << earl.getCash() << " bucks" << endl;
cout << "Hunger: " << earl.getHunger() << endl;
cout << "Boogers: " << earl.getBoogers() << endl;
cout << "Health: " << earl.getHealth() << endl;
cout << "Confidence: " << earl.getConfidence() << endl;
cout << "=============================" << endl;
}
// Creates a linked list, where each Space has 4 pointers to other Spaces (often nullptr). Is used at the start of
// the game to generate the linked list structure used to simulate the world Earl lives in. A visual representation
// of this world is in showMap().
void Game::generateWorld()
{
// House with all 4 directions null
head = new House();
tail = head;
current = head;
// street
tail = new Street("Old New Mexico St");
tail->setSouth(head);
head->setNorth(tail);
tailWest = tail; //tailWest == street
// bus station
tail = new BusStation();
tail->setWest(tailWest);
tailWest->setEast(tail);
Space* copyPtr = tail;
// bus
tail = new Bus();
tail->setSouth(copyPtr);
copyPtr->setNorth(tail);
copyPtr = tail;
// taco terrace
tail = new TacoTerrace();
tail->setSouth(copyPtr);
copyPtr->setNorth(tail);
copyPtr = tailWest;
// mall
tailWest = new Mall();
tailWest->setEast(copyPtr);
copyPtr->setWest(tailWest);
copyPtr = tailWest;
// street 2
tailWest = new Street("Garbage St");
tailWest->setSouth(copyPtr);
copyPtr->setNorth(tailWest);
copyPtr = tailWest;
// gas station
tailWest = new GasStation();
tailWest->setSouth(copyPtr);
copyPtr->setNorth(tailWest);
// link west to tail
tailWest->setEast(tail);
tail->setEast(tailWest);
}
// An ASCII representation of the world Earl lives in. Calls a getter to display which Space Earl is currently in.
void Game::showMap()
{
cout << "=====================" << endl;
cout << "======World Map======" << endl;
cout << "=====================" << endl;
cout << endl;
cout << "Earl is currently in: " << current->getLocation() << endl;
cout << endl;
cout << "################ ################" << endl;
cout << "# # # #" << endl;
cout << "# Gas Station #---# TACO TERRACE #-----------|" << endl;
cout << "# # # # |" << endl;
cout << "################ ################ |" << endl;
cout << " | |" << endl;
cout << "################ ################" << endl;
cout << "# Garbage # # #" << endl;
cout << "# Street # # Bus #" << endl;
cout << "# # # #" << endl;
cout << "################ ################" << endl;
cout << " | |" << endl;
cout << "################ ################ ################" << endl;
cout << "# # # Old New # # #" << endl;
cout << "# Mall #---# Mexico Street#---# Bus Station #" << endl;
cout << "# # # # # #" << endl;
cout << "################ ################ ################" << endl;
cout << " | " << endl;
cout << " ################" << endl;
cout << " # #" << endl;
cout << " # Earl's House #" << endl;
cout << " # #" << endl;
cout << " ################" << endl;
}
// Provides user with option to traverse the linked list in each of the possible directions. Uses bools one, two,
// three, four to verify that that direction is not set to nullptr, otherwise displays location and allows user to
// pick that location. If northern location is Bus, makes sure user has purchased a bus ticket before allowing that
// as a choice. After a successful move, updates Earl's hunger by subtracting 5 hunger with setHunger().
void Game::move()
{
bool one = false;
bool two = false;
bool three = false;
bool four = false;
int choice = 0;
cout << "\n---------------------------------------" << endl;
cout << "Which direction would you like to move?" << endl;
cout << "Available directions: " << endl;
Space* copyPtr;
if(current->getNorth() != nullptr)
{
copyPtr = current->getNorth();
if(copyPtr->getLocation() == "Bus")
{
if(!earl.getBusTicket())
{
cout << "1. North - " << copyPtr->getLocation() << ". Please purchase a bus ticket." << endl;
one = false;
}
else
{
cout << "1. North - " << copyPtr->getLocation() << endl;
one = true;
}
}
else
{
cout << "1. North - " << copyPtr->getLocation() << endl;
one = true;
}
}
if(current->getEast() != nullptr)
{
copyPtr = current->getEast();
cout << "2. East - " << copyPtr->getLocation() << endl;
two = true;
}
if(current->getSouth() != nullptr)
{
copyPtr = current->getSouth();
cout << "3. South - " << copyPtr->getLocation() << endl;
three = true;
}
if(current->getWest() != nullptr)
{
copyPtr = current->getWest();
cout << "4. West - " << copyPtr->getLocation() << endl;
four = true;
}
while(choice < 1 || choice > 4)
{
choice = getInt();
if(choice < 1 || choice > 4)
{
cout << "Enter one of the listed choices." << endl;
}
switch (choice)
{
case 1:
if(!one)
{
cout << "Invalid choice. Make a different selection." << endl;
choice = 0;
}
else
{
current = current->getNorth();
earl.setHunger(-5);
}
break;
case 2:
if(!two)
{
cout << "Invalid choice. Make a different selection." << endl;
choice = 0;
}
else
{
current = current->getEast();
earl.setHunger(-5);
}
break;
case 3:
if(!three)
{
cout << "Invalid choice. Make a different selection." << endl;
choice = 0;
}
else
{
current = current->getSouth();
earl.setHunger(-5);
}
break;
case 4:
if(!four)
{
cout << "Invalid choice. Make a different selection." << endl;
choice = 0;
}
else
{
current = current->getWest();
earl.setHunger(-5);
}
break;
}
}
}
// deletes all dynamically allocated Space objects
Game::~Game()
{
// delete house
Space* copyPtr = head;
copyPtr = copyPtr->getNorth();
delete head;
head = nullptr;
// street
head = copyPtr; // head == street
// bus station
copyPtr = copyPtr->getEast();
Space* nodePtr = copyPtr;
copyPtr = copyPtr->getNorth();
delete nodePtr;
// bus - tail points to taco terrace
delete copyPtr;
copyPtr = nullptr;
// back to street - moving to mall
copyPtr = head;
copyPtr = copyPtr->getWest();
delete head;
head = nullptr;
// mall
head = copyPtr;
copyPtr = copyPtr->getNorth();
delete head;
// street 2 - tailWest points to gas station
delete copyPtr;
// gas station
delete tailWest;
// taco terrace
delete tail;
}