View difference between Paste ID: AESvBhXx 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 CLight
5
{
6
    class Program
7-
        static void Main(string[] args)
7+
8
        public static void Main()
9-
            
9+
10
            List<Carriage> carriage = new List<Carriage>() {new Carriage(10, "Малый вагон"), new Carriage(20, "Средний вагон"), new Carriage(30, "Большой вагон") };
11
            Depo depo = new Depo(carriage);
12
            depo.Work();
13
        }
14
    }
15
    public static class RandomStatic
16
    {
17
        static private Random _rand = new Random();
18
        static public int GetNext(int min, int max)
19
        {
20
            return _rand.Next(min, max);
21
22
        }
23
    }
24
    public static class Messager
25
    {
26
        static public void ShowMessageWithColor(string message, ConsoleColor color, bool delay)
27
        {
28
            ConsoleColor defaultColor = Console.ForegroundColor;
29
            Console.ForegroundColor = color;
30
            Console.WriteLine(message);
31
            Console.ForegroundColor = defaultColor;
32
            if (delay)
33
                Console.ReadKey();
34
        }
35
    }
36
    class Depo
37
    {
38
        private List<Carriage> _availableCarriages;
39
        private Direction _direction;
40
        public Depo(List<Carriage> availableCarriages)
41
        {
42
            _availableCarriages = availableCarriages;
43
        }
44
        public void Work()
45
        {
46
            bool isOpen = true;
47
            int step = 0;
48
            while (isOpen)
49
            {
50
                Console.Clear();
51
                if(step == 0)
52
                {
53
                    Messager.ShowMessageWithColor("Ещё нет созданного направления. \n\n\n", ConsoleColor.White, false);
54
                    Console.WriteLine("Enter - Создать направление \nEsc - выход");
55
                    switch (Console.ReadKey().Key)
56
                    {
57
                        case ConsoleKey.Enter:
58
                            Messager.ShowMessageWithColor("Вы получили новое направление. Оформите его!", ConsoleColor.Green, true);
59
                            _direction = new Direction();
60
                            step = 1;
61
                            break;
62
                        case ConsoleKey.Escape:
63
                            isOpen = false;
64
                            break;
65
                    }
66
                }
67
                else if(step == 1)
68
                {
69
                    Messager.ShowMessageWithColor("Направление есть. \n\n\n", ConsoleColor.White, false);
70
                    Console.WriteLine("Enter - Создать поезд");
71
                    switch (Console.ReadKey().Key)
72
                    {
73
                        case ConsoleKey.Enter:
74
                            _direction.CreateTrain();
75
                            Messager.ShowMessageWithColor("Вы  создали поезд", ConsoleColor.Green, true);
76
                            step = 2;
77
                            break;
78
                    }
79
                }
80
                else if (step == 2)
81
                {
82
                    ShowInfo();
83
                    Messager.ShowMessageWithColor("\n\n\nМеню продажи билетов", ConsoleColor.White, false);
84
                    Console.WriteLine("Enter - Продать билеты");
85
                    switch (Console.ReadKey().Key)
86
                    {
87
                        case ConsoleKey.Enter:
88
                            _direction.SellTickets();
89
                            step = 3;
90
                            break;
91
                    }
92
                }
93
                else if (step == 3)
94
                {
95
                    ShowInfo();
96
                    Messager.ShowMessageWithColor("\n\nМеню создание вагонов поезда", ConsoleColor.White, false);
97
                    Console.WriteLine("Enter - создать вагоны поезда");
98
                    switch (Console.ReadKey().Key)
99
                    {
100
                        case ConsoleKey.Enter:
101
                            _direction.Train.FormTrain(_availableCarriages,_direction.Passenger);
102
                            Messager.ShowMessageWithColor("Вы сформировали состав", ConsoleColor.Green, true);
103
                            step = 4;
104
                            break;
105
                    }
106
                }
107
                else if (step == 4)
108
                {
109
                    ShowInfo();
110
                    Messager.ShowMessageWithColor("\n\n\nМеню запуска поезда", ConsoleColor.White, false);
111
                    Console.WriteLine("Enter - Запустить поезд");
112
                    switch (Console.ReadKey().Key)
113
                    {
114
                        case ConsoleKey.Enter:
115
                            _direction.Train.Start();
116
                            step = 0;
117
                            _direction = null;
118
                            break;
119
                        
120
                    }
121
                }
122
            }
123
        }
124
        private void ShowInfo()
125
        {
126
            Console.WriteLine($"Направление {_direction.DirectionFrom} - {_direction.DirectionTo}");
127
            Messager.ShowMessageWithColor($"Вагоны в составе", ConsoleColor.Yellow, false);
128
            Console.WriteLine(_direction.Train.GetInfoCarriage());
129
            Messager.ShowMessageWithColor($"Пассажиров/Доступных мест {_direction.Passenger}/{_direction.Train.GetAvailableSeats()}", ConsoleColor.White, false);
130
        }
131
    }
132
    class Direction
133
    {
134
        public int Passenger { get; private set; }
135
        public string DirectionFrom { get; private set; } = "";
136
        public string DirectionTo { get; private set; } = "";
137
        public Train Train { get; private set; }
138
        public Direction()
139
        {
140
            while (DirectionFrom == "" || DirectionTo == "")
141
            {
142
                Console.Clear();
143
                Messager.ShowMessageWithColor("Введите направление откуда: ", ConsoleColor.White, false);
144
                DirectionFrom = Console.ReadLine();
145
                Messager.ShowMessageWithColor("Введите направление куда: ", ConsoleColor.White, false);
146
                DirectionTo = Console.ReadLine();
147
                if (DirectionFrom == "" || DirectionTo == "")
148
                    Messager.ShowMessageWithColor("Было введено пустое направление. Введите ещё раз.", ConsoleColor.Red, true);
149
            }
150
        }
151
        public void CreateTrain()
152
        {
153
            Train = new Train();
154
        }
155
        public void SellTickets()
156
        {
157
            Passenger = RandomStatic.GetNext(50, 300);
158
            Messager.ShowMessageWithColor("Билет проданы", ConsoleColor.Green, true);
159
        }
160
    }
161
    class Train
162
    {
163
        
164
        private List<Carriage> _listCarriage = new List<Carriage>();
165
        public void Start()
166
        {
167
            Messager.ShowMessageWithColor("Поезд запущен!", ConsoleColor.Green, true);
168
        }
169
        public int GetAvailableSeats()
170
        {
171
            int result = 0;
172
            foreach (Carriage car in _listCarriage)
173
            {
174
                result += car.AmountPassengers;
175
            }
176
            return result;
177
        }
178
        public string GetInfoCarriage()
179
        {
180
            string result = "";
181
            for (int i = 0; i < _listCarriage.Count; i++)
182
            {
183
                result += $"{i}:{_listCarriage[i].Name}\n";
184
            }
185
            return result;
186
        }
187
        public void FormTrain(List<Carriage> typeCarriages, int amountPassenger)
188
        {
189
            typeCarriages.Sort(delegate (Carriage x, Carriage y)
190
            {
191
                if (x.AmountPassengers > y.AmountPassengers) return -1;
192
                else if (x.AmountPassengers < y.AmountPassengers) return 1;
193
                else return 0;
194
            });
195
            int index = 0;
196
            while (GetAvailableSeats() < amountPassenger)
197
            {
198
                if (typeCarriages[index].AmountPassengers <= amountPassenger - GetAvailableSeats())
199
                    _listCarriage.Add(typeCarriages[index]);
200
                else
201
                    index++;
202
                if (index >= typeCarriages.Count)
203
                    break;
204
            }
205
            if(amountPassenger-GetAvailableSeats()>0)
206
                _listCarriage.Add(typeCarriages[typeCarriages.Count - 1]);
207
        }
208
    }
209
    class Carriage
210
    {
211
        public string Name { get; private set; }
212
        public int AmountPassengers { get; private set; }
213
        public Carriage(int amountPassengers, string name)
214
        {
215
            AmountPassengers = amountPassengers;
216
            Name = name;
217
        }
218
    }
219
}