-
Notifications
You must be signed in to change notification settings - Fork 0
/
Leaderboard.cpp
118 lines (96 loc) · 3.68 KB
/
Leaderboard.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
#include <fstream>
#include <iostream>
#include "Leaderboard.h"
void Leaderboard::read_from_file(const string& filename) {
ifstream file(filename);
if (!file.is_open()) {
cerr << "Unable to open file: " << filename << endl;
return;
}
string playerName;
time_t date;
unsigned long score;
while (file >> score >> date >> playerName) {
LeaderboardEntry* newEntry = new LeaderboardEntry(score, date, playerName);
insert_new_entry(newEntry);
}
file.close();
}
void Leaderboard::write_to_file(const string& filename) {
std::ofstream file(filename);
if (!file.is_open()) {
cerr << "Unable to open file: " << filename << endl;
return;
}
LeaderboardEntry* currentEntry = head_leaderboard_entry;
while (currentEntry != nullptr) {
file << currentEntry->score << " " << currentEntry->last_played << " " << currentEntry->player_name << endl;
currentEntry = currentEntry->next_leaderboard_entry;
}
file.close();
}
void Leaderboard::print_leaderboard() {
cout << "Leaderboard:" << endl;
cout << "-----------" << endl;
int rank = 1;
LeaderboardEntry* temp = head_leaderboard_entry;
while (temp != nullptr) {
cout << rank << ". " << temp->player_name << " " << temp->score << " ";
// Format the last_played time
struct tm* timeInfo;
char buffer[80]; // For storing the formatted time
timeInfo = localtime(&temp->last_played);
strftime(buffer, sizeof(buffer), "%H:%M:%S/%d.%m.%Y", timeInfo);
cout << buffer << endl;
temp = temp->next_leaderboard_entry;
rank++;
}
}
void Leaderboard::insert_new_entry(LeaderboardEntry* new_entry) {
if (head_leaderboard_entry == nullptr) {
head_leaderboard_entry = new_entry;
return;
}
LeaderboardEntry* prevEntry = nullptr;
LeaderboardEntry* tempEntry = head_leaderboard_entry;
// Traverse the current entries to find the position to insert the new entry
while (tempEntry != nullptr && tempEntry->score >= new_entry->score) {
prevEntry = tempEntry;
tempEntry = tempEntry->next_leaderboard_entry;
}
if (prevEntry == nullptr) {
// If the new entry's score is the highest, insert it at the beginning
new_entry->next_leaderboard_entry = head_leaderboard_entry;
head_leaderboard_entry = new_entry;
} else {
// Insert the new entry in the correct position
prevEntry->next_leaderboard_entry = new_entry;
new_entry->next_leaderboard_entry = tempEntry;
}
// Keep only the top MAX_LEADERBOARD_SIZE (10) entries
int entryCount = 0;
tempEntry = head_leaderboard_entry;
while (entryCount < 10 - 1 && tempEntry->next_leaderboard_entry != nullptr) {
tempEntry = tempEntry->next_leaderboard_entry;
++entryCount;
}
// Remove entries beyond the top MAX_LEADERBOARD_SIZE = 10
if (entryCount >= 10 - 1) {
LeaderboardEntry* nextEntry = tempEntry->next_leaderboard_entry;
tempEntry->next_leaderboard_entry = nullptr;
// Free memory for the removed entries
while (nextEntry != nullptr) {
LeaderboardEntry* toDelete = nextEntry;
nextEntry = nextEntry->next_leaderboard_entry;
delete toDelete;
}
}
}
Leaderboard::~Leaderboard() {
LeaderboardEntry* currentEntry = head_leaderboard_entry;
while (currentEntry != nullptr) {
LeaderboardEntry* temp = currentEntry;
currentEntry = currentEntry->next_leaderboard_entry;
delete temp;
}
}