Batylkin A.O LabWork04 #6

Closed
Stranni15k wants to merge 2 commits from LabWork4 into LabWork3
2 changed files with 91 additions and 101 deletions
Showing only changes of commit 73c5fa9476 - Show all commits

View File

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

View File

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