SaNik74

gladiator fight

Aug 21st, 2024 (edited)
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.46 KB | None | 0 0
  1. using System.Security.Cryptography.X509Certificates;
  2.  
  3. namespace gladiator_fights
  4. {
  5. internal class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. Arena arena = new Arena();
  10.  
  11. arena.Work();
  12. }
  13. }
  14.  
  15. abstract class Fighter
  16. {
  17. public Fighter(int health, int damage, string name)
  18. {
  19. Health = health;
  20. Damage = damage;
  21. Name = name;
  22. }
  23.  
  24. public int Health { get; protected set; }
  25. public int Damage { get; protected set; }
  26. public string Name { get; protected set; }
  27.  
  28. virtual public void Attack(Fighter defenter)
  29. {
  30. defenter.TakeDamage(Damage);
  31. }
  32.  
  33. virtual public void TakeDamage(int damage)
  34. {
  35. if (damage >= 0)
  36. {
  37. Health -= damage;
  38. }
  39. }
  40.  
  41. abstract public Fighter Clone();
  42. }
  43.  
  44. class Healer : Fighter
  45. {
  46. private int _rageNeedForRegen;
  47. private int _rage;
  48.  
  49. public Healer() : base(150, 10, "Целитель")
  50. {
  51. _rage = 0;
  52. _rageNeedForRegen = 100;
  53. }
  54.  
  55. public override void TakeDamage(int damage)
  56. {
  57. if (damage >= 0)
  58. {
  59. Health -= damage;
  60.  
  61. RageRegen();
  62. Heal();
  63. }
  64. }
  65.  
  66. public override Fighter Clone()
  67. {
  68. return new Healer();
  69. }
  70.  
  71. private void RageRegen()
  72. {
  73. int maxPointOfRageRegen = 12;
  74. int minPointOfRageRegen = 7;
  75. int pointOfRageRegen = UserUnits.GenerateRandomNumber(minPointOfRageRegen, maxPointOfRageRegen);
  76.  
  77. _rage += pointOfRageRegen;
  78.  
  79. if (_rage > _rageNeedForRegen)
  80. {
  81. _rage = _rageNeedForRegen;
  82. }
  83. }
  84.  
  85. private void Heal()
  86. {
  87. int maxHealth = 150;
  88. int pointOfHeal = 50;
  89.  
  90. if (_rage == _rageNeedForRegen)
  91. {
  92. Health += pointOfHeal;
  93. _rage = 0;
  94. }
  95.  
  96. if (Health > maxHealth)
  97. {
  98. Health = maxHealth;
  99. }
  100. }
  101. }
  102.  
  103. class Dredevil : Fighter
  104. {
  105. private int _numberAttack;
  106. private int _numberForDoubleAttack;
  107.  
  108. public Dredevil() : base(150, 10, "Смельчак")
  109. {
  110. _numberAttack = 0;
  111. _numberForDoubleAttack = 3;
  112. }
  113.  
  114. public override void Attack(Fighter defender)
  115. {
  116. _numberAttack++;
  117.  
  118. if (_numberAttack == _numberForDoubleAttack)
  119. {
  120. defender.TakeDamage(Damage);
  121.  
  122. _numberAttack = 0;
  123. }
  124.  
  125. defender.TakeDamage(Damage);
  126. }
  127.  
  128. public override Fighter Clone()
  129. {
  130. return new Dredevil();
  131. }
  132. }
  133.  
  134. class LuckyGuy : Fighter
  135. {
  136. private int _numberForChanceDodge;
  137.  
  138. public LuckyGuy() : base(150, 10, "Проныра")
  139. {
  140. _numberForChanceDodge = 1;
  141. }
  142.  
  143. public override void TakeDamage(int damage)
  144. {
  145. if (CanDodge() == false)
  146. {
  147. Health -= damage;
  148. }
  149. }
  150.  
  151. public override Fighter Clone()
  152. {
  153. return new LuckyGuy();
  154. }
  155.  
  156. private bool CanDodge()
  157. {
  158. int minRandomNumber = 1;
  159. int maxRandomNumber = 11;
  160.  
  161. return _numberForChanceDodge == UserUnits.GenerateRandomNumber(minRandomNumber, maxRandomNumber);
  162. }
  163. }
  164.  
  165. class Warlock : Fighter
  166. {
  167. private int _manaNeedForFireBallAttack;
  168. private int _damageForFireBall;
  169. private int _mana;
  170. private int _manaRegen;
  171.  
  172. public Warlock() : base(150, 10, "Чернокнижник")
  173. {
  174. _manaNeedForFireBallAttack = 20;
  175. _damageForFireBall = 18;
  176. _mana = 100;
  177. _manaRegen = 15;
  178. }
  179.  
  180. public override void Attack(Fighter defender)
  181. {
  182. if (TryConsumeMana())
  183. {
  184. defender.TakeDamage(_damageForFireBall);
  185. _mana = -_damageForFireBall;
  186. }
  187. else
  188. {
  189. defender.TakeDamage(Damage);
  190. _mana += _manaRegen;
  191. }
  192. }
  193.  
  194. public override Fighter Clone()
  195. {
  196. return new Warlock();
  197. }
  198.  
  199. private bool TryConsumeMana()
  200. {
  201. return _mana >= _manaNeedForFireBallAttack;
  202. }
  203. }
  204.  
  205. class Knight : Fighter
  206. {
  207. private int _numberForCriticalAttack;
  208. private int _criticalAttack;
  209.  
  210. public Knight() : base(150, 10, "Рыцарь")
  211. {
  212. _numberForCriticalAttack = 1;
  213. _criticalAttack = Damage * 2;
  214. }
  215.  
  216. public override void Attack(Fighter defender)
  217. {
  218. if (IsChanseCriticalAttack())
  219. {
  220. defender.TakeDamage(_criticalAttack);
  221. }
  222. else
  223. {
  224. defender.TakeDamage(Damage);
  225. }
  226. }
  227.  
  228. public override Fighter Clone()
  229. {
  230. return new Knight();
  231. }
  232.  
  233. private bool IsChanseCriticalAttack()
  234. {
  235. int minRandomNumber = 1;
  236. int maxRandomNumber = 11;
  237.  
  238. return _numberForCriticalAttack == UserUnits.GenerateRandomNumber(minRandomNumber, maxRandomNumber);
  239. }
  240. }
  241.  
  242. class Arena
  243. {
  244. private List<Fighter> _fighters = new List<Fighter>();
  245.  
  246. public Arena()
  247. {
  248. _fighters.Add(new Healer());
  249. _fighters.Add(new Dredevil());
  250. _fighters.Add(new LuckyGuy());
  251. _fighters.Add(new Warlock());
  252. _fighters.Add(new Knight());
  253. }
  254.  
  255. public void Work()
  256. {
  257. Fighter fighterOne = null;
  258. Fighter fighterTwo = null;
  259.  
  260. ChooseFighter(out fighterOne);
  261. ChooseFighter(out fighterTwo);
  262.  
  263. Console.Clear();
  264.  
  265. Fight(fighterOne, fighterTwo);
  266.  
  267. IdentifyWinner(fighterOne, fighterTwo);
  268. }
  269.  
  270. private void Fight(Fighter fighterOne, Fighter fighterTwo)
  271. {
  272. while (fighterOne.Health > 0 && fighterTwo.Health > 0)
  273. {
  274. ShowInfo(fighterOne, fighterTwo);
  275.  
  276. fighterOne.Attack(fighterTwo);
  277.  
  278. if (fighterTwo.Health <= 0)
  279. {
  280. break;
  281. }
  282.  
  283. ShowInfo(fighterOne, fighterTwo);
  284.  
  285. fighterTwo.Attack(fighterOne);
  286. }
  287. }
  288.  
  289. private void IdentifyWinner(Fighter fighterOne, Fighter fighterTwo)
  290. {
  291. if (fighterOne.Health <= 0 && fighterTwo.Health <= 0)
  292. {
  293. Console.WriteLine("Оба игрока погибли. Ничья.");
  294. }
  295. else if (fighterOne.Health <= 0)
  296. {
  297. Console.WriteLine($"Игрок 2 {fighterTwo.Name} победил.");
  298. }
  299. else
  300. {
  301. Console.WriteLine($"Игрок 1 {fighterOne.Name} победил.");
  302. }
  303. }
  304.  
  305. private void ShowInfo(Fighter fighter, Fighter fighterTwo)
  306. {
  307. Console.WriteLine($"У 1 игрока {fighter.Name} осталось {fighter.Health} жизней.");
  308. Console.WriteLine($"У 2 игрока {fighterTwo.Name} осталось {fighterTwo.Health} жизней.");
  309. Console.ReadKey();
  310. Console.Clear();
  311. }
  312.  
  313. private void ChooseFighter(out Fighter fighter)
  314. {
  315. fighter = null;
  316.  
  317. while (fighter == null)
  318. {
  319. Console.WriteLine("Выберете бойца:");
  320.  
  321. ShowAllFighters();
  322.  
  323. int userInput = UserUnits.ReadNumber();
  324. int indexNeedFighter = userInput - 1;
  325.  
  326. if (indexNeedFighter >= 0 && indexNeedFighter < _fighters.Count)
  327. {
  328. fighter = _fighters[indexNeedFighter].Clone();
  329. Console.Clear();
  330. }
  331. else
  332. {
  333. Console.WriteLine("Вы ввели не верную команду.");
  334. Console.ReadKey();
  335. Console.Clear();
  336. }
  337. }
  338. }
  339.  
  340. private void ShowAllFighters()
  341. {
  342. int numberFigterInList = 1;
  343.  
  344. foreach (Fighter fighter in _fighters)
  345. {
  346. Console.WriteLine($"{numberFigterInList} {fighter.Name}");
  347. numberFigterInList++;
  348. }
  349. }
  350. }
  351.  
  352. class UserUnits
  353. {
  354. private static Random s_random = new Random();
  355.  
  356. public static int GenerateRandomNumber(int min, int max)
  357. {
  358. return s_random.Next(min, max);
  359. }
  360.  
  361. public static int ReadNumber()
  362. {
  363. bool isNumber = false;
  364. int result = 0;
  365.  
  366. while (isNumber == false)
  367. {
  368. isNumber = int.TryParse(Console.ReadLine(), out result);
  369. }
  370.  
  371. return result;
  372. }
  373. }
  374. }
  375.  
Advertisement
Add Comment
Please, Sign In to add comment