fork download
  1. <?php
  2. header("Content-Type: text/plain; charset=utf-8");
  3.  
  4. define('FIRST', '1');
  5. define('SECOND', '2');
  6. define('THIRD', '3');
  7. $phrasesDodge = array(
  8. FIRST => 'наносит резкий удар, лезвие проходит в дюйме от шеи противника.',
  9. SECOND => 'делает ложный выпад и наносит неожиданный удар, но удача была в этот раз на стороне врага.',
  10. THIRD => 'издает победный клич и наносит мощный рубящий удар, цель удара чудом избежала чудовищного удара.'
  11. );
  12.  
  13.  
  14.  
  15.  
  16.  
  17. class Hero
  18. {
  19. public $name;
  20. public $health;
  21. public $armorLow;
  22. public $armorHigh;
  23. public $block;
  24. public $dodgeCrit;
  25. public $crit;
  26. public $attackLow;
  27. public $attackHigh;
  28. public $charisma;
  29. public $agility;
  30. public $skill;
  31. public $hitChance;
  32. public $doubleHit = 0;
  33. public $enemyBlock;
  34. public $enemyArmorLow;
  35. public $enemyArmorHigh;
  36. public $enemyName;
  37.  
  38. public function __construct($name, $attackLow, $attackHigh, $health, $armorLow, $armorHigh, $block, $dodgeCrit, $crit, $charisma, $agility, $skill)
  39. {
  40. $this->name = $name;
  41. $this->attackLow = $attackLow;
  42. $this->attackHigh = $attackHigh;
  43. $this->health = $health;
  44. $this->armorLow = $armorLow;
  45. $this->armorHigh = $armorHigh;
  46. $this->block = $block;
  47. $this->dodgeCrit = $dodgeCrit;
  48. $this->crit = $crit;
  49. $this->charisma = $charisma;
  50. $this->agility = $agility;
  51. $this->skill = $skill;
  52. }
  53. public function getAverageDmg() //средний урон персонажа
  54. {
  55. return mt_rand($this->attackLow, $this->attackHigh);
  56. }
  57. public function getAverageDmgReduction() //среднее число блокируемое доспехами урона
  58. {
  59. return mt_rand($this->enemyArmorLow, $this->enemyArmorHigh);
  60. }
  61. public function isDoubleAttack()
  62. {
  63. $roll = mt_rand(1, 100);
  64. if ($roll <= $this->doubleHit) {
  65. return 1;
  66. } else {
  67. return 0;
  68. }
  69. }
  70.  
  71. }
  72. class Game
  73. {
  74. public $heroes;
  75. public function __construct($heroFirst, $heroSecond)
  76. {
  77. $this->heroes[] = $heroFirst;
  78. $this->heroes[] = $heroSecond;
  79. }
  80. private function makeRoll()
  81. {
  82. return mt_rand(1, 100);
  83. }
  84.  
  85. private function makeOneHit($hero) //шанс на удар->блок->крит
  86. {
  87. global $phrasesDodge;
  88. if ($this->makeRoll() > $hero->hitChance) //true = промах
  89. {
  90. $roll = mt_rand(1, 3);
  91. echo "{$hero->name} {$phrasesDodge[$roll]} \n";
  92. return 0;
  93. }
  94. if ($this->makeRoll() < $hero->enemyBlock) //true = атака заблокирована
  95. {
  96. echo "{$hero->name} наносит удар, но вражеский щит блокирует атаку. \n";
  97. return 0;
  98. }
  99. if ($this->makeRoll() > $hero->crit) // true = простая атака
  100. {
  101. $dmg = $hero->getAverageDmg() - $hero->getAverageDmgReduction();
  102. echo "{$hero->name} наносит противнику удар равноценный $dmg единиц урона. \n";
  103. return $dmg;
  104. } else { //крит
  105. $dmg = $hero->getAverageDmg() * 2 - $hero->getAverageDmgReduction(); //урон х 2 за минусом поглощения
  106. echo "{$hero->name} производит атаку которая имеет критический эффект: противник теряет $dmg единиц здоровья \n";
  107. return $dmg;
  108. }
  109.  
  110. }
  111. private function makeOneRound()
  112. {
  113. $damage = array();
  114. foreach ($this->heroes as $number => $hero) {
  115. if ($hero->isDoubleAttack()) {
  116. $k = 2;
  117. } else {
  118. $k = 1;
  119. }
  120. for ($i = 1; $i <= $k; $i++) {
  121. $dmg = $this->makeOneHit($hero);
  122. if (!isset($damage[$number]))
  123. {
  124. $damage[$number] = 0;
  125. }
  126. $damage[$number] += $dmg;
  127. }
  128. }
  129. return $damage;
  130. }
  131.  
  132.  
  133.  
  134. private function fillNotFilledStrings() //присвоить героям шанс на вторую атаку и шанс на успешное попадание исходя из разницы в харизме
  135. {
  136. $charAbs = abs($this->heroes[0]->charisma - $this->heroes[1]->charisma);
  137. if ($charAbs > 100) {
  138. $charAbs = 100;
  139. }
  140. $charOne = $this->heroes[0]->charisma;
  141. $charTwo = $this->heroes[1]->charisma;
  142. if ($charOne > $charTwo) {
  143. $this->heroes[0]->doubleHit = $charAbs;
  144. } elseif ($charOne < $charTwo) {
  145. $this->heroes[1]->doubleHit = $charAbs;
  146. }
  147. // шанс на попадание
  148. $this->heroes[0]->hitChance = round(($this->heroes[0]->skill / ($this->heroes[1]->skill + $this->heroes[0]->agility)) * 100);
  149. $this->heroes[1]->hitChance = round(($this->heroes[1]->skill / ($this->heroes[0]->skill + $this->heroes[1]->agility)) * 100);
  150. //заполнение строки enemyBlock
  151. $this->heroes[0]->enemyBlock = $this->heroes[1]->block;
  152. $this->heroes[1]->enemyBlock = $this->heroes[0]->block;
  153. //заполнение строки поглощение урона броней
  154. $this->heroes[0]->enemyArmorLow = $this->heroes[1]->armorLow;
  155. $this->heroes[0]->enemyArmorHigh = $this->heroes[1]->armorHigh;
  156. $this->heroes[1]->enemyArmorLow = $this->heroes[0]->armorLow;
  157. $this->heroes[1]->enemyArmorHigh = $this->heroes[0]->armorHigh;
  158. //строка - имя врага
  159. $this->heroes[0]->enemyName = $this->heroes[1]->name;
  160. $this->heroes[1]->enemyName = $this->heroes[0]->name;
  161. }
  162.  
  163.  
  164. public function makeTwentyRounds()
  165. {
  166. $firstFullDmg = 0;
  167. $secondFullDmg = 0;
  168. $this->fillNotFilledStrings();
  169. $str = str_repeat('_', 42);
  170. for ($i = 1; $i <= 20; $i++) {
  171. echo "$i раунд: \n";
  172. $dmg = $this->makeOneRound();
  173. list($firstDamage, $secondDamage) = $dmg;
  174. if ($this->heroes[0]->health < $secondDamage) {
  175. $this->heroes[0]->health = 1;
  176. echo "{$this->heroes[0]->name} получает смертельное ранение.\n {$this->heroes[1]->name} побеждает в поединке.\n";
  177. return 1;
  178. }
  179. if ($this->heroes[1]->health < $firstDamage) {
  180. $this->heroes[1]->health = 1;
  181. echo "{$this->heroes[1]->name} получает смертельное ранение.\n {$this->heroes[0]->name} побеждает в поединке.\n";
  182. return 0;
  183. }
  184. $this->heroes[0]->health -= $secondDamage;
  185. $this->heroes[1]->health -= $firstDamage;
  186. $firstFullDmg += $firstDamage;
  187. $secondFullDmg += $secondDamage;
  188. echo $str."\n";
  189. }
  190. if ($firstFullDmg > $secondFullDmg) {
  191. echo "{$this->heroes[1]->name} падает на землю без сил. \n";
  192. echo "{$this->heroes[0]->name} побеждает. \n";
  193. return 0;
  194. } elseif ($firstFullDmg < $secondFullDmg) {
  195. echo "{$this->heroes[0]->name} падает на землю без сил. \n";
  196. echo "{$this->heroes[1]->name} побеждает. \n";
  197. return 1;
  198. } else {
  199. echo "Поединок заканчивается ничьей. \n";
  200. return 2;
  201. }
  202.  
  203. }
  204. }
  205. $hero1 = new Hero('DoctorS', 504, 563, 19520, 225, 276, 39, 25, 51, 1276, 890, 1182);
  206. $hero2 = new Hero('Demarest', 350, 397, 14275, 214, 261, 50, 25, 41, 775, 774, 928);
  207. /*
  208. $hero11 = new Hero('DoctorS', 504, 563, 19520, 225, 276, 39, 25, 51, 1276);
  209. $hero12 = new Hero('BkHitMan', 460, 515, 18919, 216, 264, 31, 23, 28, 1072);
  210. $game2 = new Game($hero11, $hero12);
  211.  
  212. echo "\n\n\n\n\n";
  213. $game2->makeTwentyRounds();
  214. $game->makeTwentyRounds();*/
  215. $game = new Game($hero1, $hero2);
  216. $game->makeTwentyRounds();
  217.  
Success #stdin #stdout 0.02s 24448KB
stdin
Standard input is empty
stdout
1 раунд: 
DoctorS наносит удар, но вражеский щит блокирует атаку. 
DoctorS наносит противнику удар равноценный 315 единиц урона. 
Demarest наносит удар, но вражеский щит блокирует атаку. 
__________________________________________
2 раунд: 
DoctorS наносит противнику удар равноценный 267 единиц урона. 
DoctorS производит атаку которая имеет критический эффект: противник теряет 869 единиц здоровья 
Demarest делает ложный выпад и наносит неожиданный удар, но удача была в этот раз на стороне врага. 
__________________________________________
3 раунд: 
DoctorS делает ложный выпад и наносит неожиданный удар, но удача была в этот раз на стороне врага. 
DoctorS наносит удар, но вражеский щит блокирует атаку. 
Demarest наносит противнику удар равноценный 117 единиц урона. 
__________________________________________
4 раунд: 
DoctorS наносит противнику удар равноценный 315 единиц урона. 
DoctorS производит атаку которая имеет критический эффект: противник теряет 905 единиц здоровья 
Demarest делает ложный выпад и наносит неожиданный удар, но удача была в этот раз на стороне врага. 
__________________________________________
5 раунд: 
DoctorS делает ложный выпад и наносит неожиданный удар, но удача была в этот раз на стороне врага. 
DoctorS наносит противнику удар равноценный 252 единиц урона. 
Demarest наносит резкий удар, лезвие проходит в дюйме от шеи противника. 
__________________________________________
6 раунд: 
DoctorS наносит удар, но вражеский щит блокирует атаку. 
DoctorS наносит удар, но вражеский щит блокирует атаку. 
Demarest наносит удар, но вражеский щит блокирует атаку. 
__________________________________________
7 раунд: 
DoctorS наносит удар, но вражеский щит блокирует атаку. 
DoctorS производит атаку которая имеет критический эффект: противник теряет 835 единиц здоровья 
Demarest наносит удар, но вражеский щит блокирует атаку. 
__________________________________________
8 раунд: 
DoctorS наносит удар, но вражеский щит блокирует атаку. 
DoctorS наносит резкий удар, лезвие проходит в дюйме от шеи противника. 
Demarest производит атаку которая имеет критический эффект: противник теряет 541 единиц здоровья 
__________________________________________
9 раунд: 
DoctorS делает ложный выпад и наносит неожиданный удар, но удача была в этот раз на стороне врага. 
DoctorS наносит удар, но вражеский щит блокирует атаку. 
Demarest наносит удар, но вражеский щит блокирует атаку. 
__________________________________________
10 раунд: 
DoctorS наносит противнику удар равноценный 297 единиц урона. 
DoctorS наносит удар, но вражеский щит блокирует атаку. 
Demarest делает ложный выпад и наносит неожиданный удар, но удача была в этот раз на стороне врага. 
__________________________________________
11 раунд: 
DoctorS наносит противнику удар равноценный 313 единиц урона. 
DoctorS производит атаку которая имеет критический эффект: противник теряет 872 единиц здоровья 
Demarest издает победный клич и наносит мощный рубящий удар, цель удара чудом избежала чудовищного удара. 
__________________________________________
12 раунд: 
DoctorS делает ложный выпад и наносит неожиданный удар, но удача была в этот раз на стороне врага. 
DoctorS наносит противнику удар равноценный 324 единиц урона. 
Demarest делает ложный выпад и наносит неожиданный удар, но удача была в этот раз на стороне врага. 
__________________________________________
13 раунд: 
DoctorS наносит противнику удар равноценный 321 единиц урона. 
DoctorS издает победный клич и наносит мощный рубящий удар, цель удара чудом избежала чудовищного удара. 
Demarest наносит резкий удар, лезвие проходит в дюйме от шеи противника. 
__________________________________________
14 раунд: 
DoctorS наносит удар, но вражеский щит блокирует атаку. 
DoctorS издает победный клич и наносит мощный рубящий удар, цель удара чудом избежала чудовищного удара. 
Demarest наносит резкий удар, лезвие проходит в дюйме от шеи противника. 
__________________________________________
15 раунд: 
DoctorS наносит удар, но вражеский щит блокирует атаку. 
DoctorS наносит удар, но вражеский щит блокирует атаку. 
Demarest наносит противнику удар равноценный 120 единиц урона. 
__________________________________________
16 раунд: 
DoctorS делает ложный выпад и наносит неожиданный удар, но удача была в этот раз на стороне врага. 
DoctorS наносит противнику удар равноценный 286 единиц урона. 
Demarest наносит удар, но вражеский щит блокирует атаку. 
__________________________________________
17 раунд: 
DoctorS издает победный клич и наносит мощный рубящий удар, цель удара чудом избежала чудовищного удара. 
DoctorS делает ложный выпад и наносит неожиданный удар, но удача была в этот раз на стороне врага. 
Demarest наносит удар, но вражеский щит блокирует атаку. 
__________________________________________
18 раунд: 
DoctorS производит атаку которая имеет критический эффект: противник теряет 836 единиц здоровья 
DoctorS наносит противнику удар равноценный 294 единиц урона. 
Demarest издает победный клич и наносит мощный рубящий удар, цель удара чудом избежала чудовищного удара. 
__________________________________________
19 раунд: 
DoctorS издает победный клич и наносит мощный рубящий удар, цель удара чудом избежала чудовищного удара. 
DoctorS наносит противнику удар равноценный 279 единиц урона. 
Demarest наносит противнику удар равноценный 135 единиц урона. 
__________________________________________
20 раунд: 
DoctorS наносит противнику удар равноценный 282 единиц урона. 
DoctorS делает ложный выпад и наносит неожиданный удар, но удача была в этот раз на стороне врага. 
Demarest производит атаку которая имеет критический эффект: противник теряет 438 единиц здоровья 
__________________________________________
Demarest падает на землю без сил. 
DoctorS побеждает.