Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <type_traits>
- #include <algorithm>
- using namespace std;
- class Weapon{
- private:
- double Range_A, Melee_A;
- public:
- virtual void MeleeDmg ( double ml){
- Melee_A = ml;
- }
- virtual void RangeDmg (double rng){
- Range_A = rng;
- }
- double GetRngDmg(){
- return Range_A;
- }
- double GetMlDmg(){
- return Melee_A;
- }
- };
- class Armor{
- private:
- double Range_P, Melee_P;
- public:
- virtual void RangePr (double rng){
- Range_P = rng;
- }
- virtual void MeleePr (double ml){
- Melee_P = ml;
- }
- double GetRngArm(){
- return Range_P;
- }
- double GetMlArm(){
- return Melee_P;
- }
- };
- class Race{
- private:
- double Max_Hp;
- public:
- virtual void SetHp(double hp){
- Max_Hp = hp;
- }
- double GetHp(){
- return Max_Hp;
- }
- };
- class Helmet: public Armor{
- public:
- Helmet(){
- MeleePr(25);
- RangePr(15);
- }
- ~Helmet() = default;
- };
- class Sword: public Weapon{
- public:
- Sword(){
- MeleeDmg(30);
- RangeDmg(0);
- }
- ~ Sword() = default;
- };
- class Orc: public Race{
- public:
- Orc(){
- SetHp(150);
- }
- ~Orc() = default;
- };
- template <class W, class A, class R>
- class Unit{
- private:
- static_assert(!is_base_of<W,Weapon>::value, "Weapons!");
- static_assert(!is_base_of<A,Armor>::value, "Armor!");
- static_assert(!is_base_of<R,Race>::value, "Race!");
- double max_hp, rng_dmg, rng_prt, ml_dmg, ml_prt;
- W weap;
- A arm;
- R race;
- public:
- Unit(){
- max_hp = race.GetHp();
- rng_dmg = weap.GetRngDmg();
- ml_dmg = weap.GetMlDmg();
- rng_prt = arm.GetRngArm();
- ml_prt = arm.GetMlArm();
- }
- double GetHp(){
- return max_hp;
- }
- double GetRangeAttack(){
- return rng_dmg;
- }
- double GetMeleeAttack(){
- return ml_dmg;
- }
- double GetRangeProtect(){
- return rng_prt;
- }
- double GetMeleeProtect(){
- return ml_prt;
- }
- void Attack(Unit& enemy){
- max_hp = max_hp - max(enemy.GetMeleeAttack() - ml_prt, double(0))
- - max(enemy.GetRangeAttack() - rng_prt, double(0));
- }
- };
- int main() {
- Unit<Sword, Helmet, Orc> unit1, unit2;
- std::cout << unit1.GetHp() << std::endl;
- unit1.Attack(unit2);
- cout << unit1.GetHp() << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement