fork download
  1. <?php
  2. header("Content-Type: text/plain; charset=utf-8");
  3. class Hero
  4. {
  5. public $health;
  6. public $armorLow;
  7. public $armorHigh;
  8. public $block;
  9. public $dodgeCrit;
  10. public $crit;
  11. public $attackLow;
  12. public $attackHigh;
  13. public $charisma;
  14. public $agility;
  15. public $skill;
  16. public function __construct($attackLow, $attackHigh, $health, $armorLow, $armorHigh, $block, $dodgeCrit, $crit, $charisma, $agility, $skill)
  17. {
  18. $this->attackLow = $attackLow;
  19. $this->attackHigh = $attackHigh;
  20. $this->health = $health;
  21. $this->armorLow = $armorLow;
  22. $this->armorHigh = $armorHigh;
  23. $this->block = $block;
  24. $this->dodgeCrit = $dodgeCrit;
  25. $this->crit = $crit;
  26. $this->charisma = $charisma;
  27. $this->agility = $agility;
  28. $this->skill = $skill;
  29. }
  30. public function __destruct()
  31. {
  32.  
  33. }
  34.  
  35. public function isBlock() //прок блока
  36. {
  37. if ((mt_rand(1, 100)) < $this->block) {
  38. return 1;
  39. }
  40. return 0;
  41. }
  42. public function isCrit()
  43. {
  44. if ((mt_rand(1, 100)) < $this->crit) {
  45. return 1;
  46. }
  47. return 0;
  48. }
  49. public function makeDmg()
  50. {
  51. return mt_rand($this->attackLow, $this->attackHigh);
  52. }
  53. public function getDef()
  54. {
  55. return mt_rand($this->armorLow, $this->armorHigh);
  56. }
  57. public function getDmg($dmg)
  58. {
  59. if ($this->health <= $dmg) {
  60. $this->health = 1;
  61. } else {
  62. $this->health -= $dmg;
  63. }
  64. }
  65. public function isAlive()
  66. {
  67. if ($this->health == 1) {
  68. return 0;
  69. }
  70. return 1;
  71. }
  72.  
  73. }
  74. class Game
  75. {
  76. public $heroes = array();
  77. public $cloned = array();
  78.  
  79. public function __construct($hero1, $hero2)
  80. {
  81. $this->heroes[] = $hero1;
  82. $this->heroes[] = $hero2;
  83. $this->cloned[] = clone $hero1;
  84. $this->cloned[] = clone $hero2;
  85. }
  86. public function getHit($attacker, $target) // передача атакер и цели
  87. {
  88.  
  89. $skill = $attacker->skill;
  90. $dmg = $attacker->makeDmg();
  91. $crit = 1; // коефициент крита умножаемый на основной урон в случае отстутвия крита
  92. if ($attacker->isCrit()) {
  93. $crit = 2; // -||- в случае крита
  94. }
  95.  
  96. $def = $target->getDef();
  97. $block = 1; // коефициент блока умножаемый на основной урон (в случае отсутствие блока)
  98. $avoidAttackStat = $target->skill + $target->agility;
  99. $avoidCrit = $target->dodgeCrit;
  100. if ($target->isBlock()) {
  101. $block = 0; // -||- в случае успешного блока
  102. }
  103.  
  104. $hitChance = round($skill * 100 / $avoidAttackStat);
  105. $dodge = 0;
  106. if ((mt_rand(1, 100)) < $hitChance) {
  107. $dodge = 1; // коефициент промаха (уменние / (умение и ловкость врага)) умножается на основной урон
  108. }
  109. if ($crit == 2 && (mt_rand(1, 100)) < $avoidCrit) // проверка на избежание крита
  110. {
  111. $crit = 1;
  112.  
  113. }
  114. $dmg = ($dmg - $def) * $crit * $block * $dodge;
  115. $target->getDmg($dmg);
  116. return $target->isAlive(); //вернет 1 если жив, и 0 если мертв
  117. }
  118. public function isDoubleHit($attacker, $target) // $k - номер героя (0 либо 1)
  119. {
  120.  
  121. if ($attacker->charisma <= $target->charisma) {
  122. return 0; // вернет 0 в случае если у нашего героя меньше либо столько же харизмы как у врага
  123. }
  124. $coef = $attacker->charisma - $target->charisma;
  125. if ((mt_rand(1, 100)) < $coef) {
  126. return 1; // двойная атака
  127. } else {
  128. return 0;
  129. }
  130.  
  131. }
  132.  
  133. public function getRound()
  134. {
  135. $x = 0;
  136. $y = 0;
  137.  
  138. foreach ($this->heroes as $number => $hero) {
  139. if ($number == 0) {
  140. $firstHero = $hero;
  141. } else {
  142. $secondHero = $hero;
  143. }
  144. }
  145. if ($this->isDoubleHit($firstHero, $secondHero)) {
  146.  
  147. $x = 1;
  148. }
  149. for ($i = 0; $i <= $x; $i++) {
  150. if (!($this->getHit($firstHero, $secondHero))) {
  151. return 1; // вернет 1 если первый убил второго героя
  152. }
  153. }
  154.  
  155.  
  156. if ($this->isDoubleHit($secondHero, $firstHero)) {
  157.  
  158. $y = 1;
  159. }
  160. for ($i = 0; $i <= $y; $i++) {
  161. if (!($this->getHit($secondHero, $firstHero))) {
  162. return 2; // вернет 2, если он убил первого героя
  163. }
  164. }
  165. return 3; // вернет 3 в случае если никто не умер
  166.  
  167.  
  168.  
  169. }
  170. public function getTwentyRounds()
  171. {
  172. for ($i = 1; $i <= 20; $i++) {
  173. $x = $this->getRound();
  174.  
  175. if ($x == 1) {
  176. return 1;
  177. } elseif ($x == 2) {
  178. return 2;
  179. }
  180. }
  181. $health = array();
  182. foreach ($this->heroes as $number => $hero) {
  183. $health[$number] = $this->cloned[$number]->health - $hero->health;
  184. }
  185. list($healthOne, $healthTwo) = $health;
  186. if ($healthOne < $healthTwo) {
  187. return 1; //победа первого
  188. } elseif ($healthOne > $healthTwo) {
  189. return 2; //победа второго
  190. } elseif ($healthOne == $healthTwo) {
  191. return 3; //ничья
  192. }
  193. }
  194. public function getGame()
  195. {
  196.  
  197. $x = $this->getTwentyRounds();
  198. foreach ($this->heroes as $number => $hero) {
  199. $hero->health = $this->cloned[$number]->health;
  200. }
  201.  
  202. return $x;
  203. }
  204.  
  205. }
  206.  
  207.  
  208. $hero1 = new Hero(504, 563, 520, 225, 276, 39, 25, 51, 1276, 890, 1182);
  209. $hero2 = new Hero(350, 397, 14275, 25, 27, 50, 25, 41, 775, 774, 928);
  210. $game = new Game($hero1, $hero2);
  211.  
  212.  
  213. $first = 0;
  214. $second = 0;
  215. $draw = 0;
  216. $k = 1000;
  217. for ($i = 1; $i <= $k; $i++) {
  218. $win = $game->getGame();
  219. if ($win == 1) {
  220. $first++;
  221. } elseif ($win == 2) {
  222. $second++;
  223. } elseif ($win == 3) {
  224. $draw++;
  225. }
  226. }
  227.  
  228. $first = round((($first * 100) / $k), 2);
  229. $second = round((($second * 100) / $k), 2);
  230. $draw = round((($draw * 100) / $k), 2);
  231. echo $first;
  232. echo "%\n";
  233. echo $second;
  234. echo "%\n";
  235. echo $draw;
  236. echo "%\n";
  237.  
Success #stdin #stdout 0.3s 24400KB
stdin
Standard input is empty
stdout
15.4%
84.6%
0%