#include #include // Библиотека веткоров #include // Для просчета шанса попадания using namespace std; class CTank { private: // Члены класса int m_Ammo; int m_HitChance; // Шанс в процентах 0 - 100% int m_EnemiesDown; bool m_wasHitTheTarget = false; // Присваивем false, т.к танк при создании еще не стрелял float m_Fuel; // Функция расчета удачног попадания bool randHitCalc() // Cоздаем в секции private , т.к пользовтель не должен иметь доступ к этой функции { static std::random_device rd; static std::mt19937 mersenne(rd()); if(mersenne() % 101 <= m_HitChance) //Удачное попадание return true; return false; }; public: // Списковая инициализация челнов класса с версии C++11 // То есть допустим m_Ammo(Ammo) после двоеточия присвоит значение переданное в конструтор // Члену класса m_Ammo CTank(int Ammo, int EnemiesDown, float Fuel, int HitChance): m_Ammo(Ammo), m_EnemiesDown(EnemiesDown), m_Fuel(Fuel), m_HitChance(HitChance){}; // Сеттеры или же методы для установки значения членов класса void setAmmo(int n) { m_Ammo = n; }; void setFuel(float n) { m_Fuel = n; }; void setEnemiesDown(int n) { m_EnemiesDown = n; }; void setHitChance(int n) { m_HitChance = n; }; // Геттеры или же методы для получения значения членов класса int getAmmo() { return m_Ammo; }; float getFuel() { return m_Fuel; }; int getEnemiesDown() { return m_EnemiesDown; }; int getHitChance() { return m_HitChance; }; //Выстрел void Shoot() { if(m_Ammo < 1) // Если нет патронов { cout << "No Ammo"<< endl; return; } m_Ammo--; // Уменьшаем патроны на 1; m_wasHitTheTarget = randHitCalc(); // Проверяем попали или нет } //Проверка на успех выстрела void wasShootSucceed() { if(m_wasHitTheTarget) { cout << "Perfect shoot" << endl; m_wasHitTheTarget = false; return; } cout << "Bad shoot" << endl; }; // Cимуляция движения танка void Move(float n) { if(m_Fuel < n) { cout << "Low Fuel" << endl; return; } m_Fuel -= n; }; //Получения состояния танка void Status() { cout << "Ammo: " << m_Ammo << endl; cout << "Hit Chance: " << m_HitChance << "%" << endl; cout << "Enemies Destroyed: " << m_EnemiesDown << endl; cout << "Fuel: " << m_Fuel << endl; }; CTank& operator=(const CTank &n) // Оператор присваивания { m_Ammo = n.m_Ammo; m_HitChance = n.m_HitChance; m_EnemiesDown = n.m_EnemiesDown; m_wasHitTheTarget = n.m_wasHitTheTarget; m_Fuel = n.m_Fuel; return *this; } CTank& operator+=(const CTank &n) // Оператор плюс равно { m_Fuel += n.m_Fuel; m_Ammo += n.m_Ammo; m_EnemiesDown += n.m_EnemiesDown; return *this; } CTank& operator-=(const CTank &n) // Оператор минус равно { m_Fuel -= (n.m_Fuel > m_Fuel ? m_Fuel : n.m_Fuel); // Если вычитаем больше чем есть, то устанавливаем 0 m_Ammo -= (n.m_Ammo > m_Ammo ? m_Ammo : n.m_Ammo); m_EnemiesDown -= (n.m_EnemiesDown > m_EnemiesDown ? m_EnemiesDown : n.m_EnemiesDown); return *this; } bool operator==(const CTank &n) //Операторы сравнения { return m_EnemiesDown == n.m_EnemiesDown; } bool operator>(const CTank &n) { return m_EnemiesDown > n.m_EnemiesDown; } friend std::ostream& operator<< (std::ostream &out, const CTank &n); // Дружественная функция для вывода friend std::istream& operator>> (std::istream &in, CTank &n); //Дружественная функция для ввода }; std::ostream& operator<< (std::ostream &out, const CTank &n) // Перегруженный Оператор вывода { out << "Ammo: " << n.m_Ammo << endl; out << "Hit Chance: " << n.m_HitChance << "%" << endl; out << "Enemies Destroyed: " << n.m_EnemiesDown << endl; out << "Fuel: " << n.m_Fuel << endl; return out; } std::istream& operator>> (std::istream &in, CTank &n) //Перегруженный оператор ввода { cout << "Введите количество патронов: "; in >> n.m_Ammo; cout << "Введите шанс попадания (0 - 100): "; in >> n.m_HitChance; cout << "Введите количество пораженных врагов: "; in >> n.m_EnemiesDown; cout << "Введите количство топлива:"; in >> n.m_Fuel; return in; } int main() { CTank Abrams(100, 5, 100, 50); CTank Abrams_2 = Abrams; // Присваивание Abrams_2.Status(); cout << endl; Abrams_2 += Abrams; Abrams_2.Status(); cout << endl; Abrams_2 -= Abrams; Abrams_2 -= Abrams; Abrams_2.Status(); cout << endl; cout << (Abrams_2 == Abrams) << endl; // Сравнение cout << (Abrams > Abrams_2) << endl; cout << Abrams_2 << endl; // Перегруженный вывод cin >> Abrams_2; //Перегруженный ввод Abrams_2.Status(); return 0; }