Advertisement
MaoChessy

Task 32

Nov 11th, 2020 (edited)
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace C_sharp_Light
  5. {
  6.     class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             List<Locomotive> locomotives = new List<Locomotive>()
  11.         {
  12.             new Locomotive("Паровой поезд"),
  13.             new Locomotive("Электро поезд"),
  14.             new Locomotive("Тягач")
  15.         };
  16.             List<Carriage> carriages = new List<Carriage>()
  17.             {
  18.             new Carriage(Passenger.FirstClass,10),
  19.             new Carriage(Passenger.SecondClass,20),
  20.             new Carriage(Passenger.ThirdClass,30)
  21.             };
  22.             Depo depo = new Depo(locomotives, carriages);
  23.             depo.Work();
  24.         }
  25.     }
  26.     public static class RandomStatic
  27.     {
  28.         static private Random _rand = new Random();
  29.  
  30.         static public int GetNext(int min, int max)
  31.         {
  32.             return _rand.Next(min, max);
  33.  
  34.         }
  35.         static public int GetNext(int max)
  36.         {
  37.             return _rand.Next(max);
  38.         }
  39.     }
  40.     public static class Messager
  41.     {
  42.         static public void ShowMessageWithColor(string message, ConsoleColor color, bool delay)
  43.         {
  44.             ConsoleColor defaultColor = Console.ForegroundColor;
  45.             Console.ForegroundColor = color;
  46.             Console.WriteLine(message);
  47.             Console.ForegroundColor = defaultColor;
  48.             if (delay)
  49.                 Console.ReadKey();
  50.         }
  51.     }
  52.     class Depo
  53.     {
  54.         private Train _train;
  55.         private List<Locomotive> _availableLocomotives;
  56.         private List<Carriage> _availableCarriages;
  57.  
  58.         public Depo(List<Locomotive> availableLocomotives, List<Carriage> availableCarriages)
  59.         {
  60.             _availableLocomotives = availableLocomotives;
  61.             _availableCarriages = availableCarriages;
  62.             CreateNewTrain();
  63.         }
  64.         public void Work()
  65.         {
  66.             bool isOpen = true;
  67.             while (isOpen)
  68.             {
  69.                 Console.Clear();
  70.                 ShowInfo();
  71.                 Console.SetCursorPosition(0, 13);
  72.                 Console.WriteLine("1 - Установить локомотив \n2 - удалить локомотив\n3 - Установить вагон \n4 - Удалить вагон\nEnter - Старт поезда\nESC - выход");
  73.                 ConsoleKeyInfo key = Console.ReadKey(true);
  74.                 switch (key.Key)
  75.                 {
  76.                     case ConsoleKey.D1:
  77.                         _train.AddLocomotive(_availableLocomotives);
  78.                         break;
  79.                     case ConsoleKey.D2:
  80.                         _train.RemoveLocomotive();
  81.                         break;
  82.                     case ConsoleKey.D3:
  83.                         _train.AddCarriage(_availableCarriages);
  84.                         break;
  85.                     case ConsoleKey.D4:
  86.                         _train.RemoveCarriage();
  87.                         break;
  88.                     case ConsoleKey.Enter:
  89.                         if (_train.Start())
  90.                         {
  91.                             Messager.ShowMessageWithColor("Хотите создать ещё одно направление? Y/N", ConsoleColor.White, false);
  92.                             switch (Console.ReadKey().Key)
  93.                             {
  94.                                 case ConsoleKey.Y:
  95.                                     CreateNewTrain();
  96.                                     break;
  97.                                 case ConsoleKey.N:
  98.                                     Messager.ShowMessageWithColor("Выходим из программы", ConsoleColor.White, true);
  99.                                     isOpen = false;
  100.                                     break;
  101.                             }
  102.                         }
  103.                         break;
  104.                     case ConsoleKey.Escape:
  105.                         isOpen = false;
  106.                         break;
  107.                 }
  108.             }
  109.         }
  110.         private void ShowInfo()
  111.         {
  112.             int xPositionOfMenuEditor = 0;
  113.             int xPositionOfTrain = 60;
  114.             ConsoleColor col;
  115.  
  116.             Console.SetCursorPosition(xPositionOfMenuEditor, 0);
  117.             Console.WriteLine("Доступно Локомотивов:");
  118.             for (int i = 0; i < _availableLocomotives.Count; i++)
  119.             {
  120.                 Messager.ShowMessageWithColor(i + ":" + _availableLocomotives[i].GetInfo(out col), col, false);
  121.             }
  122.             Console.Write("\nДоступно вагонов:\n");
  123.             for (int i = 0; i < _availableCarriages.Count; i++)
  124.             {
  125.                 Messager.ShowMessageWithColor(i + ":" + _availableCarriages[i].GetDetailedInfo(out col), col, false);
  126.             }
  127.  
  128.             Console.SetCursorPosition(xPositionOfTrain, 0);
  129.             Console.WriteLine(_train.GetInfoDirection());
  130.  
  131.             Console.CursorLeft = xPositionOfTrain;
  132.             Console.WriteLine("Локомотивов в составе:");
  133.             for (int i = 0; i < _train.ListLocomotive.Count; i++)
  134.             {
  135.                 Console.CursorLeft = xPositionOfTrain;
  136.                 Messager.ShowMessageWithColor(i + ":" + _train.ListLocomotive[i].GetInfo(out col), col, false);
  137.             }
  138.             Console.CursorLeft = xPositionOfTrain;
  139.             Console.WriteLine("Вагонов в составе:");
  140.             for (int i = 0; i < _train.ListCarriage.Count; i++)
  141.             {
  142.                 Console.CursorLeft = xPositionOfTrain;
  143.                 Messager.ShowMessageWithColor(i + ":" + _train.ListCarriage[i].GetInfo(out col), col, false);
  144.             }
  145.             Console.CursorLeft = xPositionOfTrain;
  146.             Messager.ShowMessageWithColor(_train.GetInfoPassenger(), ConsoleColor.White, false);
  147.         }
  148.         private void CreateNewTrain()
  149.         {
  150.             Messager.ShowMessageWithColor("Вы получили новое направление. Оформите его!", ConsoleColor.Green, true);
  151.             _train = new Train();
  152.         }
  153.     }
  154.     class Train
  155.     {
  156.         public List<Locomotive> ListLocomotive { get; private set; } = new List<Locomotive>();
  157.         public List<Carriage> ListCarriage { get; private set; } = new List<Carriage>();
  158.         private Dictionary<Direction, string> _dir = new Dictionary<Direction, string> { { Direction.From, "" }, { Direction.To, "" } };
  159.         private Dictionary<Passenger, int> _passenger = new Dictionary<Passenger, int>();
  160.  
  161.         public Train()
  162.         {
  163.             SetDirection();
  164.         }
  165.         public void AddCarriage(List<Carriage> car)
  166.         {
  167.             int index, amount;
  168.             index = ReadInt("Введите индекс вагона для добавления: ");
  169.             amount = ReadInt("Введите количество добавляемых объектов: ");
  170.             if (CheckExistIndex(car, index))
  171.             {
  172.                 for (int i = 0; i < amount; i++)
  173.                 {
  174.                     ListCarriage.Add(car[index].Clone());
  175.                 }
  176.                 Messager.ShowMessageWithColor("Успешное добавление", ConsoleColor.Green, true);
  177.             }
  178.             else
  179.             {
  180.                 Messager.ShowMessageWithColor("Ошибка: неправильный индекс.", ConsoleColor.Red, true);
  181.             }
  182.         }
  183.         public void AddLocomotive(List<Locomotive> locs)
  184.         {
  185.             int index = ReadInt("Введите индекс локомотива для добавления: ");
  186.             if (CheckExistIndex(locs, index))
  187.             {
  188.                 ListLocomotive.Add(locs[index].Clone());
  189.                 Messager.ShowMessageWithColor("Успешное добавление", ConsoleColor.Green, true);
  190.             }
  191.             else
  192.             {
  193.                 Messager.ShowMessageWithColor("Ошибка: неправильный индекс.", ConsoleColor.Red, true);
  194.             }
  195.         }
  196.         public void RemoveLocomotive()
  197.         {
  198.             int index = ReadInt("Введите индекс локомотива для удаления: ");
  199.             if (CheckExistIndex(ListLocomotive, index))
  200.             {
  201.                 ListLocomotive.RemoveAt(index);
  202.                 Messager.ShowMessageWithColor("Успешное удаление", ConsoleColor.Green, true);
  203.             }
  204.             else
  205.             {
  206.                 Messager.ShowMessageWithColor("Ошибка: неправильный индекс.", ConsoleColor.Red, true);
  207.             }
  208.         }
  209.         public void RemoveCarriage()
  210.         {
  211.             int index = ReadInt("Введите индекс вагона для удаления: ");
  212.             if (CheckExistIndex(ListCarriage, index))
  213.             {
  214.                 ListCarriage.RemoveAt(index);
  215.                 Messager.ShowMessageWithColor("Успешное удаление", ConsoleColor.Green, true);
  216.             }
  217.             else
  218.             {
  219.                 Messager.ShowMessageWithColor("Ошибка: неправильный индекс.", ConsoleColor.Red, true);
  220.             }
  221.         }
  222.         public bool Start()
  223.         {
  224.             if (CheckPossibilityStart())
  225.             {
  226.                 Messager.ShowMessageWithColor("Поезд запущен!", ConsoleColor.Green, true);
  227.                 return true;
  228.             }
  229.             Console.ReadKey();
  230.             return false;
  231.         }
  232.         public string GetInfoPassenger()
  233.         {
  234.             int firstPlace, secondPlace, thirdPlace;
  235.             CountRequiredPlace(out firstPlace, out secondPlace, out thirdPlace);
  236.             return $"Пассажиры: 1-ый {_passenger[Passenger.FirstClass]}/{firstPlace}; 2-ой {_passenger[Passenger.SecondClass]}/{secondPlace}; 3-ий {_passenger[Passenger.ThirdClass]}/{thirdPlace};";
  237.         }
  238.         public string GetInfoDirection()
  239.         {
  240.             return $"Откуда: {_dir[Direction.From]}; Куда: {_dir[Direction.To]};";
  241.         }
  242.  
  243.         private void SetDirection()
  244.         {
  245.             while (_dir[Direction.From] == "" || _dir[Direction.To] == "")
  246.             {
  247.                 Console.Write("Введите откуда направляется поезд: ");
  248.                 _dir[Direction.From] = Console.ReadLine();
  249.                 Console.Write("Введите куда направляется поезд: ");
  250.                 _dir[Direction.To] = Console.ReadLine();
  251.                 Console.Clear();
  252.                 if (_dir[Direction.From] == "" || _dir[Direction.To] == "")
  253.                     Messager.ShowMessageWithColor("Ошибка: Один из пунктов направлений не указан. Пересоздайте направление.", ConsoleColor.Red, true);
  254.             }
  255.             foreach (Passenger pas in Enum.GetValues(typeof(Passenger)))
  256.             {
  257.                 _passenger.Add(pas, RandomStatic.GetNext(100));
  258.             }
  259.         }
  260.         private int ReadInt(string massege)
  261.         {
  262.             int result;
  263.             while (true)
  264.             {
  265.                 Console.Write(massege);
  266.                 string value = Console.ReadLine();
  267.                 if (int.TryParse(value, out result))
  268.                     return result;
  269.                 else
  270.                     Messager.ShowMessageWithColor("Конвертация прошла не успешно. Попробуйте ещё раз.", ConsoleColor.Red, true);
  271.             }
  272.         }
  273.         private bool CheckPossibilityStart()
  274.         {
  275.             bool result = true;
  276.             int firstPlace, secondPlace, thirdPlace;
  277.             CountRequiredPlace(out firstPlace, out secondPlace, out thirdPlace);
  278.             if (_passenger[Passenger.FirstClass] > firstPlace)
  279.             {
  280.                 Messager.ShowMessageWithColor("Ошибка: мало мест для пассажиров первого класса", ConsoleColor.Red, false);
  281.                 result = false;
  282.             }
  283.             if (_passenger[Passenger.SecondClass] > secondPlace)
  284.             {
  285.                 Messager.ShowMessageWithColor("Ошибка: мало мест для пассажиров второго класса", ConsoleColor.Red, false);
  286.                 result = false;
  287.             }
  288.             if (_passenger[Passenger.ThirdClass] > thirdPlace)
  289.             {
  290.                 Messager.ShowMessageWithColor("Ошибка: мало мест для пассажиров третьего класса", ConsoleColor.Red, false);
  291.                 result = false;
  292.             }
  293.             if (ListLocomotive.Count<=0)
  294.             {
  295.                 Messager.ShowMessageWithColor("Ошибка: недостаточно локомативов", ConsoleColor.Red, false);
  296.                 result = false;
  297.             }
  298.             return result;
  299.         }
  300.         private void CountRequiredPlace(out int firstPlace, out int secondPlace, out int thirdPlace)
  301.         {
  302.             firstPlace = 0; secondPlace = 0; thirdPlace = 0;
  303.             foreach (Carriage car in ListCarriage)
  304.             {
  305.                 switch (car.TypePassenger)
  306.                 {
  307.                     case Passenger.FirstClass:
  308.                         firstPlace += car.AmountPassengers;
  309.                         break;
  310.                     case Passenger.SecondClass:
  311.                         secondPlace += car.AmountPassengers;
  312.                         break;
  313.                     case Passenger.ThirdClass:
  314.                         thirdPlace += car.AmountPassengers;
  315.                         break;
  316.                 }
  317.             }
  318.         }
  319.         private bool CheckExistIndex(List<Locomotive> list, int index)
  320.         {
  321.             if (index < 0 || index >= list.Count) return false;
  322.             else return true;
  323.         }
  324.         private bool CheckExistIndex(List<Carriage> list, int index)
  325.         {
  326.             if (index < 0 || index >= list.Count) return false;
  327.             else return true;
  328.         }
  329.     }
  330.     class Locomotive
  331.     {
  332.         public string Name { get; private set; }
  333.         public Locomotive(string name)
  334.         {
  335.             Name = name;
  336.         }
  337.         public Locomotive Clone()
  338.         {
  339.             return new Locomotive(Name);
  340.         }
  341.         public string GetInfo(out ConsoleColor color)
  342.         {
  343.             color = ConsoleColor.Red;
  344.             return $"Поезд: {Name}";
  345.         }
  346.     }
  347.     class Carriage
  348.     {
  349.         public Passenger TypePassenger { get; private set; }
  350.         public int AmountPassengers { get; private set; }
  351.  
  352.         public Carriage(Passenger typePassendger, int amountPassengers)
  353.         {
  354.             TypePassenger = typePassendger;
  355.             AmountPassengers = amountPassengers;
  356.         }
  357.         public Carriage Clone()
  358.         {
  359.             return new Carriage(TypePassenger, AmountPassengers);
  360.         }
  361.         private ConsoleColor GetColor()
  362.         {
  363.             switch (TypePassenger)
  364.             {
  365.                 case Passenger.FirstClass:
  366.                     return ConsoleColor.Yellow;
  367.                 case Passenger.SecondClass:
  368.                     return ConsoleColor.Green;
  369.                 case Passenger.ThirdClass:
  370.                     return ConsoleColor.Blue;
  371.                 default:
  372.                     return ConsoleColor.White;
  373.             }
  374.         }
  375.         public string GetDetailedInfo(out ConsoleColor color)
  376.         {
  377.             color = GetColor();
  378.             return $"Вагон {TypePassenger.ToString()} класса. \nВмещает {AmountPassengers} пассажиров.";
  379.         }
  380.         public string GetInfo(out ConsoleColor color)
  381.         {
  382.             color = GetColor();
  383.             return TypePassenger.ToString();
  384.         }
  385.     }
  386.     enum Direction
  387.     {
  388.         From, To
  389.     }
  390.     enum Passenger
  391.     {
  392.         FirstClass, SecondClass, ThirdClass
  393.     }
  394.  
  395. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement