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