Advertisement
ZhongNi

CarService

Nov 16th, 2024
39
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.91 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. namespace Classes
  6. {
  7.     internal class Program
  8.     {
  9.         static void Main()
  10.         {
  11.             CarService carService = new CarService();
  12.             carService.Work();
  13.         }
  14.     }
  15.  
  16.     public class CarService
  17.     {
  18.         private Storage _storage;
  19.         private Queue<Car> _cars;
  20.         private int _carQueueCount;
  21.         private Wallet _wallet;
  22.  
  23.         public CarService()
  24.         {
  25.             _storage = new Storage();
  26.             _cars = new Queue<Car>();
  27.             _carQueueCount = 10;
  28.             _wallet = new Wallet();
  29.  
  30.             CreateQueue();
  31.         }
  32.  
  33.         public void Work()
  34.         {
  35.             int carNumber = 1;
  36.  
  37.             while (_cars.Count != 0)
  38.             {
  39.                 Car car = _cars.Dequeue();
  40.                 bool havePart = false;
  41.  
  42.                 List<SparePart> brokenParts = car.GetBrokenPart().ToList();
  43.  
  44.                 foreach (SparePart part in brokenParts)
  45.                 {
  46.                     if (_storage.TryGetParts(part))
  47.                     {
  48.                         havePart = true;
  49.                     }
  50.                 }
  51.  
  52.                 if (havePart == false)
  53.                 {
  54.                     Console.WriteLine($"\nCar number {carNumber}");
  55.                     car.Show();
  56.                     _wallet.ReceiveFine(havePart);
  57.                 }
  58.  
  59.                 while (car.CheckBreakdowns() == false && havePart == true)
  60.                 {
  61.                     Console.WriteLine($"Car number {carNumber}");
  62.                     car.Show();
  63.                     havePart = TryRepair(car, brokenParts);
  64.                     Console.WriteLine("\nPress something...");
  65.                     Console.ReadKey(true);
  66.                     Console.WriteLine();
  67.                 }
  68.  
  69.                 carNumber++;
  70.             }
  71.         }
  72.  
  73.         private void CreateQueue()
  74.         {
  75.             for (int i = 0; i < _carQueueCount; i++)
  76.             {
  77.                 Car car = new Car();
  78.  
  79.                 if (car.CheckBreakdowns())
  80.                 {
  81.                     i--;
  82.                 }
  83.                 else
  84.                 {
  85.                     _cars.Enqueue(car);
  86.                 }
  87.             }
  88.         }
  89.  
  90.         private bool TryRepair(Car car, List<SparePart> brokenParts)
  91.         {
  92.             foreach (SparePart part in brokenParts)
  93.             {
  94.                 if (_storage.TryGetParts(part))
  95.                 {
  96.                     car.Repair(part);
  97.                     _storage.UseUp(part);
  98.                     brokenParts.Remove(part);
  99.                     Console.WriteLine($"\nWas repaired {part.Name}");
  100.                     _wallet.ReceiveIncome(part);
  101.  
  102.                     return true;
  103.                 }
  104.                 else
  105.                 {
  106.                     brokenParts.Remove(part);
  107.                     Console.WriteLine($"Can't fix {part.Name}");
  108.                     _wallet.ReceiveFine();
  109.  
  110.                     return true;
  111.                 }
  112.             }
  113.  
  114.             return false;
  115.         }
  116.     }
  117.  
  118.     public class Wallet
  119.     {
  120.         private int _amount;
  121.         private int _penalty;
  122.         private int _fullPenalty;
  123.         private PartProvider _partProvider;
  124.         private List<PartCharacteristic> _price;
  125.  
  126.         public Wallet()
  127.         {
  128.             _amount = 0;
  129.             _penalty = 200;
  130.             _fullPenalty = 1000;
  131.             _partProvider = new PartProvider();
  132.             _price = new List<PartCharacteristic>();
  133.             FillPrice();
  134.         }
  135.  
  136.         public void ReceiveIncome(SparePart part)
  137.         {
  138.             PartCharacteristic brokenSparePart = _price.Where(sparePart => sparePart.Name == part.Name).Single();
  139.             _amount += brokenSparePart.CostOfSparePart;
  140.             _amount += brokenSparePart.CostOfRepair;
  141.             Console.WriteLine($"\ncar service receives  {brokenSparePart.CostOfSparePart} + {brokenSparePart.CostOfRepair} ");
  142.             Show();
  143.         }
  144.  
  145.         public void ReceiveFine(bool havePart = true)
  146.         {
  147.             int penalty;
  148.  
  149.             if (havePart)
  150.             {
  151.                 penalty = _penalty;
  152.                 Console.WriteLine($"\ncar service receives a fine of -{penalty} ");
  153.             }
  154.             else
  155.             {
  156.                 penalty = _fullPenalty;
  157.                 Console.WriteLine($"\nThere are no suitable spare parts for this car\nCar service receives a fine of -{penalty}  ");
  158.             }
  159.  
  160.             _amount -= penalty;
  161.             Show();
  162.         }
  163.  
  164.         private void Show()
  165.         {
  166.             Console.WriteLine($"\nThe car service center has {_amount} on its balance sheet ");
  167.         }
  168.  
  169.         private void FillPrice()
  170.         {
  171.             for (int i = 0; i < _partProvider.GetCount(); i++)
  172.             {
  173.                 _price.Add(_partProvider.GetCharacteristic(i));
  174.             }
  175.         }
  176.     }
  177.  
  178.     public class Storage
  179.     {
  180.         private List<SparePart> _carParts;
  181.         private PartProvider _provider;
  182.         private int _partMaxCount;
  183.  
  184.         public Storage()
  185.         {
  186.             _carParts = new List<SparePart>();
  187.             _provider = new PartProvider();
  188.             _partMaxCount = 5;
  189.             Fill();
  190.         }
  191.  
  192.         public bool TryGetParts(SparePart part)
  193.         {
  194.             return _carParts.Any(sparePart => sparePart.Name == part.Name);
  195.         }
  196.  
  197.         public void UseUp(SparePart part)
  198.         {
  199.             _carParts.Remove(_carParts.First(sparePart => sparePart.Name == part.Name));
  200.         }
  201.  
  202.         private void Fill()
  203.         {
  204.             for (int i = 0; i < _provider.GetCount(); i++)
  205.             {
  206.                 for (int j = 0; j < UserUtil.GetRandom(_partMaxCount + 1); j++)
  207.                 {
  208.                     _carParts.Add(new SparePart(_provider.GetCharacteristic(i).Name, _provider.GetCharacteristic(i).IsIntact));
  209.                 }
  210.             }
  211.         }
  212.     }
  213.  
  214.     public class Car
  215.     {
  216.         private List<SparePart> _car;
  217.         private PartProvider _provider;
  218.  
  219.         public Car()
  220.         {
  221.             _provider = new PartProvider();
  222.             _car = new List<SparePart>();
  223.             Create();
  224.         }
  225.  
  226.         public bool CheckBreakdowns()
  227.         {
  228.             foreach (SparePart sparePart in _car)
  229.             {
  230.                 if (sparePart.IsIntact == false)
  231.                 {
  232.                     return false;
  233.                 }
  234.             }
  235.  
  236.             return true;
  237.         }
  238.  
  239.         public List<SparePart> GetBrokenPart()
  240.         {
  241.             List<SparePart> BrokenSparePart = _car.Where(part => part.IsIntact == false).ToList();
  242.  
  243.             return BrokenSparePart;
  244.         }
  245.  
  246.         public void Repair(SparePart part)
  247.         {
  248.             foreach (SparePart sparePart in _car)
  249.             {
  250.                 if (sparePart.Name == part.Name)
  251.                 {
  252.                     sparePart.Fix();
  253.                 }
  254.             }
  255.         }
  256.  
  257.         public void Show()
  258.         {
  259.             foreach (SparePart sparePart in _car)
  260.             {
  261.                 if (sparePart.IsIntact)
  262.                 {
  263.                     Console.ForegroundColor = ConsoleColor.DarkGreen;
  264.                 }
  265.                 else
  266.                 {
  267.                     Console.ForegroundColor = ConsoleColor.DarkRed;
  268.                 }
  269.  
  270.                 Console.WriteLine(sparePart.Name);
  271.                 Console.ResetColor();
  272.             }
  273.         }
  274.  
  275.         private void Create()
  276.         {
  277.             int chanceIntact = 100;
  278.             int chanceBreak = 40;
  279.  
  280.             for (int i = 0; i < _provider.GetCount(); i++)
  281.             {
  282.                 bool isIntact = chanceBreak >= UserUtil.GetRandom(chanceIntact + 1) ? false : true;
  283.                 _car.Add(new SparePart(_provider.GetCharacteristic(i).Name, isIntact));
  284.             }
  285.         }
  286.     }
  287.  
  288.     public class PartProvider
  289.     {
  290.         private List<PartCharacteristic> _parts;
  291.  
  292.         public PartProvider()
  293.         {
  294.             _parts = new List<PartCharacteristic>()
  295.             {
  296.             new PartCharacteristic("spare part 1", true, 100, 100) ,
  297.             new PartCharacteristic("spare part 2", true, 200, 200) ,
  298.             new PartCharacteristic("spare part 3", true, 300, 300) ,
  299.             new PartCharacteristic("spare part 4", true, 400, 400) ,
  300.             new PartCharacteristic("spare part 5", true, 500, 500) ,
  301.             new PartCharacteristic("spare part 6", true, 600, 600) ,
  302.             new PartCharacteristic("spare part 7", true, 700, 700)
  303.             };
  304.         }
  305.  
  306.         public int GetCount()
  307.         {
  308.             return _parts.Count;
  309.         }
  310.  
  311.         public PartCharacteristic GetCharacteristic(int index)
  312.         {
  313.             return _parts[index];
  314.         }
  315.     }
  316.  
  317.     public class PartCharacteristic
  318.     {
  319.         public PartCharacteristic(string name, bool isIntact, int costOfSparePart, int costOfRepair)
  320.         {
  321.             Name = name;
  322.             IsIntact = isIntact;
  323.             CostOfSparePart = costOfSparePart;
  324.             CostOfRepair = costOfRepair;
  325.         }
  326.  
  327.         public string Name { get; private set; }
  328.         public bool IsIntact { get; private set; }
  329.         public int CostOfSparePart { get; private set; }
  330.         public int CostOfRepair { get; private set; }
  331.     }
  332.  
  333.     public class SparePart
  334.     {
  335.         public SparePart(string name, bool isIntact)
  336.         {
  337.             Name = name;
  338.             IsIntact = isIntact;
  339.         }
  340.  
  341.         public string Name { get; private set; }
  342.         public bool IsIntact { get; private set; }
  343.  
  344.         public void Fix()
  345.         {
  346.             IsIntact = true;
  347.         }
  348.     }
  349.  
  350.     public static class UserUtil
  351.     {
  352.         private static Random s_random = new Random();
  353.  
  354.         public static int GetRandom(int max, int min = 0)
  355.         {
  356.             return s_random.Next(min, max);
  357.         }
  358.     }
  359. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement