Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- public class RaceTower
- {
- private List<Driver> drivers;
- private Queue<Driver> lostDrivers;
- public RaceTower()
- {
- this.drivers = new List<Driver>();
- this.lostDrivers = new Queue<Driver>();
- }
- public int TotalLaps { get; private set; }
- public int TrackLength { get; private set; }
- public int CurrentLap { get; private set; }
- private string Weather { get; set; }
- public IReadOnlyCollection<Driver> Drivers => (IReadOnlyCollection<Driver>)this.drivers;
- public void SetTrackInfo(int totalLaps, int trackLength)
- {
- this.TotalLaps = totalLaps;
- this.TrackLength = trackLength;
- this.CurrentLap = 0;
- }
- public void PrintWinner()
- {
- var winner = drivers.OrderBy(d => d.TotalTime).First();
- Console.WriteLine($"{winner.Name} wins the race for {winner.TotalTime:f3} seconds.");
- }
- public void RegisterDriver(List<string> commandArgs)
- {
- var driverInfo = commandArgs.Take(2).ToList();
- var carInfo = commandArgs.Skip(2).ToList();
- var tyreInfo = commandArgs.Skip(4).ToList();
- var tyre = TyreFactory.CreateTyre(tyreInfo);
- var car = CarFactory.CreateCar(carInfo, tyre);
- var driver = DriverFactory.CreateDriver(driverInfo, car);
- drivers.Add(driver);
- }
- public void DriverBoxes(List<string> commandArgs)
- {
- var type = commandArgs[0];
- var driversName = commandArgs[1];
- var currentDriver = drivers.FirstOrDefault(d => d.Name == driversName);
- currentDriver.TotalTime += 20;
- switch (type)
- {
- case "ChangeTyres":
- var tyreInfo = commandArgs.Skip(2).ToList();
- var tyre = TyreFactory.CreateTyre(tyreInfo);
- currentDriver.Car.ChangeTyre(tyre);
- break;
- case "Refuel":
- var fuelAmount = double.Parse(commandArgs[2]);
- currentDriver.Car.Refuel(fuelAmount);
- break;
- }
- }
- public string CompleteLaps(List<string> commandArgs)
- {
- var sb = new StringBuilder();
- var numberOfLaps = int.Parse(commandArgs[0]);
- if (numberOfLaps + CurrentLap > TotalLaps)
- {
- return $"There is no time! On lap {CurrentLap}.";
- }
- for (int lap = 0; lap < numberOfLaps; lap++)
- {
- for (int count = 0; count < drivers.Count; count++)
- {
- var currentDriver = drivers[count];
- currentDriver.AddTimeToTotalTime(this.TrackLength);
- try
- {
- currentDriver.Car.ReduceFuel(this.TrackLength, currentDriver.FuelConsumptionPerKm);
- currentDriver.Car.Tyre.DegradateTyre();
- }
- catch (ArgumentException ex)
- {
- currentDriver.FailureReason = ex.Message;
- RemoveFailedDruiver(currentDriver, drivers, lostDrivers);
- count--;
- }
- }
- this.CurrentLap++;
- CheckForOvertaking(drivers, sb);
- }
- return sb.ToString(); ;
- }
- private void CheckForOvertaking(List<Driver> drivers, StringBuilder sb)
- {
- drivers = drivers.OrderByDescending(d => d.TotalTime).ToList();
- for (int count = 0; count < drivers.Count - 1; count++)
- {
- var firstDriver = drivers[count];
- var secondDriver = drivers[count + 1];
- var timeDifference = Math.Abs(firstDriver.TotalTime - secondDriver.TotalTime);
- if (firstDriver.GetType().Name == "AggressiveDriver" && firstDriver.Car.Tyre.Name == "Ultrasoft" && timeDifference <= 3)
- {
- if (this.Weather == "Foggy")
- {
- firstDriver.FailureReason = "Crashed";
- RemoveFailedDruiver(firstDriver, drivers, lostDrivers);
- }
- else
- {
- ChangeDriversPositions(firstDriver, secondDriver, 3);
- sb.Append(ReturningOvertakingInfo(firstDriver, secondDriver));
- count++;
- }
- }
- else if (firstDriver.GetType().Name == "EnduranceDriver" && firstDriver.Car.Tyre.Name == "Hard" && timeDifference <= 3)
- {
- if (this.Weather == "Rainy")
- {
- firstDriver.FailureReason = "Crashed";
- RemoveFailedDruiver(firstDriver, drivers, lostDrivers);
- }
- else
- {
- ChangeDriversPositions(firstDriver, secondDriver, 3);
- sb.Append(ReturningOvertakingInfo(firstDriver, secondDriver));
- }
- }
- else if (timeDifference <= 2)
- {
- ChangeDriversPositions(firstDriver, secondDriver, 2);
- sb.Append(ReturningOvertakingInfo(firstDriver, secondDriver));
- }
- }
- }
- private string ReturningOvertakingInfo(Driver firstDriver, Driver secondDriver)
- {
- return $"{firstDriver.Name} has overtaken {secondDriver.Name} on lap {this.CurrentLap}.";
- }
- private void ChangeDriversPositions(Driver firstDriver, Driver secondDriver, int time)
- {
- firstDriver.TotalTime -= time;
- secondDriver.TotalTime += time;
- }
- private void RemoveFailedDruiver(Driver driver, List<Driver> drivers, Queue<Driver> lostDrivers)
- {
- lostDrivers.Enqueue(driver);
- this.drivers.Remove(driver);
- }
- public string GetLeaderboard()
- {
- var counter = 1;
- var sb = new StringBuilder();
- sb.AppendLine($"Lap {this.CurrentLap}/{this.TotalLaps}");
- foreach (var driver in drivers.OrderBy(d => d.TotalTime))
- {
- sb.AppendLine($"{counter++} {driver.Name} {driver.TotalTime:f3}");
- }
- foreach (var driver in lostDrivers.Reverse())
- {
- sb.AppendLine($"{counter++} {driver.Name} {driver.FailureReason}");
- }
- return sb.ToString().TrimEnd();
- }
- public void ChangeWeather(List<string> commandArgs)
- {
- var newWeather = commandArgs[0];
- this.Weather = newWeather;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement