Є абстрактний клас CombatVehicle :
class CombatVehicle
{
private:
std::string type;
std::string model;
protected:
struct minMax
{
double min;
double max;
};
double health;
double last_damage;
double last_defence;
public:
CombatVehicle();
CombatVehicle(std::string type, std::string model, double health);
virtual ~CombatVehicle();
bool IsDestroyed() const{ return health <= 0; };
void ShowShortInfo() const { std::cout << " " << type << " : " << model << std::endl; };
virtual void ShowInfo(int X, int Y, HANDLE handle);
virtual double Attack() const = 0;
virtual void Defense(double damage) = 0;
std::string getType()const { return type;}
};
Від цього класу наслідуються нащадки Tank , ArmoredCar , AirDefenseVehicle....
lass Tank : public CombatVehicle
{
private:
double recharge_time;
double shot_acuracy;
double armor_thickness;
static constexpr minMax rtime { 1.5 , 2 };
static constexpr minMax acuracy { 2,3 };
static constexpr minMax thickness { 30,50 };
static constexpr minMax thealth { 1500,2000 };
static constexpr const char* models[5] { "M1A1 Abrams","Leopard","T-64BM Oplot","Merkava","Leclerc" };
public:
Tank();
Tank(std::string type, std::string model, double health, double recharge_time,double shot_acuracy,double armor_thickness);
void ShowInfo(int X, int Y,HANDLE handle) ;
double Attack() const { return (100 * shot_acuracy) / recharge_time; }
void Defense(double damage);
};
Існує клас Troops який містить армію техніки в масиві який заповнюється випадковим чином:
class Troops
{
private:
enum class VehicleType
{
Tank = 1,
ArmoredCar,
AirDefenseVehicle
};
static const size_t max_count = 10;
static const size_t min_count = 5;
std::string name;
int vehicles_count;
CombatVehicle** troops;
public:
Troops();
~Troops();
Troops(std::string name,int vehicles_count);
bool isVechicleExist() { return vehicles_count > 0; }
void show(int X, int Y, HANDLE handle) const;
CombatVehicle& getVehicle() { return *troops[vehicles_count - 1]; };
void dellCurentVehicle();
void v_show(int index,int prnt_index,int X, int Y, HANDLE handle) const;
};
Також існує клас Battle який створює дві армії (Troops які в свою чергу генерують випадковим чином екземпляри класів похідних від CombatVehicle тобто Tank і тд. і зберігають в масиві) і проводить битву двох армій беручи з кожної армії по одному екземпляру техніки ... і так до того моменту коли в одній з армій не закінчиться техніка.
class Battle
{
private:
Troops troops1;
Troops troops2;
int pause = 500;
bool rаund(CombatVehicle& veh1, CombatVehicle& veh2, HANDLE handle);
bool isDestroyed(CombatVehicle& veh, HANDLE handle , bool swich);
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
public:
Battle(std::string tr1name, std::string tr2name,int trvCount, int tr2vCount = 0);
void battleStart();
};
Саме про методи CombatVehicle& getVehicle() та bool rаund(CombatVehicle& veh1, CombatVehicle& veh2, HANDLE handle) було питання....
Все працює ... але виклик rаund(getVehicle(),getVehicle(),handle) ... якось...