CCCPaste

Конфигуратор поезда

namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
ConsoleMenu menu = new();

menu.IsWork();
}
}

class ConsoleMenu
{
private readonly Dispatcher _dispatcher = new();

private enum Menu
{
CreateTrain = 1,
Exit
}

public void IsWork()
{
Console.WriteLine("Вас приветствует создатель поездов.");

bool isWork = true;

while (isWork)
{
Console.WriteLine("\nЧтобы Вам хотелось:\n" +
$"{(int)Menu.CreateTrain} - Отправить поезд\n" +
$"{(int)Menu.Exit} - Выход");

Console.WriteLine("\nВведите пункт меню");

if (Enum.TryParse(Console.ReadLine(), out Menu menu))
{
switch (menu)
{
case Menu.CreateTrain:
_dispatcher.FormTrain();
break;

case Menu.Exit:
isWork = false;
Console.WriteLine("До свидания!");
break;

default:
ShowWarningMassage();
break;
}
}
else
{
ShowWarningMassage();
}
}
}

private void ShowWarningMassage()
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Будьте внимательнее!");
Console.ResetColor();
}
}

class Dispatcher
{
private Dictionary<Train, string> _allTrains = [];

public void FormTrain()
{
SellTicket();
ShowInfo();
}

private Train CreateTrain(string text)
{
Train train = new();

_allTrains.Add(train, text);

return train;
}

private void SellTicket()
{
int passengersCount = CreatePassengers();

Console.WriteLine("Идет продажа билетов.\n");

for (int i = 0; i <= passengersCount; i++)
{
PaintOverSoldPlace();
}
}

private void PaintOverSoldPlace()
{
char soldTicketPaintOverSign = '\u2588';
char space = '\u0020';

Console.Write($"{soldTicketPaintOverSign}{space}");

Thread.Sleep(500);
}

private int CreatePassengers()
{
Train train = CreateTrain(CreateDestination());

Random random = new();

int passengersCount = random.Next(1, train.TotalSeatsCarriage);

return passengersCount;
}

private string CreateDestination()
{
List<Destination> cities =
[
new("Санкт-Петербург"),
new("Норильск"),
new("Адлер"),
new("Екатеринбург"),
new("Красноярск"),
new("Москва"),
new("Владивосток"),
new("Псков")
];

int indexStartCity = GetIndex(cities);
int indexFinalCity = GetIndex(cities);

if (indexStartCity == indexFinalCity)
indexFinalCity = GetIndex(cities);

string cityFirst = GetCity(indexStartCity, cities);
string cityLast = GetCity(indexFinalCity, cities);
string citiesOfRoute = $"{cityFirst} - {cityLast}";

return citiesOfRoute;
}

private string GetCity(int index, List<Destination> cities)
{
Destination city = cities[index];

return city.CityOfTravel;
}

private int GetIndex(List<Destination> cities)
{
Random random = new();

return random.Next(cities.Count);
}

private void ShowInfo()
{
foreach (var train in _allTrains)
{
Console.WriteLine($"\nПоезд номер {train.Key.NumberTrain} отправляется по маршруту {train.Value}," +
$" всего свободных мест {train.Key.TotalSeatsCarriage}.");
}
}
}

class Destination(string cityOfTravel)
{
public string CityOfTravel { get; private set; } = cityOfTravel;
}

class Train
{
private readonly int _minNumberOfTrain = 1;
private readonly int _maxNumberOfTrain = 100;
private readonly int _maxNumberSeats = 10;

public Train()
{
TotalSeatsCarriage = _random.Next(1, _maxNumberSeats);
NumberTrain = _random.Next(_minNumberOfTrain, _maxNumberOfTrain);
}

public int TotalSeatsCarriage { get; private set; }
public int NumberTrain { get; private set; }

private readonly Random _random = new();
}
}