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();
}
}