forked from FLAK-ZOSO/Labirint
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.cpp
158 lines (137 loc) · 5.29 KB
/
main.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
#include <future>
#include <thread>
#include <limits>
#include <cstring>
#include <conio.h>
// Puoi includere file creati da te, scritti in C++
// ...ma con estensione .hpp invece che .cpp
#include "game.hpp" // Questo file è stato creato da noi
#include "menu.hpp" // Questo file è stato creato da Asia
// g++ main.cpp -o labirint.exe -std=c++2a
char inputMove() {
char move = getch();
return move;
}
Game game(std::string name) { // Ritorna l'oggetto Game
Game myGame;
myGame.points = 0;
myGame.bonus = 0;
myGame.emptyLine = false;
myGame.borderCounter = 0;
myGame.z = true; // true quando è il default
myGame.zFrames = 0;
myGame.zFuel = 0; // Quante @ devi ancora usare
srand(time(0)); // Rende casuale la generazione di numeri casuali con rand()
// std::ios_base::sync_with_stdio(false); // Rende la console non bloccante
// Informazioni
while ((std::cout << "Bonus frequency (period): ") && (!(std::cin >> myGame.bonusFrequency))) {
std::cout << "Not a positive number" << std::endl;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
while ((std::cout << "Cloud max width: ") && (!(std::cin >> myGame.maxCloudWidth))) {
std::cout << "Not a positive number" << std::endl;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
long double frame_duration_; // durata di un fotogramma in secondi
while ((std::cout << "Duration of a frame: ") && (!(std::cin >> frame_duration_))) {
std::cout << "Not a positive number" << std::endl;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
if (myGame.bonusFrequency > 10)
myGame.bonusFrequency = 10;
if (myGame.bonusFrequency < 1)
myGame.bonusFrequency = 1;
if (myGame.maxCloudWidth > 15)
myGame.maxCloudWidth = 15;
if (frame_duration_ < 0.05)
frame_duration_ = 0.05;
// Variabile di tipo std::chrono che indica la durata del fotogramma
auto frame_duration = std::chrono::duration<long double> (frame_duration_);
// Colore
std::string color;
std::cout << "Color: ";
std::cin >> color;
if (color == "matrix")
system("color 0A");
if (color == "red")
system("color 0C");
if (color == "fucsia")
system("color DE");
if (color == "gray")
system("color 70");
if (color == "bordeaux")
system("color 4E");
// Riempio la matrice, che in partenza è vuota
for (int i = 0; i < 20; i++) {
for (int j = 0; j < 50; j++)
myGame.matrix[i][j] = ' ';
myGame.matrix[i][0] = '#';
myGame.matrix[i][49] = '#';
}
// Il personaggio del giocatore sarà la lettera maiuscola della sua iniziale
myGame.name = name;
myGame.skin = name[0];
myGame.x = 24;
myGame.y = 3;
myGame.matrix[3][24] = myGame.skin;
bool end = false; // Variabile che serve a uscire dai while annidati
while (!end) { // "while not end" = finché end è false
// Enable standard literals as 2s and ""s.
using namespace std::literals;
// Eseguo la funzione inputMove in modo asincrono
auto input = std::async(std::launch::async, inputMove);
// Continue execution in main thread
while (input.wait_for(frame_duration) != std::future_status::ready) {
if (checkMatrix(myGame)) { // Controlliamo se ha perso
end = true;
break;
}
updateMatrix(myGame); // Aggiorniamo la matrice
printMatrix(myGame); // Aggiorniamo l'immagine
}
processMove(myGame, input.get());
printMatrix(myGame);
}
updateMatrix(myGame);
printMatrix(myGame);
return myGame;
}
bool giocaAncora(string username) {
system("cls");
std::cout << "Do you want to play again? (y/n)" << std::endl << "> ";
char answer;
std::cin >> answer;
// Quindi fa return true se l'utente vuole giocare ancora
return (answer == 'y' || answer == 'Y');
}
int main() {
// Stampiamo il menu con una funzione che viene da menu.hpp
stampaScrittaMenu();
system("pause >nul"); // Mette in pausa l'esecuzione finché l'utente non preme invio
system("cls"); // Pulisce lo schermo
// Stampiamo tutti i dati con dei file .txt (di testo)
stampaDati();
system("pause >nul");
system("cls");
// Chiediamo le varie informazioni all'utente
std::string name;
std::cout << "Username: ";
std::cin >> name;
// Leggi record se c'è
int points, record = leggiRecord(name);
do {
points = game(name).points;
std::cout << "You scored " << points << " points" << std::endl;
std::cout << "Your record is " << record << " points" << std::endl;
system("pause >nul");
system("cls");
if (record < points) { // Se ha battuto il record personale
std::cout << "Checking the leaderboard... " << std::endl;
scriviDati(name, points); // Salva i dati nel file utenti.txt
}
} while (giocaAncora(name)); // Chiediamo se vuole rigiocare
return 0;
}