Advertisement
viktarb

Война

Oct 24th, 2023 (edited)
797
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.35 KB | Gaming | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.CompilerServices;
  5.  
  6. class Program
  7. {
  8.     static void Main(string[] args)
  9.     {
  10.         BattelField battelField = new BattelField();
  11.         battelField.Game();
  12.     }
  13. }
  14.  
  15. class BattelField
  16. {
  17.     private List<Warrior> _defaultWarriors = new List<Warrior>();
  18.  
  19.     public BattelField()
  20.     {
  21.         FillDefaultWarriors();
  22.     }
  23.  
  24.     public void Game()
  25.     {
  26.         Squad firstSquad;
  27.         Squad secondSquad;
  28.         string squadName;
  29.         bool isEndFight = false;
  30.  
  31.         Console.WriteLine("\tДобро пожаловать на войну \"Team Fortress 2\".");
  32.  
  33.         Console.Write("\nВведи как называется первое отделение? ");
  34.         squadName = Console.ReadLine();
  35.         firstSquad = CreateSquad(squadName);
  36.  
  37.         Console.Write("\nВведи как называется второе отделение? ");
  38.         squadName = Console.ReadLine();
  39.         secondSquad = CreateSquad(squadName);
  40.  
  41.         Console.WriteLine("Бой начинается!\n");
  42.         System.Threading.Thread.Sleep(1000);
  43.  
  44.         while (isEndFight == false)
  45.         {
  46.             StartFight(firstSquad, secondSquad);
  47.  
  48.             if (firstSquad.IsAlive == false && secondSquad.IsAlive == false)
  49.                 isEndFight = true;
  50.         }
  51.  
  52.         TryPickingWinner(firstSquad, secondSquad);
  53.         Console.WriteLine("Игра завершена.");
  54.     }
  55.  
  56.         private void FillDefaultWarriors()
  57.     {
  58.         _defaultWarriors.Add(new Soldier("Солдат", 200, 50, 0.2f));
  59.         _defaultWarriors.Add(new HeavyWarrior("Хейви", 300, 25, 0.4f));
  60.         _defaultWarriors.Add(new Sniper("Снайпер", 125, 105, 0));
  61.         _defaultWarriors.Add(new Demoman("Демоман", 185, 70, 0.2f));
  62.         _defaultWarriors.Add(new Scout("Скаут", 125, 10, 0.4f));
  63.     }
  64.  
  65.     private Squad CreateSquad(string squadName)
  66.     {
  67.         int сountWarriors;
  68.         Warrior userSelectWarrior;
  69.  
  70.         Console.Write($"\nВыберите из каких солдатов будет состоять {squadName} отделение:");
  71.         userSelectWarrior = SelectWarrior();
  72.  
  73.         Console.Write($"\nСколько единиц будет в {squadName} отделении? ");
  74.         сountWarriors = SelectCount();
  75.  
  76.         return new Squad(userSelectWarrior, сountWarriors, squadName);
  77.     }
  78.  
  79.     private Warrior SelectWarrior()
  80.     {
  81.         bool isSelectWarrior = false;
  82.         Warrior selectWarrior = null;
  83.  
  84.         ShowAllWarriors();
  85.  
  86.         while (isSelectWarrior == false)
  87.         {
  88.             int.TryParse(Console.ReadLine(), out int userWarriorSellected);
  89.             isSelectWarrior = userWarriorSellected > 0 && userWarriorSellected <= _defaultWarriors.Count;
  90.  
  91.             if (isSelectWarrior)
  92.             {
  93.                 selectWarrior = _defaultWarriors[userWarriorSellected - 1];
  94.             }
  95.             else
  96.             {
  97.                 Console.Write("\aТакого бойца в списке нет, или нужно вводить число. Попробуйте еще раз: ");
  98.             }
  99.         }
  100.  
  101.         return new Warrior(selectWarrior.Name, selectWarrior.Health, selectWarrior.Damage, selectWarrior.Defence);
  102.     }
  103.  
  104.     private void ShowAllWarriors()
  105.     {
  106.         int counter = 1;
  107.         Console.WriteLine("\n  Список воинов:");
  108.  
  109.         foreach (Warrior warrior in _defaultWarriors)
  110.         {
  111.             Console.Write(counter + " ");
  112.             warrior.ShowStats();
  113.             counter++;
  114.         }
  115.     }
  116.  
  117.     private void TryPickingWinner(Squad firstSquad, Squad secondSquad)
  118.     {
  119.         if (firstSquad.IsAlive == false && secondSquad.IsAlive == false)
  120.         {
  121.             Console.WriteLine("Погибли оба отделения. Победителей нет.");
  122.         }
  123.         else if (firstSquad.IsAlive == false)
  124.         {
  125.             Console.WriteLine($"\nПобедил {secondSquad.Name}! Поздравляем победителя!");
  126.         }
  127.         else if (secondSquad.IsAlive == false)
  128.         {
  129.             Console.WriteLine($"\nПобедил {firstSquad.Name}! Поздравляем победителя!");
  130.         }
  131.     }
  132.  
  133.     private int SelectCount()
  134.     {
  135.         bool isCorrectInput = false;
  136.         int result = 0;
  137.  
  138.         while (isCorrectInput == false)
  139.         {
  140.             isCorrectInput = int.TryParse(Console.ReadLine(), out result);
  141.  
  142.             if (result <= 0)
  143.             {
  144.                 isCorrectInput = false;
  145.                 Console.WriteLine("\aВведите положительное число!");
  146.             }
  147.         }
  148.  
  149.         return result;
  150.     }
  151.  
  152.     private void StartFight(Squad firstSquad, Squad secondSquad)
  153.     {
  154.         firstSquad.Attack(secondSquad);
  155.         secondSquad.Attack(firstSquad);
  156.  
  157.         firstSquad.TryRemoveDeadSoldiers();
  158.         secondSquad.TryRemoveDeadSoldiers();
  159.  
  160.         firstSquad.ShowCountWarrior();
  161.         secondSquad.ShowCountWarrior();
  162.  
  163.         System.Threading.Thread.Sleep(100);
  164.         Console.WriteLine();
  165.     }
  166. }
  167.  
  168. class Warrior
  169. {
  170.     private Random _random = new Random();
  171.  
  172.     public Warrior(string name, int health, int damage, float defence)
  173.     {
  174.         Name = name;
  175.         Health = health;
  176.         Damage = damage;
  177.         Defence = defence;
  178.     }
  179.  
  180.     public string Name { get; protected set; }
  181.     public int Health { get; protected set; }
  182.     public int Damage { get; protected set; }
  183.     public float Defence { get; protected set; }
  184.  
  185.     public virtual void TakeDamage(int damage)
  186.     {
  187.         if ((damage - Defence) > 0)
  188.             Health -= damage * Convert.ToInt32((1 - Defence));
  189.     }
  190.  
  191.     public virtual void Attack(Warrior entity)
  192.     {
  193.         entity.TakeDamage(Damage);
  194.     }
  195.  
  196.     public void ShowCurrentHealth()
  197.     {
  198.         Console.WriteLine($"{Name} здоровье: {Health}");
  199.     }
  200.  
  201.     public void ShowStats()
  202.     {
  203.         Console.WriteLine($"{Name}: Здоровье - {Health}, Урон - {Damage}, Броня - {Defence}");
  204.     }
  205.  
  206.     protected bool CanToUseSkill(int deltaChanceSuccess = 0)
  207.     {
  208.         int minimumValue = 0;
  209.         int maximumValue = 101;
  210.         int defaultChanceSuccess = 20;
  211.  
  212.         return _random.Next(minimumValue, maximumValue) <= defaultChanceSuccess + deltaChanceSuccess;
  213.     }
  214. }
  215.  
  216. class Soldier : Warrior
  217. {
  218.     public Soldier(string name, int health, int damage, float defence) : base(name, health, damage, defence) { }
  219.  
  220.     public override void Attack(Warrior warrior)
  221.     {
  222.         float multiplyingFactor = 2.5F;
  223.         int deltaChanceSuccess = 10;
  224.         int takeDamageFromYourShots = 50;
  225.  
  226.         if (CanToUseSkill(deltaChanceSuccess))
  227.         {
  228.             warrior.TakeDamage(Convert.ToInt32(Damage * multiplyingFactor));
  229.             Health -= takeDamageFromYourShots;
  230.         }
  231.         else
  232.         {
  233.             base.Attack(warrior);
  234.         }
  235.     }
  236. }
  237.  
  238. class HeavyWarrior : Warrior
  239. {
  240.     public HeavyWarrior(string name, int health, int damage, float defence) : base(name, health, damage, defence) { }
  241.  
  242.     public override void Attack(Warrior warrior)
  243.     {
  244.         int defaultChanceSuccess = -10;
  245.         int recoveryHealth = 50;
  246.  
  247.         if (CanToUseSkill(defaultChanceSuccess))
  248.             Health += recoveryHealth;
  249.  
  250.         base.Attack(warrior);
  251.     }
  252. }
  253.  
  254. class Sniper : Warrior
  255. {
  256.     public Sniper(string name, int health, int damage, float defence) : base(name, health, damage, defence) { }
  257.  
  258.     public override void Attack(Warrior warrior)
  259.     {
  260.         float multiplyingFactor = 1.8F;
  261.         int deltaChanceSuccess = 5;
  262.  
  263.         if (CanToUseSkill(deltaChanceSuccess))
  264.             warrior.TakeDamage(Convert.ToInt32(Damage * multiplyingFactor));
  265.         else
  266.             base.Attack(warrior);
  267.     }
  268. }
  269.  
  270. class Demoman : Warrior
  271. {
  272.     private int _gunReloading;
  273.  
  274.     public Demoman(string name, int health, int damage, float defence, int _gunReloading = 0) : base(name, health, damage, defence) { }
  275.  
  276.     public override void Attack(Warrior warrior)
  277.     {
  278.         int deltaChanceSuccess = 30;
  279.         int coldownGunReloadingInTurns = 3;
  280.  
  281.         if (_gunReloading > 0)
  282.             _gunReloading--;
  283.  
  284.         if (CanToUseSkill(deltaChanceSuccess) && _gunReloading == 0)
  285.         {
  286.             warrior.TakeDamage(Damage);
  287.             warrior.TakeDamage(Damage);
  288.  
  289.             _gunReloading = coldownGunReloadingInTurns;
  290.         }
  291.         else
  292.         {
  293.             Console.WriteLine(Name + " не смог выстрелить, кроме того осталось еще " + _gunReloading + " ходов перезарядки.");
  294.         }
  295.     }
  296. }
  297.  
  298. class Scout : Warrior
  299. {
  300.     public Scout(string name, int health, int damage, float defence) : base(name, health, damage, defence) { }
  301.  
  302.     public override void TakeDamage(int damage)
  303.     {
  304.         int deltaChanceSuccess = 40;
  305.  
  306.         if (CanToUseSkill(deltaChanceSuccess))
  307.         {
  308.             Console.WriteLine(Name + " увернулся от удара.");
  309.         }
  310.         else
  311.         {
  312.             base.TakeDamage(damage);
  313.         }
  314.     }
  315. }
  316.  
  317. class Squad
  318. {
  319.     private Random _random = new Random();
  320.     private List<Warrior> _soldiers = new List<Warrior>();
  321.  
  322.     public Squad(Warrior warrior, int warriorsCount, string name)
  323.     {
  324.         Name = name;
  325.  
  326.         for (int i = 0; i < warriorsCount; i++)
  327.         {
  328.             _soldiers.Add(new Warrior(warrior.Name, warrior.Health, warrior.Damage, warrior.Defence));
  329.         }
  330.     }
  331.  
  332.     public string Name { get; private set; }
  333.     public bool IsAlive
  334.     {
  335.         get
  336.         {
  337.             return _soldiers.Count > 0;
  338.         }
  339.     }
  340.  
  341.     public Warrior GetWarrior()
  342.     {
  343.         return _soldiers[_random.Next(0, _soldiers.Count())];
  344.     }
  345.  
  346.     public void Attack(Squad enemy)
  347.     {
  348.         GetWarrior().Attack(enemy.GetWarrior());
  349.     }
  350.  
  351.     public void TryRemoveDeadSoldiers()
  352.     {
  353.         for (int i = _soldiers.Count - 1; i >= 0; i--)
  354.         {
  355.             if (_soldiers[i].Health <= 0)
  356.             {
  357.                 _soldiers.RemoveAt(i);
  358.                 i--;
  359.             }
  360.         }
  361.     }
  362.  
  363.     public void ShowCountWarrior()
  364.     {
  365.         Console.WriteLine($"Количество бойцов в отделении {Name}: {_soldiers.Count()} ");
  366.     }
  367. }
Tags: ijunior
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement