Создала классы, придумала проверки

This commit is contained in:
bulatova_karina 2023-10-24 19:05:51 +03:00
parent 7a45baf1c5
commit 38b8cbf1fc
4 changed files with 301 additions and 15 deletions

View File

@ -4,6 +4,7 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using WarmlyShip.Entities; using WarmlyShip.Entities;
using WarmlyShip.MovementStrategy;
namespace WarmlyShip.DrawingObjects namespace WarmlyShip.DrawingObjects
{ {
@ -123,6 +124,10 @@ namespace WarmlyShip.DrawingObjects
break; break;
} }
} }
/// <summary>
/// Получение объекта IMoveableObject из объекта DrawingCar
/// </summary>
public IMoveableObject GetMoveableObject => new DrawingObjectShip(this);
} }
} }

View File

@ -7,10 +7,13 @@ namespace WarmlyShip
{ {
private DrawingWarmlyShip? _drawingWarmlyShip; private DrawingWarmlyShip? _drawingWarmlyShip;
private AbstractStrategy? _abstractStrategy; private AbstractStrategy? _strategy;
public DrawingWarmlyShip? SelectedShip { get; private set; }
public FormWarmlyShip() public FormWarmlyShip()
{ {
InitializeComponent(); InitializeComponent();
_strategy = null;
SelectedShip = null;
} }
private void Draw() private void Draw()
{ {
@ -27,10 +30,16 @@ namespace WarmlyShip
private void buttonCreate_Click(object sender, EventArgs e) private void buttonCreate_Click(object sender, EventArgs e)
{ {
Random random = new(); Random random = new();
Color color = Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256));
ColorDialog dialog = new();
if (dialog.ShowDialog() == DialogResult.OK)
{
color = dialog.Color;
}
_drawingWarmlyShip = new DrawingWarmlyShip(random.Next(100, 300), _drawingWarmlyShip = new DrawingWarmlyShip(random.Next(100, 300),
random.Next(1000, 3000), random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), color,
random.Next(0, 256)),
pictureBoxWarmlyShip.Width, pictureBoxWarmlyShip.Height); pictureBoxWarmlyShip.Width, pictureBoxWarmlyShip.Height);
_drawingWarmlyShip.SetPosition(random.Next(10, 100), random.Next(10, 100)); _drawingWarmlyShip.SetPosition(random.Next(10, 100), random.Next(10, 100));
Draw(); Draw();
@ -38,12 +47,24 @@ namespace WarmlyShip
private void buttonCreateWarmlyShip_Click(object sender, EventArgs e) private void buttonCreateWarmlyShip_Click(object sender, EventArgs e)
{ {
Random random = new(); Random random = new();
Color color = Color.FromArgb(random.Next(0, 256),
random.Next(0, 256), random.Next(0, 256));
ColorDialog dialogColor = new();
if (dialogColor.ShowDialog() == DialogResult.OK)
{
color = dialogColor.Color;
}
Color addColor = Color.FromArgb(random.Next(0, 256),
random.Next(0, 256), random.Next(0, 256));
ColorDialog dialogDopColor = new();
if (dialogDopColor.ShowDialog() == DialogResult.OK)
{
addColor = dialogDopColor.Color;
}
_drawingWarmlyShip = new DrawingWarmlyShipWithPipes(random.Next(100, 300), _drawingWarmlyShip = new DrawingWarmlyShipWithPipes(random.Next(100, 300),
random.Next(1000, 3000), random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), color, addColor,
random.Next(0, 256)),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256),
random.Next(0, 256)),
Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)),
Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)),
pictureBoxWarmlyShip.Width, pictureBoxWarmlyShip.Height); pictureBoxWarmlyShip.Width, pictureBoxWarmlyShip.Height);
@ -83,32 +104,31 @@ namespace WarmlyShip
} }
if (comboBoxStrategy.Enabled) if (comboBoxStrategy.Enabled)
{ {
_abstractStrategy = comboBoxStrategy.SelectedIndex _strategy = comboBoxStrategy.SelectedIndex
switch switch
{ {
0 => new MoveToCenter(), 0 => new MoveToCenter(),
1 => new MoveToBorder(), 1 => new MoveToBorder(),
_ => null, _ => null,
}; };
if (_abstractStrategy == null) if (_strategy == null)
{ {
return; return;
} }
_abstractStrategy.SetData(new _strategy.SetData(_drawingWarmlyShip.GetMoveableObject, pictureBoxWarmlyShip.Width,
DrawingObjectShip(_drawingWarmlyShip), pictureBoxWarmlyShip.Width,
pictureBoxWarmlyShip.Height); pictureBoxWarmlyShip.Height);
comboBoxStrategy.Enabled = false; comboBoxStrategy.Enabled = false;
} }
if (_abstractStrategy == null) if (_strategy == null)
{ {
return; return;
} }
_abstractStrategy.MakeStep(); _strategy.MakeStep();
Draw(); Draw();
if (_abstractStrategy.GetStatus() == Status.Finish) if (_strategy.GetStatus() == Status.Finish)
{ {
comboBoxStrategy.Enabled = true; comboBoxStrategy.Enabled = true;
_abstractStrategy = null; _strategy = null;
} }
} }
} }

View File

@ -0,0 +1,107 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WarmlyShip.Generics
{
internal class SetGeneric<T>
where T : class
{
/// <summary>
/// Массив объектов, которые храним
/// </summary>
private readonly T?[] _places;
/// <summary>
/// Количество объектов в массиве
/// </summary>
public int Count => _places.Length;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="count"></param>
public SetGeneric(int count)
{
_places = new T?[count];
}
/// <summary>
/// Добавление объекта в набор
/// </summary>
/// <param name="warmlyship">Добавляемый автомобиль</param>
/// <returns></returns>
public int Insert(T warmlyship)
{
// TODO вставка в начало набора
return Insert(warmlyship, 0);
}
/// <summary>
/// Добавление объекта в набор на конкретную позицию
/// </summary>
/// <param name="car">Добавляемый автомобиль</param>
/// <param name="position">Позиция</param>
/// <returns></returns>
public int Insert(T warmlyship, int position)
{
// TODO проверка позиции
// TODO проверка, что элемент массива по этой позиции пустой, если нет, то
// проверка, что после вставляемого элемента в массиве есть пустой элемент
// сдвиг всех объектов, находящихся справа от позиции до первого пустого элемента
// TODO вставка по позиции
int nullIndex = -1;
int i;
if (position < 0 || position >= Count)
return -1;
for (i = position; i < Count; i++)
{
if (_places[i] == null)
{
nullIndex = i;
break;
}
}
if (nullIndex < 0)
return -1;
for (i = nullIndex; i > position; i--)
{
_places[i] = _places[i - 1];
}
_places[position] = warmlyship;
return position;
}
/// <summary>
/// Удаление объекта из набора с конкретной позиции
/// </summary>
/// <param name="position"></param>
/// <returns></returns>
public bool Remove(int position)
{
// TODO проверка позиции
// TODO удаление объекта из массива, присвоив элементу массива значение null
if (position < 0 || position >= Count)
{
return false;
}
_places[position] = null;
return true;
}
/// <summary>
/// Получение объекта из набора по позиции
/// </summary>
/// <param name="position"></param>
/// <returns></returns>
public T? Get(int position)
{
// TODO проверка позиции
if (position < 0 || position >= Count)
{
return null;
}
return _places[position];
}
}
}

View File

@ -0,0 +1,154 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WarmlyShip.DrawingObjects;
using WarmlyShip.MovementStrategy;
namespace WarmlyShip.Generics
{
internal class ShipsGenericCollection<T, U>
where T : DrawingWarmlyShip
where U : IMoveableObject
{
/// <summary>
/// Ширина окна прорисовки
/// </summary>
private readonly int _pictureWidth;
/// <summary>
/// Высота окна прорисовки
/// </summary>
private readonly int _pictureHeight;
/// <summary>
/// Размер занимаемого объектом места (ширина)
/// </summary>
private readonly int _placeSizeWidth = 185;
/// <summary>
/// Размер занимаемого объектом места (высота)
/// </summary>
private readonly int _placeSizeHeight = 180;
/// <summary>
/// Набор объектов
/// </summary>
private readonly SetGeneric<T> _collection;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="picWidth"></param>
/// <param name="picHeight"></param>
public ShipsGenericCollection(int picWidth, int picHeight)
{
int width = picWidth / _placeSizeWidth;
int height = picHeight / _placeSizeHeight;
_pictureWidth = picWidth;
_pictureHeight = picHeight;
_collection = new SetGeneric<T>(width * height);
}
/// <summary>
/// Перегрузка оператора сложения
/// </summary>
/// <param name="collect"></param>
/// <param name="obj"></param>
/// <returns></returns>
public static int operator +(ShipsGenericCollection<T, U> collect, T?
obj)
{
if (obj == null)
{
return -1;
}
return collect._collection.Insert(obj);
}
/// <summary>
/// Перегрузка оператора вычитания
/// </summary>
/// <param name="collect"></param>
/// <param name="pos"></param>
/// <returns></returns>
public static T? operator -(ShipsGenericCollection<T, U> collect, int
pos)
{
T? obj = collect._collection.Get(pos);
if (obj != null)
{
collect._collection.Remove(pos);
}
return obj;
}
/// <summary>
/// Получение объекта IMoveableObject
/// </summary>
/// <param name="pos"></param>
/// <returns></returns>
public U? GetU(int pos)
{
return (U?)_collection.Get(pos)?.GetMoveableObject;
}
/// <summary>
/// Вывод всего набора объектов
/// </summary>
/// <returns></returns>
public Bitmap ShowCars()
{
Bitmap bmp = new(_pictureWidth, _pictureHeight);
Graphics gr = Graphics.FromImage(bmp);
DrawBackground(gr);
DrawObjects(gr);
return bmp;
}
/// <summary>
/// Метод отрисовки фона
/// </summary>
/// <param name="g"></param>
private void DrawBackground(Graphics g)
{
Pen pen = new(Color.Black, 3);
for (int i = 0; i < _pictureWidth / _placeSizeWidth; i++)
{
for (int j = 0; j < _pictureHeight / _placeSizeHeight +
1; ++j)
{//линия рамзетки места
g.DrawLine(pen, i * _placeSizeWidth, j *
_placeSizeHeight, i * _placeSizeWidth + _placeSizeWidth / 2, j *
_placeSizeHeight);
}
g.DrawLine(pen, i * _placeSizeWidth, 0, i *
_placeSizeWidth, _pictureHeight / _placeSizeHeight * _placeSizeHeight);
}
}
/// <summary>
/// /// Метод прорисовки объектов
/// </summary>
/// <param name="g"></param>
private void DrawObjects(Graphics g)
{
T? obj;
int width = _pictureWidth / _placeSizeWidth;
int height = _pictureHeight / _placeSizeHeight;
int diff = 1;
int currWidth = 0;
for (int i = 0; i < _collection.Count; i++)
{
// TODO получение объекта
// TODO установка позиции
// TODO прорисовка объекта
currWidth++;
if (currWidth > width)
{
diff++;
currWidth = 1;
}
obj = _collection.Get(i);
if (obj != null)
{
obj.SetPosition(i % width * _placeSizeWidth + _placeSizeWidth / 40,
(height - diff) * _placeSizeHeight + _placeSizeHeight / 15);
obj.DrawTransport(g);
}
}
}
}
}