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 isChance($attribute) //общая функция для крита и блока
  31. {
  32. if ((mt_rand(1, 100)) < $attribute) {
  33. return 1;
  34. }
  35. return 0;
  36. }
  37. public function getDmg()
  38. {
  39. return mt_rand($this->attackLow, $this->attackHigh);
  40. }
  41. public function getDef()
  42. {
  43. return mt_rand($this->armorLow, $this->armorHigh);
  44. }
  45.  
  46. }
  47. class Game
  48. {
  49. public $heroes = array();
  50. public $cloned = array();
  51. public function __construct($hero1, $hero2)
  52. {
  53. $this->heroes[] = $hero1;
  54. $this->heroes[] = $hero2;
  55. $hero12 = clone $hero1;
  56. $hero22 = clone $hero2;
  57. $this->cloned[] = $hero12;
  58. $this->cloned[] = $hero22;
  59. }
  60. public function getHit($k) // $k = 0 либо 1 (номер игрока который наносит урон)
  61. {
  62. foreach ($this->heroes as $number => $hero) {
  63. if ($number == $k) {
  64. $skill = $hero->skill;
  65. $dmg = $hero->getDmg();
  66. $crit = 1; // коефициент крита умножаемый на основной урон в случае отстутвия крита
  67. if ($hero->isChance($hero->crit)) {
  68. $crit = 2; // -||- в случае крита
  69. }
  70. } else {
  71. $def = $hero->getDef();
  72. $block = 1; // коефициент блока умножаемый на основной урон (в случае отсутствие блока)
  73. $avoidAttackStat = $hero->skill + $hero->agility;
  74. $avoidCrit = $hero->dodgeCrit;
  75. if ($hero->isChance($hero->block)) {
  76. $block = 0; // -||- в случае успешного блока
  77. }
  78. }
  79. }
  80. $hitChance = round($skill * 100 / $avoidAttackStat);
  81. $dodge = 0;
  82. if ((mt_rand(1, 100)) < $hitChance) {
  83. $dodge = 1; // коефициент промаха (уменние / (умение и ловкость врага)) умножается на основной урон
  84. }
  85. if ($crit == 2 && (mt_rand(1, 100)) < $avoidCrit) // проверка на избежание крита
  86. {
  87. $crit = 1;
  88.  
  89. }
  90. $dmg = ($dmg - $def) * $crit * $block * $dodge;
  91. return $dmg;
  92. }
  93. public function isDoubleHit($k) // $k - номер героя (0 либо 1)
  94. {
  95. foreach ($this->heroes as $number => $hero) {
  96. if ($number == $k) {
  97. $charMain = $hero->charisma;
  98. } else {
  99. $charEnemy = $hero->charisma;
  100. }
  101.  
  102. }
  103. if ($charMain < $charEnemy || $charMain == $charEnemy) {
  104. return 0; // вернет 0 в случае если у нашего героя меньше либо столько же харизмы как у врага
  105. }
  106. $coef = $charMain - $charEnemy;
  107. if ((mt_rand(1, 100)) < $coef) {
  108. return 1; // двойная атака
  109. } else {
  110. return 0;
  111. }
  112.  
  113. }
  114. public function isAlive($k, $dmg) //номер героя (0,1)
  115. {
  116. foreach ($this->heroes as $number => $hero) {
  117. if ($number != $k) {
  118. if ($hero->health <= $dmg) {
  119. $hero->health = 1;
  120. return;
  121. }
  122. $hero->health -= $dmg;
  123. }
  124.  
  125. }
  126.  
  127. }
  128. public function getRound()
  129. {
  130. for ($i = 0; $i <= 1; $i++) {
  131. if ($this->isDoubleHit($i)) {
  132. $dmg = $this->getHit($i) + $this->getHit($i);
  133. } else {
  134. $dmg = $this->getHit($i);
  135. }
  136. $this->isAlive($i, $dmg);
  137. }
  138. }
  139. public function getGame()
  140. {
  141. for ($i = 1; $i <= 20; $i++) {
  142. $this->getRound();
  143. }
  144. $health = array();
  145. foreach ($this->heroes as $number => $hero) {
  146. $health[$number] = $this->cloned[$number]->health - $hero->health;
  147. }
  148. list($healthOne, $healthTwo) = $health;
  149. $this->heroes = $this->cloned;
  150. if ($healthOne < $healthTwo) {
  151. return 0; //победа первого
  152. } elseif ($healthOne > $healthTwo) {
  153. return 1; //победа второго
  154. } elseif ($healthOne == $healthTwo) {
  155. return 2; //ничья
  156. }
  157. }
  158.  
  159. }
  160.  
  161. $hero1 = new Hero(504, 563, 19520, 225, 276, 39, 25, 51, 1276, 890, 1182);
  162. $hero2 = new Hero(350, 397, 14275, 25, 27, 50, 25, 41, 775, 774, 928);
  163. $game = new Game($hero1, $hero2);
  164. $k = 1000;
  165. $first = 0;
  166. $second = 0;
  167. $draw = 0;
  168.  
  169. for ($i = 1; $i <= $k; $i++) {
  170. $win = $game->getGame();
  171. if ($win == 0) {
  172. $first++;
  173. } elseif ($win == 1) {
  174. $second++;
  175. } elseif ($win == 2) {
  176. $draw++;
  177. }
  178. }
  179. echo $first;
  180. echo "\n";
  181. echo $second;
  182. echo "\n";
  183. echo $draw;
  184. echo "\n";
  185. $first = round((($first * 100) / $k), 2);
  186. $second = round((($second * 100) / $k), 2);
  187. $draw = round((($draw * 100) / $k), 2);
  188. echo $first;
  189. echo "\n";
  190. echo $second;
  191. echo "\n";
  192. echo $draw;
  193. echo "\n";
Success #stdin #stdout 0.55s 24448KB
stdin
Standard input is empty
stdout
1
0
999
0.1
0
99.9