Created
May 26, 2025 04:55
-
-
Save Ariveder4i/9789a26e1926afb886a5050f92fa93db to your computer and use it in GitHub Desktop.
ДЗ: Война # 4
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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