Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Ariveder4i/9789a26e1926afb886a5050f92fa93db to your computer and use it in GitHub Desktop.
Save Ariveder4i/9789a26e1926afb886a5050f92fa93db to your computer and use it in GitHub Desktop.
ДЗ: Война # 4
using System;
using System.Collections.Generic;
namespace War
{
internal class Program
{
static void Main(string[] args)
{
War battlefield = new War();
battlefield.ShowPlatoon();
Console.WriteLine("Для начала боя нажмите любую клавишу!");
Console.ReadKey();
battlefield.InitiateBattle();
}
}
class War
{
private Platoon _firstPlatoon;
private Platoon _secondPlatoon;
public War()
{
GeneratePlatoons();
}
public void ShowPlatoon()
{
_firstPlatoon.ShowInfo();
_secondPlatoon.ShowInfo();
}
public void ShowWinner()
{
if (_firstPlatoon.IsAlive == false && _secondPlatoon.IsAlive == false)
Console.WriteLine("\nНичья");
else if (_firstPlatoon.IsAlive == false)
Console.WriteLine("\nПервый взвод победил!");
else
Console.WriteLine("\nВторой взвод победил!");
}
public void InitiateBattle()
{
while (_firstPlatoon.IsAlive && _secondPlatoon.IsAlive)
{
Console.WriteLine($"\nЧисло живых бойцов в первом взводе = {_firstPlatoon.Soldiers.Count}, во втором = {_secondPlatoon.Soldiers.Count}\n");
Console.WriteLine($"\nАтакует первый взвод!\n");
_firstPlatoon.Attack(_secondPlatoon.Soldiers);
Console.WriteLine($"\nАтакует второй взвод!\n");
_secondPlatoon.Attack(_firstPlatoon.Soldiers);
_firstPlatoon.RemoveSoldier();
_secondPlatoon.RemoveSoldier();
}
ShowWinner();
}
private void GeneratePlatoons()
{
PlatoonFactory factory = new PlatoonFactory();
_firstPlatoon = factory.CreatePlatoon("Первый взвод");
_secondPlatoon = factory.CreatePlatoon("Второй взвод");
}
}
class PlatoonFactory
{
public Platoon CreatePlatoon(string name)
{
Platoon platoon = new Platoon(name);
platoon.CreateUnit();
return platoon;
}
}
class Platoon
{
private List<Soldier> _soldiers;
public Platoon(string name)
{
Name = name;
_soldiers = new List<Soldier>();
}
public bool IsAlive => _soldiers.Count > 0;
public List<Soldier> Soldiers => new List<Soldier>(_soldiers);
public string Name { get; private set; }
public void RemoveSoldier()
{
for (int i = _soldiers.Count - 1; i >= 0; i--)
{
if (_soldiers[i].IsAlive == false)
_soldiers.RemoveAt(i);
}
}
public void AddSoldier(Soldier soldier)
{
_soldiers.Add(soldier);
}
public void Attack(List<Soldier> soldiers)
{
foreach (Soldier soldier in _soldiers)
{
if (soldiers.Count > 0)
{
soldier.Attack(soldiers);
}
}
}
public void ShowInfo()
{
Console.WriteLine($"\nВзвод {Name}:");
foreach (Soldier soldier in _soldiers)
{
soldier.ShowInfo();
}
}
public void CreateUnit()
{
List <Soldier> allTypesSoldiers = GetAllSoldiers();
for (int i = 0; i < allTypesSoldiers.Count; i++)
{
int randomIndexTypeSolders = UserUtils.Generate(0, allTypesSoldiers.Count);
_soldiers.Add(allTypesSoldiers[randomIndexTypeSolders]);
}
}
private List <Soldier> GetAllSoldiers()
{
List<Soldier> soldiers = new List<Soldier>();
soldiers.Add(new DefaultSoldier("Рядовой", 100, 30, 20));
soldiers.Add(new DamageFactorSoldier("Сержант", 100, 20, 20));
soldiers.Add(new SplashSoldier("Капитан", 100, 15, 15));
soldiers.Add(new RandomDamageAttackSoldier("Майор", 100, 20, 5));
return soldiers;
}
}
abstract class Soldier
{
protected Soldier(string name, int health, int damage, int armor)
{
Name = name;
Health = health;
Damage = damage;
Armor = armor;
}
public string Name { get; private set; }
public int Health { get; protected set; }
public int Armor { get; private set; }
public int Damage { get; private set; }
public void TakeDamage(int damage)
{
if (damage - Armor > Health)
{
Health = 0;
}
else
{
Health -= damage - Armor;
}
Console.WriteLine($"\n{Name} получает {damage} урона. Осталось здоровья - {Health}");
}
public bool IsAlive => Health > 0;
public virtual void Attack(List<Soldier> enemies)
{
Soldier target = enemies[UserUtils.Generate(0, enemies.Count)];
target.TakeDamage(Damage);
}
public void ShowInfo()
{
Console.WriteLine($"Боец - {Name}, здоровье = {Health}, броня = {Armor}. Максимальный урон = {Damage}");
}
}
class DefaultSoldier : Soldier
{
public DefaultSoldier(string name, int health, int damage, int armor) : base(name, health, damage, armor) { }
}
class DamageFactorSoldier : Soldier
{
public DamageFactorSoldier(string name, int health, int damage, int armor) : base(name, health, damage, armor) { }
public override void Attack(List<Soldier> enemies)
{
int damageFactor = 2;
Soldier target = enemies[UserUtils.Generate(0, enemies.Count)];
target.TakeDamage(Damage * damageFactor);
}
}
class SplashSoldier : Soldier
{
public SplashSoldier(string name, int health, int damage, int armor) : base(name, health, damage, armor) { }
public override void Attack(List<Soldier> enemies)
{
int numberOfTargets = 3;
if (enemies.Count > numberOfTargets)
{
List<Soldier> possibleTargets = new List<Soldier>(enemies);
for (int i = 0; i < numberOfTargets - 1; i++)
{
Soldier target = possibleTargets[UserUtils.Generate(0, possibleTargets.Count)];
target.TakeDamage(Damage);
possibleTargets.Remove(target);
}
}
}
}
class RandomDamageAttackSoldier : Soldier
{
public RandomDamageAttackSoldier(string name, int health, int damage, int armor) : base(name, health, damage, armor) { }
public override void Attack(List<Soldier> enemies)
{
int attacksCount = 2;
for (int i = 0; i < attacksCount; i++)
{
Soldier target = enemies[UserUtils.Generate(0, enemies.Count)];
target.TakeDamage(Damage);
}
}
}
static class UserUtils
{
private static Random s_random = new Random();
public static int Generate(int minValue, int maxValue)
{
return s_random.Next(minValue, maxValue);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment