-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
381 lines (355 loc) · 11.7 KB
/
Copy pathmain.cpp
File metadata and controls
381 lines (355 loc) · 11.7 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
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
#include <iostream>
#include <fstream>
#include <conio.h>
#include <windows.h>
using namespace std;
const int sizey = 19;
const int sizex = 19;
const int maxenemies = 100;
const int maxbutterflies = 100;
int enemies;
int floornumber;
int butterflies;
int health;
int score;
int deadenemies;
char gameScreen[100][100];
char player = '@';
int playerx = 10;
int playery = 10;
struct entity {
char character;
int posx;
int posy;
};
entity enemylist[maxenemies];
entity butterflylist[maxbutterflies];
entity stairs;
void printHealth();
void printScreen();
void createEntities();
void newFloor();
void entityMove();
void randomMove(entity entitylist[], int entity);
void gameOver();
void checkForHit(entity entitylist[], int targetx, int targety);
void hit(entity entitylist[], int entity);
void populateScreen();
void hitScreen();
void catchScreen();
void hitOrWalk(int targetx, int targety);
void printSlow(string stringtoprint);
void gotoxy(int x, int y);
void startScreen();
void scoreScreen();
int main()
{
score = 0;
health = 5;
enemies = 4;
butterflies = 2;
floornumber = 1;
startScreen();
createEntities(); //Luodaan kenttään viholliset, kerättävät perhoset, sekä portaat seuraavaan kenttään
populateScreen(); //Laitetaan kaikki luodut asiat paikoilleen ja täytetään loppukenttä "." merkeillä
printScreen(); //Printataan kenttä konsoli-ikkunaan
int input = 0;
while (input != 27) {
gotoxy(sizex+1, 0); //Siirretään konsolin kursori pelikentän oikeaan laitaan, koska siellä enemmän tyhjää tilaa UI:lle
cout << "HEALTH: ";
printHealth();
gotoxy(sizex + 1, 1);
cout << "FLOOR: " << floornumber;
gotoxy(sizex + 1, 2);
cout << "SCORE: " << score;
gotoxy(0, 0);
input = _getch();
switch (input) {
case 72:{ // Pelaaja koittaa liikkua ylös
if (playerx != 0) { // Kentän raja
int tempx = playerx; // Lähetetään temp muuttujat oikeiden sijaan (ettei pelaaja kulje asioiden lävitse)
int tempy = playery;
hitOrWalk(--tempx, tempy); // Testataan mitä pelaaja tekee liikkuessaan ylös
break;
}
else break;
}
case 75: { // Pelaaja koittaa liikkua vasemmalle
if (playery != 0) { // Kentän raja
int tempx = playerx;
int tempy = playery;
hitOrWalk(tempx, --tempy); // Testataan mitä pelaaja tekee liikkuessaan vasemmalle
break;
}
else break;
}
case 80: { // Pelaaja koittaa liikkua alas
if (playerx != 18) { // Kentän raja
int tempx = playerx;
int tempy = playery;
hitOrWalk(++tempx, tempy); // Testataan mitä pelaaja tekee liikkuessaan alas
break;
}
else break;
}
case 77: { // Pelaaja koittaa liikkua oikealle
if (playery != 18) { // Kentän raja
int tempx = playerx;
int tempy = playery;
hitOrWalk(tempx, ++tempy); // Testataan mitä pelaaja tekee liikkuessaan oikealle
break;
}
else break;
}
}
system("CLS"); //Tyhjennetään konsoli-ikkuna
populateScreen(); //Täytetään pelikenttä uusiksi pelaajan ja muiden hahmojen liikkumisen mukaan
printScreen(); //Printataan päivittynyt kenttä
}
}
void populateScreen() {
for (int i = 0; i < sizex; i++) // Käydään pelikenttä läpi ja lisätään "." jokaiseen 'peliruutuun'
{
for (int j = 0; j < sizey; j++)
{
gameScreen[i][j] = '.';
}
}
gameScreen[playerx][playery] = player; // Lisätään pelaaja paikalleen
int catchedbutterflies = 0; // Alustetaan kentän voittoehto myöhempää tarkastelua varten
for (int i = 0; i < enemies; i++) {
gameScreen[enemylist[i].posx][enemylist[i].posy] = enemylist[i].character; // Lisätään viholliset paikoilleen
}
for (int i = 0; i < butterflies; i++) { // Lisätään perhoset paikoilleen
gameScreen[butterflylist[i].posx][butterflylist[i].posy] = butterflylist[i].character;
if (butterflylist[i].character == 'D') // Katsotaan listalta kerättyjen perhosten määrä (kerätty perhonen menee pois pelikentältä ja sen merkki muuttuu "D" merkiksi)
{
catchedbutterflies++;
if (catchedbutterflies >= butterflies) // Jos pelaaja on kerännyt kentän kaikki perhoset...
{
stairs.character = 'O'; //...muuttuu portaat seuraavaan kerrokseen merkiksi "O", jolloin sinne voi mennä
}
}
}
gameScreen[stairs.posx][stairs.posy] = stairs.character; // Asetetaan portaat paikoilleen
}
void createEntities() { // Käydään sekä vihollislista, että perhoslista läpi ja randomisoidaan molempien
for (int i = 0; i < enemies; i++) { // paikat kentällä kentän koon mukaan, randomisoidaan myös portaat
enemylist[i].character = 'G';
enemylist[i].posx = rand() % sizex;
enemylist[i].posy = rand() % sizey;
}
for (int i = 0; i < butterflies; i++) {
butterflylist[i].character = '%';
butterflylist[i].posx = rand() % sizex;
butterflylist[i].posy = rand() % sizey;
}
stairs.character = '/';
stairs.posx = rand() % sizex;
stairs.posy = rand() % sizey;
}
void printScreen() { // Käydään pelikenttä läpi ja printataan
for (int i = 0; i < sizex; ++i)
{
for (int j = 0; j < sizey; ++j)
{
cout << gameScreen[i][j];
}
cout << endl;
}
}
void printHealth() { // Tulostetaan elämäpisteiden määrä UI:n
for (int i = 0; i < health; i++)
{
cout << "*";
}
}
void hitOrWalk(int targetx,int targety) { // Tarkastellaan mitä tapahtuu, kun pelaaja koittaa liikkua
if (gameScreen[targetx][targety] == 'G') // Jos halutussa paikassa on jo vihollinen
{
checkForHit(enemylist, targetx, targety); // Tarkastetaan osuma viholliseen
}
else if (gameScreen[targetx][targety] == '%') // Jos halutussa paikassa on jo perhonen
{
checkForHit(butterflylist, targetx, targety); // Tarkastetaan osuma perhoseen
}
else if (gameScreen[targetx][targety] == '/') // Jos kohdassa on suljetut portaat
{
// Älä tee mitään (ei mahdollista kulkea suljettujen portaiden läpi)
}
else if (gameScreen[targetx][targety] == 'O') // Jos kohdassa avatut portaat
{
playerx = targetx; // Liiku kohtaan
playery = targety;
newFloor(); // ja aloita uusi kenttä
}
else {
playerx = targetx; // Muuten liiku normaalisti
playery = targety;
}
entityMove(); // Kutsutaan muiden liikkumista käsittelevää funktiota
checkForHit(enemylist, playerx, playery); // Tarkastetaan vielä osumaa siinä kohdalla missä olemme,
checkForHit(butterflylist, playerx, playery); // siltä varalta että vihollinen tai perhonen on liikkunut siihen samalla vuorolla
}
void checkForHit(entity entitylist[], int targetx, int targety) { // Tarkastellaan osumista muihin asioihin
for (int i = 0; i < enemies; i++) {
if (entitylist[i].posx == targetx && entitylist[i].posy == targety)
{
hit(entitylist, i); // Osuessa kutsutaan funktiota joka hävittää kohteen
if (entitylist == butterflylist) {
catchScreen(); // Jos osutaan perhoseen mennään catchScreen funktioon
}
else hitScreen(); // Jos osutaan viholliseen, mennään hitScreen funktioon
}
}
}
void hit(entity entitylist[], int entity) { // Piilotetaan "kuolleet" asiat pois pelikentältä ja muutetaan niitten merkki "D"
entitylist[entity].character = 'D';
entitylist[entity].posx = 100;
entitylist[entity].posy = 100;
}
void entityMove() // Perhosten ja vihollisten liikkuminen
{
for (int i = 0; i < enemies; i++) {
if (enemylist[i].character == 'G')
{
randomMove(enemylist, i); // Annetaan jokaiselle asialle käsky liikkua randomMove mukaan
}
}
for (int i = 0; i < butterflies; i++) {
if (butterflylist[i].character == '%')
{
randomMove(butterflylist, i);
}
}
}
void randomMove(entity entitylist[], int entity)// Randomisoidaan asioiden liikkuminen yksinkertaisella funktiolla
{
int randomizer = rand() % 4; // Random numero 0-3, joka annetaan switch case -rakenteelle
switch (randomizer) {
case 0: {
if (entitylist[entity].posx != 0) {
entitylist[entity].posx--;
break;
}
}
case 1: {
if (entitylist[entity].posy != 0) {
entitylist[entity].posy--;
break;
}
}
case 2: {
if (entitylist[entity].posx != 18) {
entitylist[entity].posx++;
break;
}
}
case 3: {
if (entitylist[entity].posy != 18) {
entitylist[entity].posy++;
break;
}
}
}
}
void newFloor() // Asetetaan seuraavalle kentälle uudet määreet
{
floornumber++;
enemies++;
butterflies = enemies / 2;
createEntities();
populateScreen();
printScreen();
}
void hitScreen() { // Osumisruutu
system("CLS"); // Tyhjennetään ruutu
health--; // Vähennetään elämäpiste
if (health <= 0) {
gameOver(); // Jos elämäpisteet 0, Game Over -ruutuun
}
for (int i = 0; i < sizex; ++i)
{
for (int j = 0; j < sizey; ++j)
{
gameScreen[i][j] = 'X'; // Väläytetään näyttöä, jossa koko pelikenttä täynnä "X" -merkkiä
}
}
printScreen();
}
void catchScreen() { // Keräämisruutu
score += floornumber; // Lisätään pelaajalle pisteitä riippuen kuinka pitkällä pelissä on
system("CLS"); // Tyhjennetään ruutu
for (int i = 0; i < sizex; ++i)
{
for (int j = 0; j < sizey; ++j)
{
gameScreen[i][j] = '*'; // Väläytetään näyttöä, jossa koko pelikenttä täynnä "*" -merkkiä
}
}
printScreen();
}
void gameOver() // Jos pelaaja menettää kaikki elämäpisteet, printataan seuraavat asiat
{
floornumber = 0; // Alustetaan kerrosnumero uudelle pelikerralle
enemies = 3; // Alustetaan vihollismäärä uudelle pelikerralle
health = 5; // Alustetaan elämäpisteet uudelle pelikerralle
system("CLS"); // Tyhjennetään ruutu
while (!_kbhit()) { // Odotetaan käyttäjän inputtia
char R[15] = { '1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' }; // Listataan värivaihtoehdot
char color_string[20];
int Ra = rand() % 15;
int Rb = rand() % 15;
sprintf_s(color_string, "color %c%c", R[Ra], R[Rb]); // Tehdään string kahdesta yllä olevan listan random arvosta
system(color_string); // Muutetaan konsolin värit kyseisiin väreihin
Sleep(20);
printSlow("GAME OVER ---press enter--- ");
}
system("CLS");
cin.ignore();
scoreScreen();
startScreen();
newFloor(); // Uusi kenttä
}
void printSlow(string stringtoprint) { // Printtaa stringin kirjain kerrallaan
for (int i = 0; i < stringtoprint.size(); i++) {
cout << stringtoprint[i];
Sleep(10);
}
}
void gotoxy(int x, int y) // Siirtää konsolin osoittimen haluttuun kohtaan
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void startScreen()
{
system("color 5E"); // Määritellään pelin default väri
cout << " _____ _ _ ___ _ " << endl;
cout << "| __ |_ _| |_| |_ ___ ___| _| |_ _ " << endl;
cout << "| __ -| | | _| _| -_| _| _| | | |" << endl;
cout << "|_____|___|_| |_| |___|_| |_| |_|_ |" << endl;
cout << " |___|" << endl;
cout << " " << endl;
cout << "-------------------------------------" << endl;
cout << " Move using the arrow keys " << endl;
cout << " Try to catch every butterfly(%) " << endl;
cout << "and stairs to the next floor will open(O)" << endl;
cout << "Watch out for the goblins(G), though!" << endl;
cout << " " << endl;
cout << "Press any key to start or ESC to quit" << endl;
_getch(); //Pysäytetään ohjelman ajo, jotta startscreen jää näkyviin kunnes pelaaja painaa jotain
}
void scoreScreen() {
system("color 5E");
cout << " _______ _______ _____ ______ _______" << endl;
cout << " |______ | | | |_____/ |______" << endl;
cout << " ______| |_____ |_____| | \\_ |______" << endl;
cout << " " << endl;
cout << "-----------------------------------------" << endl;
cout << "Congratulations! You got : " << score << " points";
score = 0;
_getch();
}