From 377098a07aa98560d31b8133c45a1c279180236f Mon Sep 17 00:00:00 2001 From: Esenia12 <148366616+Esenia12@users.noreply.github.com> Date: Sat, 2 Mar 2024 22:52:16 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9A=D0=BE=D0=BB=D0=BB=D0=B5=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractCompany.cs | 112 ++++++++++++++++++ .../CarSharingService.cs | 6 + .../ICollectionGenericObjects.cs | 50 ++++++++ .../MassiveGenericObjects.cs | 85 +++++++++++++ 4 files changed, 253 insertions(+) create mode 100644 ProjectDumpTruck/ProjectDumpTruck/CollectionGenericObjects/AbstractCompany.cs create mode 100644 ProjectDumpTruck/ProjectDumpTruck/CollectionGenericObjects/CarSharingService.cs create mode 100644 ProjectDumpTruck/ProjectDumpTruck/CollectionGenericObjects/ICollectionGenericObjects.cs create mode 100644 ProjectDumpTruck/ProjectDumpTruck/CollectionGenericObjects/MassiveGenericObjects.cs diff --git a/ProjectDumpTruck/ProjectDumpTruck/CollectionGenericObjects/AbstractCompany.cs b/ProjectDumpTruck/ProjectDumpTruck/CollectionGenericObjects/AbstractCompany.cs new file mode 100644 index 0000000..6413673 --- /dev/null +++ b/ProjectDumpTruck/ProjectDumpTruck/CollectionGenericObjects/AbstractCompany.cs @@ -0,0 +1,112 @@ +using ProjectDumpTrack.Drawnings; +namespace ProjectDumpTruck.CollectionGenericObjects; + +public abstract class AbstractCompany +{ + /// + /// Размер места (ширина) + /// + protected readonly int _placeSizeWidth = 210; + + /// + /// Размер места (высота) + /// + protected readonly int _placeSizeHeight = 80; + + /// + /// Ширина окна + /// + protected readonly int _pictureWidth; + + /// + /// Высота окна + /// + protected readonly int _pictureHeight; + + /// + /// Коллекция автомобилей + /// + protected ICollectionGenericObjects? _collection = null; + + /// + /// Вычисление максимального количества элементов, который можно разместить в окне + /// + private int GetMaxCount => _pictureWidth * _pictureHeight / (_placeSizeWidth * _placeSizeHeight); + + /// + /// Конструктор + /// + /// Ширина окна + /// Высота окна + /// Коллекция автомобилей + public AbstractCompany(int picWidth, int picHeight, ICollectionGenericObjects collection) + { + _pictureWidth = picWidth; + _pictureHeight = picHeight; + _collection = collection; + _collection.SetMaxCount = GetMaxCount; + } + + /// + /// Перегрузка оператора сложения для класса + /// + /// Компания + /// Добавляемый объект + /// + public static bool operator +(AbstractCompany company, DrawningTrack car) + { + return company._collection?.Insert(car) ?? false; + } + + /// + /// Перегрузка оператора удаления для класса + /// + /// Компания + /// Номер удаляемого объекта + /// + public static bool operator -(AbstractCompany company, int position) + { + return company._collection?.Remove(position) ?? false; + } + + /// + /// Получение случайного объекта из коллекции + /// + /// + public DrawningTrack? GetRandomObject() + { + Random rnd = new(); + return _collection?.Get(rnd.Next(GetMaxCount)); + } + + /// + /// Вывод всей коллекции + /// + /// + public Bitmap? Show() + { + Bitmap bitmap = new(_pictureWidth, _pictureHeight); + Graphics graphics = Graphics.FromImage(bitmap); + DrawBackgound(graphics); + + SetObjectsPosition(); + for (int i = 0; i < (_collection?.Count ?? 0); ++i) + { + DrawningTrack? obj = _collection?.Get(i); + obj?.DrawTransport(graphics); + } + + return bitmap; + } + + /// + /// Вывод заднего фона + /// + /// + protected abstract void DrawBackgound(Graphics g); + + /// + /// Расстановка объектов + /// + protected abstract void SetObjectsPosition(); +} diff --git a/ProjectDumpTruck/ProjectDumpTruck/CollectionGenericObjects/CarSharingService.cs b/ProjectDumpTruck/ProjectDumpTruck/CollectionGenericObjects/CarSharingService.cs new file mode 100644 index 0000000..e2ada74 --- /dev/null +++ b/ProjectDumpTruck/ProjectDumpTruck/CollectionGenericObjects/CarSharingService.cs @@ -0,0 +1,6 @@ + +namespace ProjectDumpTruck.CollectionGenericObjects; + +internal class CarSharingService +{ +} diff --git a/ProjectDumpTruck/ProjectDumpTruck/CollectionGenericObjects/ICollectionGenericObjects.cs b/ProjectDumpTruck/ProjectDumpTruck/CollectionGenericObjects/ICollectionGenericObjects.cs new file mode 100644 index 0000000..eda278c --- /dev/null +++ b/ProjectDumpTruck/ProjectDumpTruck/CollectionGenericObjects/ICollectionGenericObjects.cs @@ -0,0 +1,50 @@ + +namespace ProjectDumpTruck.CollectionGenericObjects; + + +/// +/// Интерфейс описания действий для набора хранимых объектов +/// +/// Параметр: ограничение - ссылочный тип +public interface ICollectionGenericObjects + where T : class +{ + /// + /// Количество объектов в коллекции + /// + int Count { get; } + + /// + /// Установка максимального количества элементов + /// + int SetMaxCount { set; } + + /// + /// Добавление объекта в коллекцию + /// + /// Добавляемый объект + /// true - вставка прошла удачно, false - вставка не удалась + bool Insert(T obj); + + /// + /// Добавление объекта в коллекцию на конкретную позицию + /// + /// Добавляемый объект + /// Позиция + /// true - вставка прошла удачно, false - вставка не удалась + bool Insert(T obj, int position); + + /// + /// Удаление объекта из коллекции с конкретной позиции + /// + /// Позиция + /// true - удаление прошло удачно, false - удаление не удалось + bool Remove(int position); + + /// + /// Получение объекта по позиции + /// + /// Позиция + /// Объект + T? Get(int position); +} diff --git a/ProjectDumpTruck/ProjectDumpTruck/CollectionGenericObjects/MassiveGenericObjects.cs b/ProjectDumpTruck/ProjectDumpTruck/CollectionGenericObjects/MassiveGenericObjects.cs new file mode 100644 index 0000000..cecc38d --- /dev/null +++ b/ProjectDumpTruck/ProjectDumpTruck/CollectionGenericObjects/MassiveGenericObjects.cs @@ -0,0 +1,85 @@ + +namespace ProjectDumpTruck.CollectionGenericObjects; + +internal class SetDumpTrackGeneric + where T : class +{ + private readonly T[] _collection; + public int Count => _collection.Length; + public SetDumpTrackGeneric(int count) + { + _collection = new T[count]; + } + + public int Insert(T DumpTrack) + { + // TODO вставка в начало набора + if (_collection[Count - 1] == null) + { + for (int i = Count - 1; i > 0; i--) + { + _collection[i] = _collection[i - 1]; + } + _collection[0] = DumpTrack; + return 0; + } + return -1; + } + public int Insert(T DumpTrack, int position) + { + // TODO проверка позиции + // TODO проверка, что элемент массива по этой позиции пустой, если нет, то + // проверка, что после вставляемого элемента в массиве есть пустой элемент + // сдвиг всех объектов, находящихся справа от позиции до первого пустого элемента + // TODO вставка по позиции + if (position < 0 || position >= Count) return -1; + if (_collection[position] == null) + { + _collection[position] = DumpTrack; + return position; + } + else + { + if (_collection[Count - 1] == null) + { + for (int i = Count - 1; i > position; i--) + { + _collection[i] = _collection[i - 1]; + } + _collection[position] = DumpTrack; + return position; + } + return -1; + } + } + + public T Remove(int position) + { + // TODO проверка позиции + // TODO удаление объекта из массива, присовив элементу массива значение null + if (position < 0 || position >= Count) + return null; + if (_collection[position] != null) + { + T removed = _collection[position]; + _collection[position] = null; + if (position < Count - 1) + { + for (int k = position; k < Count - 1; k++) + { + _collection[k] = _collection[k + 1]; + } + } + return removed; + } + return null; + } + public T Get(int position) + { + // TODO проверка позиции + if (position >= Count || position < 0) + return null; + + return _collection[position]; + } +}