Задача КОТОПС и Мяу
Создайте программу на C++, моделирующую сложную экосистему, включающую три взаимосвязанных класса: `Cat`, `Dog` и `CatDog`, с расширенными возможностями и функциональностью.
Класс `Cat` должен иметь приватные поля для имени, возраста, количества жизней, уровня энергии и уровня счастья. Методы класса должны включать возможность издавать звук "Мяу!", играть, что уменьшает уровень энергии, возвращать информацию о коте, восстанавливать жизни и увеличивать уровень счастья через взаимодействие с другими существами.
Класс `Dog` должен содержать приватные поля для имени, возраста, породы, уровня преданности и уровня энергии. Методы должны позволять собаке издавать звук "Гав!", приносить предметы, что увеличивает уровень преданности, возвращать информацию о собаке и взаимодействовать с котом для повышения уровня счастья.
Класс `CatDog` должен объединять экземпляры классов `Cat` и `Dog`, иметь уровень опыта и методы для слияния и разделения этих животных. При слиянии, уровень энергии кота и преданности собаки обнуляются, а уровень счастья и опыта увеличиваются. Взаимодействие между котом и собакой должно включать возможность совместной игры, что влияет на их уровни энергии и преданности, а также на уровень счастья.
Дополнительно, программа должна включать сложную обработку исключений для случаев, когда уровни энергии, преданности, жизней или счастья выходят за пределы допустимых значений. Реализуйте систему событий, которая будет случайным образом генерировать события (например, болезнь, встреча с другими животными), влияющие на состояние животных, и методы для их обработки.
Также необходимо реализовать методы для сохранения и загрузки состояния объектов в файл, используя сериализацию в формате JSON или XML, с возможностью восстановления состояния после перезапуска программы. Напишите тесты для каждого метода, включая тесты на обработку исключений и случайные события. Создайте текстовый интерфейс для взаимодействия с пользователем, позволяющий управлять состоянием объектов, их взаимодействиями и сохранением, а также предоставляющий возможность настраивать параметры симуляции, такие как частота событий и максимальные значения для жизней, энергии и счастья.
В качестве дополнительного задания, реализуйте возможность создания и управления несколькими экземплярами `CatDog`, что позволит пользователю наблюдать за динамикой взаимодействия в рамках одной экосистемы.
#ifndef ECOSYSTEM_H
#define ECOSYSTEM_H
#include <iostream>
#include <string>
#include <stdexcept>
#include <random>
#include <fstream>
#include <nlohmann/json.hpp>
// Базовый класс Cat
class Cat {
private:
std::string name;
int age;
int lives;
int energy;
int happiness;
public:
Cat(std::string name, int age, int lives = 9, int energy = 100, int happiness = 50);
void meow();
void play();
void restoreLives();
void interactWithDog();
std::string getInfo() const;
nlohmann::json toJSON() const;
void fromJSON(const nlohmann::json& j);
// Геттеры и сеттеры для проверки состояния
int getEnergy() const { return energy; }
int getHappiness() const { return happiness; }
void modifyEnergy(int delta);
void modifyHappiness(int delta);
};
// Базовый класс Dog
class Dog {
private:
std::string name;
int age;
std::string breed;
int loyalty;
int energy;
public:
Dog(std::string name, int age, std::string breed, int loyalty = 50, int energy = 100);
void bark();
void fetch();
void interactWithCat();
std::string getInfo() const;
nlohmann::json toJSON() const;
void fromJSON(const nlohmann::json& j);
// Геттеры и сеттеры для проверки состояния
int getLoyalty() const { return loyalty; }
void modifyLoyalty(int delta);
int getEnergy() const { return energy; }
void modifyEnergy(int delta);
};
// Класс CatDog
class CatDog {
private:
Cat cat;
Dog dog;
int experience;
public:
CatDog(Cat cat, Dog dog, int experience = 0);
void merge();
void split();
void playTogether();
std::string getInfo() const;
nlohmann::json toJSON() const;
void fromJSON(const nlohmann::json& j);
int getExperience() const { return experience; }
};
// Функции для работы с событиями
void generateRandomEvent(Cat& cat, Dog& dog);
#endif // ECOSYSTEM_H