SFML и C++ Уроки \ Разработка игр › Форумы › Логика игр › Реализация атаки и защиты › Ответ в теме: Реализация атаки и защиты
MatrixDeity, да пожалуйста 😉
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 |
/** * @brief The AbstractUnit class * Абстрактный класс объета со здоровьем, может получать урон в методе AbstractUnit::takeDamage() * сбособен нанести урон объекту передонному в качестве параметра метода AbstractUnit::atack() */ class AbstractUnit { protected: /** * @brief takeDamage абстрактный метод принимающий урон вызывается в методе класса AbstractUnit::atack() * @param damage уровень урона полученного объектом */ virtual void takeDamage(float damage) = 0; public: virtual ~AbstractUnit() {} /** * @brief getDamage абстрактный метод возращающий уровень урона нанесенного объектом * @return число характерезующее уровень урона */ virtual float getDamage() const = 0; /** * @brief atack метод наносящий урон объекту * @param object объект получающий урон */ void atack(AbstractUnit *object) const { object->takeDamage(getDamage()); } /** * @brief getHealthLevel метод возвращающий уровень здоровья объекта * @return число характеризующие уровень здоровья объекта */ virtual float getHealthLevel() const = 0; /** * @brief isLife метод проверяющий жив ли еще объект * @return true если жив, false если мертв */ bool isLife() const { return getHealthLevel() > 0.0; } }; /** * @brief The SimpleHealthedObject class * Простой класса реализующий интерфейс AbstractUnit содержит число характеризующее * уровень здоровья объекта. Весь полученный урон вычитается из здоровья объекта */ class AbstractSimpleHealthedUnit : public virtual AbstractUnit { float _health; public: /** * @brief SimpleHealthedObject конструкто устанавливающий уровень здоровья объекта * @param health число характеризующее уровень здороья объекта */ AbstractSimpleHealthedUnit(float health) : _health(health) {} protected: /** * @brief setHeath метод устанавливающий уровень здоровья * @param health число характеризующее уровень здороья объекта */ void setHeath(float health) { _health = health; } // AbstractHealthedObject interface protected: /** * @brief takeDamage метод принимающий урон полученный объектом, * весь полученный урон вычитается из здоровья объекта * @param damage уровень урона полученного объектом */ virtual void takeDamage(float damage) override { setHeath(getHealthLevel() - damage); } public: /** * @brief getHealthLevel метод возращающий уровень здоровья персонажа * @return */ virtual float getHealthLevel() const override { return _health; } }; /** * @brief The AbstractBasedDamageUnit class * Класс реализующий интерфейс AbstractUnit и умеющий равномерно распределенную атаку между minDamage и maxDamage */ class AbstractBasedDamageUnit : public virtual AbstractUnit { float _minDamage; float _maxDamage; static std::default_random_engine _engine; protected: /** * @brief setMaxDamage установить число максимально возможной атаки * @param maxDamage максимально возможная атака */ void setMaxDamage(float maxDamage) { _maxDamage = maxDamage; } /** * @brief setMinDamage установить число минимально возможной атаки * @param minDamage минимально возможная атаки */ void setMinDamage(float minDamage) { _minDamage = minDamage; } /** * @brief getRandomEngine метод возвращающий генератор случайных чисел * @return генератор случайных чисел */ std::default_random_engine& getRandomEngine() const { return _engine; } public: /** * @brief getMaxDamage метод возвращающий максимально возможную атаку * @return максимальная возможная атака */ float getMaxDamage() const { return _maxDamage; } /** * @brief getMinDamage метод возвращающий минимально возможную атаку * @return минимально возможная атака */ float getMinDamage() const { return _minDamage; } // AbstractDamagedObject interface public: AbstractBasedDamageUnit(float minDamage, float maxDamage): _minDamage(minDamage), _maxDamage(maxDamage) {} virtual ~AbstractBasedDamageUnit() {} /** * @brief getDamage метод возвращает число урона от атаки, формуриется как случайное число в * промежутке от [minDamage, maxDamage) * @return число урон от атаки */ virtual float getDamage() const override { std::uniform_real_distribution<float> randomDistribution(getMinDamage(), getMaxDamage()); return randomDistribution(getRandomEngine()); } }; std::default_random_engine AbstractBasedDamageUnit::_engine; /** * @brief The AbstractCriticalDamageUnit class * Класс реализующий возможность (с заданной вероятностью) выпадения критической атаки умножающий базовый * урон на множитель критической атаки */ class AbstractCriticalDamageUnit : public virtual AbstractBasedDamageUnit { float _criticalChance; float _damageMultiplier; protected: /** * @brief setCriticalChance метод устанавливающий вероятность выпадения критической атаки * @param chance вероятность выпадения критической атаки */ void setCriticalChance(float chance) { _criticalChance = chance; } /** * @brief setDamageMultiplier метод устанавливающий множитель урона при критической атаки * @param multiplier множитель урона */ void setDamageMultiplier(float multiplier) { _damageMultiplier = multiplier; } public: AbstractCriticalDamageUnit(float criticalChance, float damageMultiplier): _criticalChance(criticalChance), _damageMultiplier(damageMultiplier) {} virtual ~AbstractCriticalDamageUnit() {} /** * @brief getCriticalChance метод возвращающий вероятность выпадения критической атаки * @return вероятность критической атаки */ float getCriticalChance() const { return _criticalChance; } /** * @brief getCriticalDamageMultiplier метод возвращающий множитель критической атаки * @return множитель критической атаки */ float getCriticalDamageMultiplier() const { return _damageMultiplier; } // AbstractUnit interface public: /** * @brief getDamage метод возвращающий число урона от атаки, с заданной вероятностью * возможно умножение базового урона на множитель критической атаки * @return урон от атаки */ virtual float getDamage() const override { std::binomial_distribution<bool> random(1, _criticalChance); if(random(getRandomEngine())) { return AbstractBasedDamageUnit::getDamage() * getCriticalDamageMultiplier(); } return AbstractBasedDamageUnit::getDamage(); } }; class ExampleUnit : public AbstractSimpleHealthedUnit, AbstractCriticalDamageUnit { public: ExampleUnit() : AbstractBasedDamageUnit(20.0, 25.0), AbstractSimpleHealthedUnit(200.0), AbstractCriticalDamageUnit(0.2, 2.5) {} }; |