View difference between Paste ID: S9hdtXZL and C26sWULh
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
}