Torgach

FixService3.0

May 13th, 2021 (edited)
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 15.60 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Service
  8. {
  9.     class Program
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             ServiceMenu menu = new ServiceMenu();
  14.             menu.Run();
  15.         }
  16.     }
  17.  
  18.     class ServiceMenu
  19.     {
  20.         private AutoService _autoService;
  21.         private Shop _shop;
  22.  
  23.         public ServiceMenu()
  24.         {
  25.             _autoService = new AutoService();
  26.             _shop = new Shop();
  27.         }
  28.  
  29.         public void Run()
  30.         {
  31.             while(_autoService.IsServiceWork())
  32.             {
  33.                 Show();
  34.                 if(ChooseItem())
  35.                 {
  36.                     if (_autoService.IsCarRepaired)
  37.                     {
  38.                         _autoService.CreateNewClient();
  39.                     }
  40.                     _shop.TryRefreshProducts();
  41.                 }
  42.                 else
  43.                 {
  44.                     return;
  45.                 }
  46.  
  47.                 Console.ReadKey();
  48.                 Console.Clear();
  49.             }
  50.         }
  51.  
  52.         public void Show()
  53.         {
  54.             _autoService.ShowBalance();
  55.             Console.WriteLine();
  56.             _autoService.ShowWarehouse();
  57.             Console.WriteLine();
  58.             _autoService.ShowBreakages();
  59.  
  60.             Console.WriteLine("\n[1] - приступить к починке\n" +
  61.                 "[2] - Заказать деталь в магазине\n" +
  62.                 "[3] - выход");
  63.             Console.Write("Ввод: ");
  64.         }
  65.  
  66.         public bool ChooseItem()
  67.         {
  68.             switch (Console.ReadLine())
  69.             {
  70.                 case "1":
  71.                     _autoService.ChooseBrokenDetail();
  72.                     break;
  73.                 case "2":
  74.                     _autoService.SignContract(_shop);
  75.                     break;
  76.                 case "3":
  77.                     return false;
  78.                 default:
  79.                     Console.WriteLine("Ошибка комманды!");
  80.                     break;
  81.             }
  82.             return true;
  83.         }
  84.     }
  85.  
  86.     class AutoService
  87.     {
  88.         private DetailWarehouse _detailsWarehouse;
  89.         private Car _clientCar;
  90.         private int _fine;
  91.  
  92.         public int WorkCost { get; private set; }
  93.         public int Balance { get; private set; }
  94.         public bool IsBalanceNegaive
  95.         {
  96.             get
  97.             {
  98.                 return Balance <= 0;
  99.             }
  100.         }
  101.         public bool IsWarehouseEmpty
  102.         {
  103.             get
  104.             {
  105.                 return _detailsWarehouse.IsSpaceDetailsEmpty();
  106.             }
  107.         }
  108.         public bool IsCarRepaired
  109.         {
  110.             get
  111.             {
  112.                 return _clientCar.IsDetailsBroken() == false;
  113.             }
  114.         }
  115.  
  116.         public AutoService()
  117.         {
  118.             _detailsWarehouse = new DetailWarehouse();
  119.             _clientCar = new Car();
  120.             Balance = 2500;
  121.             WorkCost = 5000;
  122.             _fine = 2500;
  123.         }
  124.  
  125.         public bool IsServiceWork()
  126.         {
  127.             if (IsWarehouseEmpty)
  128.             {
  129.                 Console.WriteLine("Запасов больше нет! Закрываем гараж.");
  130.                 return false;
  131.             }
  132.  
  133.             if(IsBalanceNegaive)
  134.             {
  135.                 Console.WriteLine("Отрицательный баланс! Закрываем гараж.");
  136.                 return false;
  137.             }
  138.             return true;
  139.         }
  140.  
  141.         public void ShowBalance()
  142.         {
  143.             Console.WriteLine($"Баланс: {Balance}");
  144.         }
  145.  
  146.         public void ShowBreakages()
  147.         {
  148.             _clientCar.ShowBrokenDetails();
  149.         }
  150.  
  151.         public void ChooseBrokenDetail()
  152.         {
  153.             Console.WriteLine("Выберите деталь, которую вы хотите починить: \n" +
  154.                 "[1] - Двигатель\n" +
  155.                 "[2] - Подвеска\n" +
  156.                 "[3] - Проводка\n" +
  157.                 "[4] - Кузов");
  158.             Console.Write("Ввод: ");
  159.  
  160.             if (int.TryParse(Console.ReadLine(), out int productNumber) == false
  161.                 && productNumber > _detailsWarehouse.GetMaxPartsNumber())
  162.             {
  163.                 Console.WriteLine("Ошибка! Такой детали нет.");
  164.                 return;
  165.             }
  166.  
  167.             --productNumber;
  168.             DetailType detailType = (DetailType)productNumber;
  169.  
  170.             RepairDetail(detailType);
  171.         }
  172.        
  173.         public void SignContract(Shop shop)
  174.         {
  175.             if (Balance == 0)
  176.             {
  177.                 Console.WriteLine("Ошибка! Нет предоплаты");
  178.                 return;
  179.             }
  180.  
  181.             shop.Show();
  182.  
  183.             if (shop.IsDetailChosen(out DetailType detailType) == false)
  184.             {
  185.                 return;
  186.             }
  187.  
  188.             Balance -= shop.MakePrepayment(detailType);
  189.             _detailsWarehouse.AddDetail(shop.BuyProduct(detailType));
  190.         }
  191.  
  192.         public void CreateNewClient()
  193.         {
  194.             _clientCar = new Car();
  195.         }
  196.  
  197.         public void ShowWarehouse()
  198.         {
  199.             _detailsWarehouse.ShowSpaceDetails();
  200.         }
  201.  
  202.         private void RepairDetail(DetailType detailType)
  203.         {
  204.             Detail detail = _clientCar.GetBrokenDetailByType(detailType);
  205.  
  206.             if (detail.IsBroken == false)
  207.             {
  208.                 Console.WriteLine("Деталь в рабочем состоянии!");
  209.                 _detailsWarehouse.TakeDetail(detail.DetailType);
  210.                 GetFine();
  211.                 return;
  212.             }
  213.  
  214.             _clientCar.ReplaceDetail(_detailsWarehouse.TakeDetail(detail.DetailType));
  215.             GetProfit(_detailsWarehouse.GetPrice(detail.DetailType));
  216.         }
  217.  
  218.         private void GetFine()
  219.         {
  220.             Balance -= _fine;
  221.         }
  222.  
  223.         private void GetProfit(int detailPrice)
  224.         {
  225.             Balance += detailPrice + WorkCost;
  226.         }
  227.     }
  228.  
  229.     class Car
  230.     {
  231.         private static Random _random = new Random();
  232.  
  233.         private List<Detail> _details;
  234.  
  235.         public Car()
  236.         {
  237.             _details = new List<Detail>()
  238.             {
  239.                 new Detail("Двигатель", DetailType.Engine, TryToBreak()),
  240.                 new Detail("Подвеска", DetailType.Suspension, TryToBreak()),
  241.                 new Detail("Проводка", DetailType.Wiring, TryToBreak()),
  242.                 new Detail("Кузов", DetailType.Body, TryToBreak())
  243.             };
  244.  
  245.             CheckCreatedDetails();
  246.         }
  247.  
  248.         public void ReplaceDetail(Detail newDetail)
  249.         {
  250.             for (int i = 0; i < _details.Count; i++)
  251.             {
  252.                 if(_details[i].DetailType == newDetail.DetailType)
  253.                 {
  254.                     _details[i] = newDetail;
  255.                 }
  256.             }
  257.         }
  258.  
  259.         public Detail GetBrokenDetailByType(DetailType detailType)
  260.         {
  261.             foreach (var brokenDetail in _details)
  262.             {
  263.                 if (brokenDetail.DetailType == detailType)
  264.                 {
  265.                     return brokenDetail;
  266.                 }
  267.             }
  268.  
  269.             throw new Exception("Ошибка! Деталь, которую вы хотите взять не храниться на складе!");
  270.         }
  271.  
  272.         public bool IsDetailsBroken()
  273.         {
  274.             foreach (var detail in _details)
  275.             {
  276.                 if (detail.IsBroken)
  277.                     return true;
  278.             }
  279.             return false;
  280.         }
  281.  
  282.         public void ShowBrokenDetails()
  283.         {
  284.             foreach (var brokenDetail in _details)
  285.             {
  286.                 if (brokenDetail.IsBroken)
  287.                 {
  288.                     Console.WriteLine($"{brokenDetail.Name} в критическом состоянии!");
  289.                 }
  290.             }
  291.         }
  292.  
  293.         private bool TryToBreak()
  294.         {
  295.             return Convert.ToBoolean(_random.Next(0, 2));
  296.         }
  297.  
  298.         private void CheckCreatedDetails()
  299.         {
  300.             List<Detail> details = new List<Detail>();
  301.  
  302.             foreach (var detail in _details)
  303.             {
  304.                 if(detail.IsBroken == false)
  305.                 {
  306.                     details.Add(detail);
  307.                 }
  308.                 else
  309.                 {
  310.                     return;
  311.                 }
  312.             }
  313.             details[_random.Next(0, details.Count)].BreakDetail();
  314.         }
  315.     }
  316.  
  317.     class Detail
  318.     {
  319.         public string Name { get; protected set; }
  320.         public DetailType DetailType { get; protected set; }
  321.         public bool IsBroken { get; protected set; }
  322.  
  323.         public Detail(string name, DetailType detailType, bool isBroken)
  324.         {
  325.             Name = name;
  326.             DetailType = detailType;
  327.             IsBroken = isBroken;
  328.         }
  329.  
  330.         public void BreakDetail()
  331.         {
  332.             IsBroken = true;
  333.         }
  334.     }
  335.  
  336.     enum DetailType
  337.     {
  338.         Engine,
  339.         Suspension,
  340.         Wiring,
  341.         Body
  342.     }
  343.  
  344.     abstract class Warehouse
  345.     {
  346.         protected Dictionary<SpareDetail, int> _spareDetails;
  347.  
  348.         public void ShowSpaceDetails()
  349.         {
  350.             foreach (var spareDetail in _spareDetails)
  351.             {
  352.                 Console.WriteLine($"{spareDetail.Key.Name } - {spareDetail.Value}");
  353.             }
  354.         }
  355.  
  356.         public Detail TakeDetail(DetailType detailType)
  357.         {
  358.             foreach (var requiredDetail in _spareDetails)
  359.             {
  360.                 if (requiredDetail.Key.DetailType == detailType)
  361.                 {
  362.                     _spareDetails[requiredDetail.Key] -= 1;
  363.                     return requiredDetail.Key;
  364.                 }
  365.             }
  366.  
  367.             throw new Exception("Ошибка! Деталь, которую вы хотите взять не храниться на складе!");
  368.         }
  369.  
  370.         public int GetPrice(DetailType detailType)
  371.         {
  372.             foreach (var requiredDetail in _spareDetails)
  373.             {
  374.                 if (requiredDetail.Key.DetailType == detailType)
  375.                 {
  376.                     return requiredDetail.Key.Price;
  377.                 }
  378.             }
  379.             throw new Exception("Ошибка! Деталь, которую вы хотите взять не храниться на складе! Цену получить нельзя!");
  380.         }
  381.  
  382.         public bool IsSpaceDetailsEmpty()
  383.         {
  384.             foreach (var spareDetail in _spareDetails)
  385.             {
  386.                 if (spareDetail.Value != 0)
  387.                 {
  388.                     return false;
  389.                 }
  390.             }
  391.             return true;
  392.         }
  393.     }
  394.  
  395.     class DetailWarehouse : Warehouse
  396.     {
  397.         public DetailWarehouse()
  398.         {
  399.             Detail Engine = new SpareDetail("Двигатель", DetailType.Engine, true, 20000);
  400.             SpareDetail spaceEngine = Engine as SpareDetail;
  401.  
  402.             Detail Suspension = new SpareDetail("Подвеска", DetailType.Suspension, true, 15000);
  403.             SpareDetail spaceSuspencion = Suspension as SpareDetail;
  404.  
  405.             Detail Wiring = new SpareDetail("Проводка", DetailType.Wiring, true, 10000);
  406.             SpareDetail spaceWiring = Wiring as SpareDetail;
  407.  
  408.             Detail Body = new SpareDetail("Кузов", DetailType.Body, true, 5000);
  409.             SpareDetail spaceBody = Body as SpareDetail;
  410.  
  411.             _spareDetails = new Dictionary<SpareDetail, int>
  412.             {
  413.                 { spaceEngine, 5 },
  414.                 { spaceSuspencion, 5 },
  415.                 { spaceWiring, 5 },
  416.                 { spaceBody, 5 }
  417.             };
  418.         }
  419.  
  420.         public void AddDetail(Detail detail)
  421.         {
  422.             foreach (var spareDetail in _spareDetails.ToArray())
  423.             {
  424.                 if(spareDetail.Key.DetailType == detail.DetailType)
  425.                 {
  426.                     _spareDetails[spareDetail.Key] += 1;
  427.                     return;
  428.                 }
  429.             }
  430.         }
  431.  
  432.         public int GetMaxPartsNumber()
  433.         {
  434.             return _spareDetails.Keys.Count;
  435.         }
  436.     }
  437.  
  438.  class Shop : Warehouse
  439.     {
  440.         private int _maxProducts;
  441.  
  442.         public int RefreshCounter { get; private set; }
  443.  
  444.         public Shop()
  445.         {
  446.             _maxProducts = 7;
  447.             RefreshCounter = 5;
  448.  
  449.             Detail Engine = new SpareDetail("Двигатель", DetailType.Engine, true, 10000);
  450.             SpareDetail spaceEngine = Engine as SpareDetail;
  451.  
  452.             Detail Suspension = new SpareDetail("Подвеска", DetailType.Suspension, true, 7000);
  453.             SpareDetail spaceSuspencion = Suspension as SpareDetail;
  454.  
  455.             Detail Wiring = new SpareDetail("Проводка", DetailType.Wiring, true, 5000);
  456.             SpareDetail spaceWiring = Wiring as SpareDetail;
  457.  
  458.             Detail Body = new SpareDetail("Кузов", DetailType.Body, true, 2500);
  459.             SpareDetail spaceBody = Body as SpareDetail;
  460.  
  461.             _spareDetails = new Dictionary<SpareDetail, int>
  462.             {
  463.                 { spaceEngine, 7 },
  464.                 { spaceSuspencion, 7 },
  465.                 { spaceWiring, 7 },
  466.                 { spaceBody, 7 }
  467.             };
  468.         }
  469.  
  470.         public void Show()
  471.         {
  472.             Console.WriteLine("\nКакой товар вы хотите купить?\n" +
  473.                     "[1] - Двигатель\n" +
  474.                     "[2] - Подвеска\n" +
  475.                     "[3] - Проводка\n" +
  476.                     "[4] - Кузов\n" +
  477.                     "[exit] - Выйти из каталога");
  478.             Console.Write("Ввод: ");
  479.         }
  480.  
  481.         public bool IsDetailChosen(out DetailType detailType)
  482.         {
  483.             detailType = 0;
  484.  
  485.             string userInput = Console.ReadLine();
  486.  
  487.             if(userInput == "exit")
  488.             {
  489.                 return false;
  490.             }
  491.  
  492.             if (int.TryParse(userInput, out int numberProduct) && numberProduct <= _maxProducts)
  493.             {
  494.                 --numberProduct;
  495.                 detailType = (DetailType)numberProduct;
  496.                 return true;
  497.             }
  498.             return false;
  499.         }
  500.  
  501.         public int MakePrepayment(DetailType detailType)
  502.         {
  503.             return GetPrice(detailType);
  504.         }
  505.  
  506.         public Detail BuyProduct(DetailType detailType)
  507.         {
  508.             return TakeDetail(detailType);
  509.         }
  510.  
  511.         public void TryRefreshProducts()
  512.         {
  513.             if (RefreshCounter == 0)
  514.             {
  515.                 UpdateProducts();
  516.                 RefreshCounter = 6;
  517.             }
  518.             RefreshCounter -= 1;
  519.         }
  520.  
  521.         private void UpdateProducts()
  522.         {
  523.             Dictionary<SpareDetail, int> tempList = new Dictionary<SpareDetail, int>(_spareDetails);
  524.  
  525.             foreach (var product in tempList)
  526.             {
  527.                 if (product.Value != _maxProducts)
  528.                 {
  529.                     _spareDetails[product.Key] = _maxProducts;
  530.                 }
  531.             }
  532.         }
  533.     }
  534.  
  535.     class SpareDetail : Detail
  536.     {
  537.         public int Price { get; private set; }
  538.  
  539.         public SpareDetail(string name, DetailType detailType, bool isBroken, int price) : base(name, detailType, isBroken)
  540.         {
  541.             Name = name;
  542.             IsBroken = false;
  543.             Price = price;
  544.         }
  545.     }
  546. }
Add Comment
Please, Sign In to add comment