-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstatistics.cpp
More file actions
76 lines (66 loc) · 2.14 KB
/
statistics.cpp
File metadata and controls
76 lines (66 loc) · 2.14 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
#include "statistics.h"
#include "game.h"
#include <fstream>
#include <string>
#include <algorithm>
// Konstruktor ładuje statystyki z pliku
Statistics::Statistics(const char * f):statfile(f){
ifstream fin(f);
Score s;
while(fin >> s){
results.push_back(s); // wczytuj rekordy i dodawaj do zbioru
}
}
// destruktor zapisuje wszystkie rekordy do pliku statystyk
Statistics::~Statistics(){
ofstream fout(statfile.c_str());
for(int i = 0; i < results.size(); ++i)
fout << results[i] << '\n';
}
// W przpadku zakonczenia rozgrywki
void Statistics::update(Observable * o){
Game * g = dynamic_cast<Game*>(o); // rzutuj na obiekt gry
if(g->getState() != "") return; //
Player & w = g->winner(); // pobierz zwyciezce
Player & l = g->looser(); // pobierz przegranego
int i;
// szukaj zwyciezcy w rankingu
for(i = 0; i < results.size(); ++i){
if(w.getName() == results[i].getName()){ // gry jest
results[i].win(); // aktualizuj liczbe wygranych
break;
}
}
if(i == results.size()) // gdy go nie ma
results.push_back(Score(w.getName(), 1, 0)); // utworz dla niego rekord
// szukaj przegranego w rankingu
for(i = 0; i < results.size(); ++i){
if(l.getName() == results[i].getName()){ // gry jest
results[i].lose(); // aktualizuj liczbe przegranych
break;
}
}
if(i == results.size()) // gdy go nie ma
results.push_back(Score(l.getName(), 0, 1)); // utworz dla niego rekord
sort(results.begin(), results.end()); // sortuj wg liczby wygranych
}
// metoda porownujaca rekordy
bool Score::operator<(const Score & s) const {
return wins != s.wins ? wins > s.wins : loses < s.loses;
}
// funkcja zapisujaca rekord do strumienia
ostream & operator<<(ostream & os, const Score & s){
os << s.name << ' ' << s.wins << ' ' << s.loses;
return os;
}
// funkcja odczytujaca rekord ze strumienia
istream & operator>>(istream & is, Score & s){
is >> s.name >> s.wins >> s.loses;
return is;
}
// funkcja zapisujaca statystyki do strumienia
ostream & operator<<(ostream & os, const Statistics & s){
for(int i = 0; i < s.results.size(); ++i)
os << i+1 << ". " << s.results[i] << '\n';
return os;
}