Лабораторная работа №4

This commit is contained in:
Stranni15k 2022-11-19 22:42:09 +04:00
parent f17a1c4735
commit 73c5fa9476
2 changed files with 91 additions and 101 deletions

View File

@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace ElectricLocomotive namespace ElectricLocomotive
{ {
internal class MapWithSetLocomotivGeneric<T, U> internal class MapWithSetLocomotivGeneric<T, U>
where T : class, IDrawningObject where T : class, IDrawningObject
where U : AbstractMap where U : AbstractMap
{ {
// Ширина окна отрисовки // Ширина окна отрисовки
@ -22,8 +22,6 @@ namespace ElectricLocomotive
private readonly SetLocomotivGeneric<T> _setLocomotive; private readonly SetLocomotivGeneric<T> _setLocomotive;
// Карта // Карта
private readonly U _map; private readonly U _map;
private readonly T[] _places;
// Конструктор // Конструктор
public MapWithSetLocomotivGeneric(int picWidth, int picHeight, U map) public MapWithSetLocomotivGeneric(int picWidth, int picHeight, U map)
{ {
@ -42,10 +40,8 @@ namespace ElectricLocomotive
// Перегрузка оператора вычитания // Перегрузка оператора вычитания
public static T operator -(MapWithSetLocomotivGeneric<T, U> map, int position) public static T operator -(MapWithSetLocomotivGeneric<T, U> map, int position)
{ {
return map._setLocomotive.Remove(position); return map._setLocomotive.Remove(position);
} }
// Вывод всего набора объектов
public Bitmap ShowSet() public Bitmap ShowSet()
{ {
Bitmap bmp = new(_pictureWidth, _pictureHeight); Bitmap bmp = new(_pictureWidth, _pictureHeight);
@ -58,16 +54,13 @@ namespace ElectricLocomotive
public Bitmap ShowOnMap() public Bitmap ShowOnMap()
{ {
Shaking(); Shaking();
for (int i = 0; i < _setLocomotive.Count; i++) foreach (var locomotive in _setLocomotive.GetLocomotive())
{ {
var Locomotive = _setLocomotive.Get(i); return _map.CreateMap(_pictureWidth, _pictureHeight, locomotive);
if (Locomotive != null)
{
return _map.CreateMap(_pictureWidth, _pictureHeight, Locomotive);
}
} }
return new(_pictureWidth, _pictureHeight); return new(_pictureWidth, _pictureHeight);
} }
///
// Перемещение объекта по карте // Перемещение объекта по карте
public Bitmap MoveObject(Direction direction) public Bitmap MoveObject(Direction direction)
{ {
@ -77,20 +70,21 @@ namespace ElectricLocomotive
} }
return new(_pictureWidth, _pictureHeight); return new(_pictureWidth, _pictureHeight);
} }
// "Взбалтываем" набор, чтобы все элементы оказались в начале // "Взбалтываем" набор, чтобы все элементы оказались в начале
private void Shaking() private void Shaking()
{ {
int j = _setLocomotive.Count - 1; int j = _setLocomotive.Count - 1;
for (int i = 0; i < _setLocomotive.Count; i++) for (int i = 0; i < _setLocomotive.Count; i++)
{ {
if (_setLocomotive.Get(i) == null) if (_setLocomotive[i] == null)
{ {
for (; j > i; j--) for (; j > i; j--)
{ {
var Locomotive = _setLocomotive.Get(j); var locomotive = _setLocomotive[j];
if (Locomotive != null) if (locomotive != null)
{ {
_setLocomotive.Insert(Locomotive, i); _setLocomotive.Insert(locomotive, i);
_setLocomotive.Remove(j); _setLocomotive.Remove(j);
break; break;
} }
@ -121,28 +115,25 @@ namespace ElectricLocomotive
// Метод прорисовки объектов // Метод прорисовки объектов
private void DrawLocomotive(Graphics g) private void DrawLocomotive(Graphics g)
{ {
int widthEl = _pictureWidth / _placeSizeWidth; int yNumOfPlaces = _pictureHeight / _placeSizeHeight;
int heightEl = _pictureHeight / _placeSizeHeight; int xNumOfPlaces = _pictureWidth / _placeSizeWidth;
int curWidth = 0; int RowIndex = yNumOfPlaces - 1;
int curHeight = 0; int ColumnIndex = 0;
for (int i = _setLocomotive.Count; i >= 0; i--) foreach (var HardLocomotive in _setLocomotive.GetLocomotive())
{ {
_setLocomotive.Get(i)?.SetObject(_pictureWidth - _placeSizeWidth * curWidth - 85, (float Left, float Top, float Right, float Bottom) = HardLocomotive.GetCurrentPosition();
curHeight * _placeSizeHeight + 10, _pictureWidth, _pictureHeight); HardLocomotive.SetObject(ColumnIndex * _placeSizeWidth, RowIndex * _placeSizeHeight + (_placeSizeHeight - (int)(Bottom - Top) - 70), _pictureWidth, _pictureHeight);
_setLocomotive.Get(i)?.DrawningObject(g); HardLocomotive.DrawningObject(g);
if (ColumnIndex == xNumOfPlaces - 1)
if (curWidth < widthEl) {
curWidth++; ColumnIndex = 0;
RowIndex--;
}
else else
{ {
curWidth = 1; ColumnIndex++;
curHeight++;
}
if (curHeight > heightEl)
{
return;
} }
} }

View File

@ -7,74 +7,73 @@ using System.Threading.Tasks;
namespace ElectricLocomotive namespace ElectricLocomotive
{ {
internal class SetLocomotivGeneric<T> internal class SetLocomotivGeneric<T>
where T : class where T : class
{ {
// Массив объектов, которые храним private readonly List<T> _places;
private readonly T[] _places; public int Count => _places.Count;
// Количество объектов в массиве private readonly int _maxCount;
public int Count => _places.Length; public SetLocomotivGeneric(int count)
// Конструктор {
public SetLocomotivGeneric(int count) _maxCount = count;
{ _places = new List<T>();
_places = new T[count]; }
} public int Insert(T locomotive)
// Добавление объекта в набор {
public int Insert(T Locomotive) if (_places.Count > _maxCount)
{ {
// вставка в начало набора return -1;
return Insert(Locomotive, 0); }
} // вставка в начало набора
// Добавление объекта в набор на конкретную позицию return Insert(locomotive, 0);
public int Insert(T Locomotive, int position) }
{ public int Insert(T locomotive, int position)
// проверка позиции {
if (position >= _places.Length || position < 0) if (position >= _maxCount || position < 0) return -1;
return -1; _places.Insert(position, locomotive);
//проверка, что элемент массива по этой позиции пустой, если нет, то return position;
if (_places[position] == null) }
{ public T Remove(int position)
_places[position] = Locomotive; {
return position; // проверка позиции
} if (position >= _maxCount || position < 0) return null;
//проверка, что после вставляемого элемента в массиве есть пустой элемент // удаление объекта из массива, присовив элементу массива значение null
int findEmptyPos = -1; T temp = _places[position];
_places.RemoveAt(position);
return temp;
}
public T this[int position]
{
get
{
if (position >= _places.Count || position < 0)
{
return null;
}
return _places[position];
}
set
{
if (position >= _places.Count || position < 0)
{
return;
}
Insert(value, position);
for (int i = position + 1; i < Count; i++) }
{ }
if (_places[i] == null) public IEnumerable<T> GetLocomotive()
{ {
findEmptyPos = i; foreach (var locomotive in _places)
break; {
} if (locomotive != null)
} {
if (findEmptyPos < 0) return -1; yield return locomotive;
}
//сдвиг всех объектов, находящихся справа от позиции до первого пустого элемента else
for (int i = findEmptyPos; i > position; i--) {
{ yield break;
_places[i] = _places[i - 1]; }
} }
// вставка по позиции }
_places[position] = Locomotive; }
return position;
}
// Удаление объекта из набора с конкретной позиции
public T Remove(int position)
{
// проверка позиции
if (position >= _places.Length || position < 0) return null;
// удаление объекта из массива, присовив элементу массива значение null
T temp = _places[position];
_places[position] = null;
return temp;
}
// Получение объекта из набора по позиции
public T Get(int position)
{
// проверка позиции
if (position >= _places.Length || position < 0)
return null;
return _places[position];
}
}
} }