diff --git a/TrolleybusProject/TrolleybusProject.sln b/TrolleybusProject/TrolleybusProject.sln index 2c5cb6e..47fba66 100644 --- a/TrolleybusProject/TrolleybusProject.sln +++ b/TrolleybusProject/TrolleybusProject.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.7.34024.191 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TrolleybusProject", "TrolleybusProject\TrolleybusProject.csproj", "{212BCE90-1598-4573-A91D-8498ED312A2B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TrolleybusProject", "TrolleybusProject\TrolleybusProject.csproj", "{212BCE90-1598-4573-A91D-8498ED312A2B}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/TrolleybusProject/TrolleybusProject/DirectionType.cs b/TrolleybusProject/TrolleybusProject/DirectionType.cs index 19324b3..81b2b42 100644 --- a/TrolleybusProject/TrolleybusProject/DirectionType.cs +++ b/TrolleybusProject/TrolleybusProject/DirectionType.cs @@ -4,10 +4,10 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace TrolleybusProject; +namespace TrolleybusProject.Drawnings; public enum DirectionType -{ +{ Unknow=-1, /// /// Вверх /// diff --git a/TrolleybusProject/TrolleybusProject/DrawningTrolleybus.cs b/TrolleybusProject/TrolleybusProject/DrawningTrolleybus.cs deleted file mode 100644 index 84b8226..0000000 --- a/TrolleybusProject/TrolleybusProject/DrawningTrolleybus.cs +++ /dev/null @@ -1,345 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace TrolleybusProject; - -public class DrawningTrolleybus -{ - /// - /// Класс-сущность - /// - public EntityTrolleybus? EntityTrolleybus { get; private set; } - /// - /// Ширина окна - /// - private int? _pictureWidth; - /// - /// Высота окна - /// - private int? _pictureHeight; - /// - /// Левая координата прорисовки троллейбуса - /// - private int? _startPosX; - /// - /// Верхняя кооридната прорисовки троллейбуса - /// - private int? _startPosY; - - /// - /// Ширина прорисовки троллейбуса - /// - public readonly int _drawningTrolleybusWidth = 150; - /// - /// Высота прорисовки троллейбуса - /// - public readonly int _drawningTrolleybusHeight = 86; - /// - /// Инициализация свойств - /// - /// Скорость - /// Вес - /// Основной цвет - /// Дополнительный цвет - /// Признак наличия рогов - /// Признак наличия дверей - /// Признак наличия отсека - public void Init(int speed, double weight, Color bodyColor, Color - additionalColor, bool doors, bool roga, bool otsek) - { - EntityTrolleybus = new EntityTrolleybus(); - EntityTrolleybus.Init(speed, weight, bodyColor, additionalColor, - doors, roga, otsek); - _pictureWidth = null; - _pictureHeight = null; - _startPosX = null; - _startPosY = null; - } - /// - /// Установка границ поля - /// - /// Ширина поля - /// Высота поля - /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах - public bool SetPictureSize(int width, int height) - { - if (width> _drawningTrolleybusWidth || height > _drawningTrolleybusHeight) - { - _pictureWidth = width; - _pictureHeight = height; - - - - if (_startPosY.HasValue && _startPosX.HasValue) - { - if (_startPosX + _drawningTrolleybusWidth > width) - { - - _startPosX = width - _drawningTrolleybusWidth; - - - } - if (_startPosY + _drawningTrolleybusHeight > height) - { - - _startPosY = height - _drawningTrolleybusHeight; - - - } - if (_startPosX < 0) - { - _startPosX = 0; - } - if (_startPosY < 0) - { - _startPosY = 0; - } - - - - } - - - - return true; - } - - - - - - - return false; - } - /// - /// Установка позиции - /// - /// Координата X - /// Координата Y - public void SetPosition(int x, int y) - { - if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) - { - return; - } - - - _startPosX = x; - _startPosY = y; - - - - if (_startPosX < 0) - { _startPosX = 0; } - if (_startPosY < 0) - { _startPosY = 0; } - - if (x + _drawningTrolleybusWidth > _pictureWidth) - { - - _startPosX = _pictureWidth - _drawningTrolleybusWidth; - - - } - if (y + _drawningTrolleybusHeight > _pictureHeight) - { - - _startPosY = _pictureHeight - _drawningTrolleybusHeight; - - - } - - - } - /// - /// Изменение направления перемещения - /// - /// Направление - /// true - перемещене выполнено, false - перемещение невозможно - public bool MoveTransport(DirectionType direction) - { - if (EntityTrolleybus == null || !_startPosX.HasValue || - !_startPosY.HasValue) - { - return false; - } - switch (direction) - { - //влево - case DirectionType.Left: - if (_startPosX.Value - EntityTrolleybus.Step > 0) - { - _startPosX -= (int)EntityTrolleybus.Step; - } - return true; - //вверх - case DirectionType.Up: - if (_startPosY.Value - EntityTrolleybus.Step > 0) - { - _startPosY -= (int)EntityTrolleybus.Step; - } - return true; - // вправо - case DirectionType.Right: - if (_startPosX.Value + EntityTrolleybus.Step < _pictureWidth - _drawningTrolleybusWidth) - { - _startPosX += (int)EntityTrolleybus.Step; - } - return true; - - //вниз - case DirectionType.Down: - if (_startPosY.Value + EntityTrolleybus.Step < _pictureHeight - _drawningTrolleybusHeight) - { - _startPosY += (int)EntityTrolleybus.Step; - } - return true; - default: - return false; - } - } - /// - /// Прорисовка объекта - /// - /// - public void DrawTransport(Graphics g) - { - if (EntityTrolleybus == null || !_startPosX.HasValue || - !_startPosY.HasValue) - { - return; - } - Pen pen = new(Color.Black); - Brush additionalBrush = new - SolidBrush(EntityTrolleybus.AdditionalColor); - Brush brushBodyColor = new SolidBrush(EntityTrolleybus.BodyColor); - Pen addpen = new(EntityTrolleybus.AdditionalColor); - //троллейбус границы - g.DrawEllipse(pen, _startPosX.Value + 27, _startPosY.Value + - 64, 20, 20); - g.DrawEllipse(pen, _startPosX.Value + 109, _startPosY.Value + - 64, 20, 20); - - - g.DrawRectangle(pen, _startPosX.Value + 10, _startPosY.Value + - 30, 140, 41); - - - //троллейбус - g.FillRectangle(brushBodyColor, _startPosX.Value + 10, _startPosY.Value + - 30, 140, 41); - g.DrawRectangle(pen, _startPosX.Value + 10, _startPosY.Value + - 30, 140, 41); - - - - - //дверь - g.DrawRectangle(pen, _startPosX.Value + 57, _startPosY.Value + - 40, 24, 31); - - - //окна - - Brush brBlue = new SolidBrush(Color.LightBlue); - - g.FillEllipse(brBlue, _startPosX.Value + 13, _startPosY.Value + - 34, 15, 20); - - g.FillEllipse(brBlue, _startPosX.Value + 38, _startPosY.Value + - 34, 15, 20); - - - g.FillEllipse(brBlue, _startPosX.Value + 85, _startPosY.Value + - 34, 15, 20); - g.FillEllipse(brBlue, _startPosX.Value + 102, _startPosY.Value + - 34, 15, 20); - g.FillEllipse(brBlue, _startPosX.Value + 118, _startPosY.Value + - 34, 15, 20); - g.FillEllipse(brBlue, _startPosX.Value + 134, _startPosY.Value + - 34, 15, 20); - - - - - - - - - - g.DrawEllipse(pen, _startPosX.Value + 13, _startPosY.Value + - 34, 15, 20); - - g.DrawEllipse(pen, _startPosX.Value + 38, _startPosY.Value + - 34, 15, 20); - - - g.DrawEllipse(pen, _startPosX.Value + 85, _startPosY.Value + - 34, 15, 20); - g.DrawEllipse(pen, _startPosX.Value + 102, _startPosY.Value + - 34, 15, 20); - g.DrawEllipse(pen, _startPosX.Value + 118, _startPosY.Value + - 34, 15, 20); - g.DrawEllipse(pen, _startPosX.Value + 134, _startPosY.Value + - 34, 15, 20); - - - - - - - - - - - - - - - - - - //рога - - if (EntityTrolleybus.Roga) - { - g.DrawLine(addpen, _startPosX.Value + 42, _startPosY.Value + 7, - _startPosX.Value + 124, _startPosY.Value + 29); - g.DrawLine(addpen, _startPosX.Value + 62, _startPosY.Value + 2, - _startPosX.Value + 124, _startPosY.Value + 29); - - - } - //отсек для батареек - - if (EntityTrolleybus.Otsek) - { - g.DrawRectangle(pen, _startPosX.Value + 5, _startPosY.Value + - 48, 5, 20); - g.FillRectangle(additionalBrush, _startPosX.Value + 5, _startPosY.Value + - 48, 5, 20); - - g.DrawRectangle(pen, _startPosX.Value + 5, _startPosY.Value + - 48, 5, 20); - } - - //двойная дверь - - if (EntityTrolleybus.Doors) - { - g.DrawLine(addpen, _startPosX.Value + 66, _startPosY.Value + 40, - _startPosX.Value + 66, _startPosY.Value + 70); - - - - } - - } -} - - - - diff --git a/TrolleybusProject/TrolleybusProject/Drawnings/DrawningBus.cs b/TrolleybusProject/TrolleybusProject/Drawnings/DrawningBus.cs new file mode 100644 index 0000000..590f45d --- /dev/null +++ b/TrolleybusProject/TrolleybusProject/Drawnings/DrawningBus.cs @@ -0,0 +1,353 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TrolleybusProject.Entities; + +namespace TrolleybusProject.Drawnings; + +public class DrawningBus +{ + /// + /// Класс-сущность + /// + public EntityBus? EntityBus { get; protected set; } + /// + /// Ширина окна + /// + private int? _pictureWidth; + /// + /// Высота окна + /// + private int? _pictureHeight; + /// + /// Левая координата прорисовки троллейбуса + /// + protected int? _startPosX; + /// + /// Верхняя кооридната прорисовки троллейбуса + /// + protected int? _startPosY; + + /// + /// Ширина прорисовки троллейбуса + /// + public readonly int _drawningBusWidth = 150; + /// + /// Высота прорисовки троллейбуса + /// + public readonly int _drawningBusHeight = 86; + + + /// + /// Координата X объекта + /// + public int? GetPosX => _startPosX; + /// + /// Координата Y объекта + /// + public int? GetPosY => _startPosY; + /// + /// Ширина объекта + /// + public int GetWidth => _drawningBusWidth; + /// + /// Высота объекта + /// + public int GetHeight => _drawningBusHeight; + + + + /// + /// Конструктор пустой + /// + private DrawningBus() + { + _pictureWidth = null; + _pictureHeight = null; + _startPosX = null; + _startPosY = null; + } + + + + + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + + public DrawningBus(int speed, double weight, Color bodyColor):this() + { + EntityBus = new EntityBus(speed, weight, bodyColor); + + } + + + /// + /// Конструктор для наследников + /// + /// Ширина прорисовки автобуса + /// Высота прорисовки автобуса + + + protected DrawningBus(int drawningBusWidth, int drawningBusHeight) : this() + { + _drawningBusWidth= drawningBusWidth; + _drawningBusHeight = drawningBusHeight; + + } + + + + + + + /// + /// Установка границ поля + /// + /// Ширина поля + /// Высота поля + /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах + public bool SetPictureSize(int width, int height) + { + if (width > _drawningBusWidth || height > _drawningBusHeight) + { + _pictureWidth = width; + _pictureHeight = height; + + + + if (_startPosY.HasValue && _startPosX.HasValue) + { + if (_startPosX + _drawningBusWidth > width) + { + + _startPosX = width - _drawningBusWidth; + + + } + if (_startPosY + _drawningBusHeight > height) + { + + _startPosY = height - _drawningBusHeight; + + + } + if (_startPosX < 0) + { + _startPosX = 0; + } + if (_startPosY < 0) + { + _startPosY = 0; + } + + + + } + + + + return true; + } + + + + + + + return false; + } + /// + /// Установка позиции + /// + /// Координата X + /// Координата Y + public void SetPosition(int x, int y) + { + if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) + { + return; + } + + + _startPosX = x; + _startPosY = y; + + + + if (_startPosX < 0) + { _startPosX = 0; } + if (_startPosY < 0) + { _startPosY = 0; } + + if (x + _drawningBusWidth > _pictureWidth) + { + + _startPosX = _pictureWidth - _drawningBusWidth; + + + } + if (y + _drawningBusHeight > _pictureHeight) + { + + _startPosY = _pictureHeight - _drawningBusHeight; + + + } + + + } + /// + /// Изменение направления перемещения + /// + /// Направление + /// true - перемещене выполнено, false - перемещение невозможно + public bool MoveTransport(DirectionType direction) + { + if (EntityBus == null || !_startPosX.HasValue || + !_startPosY.HasValue) + { + return false; + } + switch (direction) + { + //влево + case DirectionType.Left: + if (_startPosX.Value - EntityBus.Step > 0) + { + _startPosX -= (int)EntityBus.Step; + } + return true; + //вверх + case DirectionType.Up: + if (_startPosY.Value - EntityBus.Step > 0) + { + _startPosY -= (int)EntityBus.Step; + } + return true; + // вправо + case DirectionType.Right: + if (_startPosX.Value + EntityBus.Step < _pictureWidth - _drawningBusWidth) + { + _startPosX += (int)EntityBus.Step; + } + return true; + + //вниз + case DirectionType.Down: + if (_startPosY.Value + EntityBus.Step < _pictureHeight - _drawningBusHeight) + { + _startPosY += (int)EntityBus.Step; + } + return true; + default: + return false; + } + } + /// + /// Прорисовка объекта + /// + /// + public virtual void DrawTransport(Graphics g) + { + if (EntityBus == null || !_startPosX.HasValue || + !_startPosY.HasValue) + { + return; + } + Pen pen = new(Color.Black); + + + Brush brushBodyColor = new SolidBrush(EntityBus.BodyColor); + + //троллейбус границы + g.DrawEllipse(pen, _startPosX.Value + 22, _startPosY.Value + + 42, 20, 20); + g.DrawEllipse(pen, _startPosX.Value + 104, _startPosY.Value + + 42, 20, 20); + + + g.DrawRectangle(pen, _startPosX.Value + 5, _startPosY.Value + + 8, 140, 41); + + + //троллейбус + g.FillRectangle(brushBodyColor, _startPosX.Value + 5, _startPosY.Value + + 8, 140, 41); + g.DrawRectangle(pen, _startPosX.Value + 5, _startPosY.Value + + 8, 140, 41); + + + + + //дверь + g.DrawRectangle(pen, _startPosX.Value + 52, _startPosY.Value + + 18, 24, 31); + + + //окна + + Brush brBlue = new SolidBrush(Color.LightBlue); + + g.FillEllipse(brBlue, _startPosX.Value + 8, _startPosY.Value + + 12, 15, 20); + + g.FillEllipse(brBlue, _startPosX.Value + 33, _startPosY.Value + + 12, 15, 20); + + + g.FillEllipse(brBlue, _startPosX.Value + 80, _startPosY.Value + + 12, 15, 20); + g.FillEllipse(brBlue, _startPosX.Value + 97, _startPosY.Value + + 12, 15, 20); + g.FillEllipse(brBlue, _startPosX.Value + 113, _startPosY.Value + + 12, 15, 20); + g.FillEllipse(brBlue, _startPosX.Value + 129, _startPosY.Value + + 12, 15, 20); + + + + + + + + + + g.DrawEllipse(pen, _startPosX.Value + 8, _startPosY.Value + + 12, 15, 20); + + g.DrawEllipse(pen, _startPosX.Value + 33, _startPosY.Value + + 12, 15, 20); + + + g.DrawEllipse(pen, _startPosX.Value + 80, _startPosY.Value + + 12, 15, 20); + g.DrawEllipse(pen, _startPosX.Value + 97, _startPosY.Value + + 12, 15, 20); + g.DrawEllipse(pen, _startPosX.Value + 113, _startPosY.Value + + 12, 15, 20); + g.DrawEllipse(pen, _startPosX.Value + 129, _startPosY.Value + + 12, 15, 20); + + + + + + + + + + + + + + + + + } +} diff --git a/TrolleybusProject/TrolleybusProject/Drawnings/DrawningTrolleybus.cs b/TrolleybusProject/TrolleybusProject/Drawnings/DrawningTrolleybus.cs new file mode 100644 index 0000000..26a0011 --- /dev/null +++ b/TrolleybusProject/TrolleybusProject/Drawnings/DrawningTrolleybus.cs @@ -0,0 +1,115 @@ +using TrolleybusProject.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +using static System.Windows.Forms.VisualStyles.VisualStyleElement; +namespace TrolleybusProject.Drawnings; + +public class DrawningTrolleybus:DrawningBus +{ + /// + /// Клнструктор + /// + /// Скорость + /// Вес + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия рогов + /// Признак наличия дверей + /// Признак наличия отсека + public DrawningTrolleybus(int speed, double weight, Color bodyColor, Color + additionalColor, bool doors, bool roga, bool otsek):base(150,86) + { + EntityBus = new EntityTrolleybus(speed, weight, bodyColor, additionalColor, + doors, roga, otsek); + + + } + + public override void DrawTransport(Graphics g) + { + if (EntityBus == null || EntityBus is not EntityTrolleybus trolleybus|| !_startPosX.HasValue || + !_startPosY.HasValue) + { + return; + } + + + + Pen pen = new(Color.Black); + Brush additionalBrush = new SolidBrush(trolleybus.AdditionalColor); + Pen addpen = new(trolleybus.AdditionalColor); + + + + _startPosX += 5; + _startPosY += 22; + + base.DrawTransport(g); + _startPosX -= 5; + _startPosY -= 22; + + + + if (trolleybus.Otsek) + { + + g.DrawRectangle(pen, _startPosX.Value + 5, _startPosY.Value + + 48, 5, 20); + g.FillRectangle(additionalBrush, _startPosX.Value + 5, _startPosY.Value + + 48, 5, 20); + + g.DrawRectangle(pen, _startPosX.Value + 5, _startPosY.Value + + 48, 5, 20); + } + + //двойная дверь + + + + + + + if (trolleybus.Doors) + { + g.DrawLine(addpen, _startPosX.Value + 66, _startPosY.Value + 40, + _startPosX.Value + 66, _startPosY.Value + 70); + + + + } + + + + + //рога + + if (trolleybus.Roga) + { + g.DrawLine(addpen, _startPosX.Value + 42, _startPosY.Value + 7, + _startPosX.Value + 124, _startPosY.Value + 29); + g.DrawLine(addpen, _startPosX.Value + 62, _startPosY.Value + 2, + _startPosX.Value + 124, _startPosY.Value + 29); + + + } + + + } + + + + + +} + + + + + + + diff --git a/TrolleybusProject/TrolleybusProject/Entities/EntityBus.cs b/TrolleybusProject/TrolleybusProject/Entities/EntityBus.cs new file mode 100644 index 0000000..cb6a2a0 --- /dev/null +++ b/TrolleybusProject/TrolleybusProject/Entities/EntityBus.cs @@ -0,0 +1,54 @@ +using System; +using System.Net.Sockets; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static System.Windows.Forms.VisualStyles.VisualStyleElement; + + + + + + + + +namespace TrolleybusProject.Entities; + +/// +/// Класс-сущность Автобус +/// +public class EntityBus +{ + /// + /// Скорость + /// + public int Speed { get; private set; } + /// + /// Вес + /// + public double Weight { get; private set; } + /// + /// Основной цвет + /// + public Color BodyColor { get; private set; } + /// + /// Шаг перемещения троллейбуса + /// + public double Step => Speed * 100 / Weight; + + + + ///Конструктор сущности + /// Скорость + /// Вес троллейбуса + /// Основной цвет + + public EntityBus(int speed, double weight, Color bodyColor) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + + } +} diff --git a/TrolleybusProject/TrolleybusProject/EntityTrolleybus.cs b/TrolleybusProject/TrolleybusProject/Entities/EntityTrolleybus.cs similarity index 66% rename from TrolleybusProject/TrolleybusProject/EntityTrolleybus.cs rename to TrolleybusProject/TrolleybusProject/Entities/EntityTrolleybus.cs index ce0aca5..060e21b 100644 --- a/TrolleybusProject/TrolleybusProject/EntityTrolleybus.cs +++ b/TrolleybusProject/TrolleybusProject/Entities/EntityTrolleybus.cs @@ -4,26 +4,13 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace TrolleybusProject; -public class EntityTrolleybus +namespace TrolleybusProject.Entities; + +public class EntityTrolleybus: EntityBus + { - /// - /// Скорость - /// - public int Speed { get; private set; } - /// - /// Вес - /// - public double Weight { get; private set; } - /// - /// Основной цвет - /// - public Color BodyColor { get; private set; } - /// - /// Дополнительный цвет (для опциональных элементов) - /// public Color AdditionalColor { get; private set; } /// /// Признак (опция) наличие рогов @@ -38,10 +25,15 @@ public class EntityTrolleybus /// Признак (опция) наличия двойной двери /// public bool Doors { get; private set; } + /// /// Шаг перемещения троллейбуса /// - public double Step => Speed * 100 / Weight; + + + + + /// /// Инициализация полей объекта-класса троллейбуса /// @@ -52,12 +44,9 @@ public class EntityTrolleybus /// Признак наличия рогов /// Признак наличия отсека /// Признак наличия двойной двери - public void Init(int speed, double weight, Color bodyColor, Color - additionalColor, bool roga, bool otsek, bool doors) + public EntityTrolleybus(int speed, double weight, Color bodyColor, Color + additionalColor, bool roga, bool otsek, bool doors):base(speed,weight,bodyColor) { - Speed = speed; - Weight = weight; - BodyColor = bodyColor; AdditionalColor = additionalColor; Roga = roga; Otsek = otsek; diff --git a/TrolleybusProject/TrolleybusProject/FormTrolleybus.Designer.cs b/TrolleybusProject/TrolleybusProject/FormTrolleybus.Designer.cs index e86db48..0205489 100644 --- a/TrolleybusProject/TrolleybusProject/FormTrolleybus.Designer.cs +++ b/TrolleybusProject/TrolleybusProject/FormTrolleybus.Designer.cs @@ -34,6 +34,9 @@ buttonRight = new Button(); buttonUp = new Button(); buttonDown = new Button(); + buttonCreateBus = new Button(); + comboBoxStrategy = new ComboBox(); + buttonStrategyStep = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxTrolleybus).BeginInit(); SuspendLayout(); // @@ -51,9 +54,9 @@ buttonCreate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; buttonCreate.Location = new Point(21, 515); buttonCreate.Name = "buttonCreate"; - buttonCreate.Size = new Size(112, 34); + buttonCreate.Size = new Size(188, 34); buttonCreate.TabIndex = 1; - buttonCreate.Text = "Создать"; + buttonCreate.Text = "Создать Троллейбус"; buttonCreate.UseVisualStyleBackColor = true; buttonCreate.Click += buttonCreate_Click; // @@ -105,11 +108,45 @@ buttonDown.UseVisualStyleBackColor = true; buttonDown.Click += buttonMove_Click; // + // buttonCreateBus + // + buttonCreateBus.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateBus.Location = new Point(249, 515); + buttonCreateBus.Name = "buttonCreateBus"; + buttonCreateBus.Size = new Size(188, 34); + buttonCreateBus.TabIndex = 6; + buttonCreateBus.Text = "Создать Автобус"; + buttonCreateBus.UseVisualStyleBackColor = true; + buttonCreateBus.Click += buttonCreateBus_Click; + // + // comboBoxStrategy + // + comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxStrategy.FormattingEnabled = true; + comboBoxStrategy.Items.AddRange(new object[] { "К центру", "К краю" }); + comboBoxStrategy.Location = new Point(1079, 29); + comboBoxStrategy.Name = "comboBoxStrategy"; + comboBoxStrategy.Size = new Size(182, 33); + comboBoxStrategy.TabIndex = 7; + // + // buttonStrategyStep + // + buttonStrategyStep.Location = new Point(1149, 68); + buttonStrategyStep.Name = "buttonStrategyStep"; + buttonStrategyStep.Size = new Size(112, 34); + buttonStrategyStep.TabIndex = 8; + buttonStrategyStep.Text = "Шаг"; + buttonStrategyStep.UseVisualStyleBackColor = true; + buttonStrategyStep.Click += buttonStrategyStep_Click; + // // FormTrolleybus // AutoScaleDimensions = new SizeF(10F, 25F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(1273, 561); + Controls.Add(buttonStrategyStep); + Controls.Add(comboBoxStrategy); + Controls.Add(buttonCreateBus); Controls.Add(buttonDown); Controls.Add(buttonUp); Controls.Add(buttonRight); @@ -130,5 +167,8 @@ private Button buttonRight; private Button buttonUp; private Button buttonDown; + private Button buttonCreateBus; + private ComboBox comboBoxStrategy; + private Button buttonStrategyStep; } } \ No newline at end of file diff --git a/TrolleybusProject/TrolleybusProject/FormTrolleybus.cs b/TrolleybusProject/TrolleybusProject/FormTrolleybus.cs index 7c54417..644be9c 100644 --- a/TrolleybusProject/TrolleybusProject/FormTrolleybus.cs +++ b/TrolleybusProject/TrolleybusProject/FormTrolleybus.cs @@ -7,40 +7,100 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using TrolleybusProject.Drawnings; +using TrolleybusProject.MovementStrategy; namespace TrolleybusProject { public partial class FormTrolleybus : Form { - private DrawningTrolleybus? _drawningTrolleybus; + private DrawningBus? _drawningBus; + + private AbstractractStrategy? _strategy; public FormTrolleybus() { InitializeComponent(); + _strategy = null; } + + + + /// + /// Метод прорисовки машины + /// + private void Draw() + { + if (_drawningBus == null) + { + return; + } + Bitmap bmp = new(pictureBoxTrolleybus.Width, + pictureBoxTrolleybus.Height); + Graphics gr = Graphics.FromImage(bmp); + _drawningBus.DrawTransport(gr); + pictureBoxTrolleybus.Image = bmp; + } + + + + /// + /// Создание объекта класса-перемещения + /// + /// Тип создаваемого объекта + private void CreateObject(string type) + { + Random random = new(); + switch (type) + { + case nameof(DrawningBus): + _drawningBus = new DrawningBus(random.Next(100, 300), + random.Next(1000, 3000), + Color.FromArgb(random.Next(0, 256), + random.Next(0, 256), random.Next(0, 256))); + break; + case nameof(DrawningTrolleybus): + _drawningBus = new DrawningTrolleybus(random.Next(100, + 300), random.Next(1000, 3000), + Color.FromArgb(random.Next(0, 256), + random.Next(0, 256), 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))); + break; + default: + return; + } + _drawningBus.SetPictureSize(pictureBoxTrolleybus.Width, + pictureBoxTrolleybus.Height); + _drawningBus.SetPosition(random.Next(10, 100), random.Next(10, 100)); + + _strategy = null; + comboBoxStrategy.Enabled = true; + Draw(); + } + + + + + + + + private void buttonCreate_Click(object sender, EventArgs e) { - Random random = new(); - _drawningTrolleybus = new DrawningTrolleybus(); - _drawningTrolleybus.Init(random.Next(100, 300), random.Next(1000, 3000), - Color.FromArgb(random.Next(0, 256), random.Next(0, 256), 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))); - - _drawningTrolleybus.SetPictureSize(pictureBoxTrolleybus.Width, pictureBoxTrolleybus.Height); - - _drawningTrolleybus.SetPosition(random.Next(10, 100), random.Next(10, 100)); - - Bitmap bmp = new(pictureBoxTrolleybus.Width, pictureBoxTrolleybus.Height); - Graphics gr = Graphics.FromImage(bmp); - _drawningTrolleybus.DrawTransport(gr); - pictureBoxTrolleybus.Image = bmp; - + CreateObject(nameof(DrawningTrolleybus)); } + + + + + private void buttonMove_Click(object sender, EventArgs e) { - if (_drawningTrolleybus == null) + if (_drawningBus == null) { return; } @@ -49,25 +109,22 @@ namespace TrolleybusProject switch (name) { case "buttonUp": - result = _drawningTrolleybus.MoveTransport(DirectionType.Up); + result = _drawningBus.MoveTransport(DirectionType.Up); break; case "buttonDown": - result = _drawningTrolleybus.MoveTransport(DirectionType.Down); + result = _drawningBus.MoveTransport(DirectionType.Down); break; case "buttonLeft": - result = _drawningTrolleybus.MoveTransport(DirectionType.Left); + result = _drawningBus.MoveTransport(DirectionType.Left); break; case "buttonRight": - result = _drawningTrolleybus.MoveTransport(DirectionType.Right); + result = _drawningBus.MoveTransport(DirectionType.Right); break; } if (result) { - Bitmap bmp = new(pictureBoxTrolleybus.Width, pictureBoxTrolleybus.Height); - Graphics gr = Graphics.FromImage(bmp); - _drawningTrolleybus.DrawTransport(gr); - pictureBoxTrolleybus.Image = bmp; + Draw(); } @@ -78,5 +135,51 @@ namespace TrolleybusProject + + private void buttonCreateBus_Click(object sender, EventArgs e) + { + CreateObject(nameof(DrawningBus)); + + } + + + + + + private void buttonStrategyStep_Click(object sender, EventArgs e) + { + if (_drawningBus == null) + { + return; + } + if (comboBoxStrategy.Enabled) + { + _strategy = comboBoxStrategy.SelectedIndex switch + { + 0 => new MoveToCenter(), + 1 => new MoveToBorder(), + _ => null, + }; + if (_strategy == null) + { + return; + } + _strategy.SetData(new MoveableBus(_drawningBus), + pictureBoxTrolleybus.Width, pictureBoxTrolleybus.Height); + } + if (_strategy == null) + { + return; + } + comboBoxStrategy.Enabled = false; + _strategy.MakeStep(); + Draw(); + if (_strategy.GetStatus() == StrategyStatus.Finish) + { + comboBoxStrategy.Enabled = true; + _strategy = null; + } + } + } -} \ No newline at end of file +} diff --git a/TrolleybusProject/TrolleybusProject/MovementStrategy/AbstractractStrategy.cs b/TrolleybusProject/TrolleybusProject/MovementStrategy/AbstractractStrategy.cs new file mode 100644 index 0000000..a71e8f9 --- /dev/null +++ b/TrolleybusProject/TrolleybusProject/MovementStrategy/AbstractractStrategy.cs @@ -0,0 +1,127 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrolleybusProject.MovementStrategy; + +public abstract class AbstractractStrategy +{ + /// + /// Перемещаемый объект + /// + private IMoveableObjectcs? _moveableObject; + /// + /// Статус перемещения + /// + private StrategyStatus _state = StrategyStatus.NotInit; + /// + /// Ширина поля + /// + protected int FieldWidth { get; private set; } + /// + /// Высота поля + /// + protected int FieldHeight { get; private set; } + /// + /// Статус перемещения + /// + public StrategyStatus GetStatus() { return _state; } + /// + /// Установка данных + /// + /// Перемещаемый объект + /// Ширина поля + /// Высота поля + public void SetData(IMoveableObjectcs moveableObject, int width, int height) + { + if (moveableObject == null) + { + _state = StrategyStatus.NotInit; + return; + } + _state = StrategyStatus.InProgress; + _moveableObject = moveableObject; + FieldWidth = width; + FieldHeight = height; + } + /// + /// Шаг перемещения + /// + public void MakeStep() + { + if (_state != StrategyStatus.InProgress) + { + return; + } + if (IsTargetDestinaion()) + { + _state = StrategyStatus.Finish; + return; + } + MoveToTarget(); + } + /// + /// Перемещение влево + /// + /// Результат перемещения (true - удалось переместиться, false -неудача) +protected bool MoveLeft() => MoveTo(MovementDirection.Left); + /// + /// Перемещение вправо + /// + /// Результат перемещения (true - удалось переместиться, false -неудача) +protected bool MoveRight() => MoveTo(MovementDirection.Right); + /// + /// Перемещение вверх + /// + /// Результат перемещения (true - удалось переместиться, false -неудача) +protected bool MoveUp() => MoveTo(MovementDirection.Up); + /// + /// Перемещение вниз + /// + /// Результат перемещения (true - удалось переместиться, false -неудача) +protected bool MoveDown() => MoveTo(MovementDirection.Down); + /// + /// Параметры объекта + /// + protected ObjectParameters? GetObjectParameters => + _moveableObject?.GetObjectPosition; + /// + /// Шаг объекта + /// + /// + protected int? GetStep() + { + if (_state != StrategyStatus.InProgress) + { + return null; + } + return _moveableObject?.GetStep; + } + /// + /// Перемещение к цели + /// + protected abstract void MoveToTarget(); + /// + /// Достигнута ли цель + /// + /// + protected abstract bool IsTargetDestinaion(); + /// + /// Попытка перемещения в требуемом направлении + /// + /// Направление + /// Результат попытки (true - удалось переместиться, false -неудача) +private bool MoveTo(MovementDirection movementDirection) + { + if (_state != StrategyStatus.InProgress) + { + return false; + } + return _moveableObject?.TryMoveObject(movementDirection) ?? false; + } + + + +} diff --git a/TrolleybusProject/TrolleybusProject/MovementStrategy/IMoveableObjectcs.cs b/TrolleybusProject/TrolleybusProject/MovementStrategy/IMoveableObjectcs.cs new file mode 100644 index 0000000..ba63901 --- /dev/null +++ b/TrolleybusProject/TrolleybusProject/MovementStrategy/IMoveableObjectcs.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrolleybusProject.MovementStrategy; + +public interface IMoveableObjectcs +{ + /// + /// Получение координаты объекта + /// + ObjectParameters? GetObjectPosition { get; } + /// + /// Шаг объекта + /// + int GetStep { get; } + /// + /// Попытка переместить объект в указанном направлении + /// + /// Направление + /// true - объект перемещен, false - перемещение невозможно +bool TryMoveObject(MovementDirection direction); + + + + + +} diff --git a/TrolleybusProject/TrolleybusProject/MovementStrategy/MoveToBorder.cs b/TrolleybusProject/TrolleybusProject/MovementStrategy/MoveToBorder.cs new file mode 100644 index 0000000..655d0be --- /dev/null +++ b/TrolleybusProject/TrolleybusProject/MovementStrategy/MoveToBorder.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrolleybusProject.MovementStrategy; + +public class MoveToBorder: AbstractractStrategy +{ + protected override bool IsTargetDestinaion() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) + { + return false; + } + + return objParams.RightBorder <= FieldWidth && objParams.RightBorder + GetStep() >= FieldWidth && + objParams.DownBorder <= FieldHeight && + objParams.DownBorder + GetStep() >= FieldHeight; + } + + protected override void MoveToTarget() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) + { + return; + } + + int diffX = objParams.RightBorder - FieldWidth; + if (Math.Abs(diffX) > GetStep()) + { + if (diffX > 0) + { + MoveLeft(); + } + else + { + MoveRight(); + } + } + + int diffY = objParams.DownBorder - FieldHeight; + if (Math.Abs(diffY) > GetStep()) + { + if (diffY > 0) + { + MoveUp(); + } + else + { + MoveDown(); + } + } + } +} diff --git a/TrolleybusProject/TrolleybusProject/MovementStrategy/MoveToCenter.cs b/TrolleybusProject/TrolleybusProject/MovementStrategy/MoveToCenter.cs new file mode 100644 index 0000000..40df469 --- /dev/null +++ b/TrolleybusProject/TrolleybusProject/MovementStrategy/MoveToCenter.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrolleybusProject.MovementStrategy; + +public class MoveToCenter : AbstractractStrategy +{ + protected override bool IsTargetDestinaion() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) + { + return false; + } + return objParams.ObjectMiddleHorizontal - GetStep() <= FieldWidth / 2 + && objParams.ObjectMiddleHorizontal + GetStep() >= FieldWidth / 2 && + objParams.ObjectMiddleVertical - GetStep() <= FieldHeight / 2 + && objParams.ObjectMiddleVertical + GetStep() >= FieldHeight / 2; + } + protected override void MoveToTarget() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) + { + return; + } + int diffX = objParams.ObjectMiddleHorizontal - FieldWidth / 2; + if (Math.Abs(diffX) > GetStep()) + { + if (diffX > 0) + { + MoveLeft(); + } + else + { + MoveRight(); + } + } + int diffY = objParams.ObjectMiddleVertical - FieldHeight / 2; + if (Math.Abs(diffY) > GetStep()) + { + if (diffY > 0) + { + MoveUp(); + } + else + { + MoveDown(); + } + } + } + +} diff --git a/TrolleybusProject/TrolleybusProject/MovementStrategy/MoveableBus.cs b/TrolleybusProject/TrolleybusProject/MovementStrategy/MoveableBus.cs new file mode 100644 index 0000000..a69c00d --- /dev/null +++ b/TrolleybusProject/TrolleybusProject/MovementStrategy/MoveableBus.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TrolleybusProject.Drawnings; + +namespace TrolleybusProject.MovementStrategy; + +public class MoveableBus : IMoveableObjectcs +{ + /// + /// Поле-объект класса DrawningBus или его наследника + /// + private readonly DrawningBus? _bus = null; + /// + /// Конструктор + /// + /// Объект класса DrawningBus + public MoveableBus(DrawningBus bus) + { + _bus = bus; + } + public ObjectParameters? GetObjectPosition + { + get + { + if (_bus == null || _bus.EntityBus == null || + !_bus.GetPosX.HasValue || !_bus.GetPosY.HasValue) + { + return null; + } + return new ObjectParameters(_bus.GetPosX.Value, + _bus.GetPosY.Value, _bus.GetWidth, _bus.GetHeight); + } + } + public int GetStep => (int)(_bus?.EntityBus?.Step ?? 0); + public bool TryMoveObject(MovementDirection direction) + { + if (_bus == null || _bus.EntityBus == null) + { + return false; + } + return _bus.MoveTransport(GetDirectionType(direction)); + } + /// + /// Конвертация из MovementDirection в DirectionType + /// + /// MovementDirection + /// DirectionType + private static DirectionType GetDirectionType(MovementDirection direction) + { + return direction switch + { + MovementDirection.Left => DirectionType.Left, + MovementDirection.Right => DirectionType.Right, + MovementDirection.Up => DirectionType.Up, + MovementDirection.Down => DirectionType.Down, + _=> DirectionType.Unknow, + }; + } +} + + + + + + + + + + diff --git a/TrolleybusProject/TrolleybusProject/MovementStrategy/MovementDirection.cs b/TrolleybusProject/TrolleybusProject/MovementStrategy/MovementDirection.cs new file mode 100644 index 0000000..ddce05a --- /dev/null +++ b/TrolleybusProject/TrolleybusProject/MovementStrategy/MovementDirection.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrolleybusProject.MovementStrategy; + +public enum MovementDirection +{ + /// + /// Вверх + /// + Up = 1, + /// + /// Вниз + /// + Down = 2, + /// + /// Влево + /// + Left = 3, + /// + /// Вправо + /// + Right = 4 +} diff --git a/TrolleybusProject/TrolleybusProject/MovementStrategy/ObjectParameters.cs b/TrolleybusProject/TrolleybusProject/MovementStrategy/ObjectParameters.cs new file mode 100644 index 0000000..69bdae0 --- /dev/null +++ b/TrolleybusProject/TrolleybusProject/MovementStrategy/ObjectParameters.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrolleybusProject.MovementStrategy +{ + public class ObjectParameters + { + /// + /// Координата X + /// + private readonly int _x; + /// + /// Координата Y + /// + private readonly int _y; + /// + /// Ширина объекта + /// + private readonly int _width; + /// + /// Высота объекта + /// + private readonly int _height; + /// + /// Левая граница + /// + public int LeftBorder => _x; + /// + /// Верхняя граница + /// + public int TopBorder => _y; + /// + /// Правая граница + /// + public int RightBorder => _x + _width; + /// + /// Нижняя граница + /// + public int DownBorder => _y + _height; + /// + /// Середина объекта + /// + public int ObjectMiddleHorizontal => _x + _width / 2; + /// + /// Середина объекта + /// + public int ObjectMiddleVertical => _y + _height / 2; + /// + /// Конструктор + /// + /// Координата X + /// Координата Y + /// Ширина объекта + /// Высота объекта + public ObjectParameters(int x, int y, int width, int height) + { + _x = x; + _y = y; + _width = width; + _height = height; + } + + + + + } +} diff --git a/TrolleybusProject/TrolleybusProject/MovementStrategy/StrategyStatus.cs b/TrolleybusProject/TrolleybusProject/MovementStrategy/StrategyStatus.cs new file mode 100644 index 0000000..5c85260 --- /dev/null +++ b/TrolleybusProject/TrolleybusProject/MovementStrategy/StrategyStatus.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrolleybusProject.MovementStrategy; + +public enum StrategyStatus +{ + /// + /// Все готово к началу + /// + NotInit, + /// + /// Выполняется + /// + InProgress, + /// + /// Завершено + /// + Finish + + +}