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.  
  31. public function isBlock() //прок блока
  32. {
  33. if ((mt_rand(1, 100)) < $this->block) {
  34. return 1;
  35. }
  36. return 0;
  37. }
  38. public function isCrit()
  39. {
  40. if ((mt_rand(1, 100)) < $this->crit) {
  41. return 1;
  42. }
  43. return 0;
  44. }
  45. public function makeDmg()
  46. {
  47. return mt_rand($this->attackLow, $this->attackHigh);
  48. }
  49. public function getDef()
  50. {
  51. return mt_rand($this->armorLow, $this->armorHigh);
  52. }
  53. public function getDmg($dmg)
  54. {
  55. if ($this->health <= $dmg) {
  56. $this->health = 1;
  57. } else {
  58. $this->health -= $dmg;
  59. }
  60. }
  61. public function isAlive()
  62. {
  63. if ($this->health == 1) {
  64. return false;
  65. }
  66. return true;
  67. }
  68. }
  69. class Game
  70. {
  71. public $firstHero;
  72. public $secondHero;
  73.  
  74. public function __construct($hero1, $hero2)
  75. {
  76. $this->firstHero = $hero1;
  77. $this->secondHero = $hero2;
  78. }
  79. public function makeAvoid(Hero $attacker, Hero $target)
  80. {
  81. $avoidAttackStat = $target->skill + $target->agility;
  82. $hitChance = round($attacker->skill * 100 / $avoidAttackStat);
  83. if ((mt_rand(1, 100)) < $hitChance) {
  84. return 1; // коефициент (1 если нет промаха) (уменние / (умение и ловкость врага)) умножается на основной урон
  85. }
  86. return 0;
  87. }
  88. public function getHit(Hero $attacker, Hero $target) // передача атакер и цели
  89. {
  90. $dmg = $attacker->makeDmg();
  91. $crit = 1; // коефициент крита умножаемый на основной урон в случае отсутcтвия крита
  92. if ($attacker->isCrit()) {
  93. $crit = 2; // -||- в случае крита
  94. }
  95. $def = $target->getDef();
  96. $block = 1; // коефициент блока умножаемый на основной урон (в случае отсутствие блока)
  97. $avoidCrit = $target->dodgeCrit;
  98. if ($target->isBlock()) {
  99. $block = 0; // -||- в случае успешного блока
  100. }
  101. if ($crit == 2 && (mt_rand(1, 100)) < $avoidCrit) // проверка на избежание крита
  102. {
  103. $crit = 1;
  104. }
  105. $dmg = ($dmg - $def) * $crit * $block * $this->makeAvoid($attacker, $target);
  106. $target->getDmg($dmg);
  107. }
  108. public function isDoubleHit(Hero $attacker, Hero $target) // $k - номер героя (0 либо 1)
  109. {
  110.  
  111. if ($attacker->charisma <= $target->charisma) {
  112. return false; // вернет 0 в случае если у нашего героя меньше либо столько же харизмы как у врага
  113. }
  114. $coef = $attacker->charisma - $target->charisma;
  115. if ((mt_rand(1, 100)) < $coef) {
  116. return true; // двойная атака
  117. } else {
  118. return false;
  119. }
  120. }
  121.  
  122. public function getRound(Hero $attacker, Hero $target)
  123. {
  124. $x = 0;
  125. $y = 0;
  126. if ($this->isDoubleHit($attacker, $target)) {
  127. $x = 1;
  128. }
  129. for ($i = 0; $i <= $x; $i++) {
  130. $this->getHit($attacker, $target);
  131. if (!($target->isAlive())) {
  132. return 1; // вернет 1 если первый убил второго героя
  133. }
  134. }
  135. if ($this->isDoubleHit($target, $attacker)) {
  136.  
  137. $y = 1;
  138. }
  139. for ($i = 0; $i <= $y; $i++) {
  140. $this->getHit($target, $attacker);
  141. if (!($attacker->isAlive())) {
  142. return 2; // вернет 2, если он убил первого героя
  143. }
  144. }
  145. return 3; // вернет 3 в случае если никто не умер
  146. }
  147. public function getGame()
  148. {
  149. $first = clone $this->firstHero;
  150. $second = clone $this->secondHero;
  151. for ($i = 1; $i <= 20; $i++) {
  152. $x = $this->getRound($first, $second);
  153. if ($x == 1) {
  154. return 1;
  155. } elseif ($x == 2) {
  156. return 2;
  157. }
  158. }
  159. $healthOne = $this->firstHero->health - $first->health;
  160. $healthTwo = $this->secondHero->health - $second->health;
  161. if ($healthOne < $healthTwo) {
  162. return 1; //победа первого
  163. } elseif ($healthOne > $healthTwo) {
  164. return 2; //победа второго
  165. } elseif ($healthOne == $healthTwo) {
  166. return 3; //ничья
  167. }
  168. }
  169. }
  170.  
  171. /*
  172. if($_POST['submit'])
  173. {
  174. if ($_POST['dmg1'] > $_POST['dmg2'] || $_POST['armorLow'] > $_POST['armorHigh'] || $_POST['dmg21'] > $_POST['dmg22'] || $_POST['armorLow1'] > $_POST['armorHigh2'])
  175. {
  176. echo "<HTML><HEAD>
  177. <META HTTP-EQUIV='Refresh' CONTENT='3; URL=http://localhost/php2/lessons/index.html'>
  178. </HEAD></HTML>";
  179. echo "Проверьте правильность заполненных данных";
  180. } else {
  181. $attackLow1 = (int)$_POST['dmg1'];
  182. $attackHigh1 = (int)$_POST['dmg2'];
  183. $hp1 = (int)$_POST['HP'];
  184. $armorLow1 = (int)$_POST['armorLow'];
  185. $armorHigh1 = (int)$_POST['armorHigh'];
  186. $block1 = (int)$_POST['block'];
  187. $dodgeCrit1 = (int)$_POST['critDodge'];
  188. $crit1 = (int)$_POST['crit'];
  189. $charisma1 = (int)$_POST['charisma'];
  190. $agility1 = (int)$_POST['agility'];
  191. $skill1 = (int)$_POST['skill'];
  192.  
  193. $attackLow2 = (int)$_POST['dmg21'];
  194. $attackHigh2 = (int)$_POST['dmg22'];
  195. $hp2 = (int)$_POST['HP2'];
  196. $armorLow2 = (int)$_POST['armorLow2'];
  197. $armorHigh2 = (int)$_POST['armorHigh2'];
  198. $block2 = (int)$_POST['block2'];
  199. $dodgeCrit2 = (int)$_POST['critDodge2'];
  200. $crit2 = (int)$_POST['crit2'];
  201. $charisma2 = (int)$_POST['charisma2'];
  202. $agility2 = (int)$_POST['agility2'];
  203. $skill2 = (int)$_POST['skill2'];
  204. $firstHero = new Hero ($attackLow1, $attackHigh1, $hp1, $armorLow1, $armorHigh1, $block1, $dodgeCrit1, $crit1, $charisma1, $agility1, $skill1);
  205. $secondHero = new Hero ($attackLow2, $attackHigh2, $hp2, $armorLow2, $armorHigh2, $block2, $dodgeCrit2, $crit2, $charisma2, $agility2, $skill2);
  206. $together = array ($firstHero, $secondHero);
  207. $game = new Game ($together);
  208. }
  209. }
  210. */
  211.  
  212. $hero1 = new Hero(504, 563, 11120, 225, 276, 39, 25, 51, 276, 890, 1182);
  213. $hero2 = new Hero(350, 397, 14275, 225, 227, 50, 25, 41, 775, 774, 928);
  214. $game = new Game($hero1, $hero2);
  215. $first = 0;
  216. $second = 0;
  217. $draw = 0;
  218. $k = 1000;
  219. for ($i = 1; $i <= $k; $i++) {
  220. $win = $game->getGame();
  221. if ($win == 1) {
  222. $first++;
  223. } elseif ($win == 2) {
  224. $second++;
  225. } elseif ($win == 3) {
  226. $draw++;
  227. }
  228. }
  229. $first = round((($first * 100) / $k), 2);
  230. $second = round((($second * 100) / $k), 2);
  231. $draw = round((($draw * 100) / $k), 2);
  232. echo "Вероятность победы: \n Первого героя: ";
  233. echo $first;
  234. echo "%\n Второго героя: ";
  235. echo $second;
  236. echo "%\n Ничья: ";
  237. echo $draw;
  238. echo "%\n";
  239.  
Success #stdin #stdout 0.53s 24400KB
stdin
Standard input is empty
stdout
Вероятность победы: 
 Первого героя: 85.3%
 Второго героя: 14.5%
 Ничья: 0.2%