SHOW:
|
|
- or go back to the newest paste.
| 1 | using System; | |
| 2 | using System.Collections.Generic; | |
| 3 | ||
| 4 | namespace C_sharp_Light | |
| 5 | {
| |
| 6 | class Program | |
| 7 | - | static void Main(string[] args) |
| 7 | + | |
| 8 | public static void Main() | |
| 9 | - | |
| 9 | + | |
| 10 | new Battlefield(new Platoon("Взвод 1"), new Platoon("Взвод 2")).Work();
| |
| 11 | } | |
| 12 | } | |
| 13 | ||
| 14 | public static class RandomStatic | |
| 15 | {
| |
| 16 | static private Random _rand = new Random(); | |
| 17 | static public int GetNext(int min, int max) | |
| 18 | {
| |
| 19 | return _rand.Next(min, max); | |
| 20 | } | |
| 21 | } | |
| 22 | public static class Messager | |
| 23 | {
| |
| 24 | static public void ShowMessageWithColor(string message, ConsoleColor color, bool delay) | |
| 25 | {
| |
| 26 | ConsoleColor defaultColor = Console.ForegroundColor; | |
| 27 | Console.ForegroundColor = color; | |
| 28 | Console.WriteLine(message); | |
| 29 | Console.ForegroundColor = defaultColor; | |
| 30 | if (delay) | |
| 31 | Console.ReadKey(); | |
| 32 | } | |
| 33 | } | |
| 34 | ||
| 35 | class Battlefield | |
| 36 | {
| |
| 37 | private Platoon _side1; | |
| 38 | private Platoon _side2; | |
| 39 | public Battlefield(Platoon platoon1, Platoon platoon2) | |
| 40 | {
| |
| 41 | _side1 = platoon1; | |
| 42 | _side2 = platoon2; | |
| 43 | } | |
| 44 | public void Work() | |
| 45 | {
| |
| 46 | while (_side1.CheckCombatСapability() && _side2.CheckCombatСapability()) | |
| 47 | {
| |
| 48 | Console.Clear(); | |
| 49 | ||
| 50 | _side1.Attack(_side2); | |
| 51 | if (!(_side1.CheckCombatСapability() && _side2.CheckCombatСapability())) | |
| 52 | break; | |
| 53 | _side2.Attack(_side1); | |
| 54 | ||
| 55 | _side1.ShowInfo(); | |
| 56 | _side2.ShowInfo(); | |
| 57 | ||
| 58 | Console.ReadKey(); | |
| 59 | } | |
| 60 | Console.Clear(); | |
| 61 | ||
| 62 | if (!_side1.CheckCombatСapability() && _side2.CheckCombatСapability()) | |
| 63 | {
| |
| 64 | Messager.ShowMessageWithColor($"{_side2.Name} - Выиграл", ConsoleColor.Green, false);
| |
| 65 | Messager.ShowMessageWithColor($"{_side1.Name} - Проиграл", ConsoleColor.Red, false);
| |
| 66 | } | |
| 67 | else if (_side1.CheckCombatСapability() && !_side2.CheckCombatСapability()) | |
| 68 | {
| |
| 69 | Messager.ShowMessageWithColor($"{_side1.Name} - Выиграл", ConsoleColor.Green, false);
| |
| 70 | Messager.ShowMessageWithColor($"{_side2.Name} - Проиграл", ConsoleColor.Red, false);
| |
| 71 | } | |
| 72 | ||
| 73 | _side1.ShowInfo(); | |
| 74 | _side2.ShowInfo(); | |
| 75 | Console.ReadKey(); | |
| 76 | } | |
| 77 | } | |
| 78 | class Platoon | |
| 79 | {
| |
| 80 | private List<Soldier> _soldiers = new List<Soldier>(); | |
| 81 | private List<Soldier> _deadSoldiers = new List<Soldier>(); | |
| 82 | public string Name { get; private set; }
| |
| 83 | public Platoon(string name) | |
| 84 | {
| |
| 85 | Name = name; | |
| 86 | for (int i = 0; i < 20; i++) | |
| 87 | {
| |
| 88 | int chance = RandomStatic.GetNext(0, 101); | |
| 89 | if (chance <= 35) | |
| 90 | _soldiers.Add(new Guner(i, Name)); | |
| 91 | else if (chance <= 65) | |
| 92 | _soldiers.Add(new Autoguner(i, Name)); | |
| 93 | else if (chance <= 85) | |
| 94 | _soldiers.Add(new Sniper(i, Name)); | |
| 95 | else | |
| 96 | _soldiers.Add(new RPG(i, Name)); | |
| 97 | } | |
| 98 | } | |
| 99 | public Soldier GetRandomSoldier() | |
| 100 | {
| |
| 101 | if (_soldiers.Count > 0) | |
| 102 | return _soldiers[RandomStatic.GetNext(0, _soldiers.Count)]; | |
| 103 | else | |
| 104 | return null; | |
| 105 | } | |
| 106 | public void ShowInfo() | |
| 107 | {
| |
| 108 | ConsoleColor colorOfHp; | |
| 109 | ConsoleColor defaultColor = ConsoleColor.White; | |
| 110 | Console.WriteLine("\nВзвод: " + Name);
| |
| 111 | for (int i = 0; i < _soldiers.Count; i++) | |
| 112 | {
| |
| 113 | char symbolSoldier = _soldiers[i].GetCharInfo(out colorOfHp); | |
| 114 | Console.ForegroundColor = colorOfHp; | |
| 115 | Console.Write($"{_soldiers[i].Id}:{symbolSoldier} | ");
| |
| 116 | Console.ForegroundColor = defaultColor; | |
| 117 | } | |
| 118 | for (int i = 0; i < _deadSoldiers.Count; i++) | |
| 119 | {
| |
| 120 | char symbolSoldier = _deadSoldiers[i].GetCharInfo(out colorOfHp); | |
| 121 | Console.ForegroundColor = colorOfHp; | |
| 122 | Console.Write($"{_deadSoldiers[i].Id}:{symbolSoldier} | ");
| |
| 123 | Console.ForegroundColor = defaultColor; | |
| 124 | } | |
| 125 | Console.WriteLine(); | |
| 126 | } | |
| 127 | public void Attack(Platoon enemyPlatoon) | |
| 128 | {
| |
| 129 | MoveDeadBody(); | |
| 130 | GetRandomSoldier()?.Atack(enemyPlatoon); | |
| 131 | } | |
| 132 | public bool CheckCombatСapability() | |
| 133 | {
| |
| 134 | return _soldiers.Count > 0; | |
| 135 | } | |
| 136 | private void MoveDeadBody() | |
| 137 | {
| |
| 138 | for (int i = _soldiers.Count-1; i >= 0; i--) | |
| 139 | {
| |
| 140 | if (_soldiers[i].Hp <= 0) | |
| 141 | {
| |
| 142 | _deadSoldiers.Add(_soldiers[i]); | |
| 143 | _soldiers.RemoveAt(i); | |
| 144 | } | |
| 145 | } | |
| 146 | } | |
| 147 | } | |
| 148 | abstract class Soldier | |
| 149 | {
| |
| 150 | public int Hp { get; protected set; }
| |
| 151 | public int Armor { get; protected set; }
| |
| 152 | public int Id { get; private set; }
| |
| 153 | public bool Stealth { get; protected set; } = false;
| |
| 154 | public char Symbol { get; protected set; }
| |
| 155 | protected string NameMyPlatoon { get; private set; }
| |
| 156 | public Soldier(int id, string namePlatoon) | |
| 157 | {
| |
| 158 | Id = id; | |
| 159 | NameMyPlatoon = namePlatoon; | |
| 160 | Hp = 100; | |
| 161 | } | |
| 162 | abstract public void Atack(Platoon enemyPlatoon); | |
| 163 | public void TakeDamage(int damage) | |
| 164 | {
| |
| 165 | Hp -= GetRealTakeDamage(damage); | |
| 166 | } | |
| 167 | public int GetRealTakeDamage(int damage) | |
| 168 | {
| |
| 169 | int realDamage = damage - Armor * 5; | |
| 170 | if (Stealth) | |
| 171 | realDamage = (int)(realDamage * 0.75f); | |
| 172 | if (realDamage < 0) | |
| 173 | realDamage = 1; | |
| 174 | return realDamage; | |
| 175 | } | |
| 176 | public char GetCharInfo(out ConsoleColor color) | |
| 177 | {
| |
| 178 | if (Hp <= 0) | |
| 179 | color = ConsoleColor.DarkMagenta; | |
| 180 | else if (Hp < 25) | |
| 181 | color = ConsoleColor.Red; | |
| 182 | else if (Hp < 60) | |
| 183 | color = ConsoleColor.Yellow; | |
| 184 | else | |
| 185 | color = ConsoleColor.Green; | |
| 186 | return Symbol; | |
| 187 | } | |
| 188 | protected void ShowResultAttack(string typeSoldier, int damage, Soldier enemy) | |
| 189 | {
| |
| 190 | Console.WriteLine($"{typeSoldier} {Id}-{Symbol} от {NameMyPlatoon} Аттаковал - {enemy.Id}-{enemy.Symbol} на {enemy.GetRealTakeDamage(damage)}");
| |
| 191 | } | |
| 192 | } | |
| 193 | class RPG : Soldier | |
| 194 | {
| |
| 195 | public RPG(int id, string name) : base(id, name) | |
| 196 | {
| |
| 197 | Armor = 1; | |
| 198 | Stealth = false; | |
| 199 | Symbol = 'R'; | |
| 200 | } | |
| 201 | public override void Atack(Platoon enemyPlatoon) | |
| 202 | {
| |
| 203 | int amountTarget = RandomStatic.GetNext(3, 7); | |
| 204 | int damage = RandomStatic.GetNext(50, 80); | |
| 205 | for (int i = 0; i < amountTarget; i++) | |
| 206 | {
| |
| 207 | Soldier enemy = enemyPlatoon.GetRandomSoldier(); | |
| 208 | if (enemy != null) | |
| 209 | {
| |
| 210 | enemy.TakeDamage(damage); | |
| 211 | ShowResultAttack("Ракетчик", damage, enemy);
| |
| 212 | } | |
| 213 | } | |
| 214 | } | |
| 215 | } | |
| 216 | class Autoguner : Soldier | |
| 217 | {
| |
| 218 | public Autoguner(int id, string name) : base(id, name) | |
| 219 | {
| |
| 220 | Armor = 2; | |
| 221 | Stealth = false; | |
| 222 | Symbol = 'A'; | |
| 223 | } | |
| 224 | public override void Atack(Platoon enemyPlatoon) | |
| 225 | {
| |
| 226 | int amountTarger = RandomStatic.GetNext(0, 5); | |
| 227 | for (int i = 0; i < amountTarger; i++) | |
| 228 | {
| |
| 229 | Soldier enemy = enemyPlatoon.GetRandomSoldier(); | |
| 230 | int damage = RandomStatic.GetNext(40, 45); | |
| 231 | if (enemy != null) | |
| 232 | {
| |
| 233 | enemy.TakeDamage(damage); | |
| 234 | ShowResultAttack("Автоматчик", damage, enemy);
| |
| 235 | } | |
| 236 | } | |
| 237 | } | |
| 238 | } | |
| 239 | class Guner : Soldier | |
| 240 | {
| |
| 241 | public Guner(int id, string name) : base(id, name) | |
| 242 | {
| |
| 243 | Armor = 3; | |
| 244 | Stealth = false; | |
| 245 | Symbol = 'G'; | |
| 246 | } | |
| 247 | public override void Atack(Platoon enemyPlatoon) | |
| 248 | {
| |
| 249 | Soldier enemy = enemyPlatoon.GetRandomSoldier(); | |
| 250 | int damage = RandomStatic.GetNext(50, 55); | |
| 251 | if (enemy != null) | |
| 252 | {
| |
| 253 | enemy.TakeDamage(damage); | |
| 254 | ShowResultAttack("Стрелок", damage, enemy);
| |
| 255 | } | |
| 256 | } | |
| 257 | } | |
| 258 | class Sniper : Soldier | |
| 259 | {
| |
| 260 | public Sniper(int id, string name) : base(id, name) | |
| 261 | {
| |
| 262 | Armor = 0; | |
| 263 | Stealth = true; | |
| 264 | Symbol = 'S'; | |
| 265 | } | |
| 266 | public override void Atack(Platoon enemyPlatoon) | |
| 267 | {
| |
| 268 | Soldier enemy = enemyPlatoon.GetRandomSoldier(); | |
| 269 | int damage = 150; | |
| 270 | if (enemy != null) | |
| 271 | {
| |
| 272 | enemy.TakeDamage(damage); | |
| 273 | ShowResultAttack("Снайпер", damage, enemy);
| |
| 274 | } | |
| 275 | } | |
| 276 | } | |
| 277 | ||
| 278 | } |