diff --git a/AccordionBus/AccordionBus/DirectionType.cs b/AccordionBus/AccordionBus/Drawnings/DirectionType.cs
similarity index 79%
rename from AccordionBus/AccordionBus/DirectionType.cs
rename to AccordionBus/AccordionBus/Drawnings/DirectionType.cs
index 82de324..4eeb1b1 100644
--- a/AccordionBus/AccordionBus/DirectionType.cs
+++ b/AccordionBus/AccordionBus/Drawnings/DirectionType.cs
@@ -4,13 +4,17 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
-namespace AccordionBus
+namespace AccordionBus.Drawnings
{
///
/// Направление премещения
///
public enum DirectionType
{
+ ///
+ /// Неизвестное направление
+ ///
+ Unknow = -1,
///
/// Вверх
///
diff --git a/AccordionBus/AccordionBus/Drawnings/DrawningAccordionBus.cs b/AccordionBus/AccordionBus/Drawnings/DrawningAccordionBus.cs
new file mode 100644
index 0000000..ed3978f
--- /dev/null
+++ b/AccordionBus/AccordionBus/Drawnings/DrawningAccordionBus.cs
@@ -0,0 +1,100 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using AccordionBus.Entities;
+
+namespace AccordionBus.Drawnings
+{
+ ///
+ /// Класс, отвечающий за перемещение и прорисовку объекта-сущности
+ ///
+ public class DrawningAccordionBus : DrawningBus
+ {
+ ///
+ /// Инициализация свойств
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public DrawningAccordionBus(int speed, double weight, Color bodyColor, Color
+ additionalColor, bool onePart, bool fiveDoors): base(130, 20)
+ {
+ EntityBus = new EntityAccordionBus(speed, weight, bodyColor, additionalColor, onePart, fiveDoors);
+ }
+ ///
+ /// Отрисовка транспорта
+ ///
+ ///
+ public override void DrawTransport(Graphics g)
+ {
+ if (EntityBus == null || EntityBus is not EntityAccordionBus accordionBus || !_startPosX.HasValue ||
+ !_startPosY.HasValue)
+ {
+ return;
+ }
+
+ base.DrawTransport(g);
+
+ if (!accordionBus.OnePart)
+ {
+ Pen pen = new(Color.Black);
+ Brush brWhite = new SolidBrush(Color.White);
+ Brush br = new SolidBrush(accordionBus.BodyColor);
+ Brush brBlue = new SolidBrush(Color.LightBlue);
+ Brush additionalBrush = new SolidBrush(accordionBus.AdditionalColor);
+ //корпус
+ g.FillRectangle(br, _startPosX.Value + 70, _startPosY.Value, 60, 15);
+ g.DrawRectangle(pen, _startPosX.Value + 70, _startPosY.Value, 60, 15);
+
+ //колёса
+ g.FillEllipse(brWhite, _startPosX.Value + 75, _startPosY.Value + 10, 10, 10);
+ g.FillEllipse(brWhite, _startPosX.Value + 110, _startPosY.Value + 10, 10, 10);
+ g.DrawEllipse(pen, _startPosX.Value + 110, _startPosY.Value + 10, 10, 10);
+ g.DrawEllipse(pen, _startPosX.Value + 75, _startPosY.Value + 10, 10, 10);
+
+ //стёкла
+ g.FillRectangle(brBlue, _startPosX.Value + 72, _startPosY.Value + 3, 5, 5);
+ g.DrawRectangle(pen, _startPosX.Value + 72, _startPosY.Value + 3, 5, 5);
+ g.FillRectangle(brBlue, _startPosX.Value + 82, _startPosY.Value + 3, 5, 5);
+ g.DrawRectangle(pen, _startPosX.Value + 82, _startPosY.Value + 3, 5, 5);
+ g.FillRectangle(brBlue, _startPosX.Value + 92, _startPosY.Value + 3, 5, 5);
+ g.DrawRectangle(pen, _startPosX.Value + 92, _startPosY.Value + 3, 5, 5);
+ g.FillRectangle(brBlue, _startPosX.Value + 102, _startPosY.Value + 3, 5, 5);
+ g.DrawRectangle(pen, _startPosX.Value + 102, _startPosY.Value + 3, 5, 5);
+ g.FillRectangle(brBlue, _startPosX.Value + 112, _startPosY.Value + 3, 5, 5);
+ g.DrawRectangle(pen, _startPosX.Value + 112, _startPosY.Value + 3, 5, 5);
+
+ //гормошка
+ g.DrawLine(pen, _startPosX.Value + 60, _startPosY.Value, _startPosX.Value + 62, _startPosY.Value + 3);
+ g.DrawLine(pen, _startPosX.Value + 62, _startPosY.Value + 3, _startPosX.Value + 65, _startPosY.Value);
+ g.DrawLine(pen, _startPosX.Value + 65, _startPosY.Value, _startPosX.Value + 67, _startPosY.Value + 3);
+ g.DrawLine(pen, _startPosX.Value + 67, _startPosY.Value + 3, _startPosX.Value + 70, _startPosY.Value);
+ g.DrawLine(pen, _startPosX.Value + 60, _startPosY.Value + 15, _startPosX.Value + 62, _startPosY.Value + 12);
+ g.DrawLine(pen, _startPosX.Value + 62, _startPosY.Value + 12, _startPosX.Value + 65, _startPosY.Value + 15);
+ g.DrawLine(pen, _startPosX.Value + 65, _startPosY.Value + 15, _startPosX.Value + 67, _startPosY.Value + 12);
+ g.DrawLine(pen, _startPosX.Value + 67, _startPosY.Value + 12, _startPosX.Value + 70, _startPosY.Value + 15);
+ g.DrawLine(pen, _startPosX.Value + 62, _startPosY.Value + 3, _startPosX.Value + 62, _startPosY.Value + 12);
+ g.DrawLine(pen, _startPosX.Value + 67, _startPosY.Value + 3, _startPosX.Value + 67, _startPosY.Value + 12);
+ g.DrawLine(pen, _startPosX.Value + 65, _startPosY.Value, _startPosX.Value + 65, _startPosY.Value + 15);
+
+ //двери
+ g.FillRectangle(additionalBrush, _startPosX.Value + 123, _startPosY.Value + 5, 5, 10);
+ g.DrawRectangle(pen, _startPosX.Value + 123, _startPosY.Value + 5, 5, 10);
+ if (accordionBus.FiveDoors)
+ {
+ g.FillRectangle(additionalBrush, _startPosX.Value + 87, _startPosY.Value + 9, 21, 5);
+ g.DrawRectangle(pen, _startPosX.Value + 87, _startPosY.Value + 9, 21, 5);
+ g.FillRectangle(additionalBrush, _startPosX.Value + 53, _startPosY.Value + 5, 5, 10);
+ g.DrawRectangle(pen, _startPosX.Value + 53, _startPosY.Value + 5, 5, 10);
+ g.FillRectangle(additionalBrush, _startPosX.Value + 27, _startPosY.Value + 9, 11, 5);
+ g.DrawRectangle(pen, _startPosX.Value + 27, _startPosY.Value + 9, 11, 5);
+ }
+ }
+ }
+ }
+}
diff --git a/AccordionBus/AccordionBus/DrawningAccordionBus.cs b/AccordionBus/AccordionBus/Drawnings/DrawningBus.cs
similarity index 50%
rename from AccordionBus/AccordionBus/DrawningAccordionBus.cs
rename to AccordionBus/AccordionBus/Drawnings/DrawningBus.cs
index fc7c9c1..92cb343 100644
--- a/AccordionBus/AccordionBus/DrawningAccordionBus.cs
+++ b/AccordionBus/AccordionBus/Drawnings/DrawningBus.cs
@@ -1,20 +1,19 @@
-using System;
+using AccordionBus.Entities;
+using System;
using System.Collections.Generic;
+using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-namespace AccordionBus
+namespace AccordionBus.Drawnings
{
- ///
- /// Класс, отвечающий за перемещение и прорисовку объекта-сущности
- ///
- public class DrawningAccordionBus
+ public class DrawningBus
{
///
/// Класс-сущность
///
- public EntityAccordionBus? EntityAccordionBus { get; private set; }
+ public EntityBus? EntityBus { get; protected set; }
///
/// Ширина окна
///
@@ -26,39 +25,70 @@ namespace AccordionBus
///
/// Левая координата прорисовки авто
///
- private int? _startPosX;
+ protected int? _startPosX;
///
/// Верхняя координата прорисовки авто
///
- private int? _startPosY;
+ protected int? _startPosY;
///
/// Ширина прорисовки авто
///
- private readonly int _drawningBusWeight = 130;
+ private readonly int _drawningBusWeight = 60;
///
/// Высота прорисовки авто
///
private readonly int _drawningBusHeight = 20;
///
- /// Инициализация свойств
+ /// Координата Х объекта
///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- public void Init(int speed, double weight, Color bodyColor, Color
- additionalColor, bool onePart, bool fiveDoors)
+ ///
+ public int? GetPosX() => _startPosX;
+ ///
+ /// Координата Y объекта
+ ///
+ ///
+ public int? GetPosY() => _startPosY;
+ ///
+ /// Ширина объекта
+ ///
+ ///
+ public int GetWidth() => _drawningBusWeight;
+ ///
+ /// Высота объекта
+ ///
+ ///
+ public int GetHeight() => _drawningBusHeight;
+ ///
+ /// Пустой конструктор
+ ///
+ private DrawningBus()
{
- EntityAccordionBus = new EntityAccordionBus();
- EntityAccordionBus.Init(speed, weight, bodyColor, additionalColor, onePart, fiveDoors);
_pictureWeight = null;
_pictureHeight = null;
_startPosX = null;
_startPosY = null;
}
+ ///
+ /// Конструктор границ объекта
+ ///
+ /// Ширина
+ /// Высота
+ protected DrawningBus(int drawningBusWeight, int drawningBusHeight) : this()
+ {
+ _drawningBusWeight = drawningBusWeight;
+ _drawningBusHeight = drawningBusHeight;
+ }
+ ///
+ /// Конструктор пораметров
+ ///
+ /// Скорость
+ /// Вес
+ /// Основной цвет
+ public DrawningBus(int speed, double weight, Color bodyColor) : this()
+ {
+ EntityBus = new EntityBus(speed, weight, bodyColor);
+ }
+
///
/// Установка границ поля
///
@@ -84,6 +114,8 @@ namespace AccordionBus
_startPosY -= _startPosY.Value + _drawningBusHeight - _pictureHeight;
}
return true;
+
+
}
///
/// Установка позиции
@@ -99,7 +131,7 @@ namespace AccordionBus
if (x + _drawningBusWeight > _pictureWeight)
{
- _startPosX = x - ( x + _drawningBusWeight - _pictureWeight);
+ _startPosX = x - (x + _drawningBusWeight - _pictureWeight);
}
else if (x < 0)
{
@@ -112,7 +144,7 @@ namespace AccordionBus
if (y + _drawningBusHeight > _pictureHeight)
{
- _startPosY = y - ( y + _drawningBusHeight - _pictureHeight);
+ _startPosY = y - (y + _drawningBusHeight - _pictureHeight);
}
else if (y < 0)
{
@@ -130,7 +162,7 @@ namespace AccordionBus
/// true - перемещение выполнено, false - перемещение невозможнор
public bool MoveTransport(DirectionType direction)
{
- if (EntityAccordionBus == null || !_startPosX.HasValue ||
+ if (EntityBus == null || !_startPosX.HasValue ||
!_startPosY.HasValue)
{
return false;
@@ -140,9 +172,9 @@ namespace AccordionBus
{
case DirectionType.Left:
- if (_startPosX.Value - EntityAccordionBus.Step > 0)
+ if (_startPosX.Value - EntityBus.Step > 0)
{
- _startPosX -= (int)EntityAccordionBus.Step;
+ _startPosX -= (int)EntityBus.Step;
}
else
{
@@ -151,9 +183,9 @@ namespace AccordionBus
return true;
case DirectionType.Right:
- if (_startPosX.Value + EntityAccordionBus.Step + _drawningBusWeight < _pictureWeight)
+ if (_startPosX.Value + EntityBus.Step + _drawningBusWeight < _pictureWeight)
{
- _startPosX += (int)EntityAccordionBus.Step;
+ _startPosX += (int)EntityBus.Step;
}
else
{
@@ -162,9 +194,9 @@ namespace AccordionBus
return true;
case DirectionType.Up:
- if (_startPosY.Value - EntityAccordionBus.Step > 0)
+ if (_startPosY.Value - EntityBus.Step > 0)
{
- _startPosY -= (int)EntityAccordionBus.Step;
+ _startPosY -= (int)EntityBus.Step;
}
else
{
@@ -173,9 +205,9 @@ namespace AccordionBus
return true;
case DirectionType.Down:
- if (_startPosY.Value + EntityAccordionBus.Step + _drawningBusHeight < _pictureHeight)
+ if (_startPosY.Value + EntityBus.Step + _drawningBusHeight < _pictureHeight)
{
- _startPosY += (int)EntityAccordionBus.Step;
+ _startPosY += (int)EntityBus.Step;
}
else
{
@@ -191,19 +223,19 @@ namespace AccordionBus
/// Отрисовка транспорта
///
///
- public void DrawTransport(Graphics g)
+ public virtual void DrawTransport(Graphics g)
{
- if (EntityAccordionBus == null || !_startPosX.HasValue ||
- !_startPosY.HasValue)
+ if (EntityBus == null || !_startPosX.HasValue ||
+ !_startPosY.HasValue)
{
- return;
+ return;
}
Pen pen = new(Color.Black);
- Brush additionalBrush = new SolidBrush(EntityAccordionBus.AdditionalColor);
+ Brush brDoor = new SolidBrush(Color.Gray);
//корпус
- Brush br = new SolidBrush(EntityAccordionBus.BodyColor);
+ Brush br = new SolidBrush(EntityBus.BodyColor);
g.FillRectangle(br, _startPosX.Value, _startPosY.Value, 60, 15);
g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value, 60, 15);
@@ -226,59 +258,8 @@ namespace AccordionBus
g.DrawRectangle(pen, _startPosX.Value + 42, _startPosY.Value + 3, 5, 5);
//дверь
- g.FillRectangle(additionalBrush, _startPosX.Value + 20, _startPosY.Value + 5, 5, 10);
+ g.FillRectangle(brDoor, _startPosX.Value + 20, _startPosY.Value + 5, 5, 10);
g.DrawRectangle(pen, _startPosX.Value + 20, _startPosY.Value + 5, 5, 10);
-
- if (!EntityAccordionBus.OnePart)
- {
- //корпус
- g.FillRectangle(br, _startPosX.Value + 70, _startPosY.Value, 60, 15);
- g.DrawRectangle(pen, _startPosX.Value + 70, _startPosY.Value, 60, 15);
-
- //колёса
- g.FillEllipse(brWhite, _startPosX.Value + 75, _startPosY.Value + 10, 10, 10);
- g.FillEllipse(brWhite, _startPosX.Value + 110, _startPosY.Value + 10, 10, 10);
- g.DrawEllipse(pen, _startPosX.Value + 110, _startPosY.Value + 10, 10, 10);
- g.DrawEllipse(pen, _startPosX.Value + 75, _startPosY.Value + 10, 10, 10);
-
- //стёкла
- g.FillRectangle(brBlue, _startPosX.Value + 72, _startPosY.Value + 3, 5, 5);
- g.DrawRectangle(pen, _startPosX.Value + 72, _startPosY.Value + 3, 5, 5);
- g.FillRectangle(brBlue, _startPosX.Value + 82, _startPosY.Value + 3, 5, 5);
- g.DrawRectangle(pen, _startPosX.Value + 82, _startPosY.Value + 3, 5, 5);
- g.FillRectangle(brBlue, _startPosX.Value + 92, _startPosY.Value + 3, 5, 5);
- g.DrawRectangle(pen, _startPosX.Value + 92, _startPosY.Value + 3, 5, 5);
- g.FillRectangle(brBlue, _startPosX.Value + 102, _startPosY.Value + 3, 5, 5);
- g.DrawRectangle(pen, _startPosX.Value + 102, _startPosY.Value + 3, 5, 5);
- g.FillRectangle(brBlue, _startPosX.Value + 112, _startPosY.Value + 3, 5, 5);
- g.DrawRectangle(pen, _startPosX.Value + 112, _startPosY.Value + 3, 5, 5);
-
- //гормошка
- g.DrawLine(pen, _startPosX.Value + 60, _startPosY.Value, _startPosX.Value + 62, _startPosY.Value + 3);
- g.DrawLine(pen, _startPosX.Value + 62, _startPosY.Value + 3, _startPosX.Value + 65, _startPosY.Value);
- g.DrawLine(pen, _startPosX.Value + 65, _startPosY.Value, _startPosX.Value + 67, _startPosY.Value + 3);
- g.DrawLine(pen, _startPosX.Value + 67, _startPosY.Value + 3, _startPosX.Value + 70, _startPosY.Value);
- g.DrawLine(pen, _startPosX.Value + 60, _startPosY.Value + 15, _startPosX.Value + 62, _startPosY.Value + 12);
- g.DrawLine(pen, _startPosX.Value + 62, _startPosY.Value + 12, _startPosX.Value + 65, _startPosY.Value + 15);
- g.DrawLine(pen, _startPosX.Value + 65, _startPosY.Value + 15, _startPosX.Value + 67, _startPosY.Value + 12);
- g.DrawLine(pen, _startPosX.Value + 67, _startPosY.Value + 12, _startPosX.Value + 70, _startPosY.Value + 15);
- g.DrawLine(pen, _startPosX.Value + 62, _startPosY.Value + 3, _startPosX.Value + 62, _startPosY.Value + 12);
- g.DrawLine(pen, _startPosX.Value + 67, _startPosY.Value + 3, _startPosX.Value + 67, _startPosY.Value + 12);
- g.DrawLine(pen, _startPosX.Value + 65, _startPosY.Value, _startPosX.Value + 65, _startPosY.Value + 15);
-
- //двери
- g.FillRectangle(additionalBrush, _startPosX.Value + 123, _startPosY.Value + 5, 5, 10);
- g.DrawRectangle(pen, _startPosX.Value + 123, _startPosY.Value + 5, 5, 10);
- if (EntityAccordionBus.FiveDoors)
- {
- g.FillRectangle(additionalBrush, _startPosX.Value + 87, _startPosY.Value + 9, 21, 5);
- g.DrawRectangle(pen, _startPosX.Value + 87, _startPosY.Value + 9, 21, 5);
- g.FillRectangle(additionalBrush, _startPosX.Value + 53, _startPosY.Value + 5, 5, 10);
- g.DrawRectangle(pen, _startPosX.Value + 53, _startPosY.Value + 5, 5, 10);
- g.FillRectangle(additionalBrush, _startPosX.Value + 27, _startPosY.Value + 9, 11, 5);
- g.DrawRectangle(pen, _startPosX.Value + 27, _startPosY.Value + 9, 11, 5);
- }
- }
}
}
-}
+}
\ No newline at end of file
diff --git a/AccordionBus/AccordionBus/EntityAccordionBus.cs b/AccordionBus/AccordionBus/Entities/EntityAccordionBus.cs
similarity index 58%
rename from AccordionBus/AccordionBus/EntityAccordionBus.cs
rename to AccordionBus/AccordionBus/Entities/EntityAccordionBus.cs
index b6c06a7..336dfcf 100644
--- a/AccordionBus/AccordionBus/EntityAccordionBus.cs
+++ b/AccordionBus/AccordionBus/Entities/EntityAccordionBus.cs
@@ -4,25 +4,13 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
-namespace AccordionBus
+namespace AccordionBus.Entities
{
///
/// класс-сущность "автобус с гормошкой"
///
- public class EntityAccordionBus
+ public class EntityAccordionBus : EntityBus
{
- ///
- /// Скорость
- ///
- public int Speed { get; set; }
- ///
- /// Вес
- ///
- public double Weight { get; set; }
- ///
- /// Основной цвет
- ///
- public Color BodyColor { get; set; }
///
/// Дополнительный цвет
///
@@ -36,25 +24,17 @@ namespace AccordionBus
///
public bool FiveDoors { get; set; }
///
- /// Шаг
- ///
- public double Step => Speed * 100 / Weight;
- ///
/// инициализация полей объекта-класса
///
/// Скорость
/// вес
/// Основной цвет
/// Дополнительный цвет
- /// 3 двери
- /// 4 двери
+ /// 1 часть
/// 5 дверей
- public void Init(int speed, double weight, Color bodyColor, Color
- additionalColor, bool onePart, bool fiveDoors)
+ public EntityAccordionBus(int speed, double weight, Color bodyColor,
+ Color additionalColor, bool onePart, bool fiveDoors) : base(speed, weight, bodyColor)
{
- Speed = speed;
- Weight = weight;
- BodyColor = bodyColor;
AdditionalColor = additionalColor;
OnePart = onePart;
FiveDoors = fiveDoors;
diff --git a/AccordionBus/AccordionBus/Entities/EntityBus.cs b/AccordionBus/AccordionBus/Entities/EntityBus.cs
new file mode 100644
index 0000000..18c5a80
--- /dev/null
+++ b/AccordionBus/AccordionBus/Entities/EntityBus.cs
@@ -0,0 +1,43 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace AccordionBus.Entities
+{
+ ///
+ /// класс-сущность "Автобус"
+ ///
+ public class EntityBus
+ {
+ ///
+ /// Скорость
+ ///
+ public int Speed { get; set; }
+ ///
+ /// Вес
+ ///
+ public double Weight { get; set; }
+ ///
+ /// Основной цвет
+ ///
+ public Color BodyColor { get; set; }
+ ///
+ /// Шаг
+ ///
+ public double Step => Speed * 100 / Weight;
+ ///
+ /// Конструктор сущности
+ ///
+ /// Скорость
+ /// Вес
+ /// Основной цвет
+ public EntityBus(int speed, double weight, Color bodyColor)
+ {
+ Speed = speed;
+ Weight = weight;
+ BodyColor = bodyColor;
+ }
+ }
+}
diff --git a/AccordionBus/AccordionBus/FormAccordionBus.Designer.cs b/AccordionBus/AccordionBus/FormAccordionBus.Designer.cs
index be03cce..d34b0f9 100644
--- a/AccordionBus/AccordionBus/FormAccordionBus.Designer.cs
+++ b/AccordionBus/AccordionBus/FormAccordionBus.Designer.cs
@@ -29,17 +29,20 @@
private void InitializeComponent()
{
pictureBoxAccordionBus = new PictureBox();
- buttonCreate = new Button();
+ buttonCreateAccordionBus = new Button();
ButtonUp = new Button();
ButtonRight = new Button();
ButtonLeft = new Button();
ButtonDown = new Button();
+ buttonCreateBus = new Button();
+ comboBoxStratregy = new ComboBox();
+ buttonStrategyStap = new Button();
((System.ComponentModel.ISupportInitialize)pictureBoxAccordionBus).BeginInit();
SuspendLayout();
//
// pictureBoxAccordionBus
//
- pictureBoxAccordionBus.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
+ pictureBoxAccordionBus.Dock = DockStyle.Fill;
pictureBoxAccordionBus.Location = new Point(0, 0);
pictureBoxAccordionBus.Name = "pictureBoxAccordionBus";
pictureBoxAccordionBus.Size = new Size(882, 453);
@@ -47,16 +50,16 @@
pictureBoxAccordionBus.TabIndex = 0;
pictureBoxAccordionBus.TabStop = false;
//
- // buttonCreate
+ // buttonCreateAccordionBus
//
- buttonCreate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
- buttonCreate.Location = new Point(12, 412);
- buttonCreate.Name = "buttonCreate";
- buttonCreate.Size = new Size(94, 29);
- buttonCreate.TabIndex = 1;
- buttonCreate.Text = "создать";
- buttonCreate.UseVisualStyleBackColor = true;
- buttonCreate.Click += ButtonCreate_Click;
+ buttonCreateAccordionBus.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
+ buttonCreateAccordionBus.Location = new Point(12, 412);
+ buttonCreateAccordionBus.Name = "buttonCreateAccordionBus";
+ buttonCreateAccordionBus.Size = new Size(235, 29);
+ buttonCreateAccordionBus.TabIndex = 1;
+ buttonCreateAccordionBus.Text = "создать автобус с гормошкой";
+ buttonCreateAccordionBus.UseVisualStyleBackColor = true;
+ buttonCreateAccordionBus.Click += ButtonCreate_Click;
//
// ButtonUp
//
@@ -110,16 +113,50 @@
ButtonDown.UseVisualStyleBackColor = true;
ButtonDown.Click += ButtonMove_Click;
//
+ // buttonCreateBus
+ //
+ buttonCreateBus.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
+ buttonCreateBus.Location = new Point(253, 411);
+ buttonCreateBus.Name = "buttonCreateBus";
+ buttonCreateBus.Size = new Size(235, 29);
+ buttonCreateBus.TabIndex = 6;
+ buttonCreateBus.Text = "создать автобус";
+ buttonCreateBus.UseVisualStyleBackColor = true;
+ buttonCreateBus.Click += ButtonCreateBus_Click;
+ //
+ // comboBoxStratregy
+ //
+ comboBoxStratregy.DropDownStyle = ComboBoxStyle.DropDownList;
+ comboBoxStratregy.FormattingEnabled = true;
+ comboBoxStratregy.Items.AddRange(new object[] { "К центру", "К краю" });
+ comboBoxStratregy.Location = new Point(688, 12);
+ comboBoxStratregy.Name = "comboBoxStratregy";
+ comboBoxStratregy.Size = new Size(151, 28);
+ comboBoxStratregy.TabIndex = 7;
+ //
+ // buttonStrategyStap
+ //
+ buttonStrategyStap.Location = new Point(761, 46);
+ buttonStrategyStap.Name = "buttonStrategyStap";
+ buttonStrategyStap.Size = new Size(78, 29);
+ buttonStrategyStap.TabIndex = 8;
+ buttonStrategyStap.Text = "Шаг";
+ buttonStrategyStap.UseVisualStyleBackColor = true;
+ buttonStrategyStap.Click += buttonStrategyStap_Click;
+ //
// FormAccordionBus
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(882, 453);
+ Controls.Add(buttonStrategyStap);
+ Controls.Add(comboBoxStratregy);
+ Controls.Add(buttonCreateBus);
Controls.Add(ButtonDown);
Controls.Add(ButtonLeft);
Controls.Add(ButtonRight);
Controls.Add(ButtonUp);
- Controls.Add(buttonCreate);
+ Controls.Add(buttonCreateAccordionBus);
Controls.Add(pictureBoxAccordionBus);
Name = "FormAccordionBus";
StartPosition = FormStartPosition.CenterScreen;
@@ -132,10 +169,13 @@
#endregion
private PictureBox pictureBoxAccordionBus;
- private Button buttonCreate;
+ private Button buttonCreateAccordionBus;
private Button ButtonUp;
private Button ButtonRight;
private Button ButtonLeft;
private Button ButtonDown;
+ private Button buttonCreateBus;
+ private ComboBox comboBoxStratregy;
+ private Button buttonStrategyStap;
}
}
\ No newline at end of file
diff --git a/AccordionBus/AccordionBus/FormAccordionBus.cs b/AccordionBus/AccordionBus/FormAccordionBus.cs
index 99ee87b..4ec9bdf 100644
--- a/AccordionBus/AccordionBus/FormAccordionBus.cs
+++ b/AccordionBus/AccordionBus/FormAccordionBus.cs
@@ -7,44 +7,71 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
+using AccordionBus.Drawnings;
+using AccordionBus.MovementStrategy;
namespace AccordionBus
{
public partial class FormAccordionBus : Form
{
- private DrawningAccordionBus? _drawningAccordionBus;
+ private DrawningBus? _drawningBus;
+ private AbstractStrategy? _strategy;
public FormAccordionBus()
{
InitializeComponent();
+ _strategy = null;
}
private void Draw()
{
- if (_drawningAccordionBus == null)
+ if (_drawningBus == null)
{
return;
}
Bitmap bmp = new(pictureBoxAccordionBus.Width, pictureBoxAccordionBus.Height);
Graphics gr = Graphics.FromImage(bmp);
- _drawningAccordionBus.DrawTransport(gr);
+ _drawningBus.DrawTransport(gr);
pictureBoxAccordionBus.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, 255), random.Next(0, 255), random.Next(0, 255)));
+ break;
+ case nameof(DrawningAccordionBus):
+ _drawningBus = new DrawningAccordionBus(random.Next(100, 300), random.Next(1000, 3000),
+ Color.FromArgb(random.Next(0, 255), random.Next(0, 255), random.Next(0, 255)),
+ Color.FromArgb(random.Next(0, 255), random.Next(0, 255), random.Next(0, 255)),
+ Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)));
+ break;
+ default:
+ return;
+ }
+
+ _drawningBus.SetPictureSize(pictureBoxAccordionBus.Width, pictureBoxAccordionBus.Height);
+ _drawningBus.SetPosition(random.Next(50, 300), random.Next(50, 300));
+ _strategy = null;
+ comboBoxStratregy.Enabled = true;
+ Draw();
+ }
+
private void ButtonCreate_Click(object sender, EventArgs e)
{
- Random random = new();
- _drawningAccordionBus = new DrawningAccordionBus();
- _drawningAccordionBus.Init(random.Next(100, 300), random.Next(1000, 3000),
- Color.FromArgb(random.Next(0, 255), random.Next(0, 255), random.Next(0, 255)),
- Color.FromArgb(random.Next(0, 255), random.Next(0, 255), random.Next(0, 255)), Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)));
- _drawningAccordionBus.SetPictureSize(pictureBoxAccordionBus.Width, pictureBoxAccordionBus.Height);
- _drawningAccordionBus.SetPosition(random.Next(50, 300), random.Next(50, 300));
- Draw();
+ CreateObject(nameof(DrawningAccordionBus));
+ }
+ private void ButtonCreateBus_Click(object sender, EventArgs e)
+ {
+ CreateObject(nameof(DrawningBus));
}
private void ButtonMove_Click(object sender, EventArgs e)
{
- if (_drawningAccordionBus == null)
+ if (_drawningBus == null)
{
return;
}
@@ -54,16 +81,16 @@ namespace AccordionBus
switch (name)
{
case "ButtonUp":
- result = _drawningAccordionBus.MoveTransport(DirectionType.Up);
+ result = _drawningBus.MoveTransport(DirectionType.Up);
break;
case "ButtonDown":
- result = _drawningAccordionBus.MoveTransport(DirectionType.Down);
+ result = _drawningBus.MoveTransport(DirectionType.Down);
break;
case "ButtonLeft":
- result = _drawningAccordionBus.MoveTransport(DirectionType.Left);
+ result = _drawningBus.MoveTransport(DirectionType.Left);
break;
case "ButtonRight":
- result = _drawningAccordionBus.MoveTransport(DirectionType.Right);
+ result = _drawningBus.MoveTransport(DirectionType.Right);
break;
}
@@ -72,5 +99,32 @@ namespace AccordionBus
Draw();
}
}
+
+ private void buttonStrategyStap_Click(object sender, EventArgs e)
+ {
+ if (_drawningBus == null) return;
+ if (comboBoxStratregy.Enabled)
+ {
+ _strategy = comboBoxStratregy.SelectedIndex switch
+ {
+ 0 => new MoveToCenter(),
+ 1 => new MoveToBorder(),
+ _ => null
+ };
+ if (_strategy == null) return;
+ _strategy.SetData(new MoveableBus(_drawningBus), pictureBoxAccordionBus.Width, pictureBoxAccordionBus.Height);
+ }
+
+ if (_strategy == null) return;
+ comboBoxStratregy.Enabled = false;
+ _strategy.MakeStap();
+ Draw();
+
+ if (_strategy.GetStatus() == StrategyStatus.Finish)
+ {
+ comboBoxStratregy.Enabled = true;
+ _strategy = null;
+ }
+ }
}
}
diff --git a/AccordionBus/AccordionBus/MovementStrategy/AbstractStrategy.cs b/AccordionBus/AccordionBus/MovementStrategy/AbstractStrategy.cs
new file mode 100644
index 0000000..6fc9fee
--- /dev/null
+++ b/AccordionBus/AccordionBus/MovementStrategy/AbstractStrategy.cs
@@ -0,0 +1,125 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace AccordionBus.MovementStrategy
+{
+ public abstract class AbstractStrategy
+ {
+ ///
+ /// Объект
+ ///
+ private IMoveableObjects? _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(IMoveableObjects moveableObject, int width, int height)
+ {
+ if (moveableObject == null)
+ {
+ _state = StrategyStatus.NotInit;
+ return;
+ }
+
+ _state = StrategyStatus.InProgress;
+ _moveableObject = moveableObject;
+ FieldWidth = width;
+ FieldHeight = height;
+ }
+ ///
+ /// Напавление
+ ///
+ public void MakeStap()
+ {
+ if (_state != StrategyStatus.InProgress) return;
+ if (IsTargetDestination())
+ {
+ _state = StrategyStatus.Finish;
+ return;
+ }
+ MoveToTarget();
+ }
+ ///
+ /// Шаг влево
+ ///
+ ///
+ protected bool MoveLeft() => MoveTo(MovementDirection.Left);
+ ///
+ /// Шаг вправо
+ ///
+ ///
+ protected bool MoveRight() => MoveTo(MovementDirection.Right);
+ ///
+ /// Шаг вверх
+ ///
+ ///
+ protected bool MoveUp() => MoveTo(MovementDirection.Up);
+ ///
+ /// Шаг вниз
+ ///
+ ///
+ protected bool MoveDown() => MoveTo(MovementDirection.Down);
+ ///
+ /// Получение параметров
+ ///
+ ///
+ protected ObjectParameters? GetObjectParameters() => _moveableObject?.GetObjectPosition;
+ ///
+ /// Получение шага
+ ///
+ ///
+ protected int? GetStap()
+ {
+ if(_state != StrategyStatus.InProgress)
+ {
+ return null;
+ }
+ return _moveableObject?.GetStep;
+ }
+ ///
+ /// Шаг к цели
+ ///
+ protected abstract void MoveToTarget();
+ ///
+ /// Достижение цели
+ ///
+ ///
+ protected abstract bool IsTargetDestination();
+ ///
+ /// Сделать шаг
+ ///
+ ///
+ ///
+ private bool MoveTo(MovementDirection movementDirection)
+ {
+ if(_state != StrategyStatus.InProgress)
+ {
+ return false;
+ }
+
+ return _moveableObject?.TryMoveObject(movementDirection) ?? false;
+ }
+ }
+}
diff --git a/AccordionBus/AccordionBus/MovementStrategy/IMoveableObjects.cs b/AccordionBus/AccordionBus/MovementStrategy/IMoveableObjects.cs
new file mode 100644
index 0000000..b5eabf4
--- /dev/null
+++ b/AccordionBus/AccordionBus/MovementStrategy/IMoveableObjects.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace AccordionBus.MovementStrategy
+{
+ ///
+ /// Интерфейс для работы с пперемещаемым объектом
+ ///
+ public interface IMoveableObjects
+ {
+ ///
+ /// Получение координаты объекта
+ ///
+ ObjectParameters? GetObjectPosition { get; }
+ ///
+ /// Шаг объекта
+ ///
+ int GetStep { get; }
+ ///
+ /// попытка переместить объект в указаном направлении
+ ///
+ /// Направление
+ /// true - перемещение удалось false - перемещение невозможно
+ bool TryMoveObject(MovementDirection direction);
+ }
+}
diff --git a/AccordionBus/AccordionBus/MovementStrategy/MoveToBorder.cs b/AccordionBus/AccordionBus/MovementStrategy/MoveToBorder.cs
new file mode 100644
index 0000000..eb47e58
--- /dev/null
+++ b/AccordionBus/AccordionBus/MovementStrategy/MoveToBorder.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace AccordionBus.MovementStrategy
+{
+ public class MoveToBorder : AbstractStrategy
+ {
+ protected override bool IsTargetDestination()
+ {
+ ObjectParameters? objParams = GetObjectParameters();
+ if (objParams == null)
+ {
+ return false;
+ }
+ return objParams.RightBorder() == FieldWidth && objParams.DownBorder() == FieldHeight;
+ }
+
+ protected override void MoveToTarget()
+ {
+ ObjectParameters? objParams = GetObjectParameters();
+ if (objParams == null)
+ {
+ return;
+ }
+
+ if (objParams.RightBorder() < FieldWidth) MoveRight();
+ if (objParams.DownBorder() < FieldHeight) MoveDown();
+ }
+ }
+}
diff --git a/AccordionBus/AccordionBus/MovementStrategy/MoveToCenter.cs b/AccordionBus/AccordionBus/MovementStrategy/MoveToCenter.cs
new file mode 100644
index 0000000..f89bc56
--- /dev/null
+++ b/AccordionBus/AccordionBus/MovementStrategy/MoveToCenter.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace AccordionBus.MovementStrategy
+{
+ public class MoveToCenter : AbstractStrategy
+ {
+ protected override bool IsTargetDestination()
+ {
+ ObjectParameters? objParams = GetObjectParameters();
+ if (objParams == null)
+ {
+ return false;
+ }
+ return objParams.ObjectMiddleHorizontal() - GetStap() <= FieldWidth / 2
+ && objParams.ObjectMiddleHorizontal() + GetStap() >= FieldWidth / 2 &&
+ objParams.ObjectMiddleVertical() - GetStap() <= FieldHeight / 2
+ && objParams.ObjectMiddleVertical() + GetStap() >= FieldHeight / 2;
+ }
+ protected override void MoveToTarget()
+ {
+ ObjectParameters? objParams = GetObjectParameters();
+ if (objParams == null)
+ {
+ return;
+ }
+ int diffX = objParams.ObjectMiddleHorizontal() - FieldWidth / 2;
+ if (Math.Abs(diffX) > GetStap())
+ {
+ if (diffX > 0)
+ {
+ MoveLeft();
+ }
+ else
+ {
+ MoveRight();
+ }
+ }
+ int diffY = objParams.ObjectMiddleVertical() - FieldHeight / 2;
+ if (Math.Abs(diffY) > GetStap())
+ {
+ if (diffY > 0)
+ {
+ MoveUp();
+ }
+ else
+ {
+ MoveDown();
+ }
+ }
+ }
+ }
+}
diff --git a/AccordionBus/AccordionBus/MovementStrategy/MoveableBus.cs b/AccordionBus/AccordionBus/MovementStrategy/MoveableBus.cs
new file mode 100644
index 0000000..1d3cb65
--- /dev/null
+++ b/AccordionBus/AccordionBus/MovementStrategy/MoveableBus.cs
@@ -0,0 +1,67 @@
+using AccordionBus.Drawnings;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace AccordionBus.MovementStrategy
+{
+ ///
+ /// Класс-реализация IMoveableObjects с использованием DrawningBus
+ ///
+ public class MoveableBus : IMoveableObjects
+ {
+ ///
+ /// Поле-объект DrawningBus
+ ///
+ private readonly DrawningBus? _car;
+ ///
+ /// Конструктор
+ ///
+ /// Объект класса DrawningBus
+ public MoveableBus(DrawningBus? car)
+ {
+ _car = car;
+ }
+
+ public ObjectParameters? GetObjectPosition
+ {
+ get
+ {
+ if (_car == null || _car.EntityBus == null || _car.GetPosX() == null || _car.GetPosY() == null)
+ {
+ return null;
+ }
+ return new ObjectParameters(_car.GetPosX().Value, _car.GetPosY().Value, _car.GetWidth(), _car.GetHeight());
+ }
+ }
+
+ public int GetStep => (int)(_car?.EntityBus?.Step ?? 0);
+
+ public bool TryMoveObject(MovementDirection direction)
+ {
+ if (_car == null || _car.EntityBus == null)
+ {
+ return false;
+ }
+ return _car.MoveTransport(GetDirectionType(direction));
+ }
+ ///
+ /// Конвертация из 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/AccordionBus/AccordionBus/MovementStrategy/MovementDirection.cs b/AccordionBus/AccordionBus/MovementStrategy/MovementDirection.cs
new file mode 100644
index 0000000..4ae1734
--- /dev/null
+++ b/AccordionBus/AccordionBus/MovementStrategy/MovementDirection.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace AccordionBus.MovementStrategy
+{
+ public enum MovementDirection
+ {
+ ///
+ /// Вверх
+ ///
+ Up = 1,
+ ///
+ /// Вниз
+ ///
+ Down = 2,
+ ///
+ /// Влево
+ ///
+ Left = 3,
+ ///
+ /// Вправо
+ ///
+ Right = 4
+ }
+}
diff --git a/AccordionBus/AccordionBus/MovementStrategy/ObjectParameters.cs b/AccordionBus/AccordionBus/MovementStrategy/ObjectParameters.cs
new file mode 100644
index 0000000..5d7442c
--- /dev/null
+++ b/AccordionBus/AccordionBus/MovementStrategy/ObjectParameters.cs
@@ -0,0 +1,75 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace AccordionBus.MovementStrategy
+{
+ ///
+ /// Параметры-координаты объекта
+ ///
+ public class ObjectParameters
+ {
+ ///
+ /// Координата Х
+ ///
+ 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;
+ ///
+ /// Конструктор
+ ///
+ /// Координата Х
+ /// Координата Y
+ ///
+ /// Высота
+ public ObjectParameters(int x, int y, int width, int height)
+ {
+ _x = x;
+ _y = y;
+ _width = width;
+ _height = height;
+ }
+ }
+}
diff --git a/AccordionBus/AccordionBus/MovementStrategy/StrategyStatus.cs b/AccordionBus/AccordionBus/MovementStrategy/StrategyStatus.cs
new file mode 100644
index 0000000..83b52e6
--- /dev/null
+++ b/AccordionBus/AccordionBus/MovementStrategy/StrategyStatus.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace AccordionBus.MovementStrategy
+{
+ public enum StrategyStatus
+ {
+ ///
+ /// всё готово к началу
+ ///
+ NotInit,
+ ///
+ /// В процессе
+ ///
+ InProgress,
+ ///
+ /// Завершено
+ ///
+ Finish
+ }
+}