#include <iostream>
#include <chrono>
#include <thread>
#include <vector>
#include <string>
using namespace std;
using namespace std::chrono;
class Kara {
public:
int czasKary;
string powod;
Kara(int czas, const string& powod) : czasKary(czas), powod(powod) {}
};
class Zawodnik {
private:
string imie;
string nazwisko;
steady_clock::time_point start;
steady_clock::time_point stop;
bool czyStop = false;
vector<Kara> kary;
bool zdyskwalifikowany = false;
public:
Zawodnik(const string& imie_, const string& nazwisko_)
: imie(imie_), nazwisko(nazwisko_) {}
void startStoper() {
start = steady_clock::now();
czyStop = false;
cout << "Stoper dla " << imie << " " << nazwisko << " uruchomiony.\n";
}
void stopStoper() {
stop = steady_clock::now();
czyStop = true;
cout << "Stoper dla " << imie << " " << nazwisko << " zatrzymany.\n";
}
void dodajKare(int sekundy, const string& powod) {
kary.emplace_back(sekundy, powod);
}
void dyskwalifikuj() {
zdyskwalifikowany = true;
}
int czasBazowy() const {
return duration_cast<seconds>(stop - start).count();
}
int lacznyCzas() const {
if (zdyskwalifikowany) return -1;
int sumaKar = 0;
for (const auto& kara : kary) {
sumaKar += kara.czasKary;
}
return czasBazowy() + sumaKar;
}
void pokazWynik() const {
cout << "\nZawodnik: " << imie << " " << nazwisko << endl;
if (zdyskwalifikowany) {
cout << "Status: DYSKWALIFIKACJA" << endl;
} else {
cout << "Czas podstawowy: " << czasBazowy() << " s" << endl;
if (kary.empty()) {
cout << "Brak kar.\n";
} else {
cout << "Kary:\n";
for (const auto& kara : kary) {
cout << " +" << kara.czasKary << " s - " << kara.powod << endl;
}
}
cout << "Łączny czas: " << lacznyCzas() << " s" << endl;
}
cout << "---------------------------" << endl;
}
bool jestZdyskwalifikowany() const {
return zdyskwalifikowany;
}
string getImieNazwisko() const {
return imie + " " + nazwisko;
}
};
int main() {
Zawodnik zawodnik1("Jan", "Kowalski");
Zawodnik zawodnik2("Anna", "Nowak");
// Start obu stoperów
zawodnik1.startStoper();
this_thread::sleep_for(seconds(3)); // symulacja upływu czasu
zawodnik2.startStoper();
this_thread::sleep_for(seconds(4)); // zawodnik1 kończy
zawodnik1.stopStoper();
this_thread::sleep_for(seconds(2)); // zawodnik2 kończy
zawodnik2.stopStoper();
// Dodanie kar
zawodnik1.dodajKare(5, "Falstart");
zawodnik2.dodajKare(10, "Nieprawidłowy manewr");
// Możliwość dyskwalifikacji (opcjonalna)
// zawodnik2.dyskwalifikuj();
// Pokazanie wyników
zawodnik1.pokazWynik();
zawodnik2.pokazWynik();
// Porównanie wyników
if (zawodnik1.jestZdyskwalifikowany() && zawodnik2.jestZdyskwalifikowany()) {
cout << "Obaj zawodnicy zostali zdyskwalifikowani." << endl;
} else if (zawodnik1.jestZdyskwalifikowany()) {
cout << zawodnik2.getImieNazwisko() << " wygrywa (drugi zawodnik zdyskwalifikowany)." << endl;
} else if (zawodnik2.jestZdyskwalifikowany()) {
cout << zawodnik1.getImieNazwisko() << " wygrywa (drugi zawodnik zdyskwalifikowany)." << endl;
} else {
if (zawodnik1.lacznyCzas() < zawodnik2.lacznyCzas()) {
cout << zawodnik1.getImieNazwisko() << " wygrywa!" << endl;
} else if (zawodnik1.lacznyCzas() > zawodnik2.lacznyCzas()) {
cout << zawodnik2.getImieNazwisko() << " wygrywa!" << endl;
} else {
cout << "Remis!" << endl;
}
}
return 0;
}