From 976bf76ff8ab8daedf5944e058d50fa3f301d6b4 Mon Sep 17 00:00:00 2001
From: LESN1K <vl-taras73@mail.ru>
Date: Sat, 9 Mar 2024 20:03:38 +0400
Subject: [PATCH 1/3] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?=
 =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=80=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB?=
 =?UTF-8?q?=D0=B5=D0=B9=20=D0=B8=20=D0=B2=D0=B2=D0=BE=D0=B4=20=D0=BA=D0=BE?=
 =?UTF-8?q?=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D0=BE=D1=80=D0=BE?=
 =?UTF-8?q?=D0=B2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ProjectSportCar/FormMonorail.Designer.cs      |  53 ++++---
 ProjectSportCar/FormMonorail.cs               |  87 ++++++----
 .../{ => Monorail/Drawnings}/DirectionType.cs |   2 +-
 .../Drawnings/DrawingModernMonorail.cs        | 137 ++++++++++++++++
 .../DrawingMonorail.cs}                       | 150 +++++-------------
 .../EntityModernMonorail.cs}                  |  32 +---
 .../Monorail/Entities/EntityMonorail.cs       |  41 +++++
 7 files changed, 317 insertions(+), 185 deletions(-)
 rename ProjectSportCar/Scripts/{ => Monorail/Drawnings}/DirectionType.cs (89%)
 create mode 100644 ProjectSportCar/Scripts/Monorail/Drawnings/DrawingModernMonorail.cs
 rename ProjectSportCar/Scripts/Monorail/{DrawMonorail.cs => Drawnings/DrawingMonorail.cs} (57%)
 rename ProjectSportCar/Scripts/Monorail/{EntityMonorail.cs => Entities/EntityModernMonorail.cs} (62%)
 create mode 100644 ProjectSportCar/Scripts/Monorail/Entities/EntityMonorail.cs

diff --git a/ProjectSportCar/FormMonorail.Designer.cs b/ProjectSportCar/FormMonorail.Designer.cs
index 3a375e4..61d6b4e 100644
--- a/ProjectSportCar/FormMonorail.Designer.cs
+++ b/ProjectSportCar/FormMonorail.Designer.cs
@@ -33,6 +33,7 @@
             buttonMove_Left = new Button();
             buttonMove_Up = new Button();
             pictureBoxMonorail = new PictureBox();
+            buttonCreateModernMonorail = new Button();
             buttonCreateMonorail = new Button();
             ((System.ComponentModel.ISupportInitialize)pictureBoxMonorail).BeginInit();
             SuspendLayout();
@@ -42,10 +43,9 @@
             buttonMove_Right.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
             buttonMove_Right.BackgroundImage = Properties.Resources.ArrowRight;
             buttonMove_Right.BackgroundImageLayout = ImageLayout.Stretch;
-            buttonMove_Right.Location = new Point(875, 569);
-            buttonMove_Right.Margin = new Padding(3, 4, 3, 4);
+            buttonMove_Right.Location = new Point(766, 427);
             buttonMove_Right.Name = "buttonMove_Right";
-            buttonMove_Right.Size = new Size(40, 47);
+            buttonMove_Right.Size = new Size(35, 35);
             buttonMove_Right.TabIndex = 0;
             buttonMove_Right.UseVisualStyleBackColor = true;
             buttonMove_Right.Click += ButtonMove_Click;
@@ -55,10 +55,9 @@
             buttonMove_Down.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
             buttonMove_Down.BackgroundImage = Properties.Resources.ArrowDown;
             buttonMove_Down.BackgroundImageLayout = ImageLayout.Stretch;
-            buttonMove_Down.Location = new Point(829, 569);
-            buttonMove_Down.Margin = new Padding(3, 4, 3, 4);
+            buttonMove_Down.Location = new Point(725, 427);
             buttonMove_Down.Name = "buttonMove_Down";
-            buttonMove_Down.Size = new Size(40, 47);
+            buttonMove_Down.Size = new Size(35, 35);
             buttonMove_Down.TabIndex = 1;
             buttonMove_Down.UseVisualStyleBackColor = true;
             buttonMove_Down.Click += ButtonMove_Click;
@@ -68,10 +67,9 @@
             buttonMove_Left.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
             buttonMove_Left.BackgroundImage = Properties.Resources.ArrowLeft;
             buttonMove_Left.BackgroundImageLayout = ImageLayout.Stretch;
-            buttonMove_Left.Location = new Point(782, 569);
-            buttonMove_Left.Margin = new Padding(3, 4, 3, 4);
+            buttonMove_Left.Location = new Point(684, 427);
             buttonMove_Left.Name = "buttonMove_Left";
-            buttonMove_Left.Size = new Size(40, 47);
+            buttonMove_Left.Size = new Size(35, 35);
             buttonMove_Left.TabIndex = 2;
             buttonMove_Left.UseVisualStyleBackColor = true;
             buttonMove_Left.Click += ButtonMove_Click;
@@ -81,10 +79,9 @@
             buttonMove_Up.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
             buttonMove_Up.BackgroundImage = Properties.Resources.ArrowUp;
             buttonMove_Up.BackgroundImageLayout = ImageLayout.Stretch;
-            buttonMove_Up.Location = new Point(829, 515);
-            buttonMove_Up.Margin = new Padding(3, 4, 3, 4);
+            buttonMove_Up.Location = new Point(725, 386);
             buttonMove_Up.Name = "buttonMove_Up";
-            buttonMove_Up.Size = new Size(40, 47);
+            buttonMove_Up.Size = new Size(35, 35);
             buttonMove_Up.TabIndex = 3;
             buttonMove_Up.UseVisualStyleBackColor = true;
             buttonMove_Up.Click += ButtonMove_Click;
@@ -94,36 +91,45 @@
             pictureBoxMonorail.Dock = DockStyle.Fill;
             pictureBoxMonorail.ImageLocation = "";
             pictureBoxMonorail.Location = new Point(0, 0);
-            pictureBoxMonorail.Margin = new Padding(3, 4, 3, 4);
             pictureBoxMonorail.Name = "pictureBoxMonorail";
-            pictureBoxMonorail.Size = new Size(929, 632);
+            pictureBoxMonorail.Size = new Size(813, 474);
             pictureBoxMonorail.TabIndex = 4;
             pictureBoxMonorail.TabStop = false;
             // 
+            // buttonCreateModernMonorail
+            // 
+            buttonCreateModernMonorail.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
+            buttonCreateModernMonorail.Location = new Point(12, 439);
+            buttonCreateModernMonorail.Name = "buttonCreateModernMonorail";
+            buttonCreateModernMonorail.Size = new Size(220, 23);
+            buttonCreateModernMonorail.TabIndex = 5;
+            buttonCreateModernMonorail.Text = "Создать современный монорельс";
+            buttonCreateModernMonorail.UseVisualStyleBackColor = true;
+            buttonCreateModernMonorail.Click += ButtonCreateModernMonorail_Click;
+            // 
             // buttonCreateMonorail
             // 
             buttonCreateMonorail.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
-            buttonCreateMonorail.Location = new Point(14, 585);
-            buttonCreateMonorail.Margin = new Padding(3, 4, 3, 4);
+            buttonCreateMonorail.Location = new Point(238, 439);
             buttonCreateMonorail.Name = "buttonCreateMonorail";
-            buttonCreateMonorail.Size = new Size(86, 31);
-            buttonCreateMonorail.TabIndex = 5;
-            buttonCreateMonorail.Text = "Создать";
+            buttonCreateMonorail.Size = new Size(194, 23);
+            buttonCreateMonorail.TabIndex = 6;
+            buttonCreateMonorail.Text = "Создать монорельс";
             buttonCreateMonorail.UseVisualStyleBackColor = true;
-            buttonCreateMonorail.Click += ButtonCreateMonorail_Click;
+            buttonCreateMonorail.Click += buttonCreateMonorail_Click;
             // 
             // FormMonorail
             // 
-            AutoScaleDimensions = new SizeF(8F, 20F);
+            AutoScaleDimensions = new SizeF(7F, 15F);
             AutoScaleMode = AutoScaleMode.Font;
-            ClientSize = new Size(929, 632);
+            ClientSize = new Size(813, 474);
             Controls.Add(buttonCreateMonorail);
+            Controls.Add(buttonCreateModernMonorail);
             Controls.Add(buttonMove_Up);
             Controls.Add(buttonMove_Left);
             Controls.Add(buttonMove_Down);
             Controls.Add(buttonMove_Right);
             Controls.Add(pictureBoxMonorail);
-            Margin = new Padding(3, 4, 3, 4);
             Name = "FormMonorail";
             Text = "Монорельс";
             ((System.ComponentModel.ISupportInitialize)pictureBoxMonorail).EndInit();
@@ -137,6 +143,7 @@
         private Button buttonMove_Left;
         private Button buttonMove_Up;
         private PictureBox pictureBoxMonorail;
+        private Button buttonCreateModernMonorail;
         private Button buttonCreateMonorail;
     }
 }
\ No newline at end of file
diff --git a/ProjectSportCar/FormMonorail.cs b/ProjectSportCar/FormMonorail.cs
index 0f6ac8e..b86977a 100644
--- a/ProjectSportCar/FormMonorail.cs
+++ b/ProjectSportCar/FormMonorail.cs
@@ -1,10 +1,10 @@
-using ProjectMonorail.Scripts.Locomative;
+using ProjectMonorail.Scripts.Monorail.Drawnings;
 
 namespace ProjectMonorail
 {
     public partial class FormMonorail : Form
     {
-        private DrawMonorail? _drawningMonorail;
+        private DrawingMonorail? _drawningMonorail;
 
         public FormMonorail()
         {
@@ -14,7 +14,7 @@ namespace ProjectMonorail
         /// <summary>
         /// Метод для прорисовки автомобиля
         /// </summary>
-        private void Draw ()
+        private void Draw()
         {
             if (_drawningMonorail == null) return;
 
@@ -24,26 +24,6 @@ namespace ProjectMonorail
             pictureBoxMonorail.Image = bmp;
         }
 
-        /// <summary>
-        /// Обработка нажатия кнопки "Создать"
-        /// </summary>
-        private void ButtonCreateMonorail_Click(object sender, EventArgs e)
-        {
-            Random random = new();
-            _drawningMonorail = new DrawMonorail();
-
-            _drawningMonorail.Initialization(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)));
-
-            _drawningMonorail.SetPictureSize(pictureBoxMonorail.Width, pictureBoxMonorail.Height);
-            _drawningMonorail.SetPosition(random.Next(10, 100), random.Next(10, 100));
-
-            Draw();
-        }
-
         /// <summary>
         /// Обработка кнопок перемешения
         /// </summary>
@@ -53,23 +33,74 @@ namespace ProjectMonorail
 
             string name = ((Button)sender).Name ?? string.Empty;
             bool result = false;
-            switch(name)
+            switch (name)
             {
                 case "buttonMove_Up":
-                    result = _drawningMonorail.MoveTransport(Scripts.DirectionType.Up);
+                    result = _drawningMonorail.MoveTransport(DirectionType.Up);
                     break;
                 case "buttonMove_Down":
-                    result = _drawningMonorail.MoveTransport(Scripts.DirectionType.Down);
+                    result = _drawningMonorail.MoveTransport(DirectionType.Down);
                     break;
                 case "buttonMove_Right":
-                    result = _drawningMonorail.MoveTransport(Scripts.DirectionType.Right);
+                    result = _drawningMonorail.MoveTransport(DirectionType.Right);
                     break;
                 case "buttonMove_Left":
-                    result = _drawningMonorail.MoveTransport(Scripts.DirectionType.Left);
+                    result = _drawningMonorail.MoveTransport(DirectionType.Left);
                     break;
             }
 
             if (result) Draw();
         }
+
+        /// <summary>
+        /// Создание объекта класса-перемещения
+        /// </summary>
+        /// <param name="type">Тип создоваемого объекта</param>
+        private void CreateObject(string type)
+        {
+            Random random = new();
+
+            switch (type)
+            {
+                case nameof(DrawingMonorail):
+                    _drawningMonorail = new DrawingMonorail(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(DrawingModernMonorail):
+                    bool randomTrack = Convert.ToBoolean(random.Next(0, 2));
+                    _drawningMonorail = new DrawingModernMonorail(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)),
+                randomTrack,
+                (randomTrack? Convert.ToBoolean(random.Next(0, 2)) : true));
+                    break;
+                default:
+                    return;
+            }
+
+            _drawningMonorail.SetPictureSize(pictureBoxMonorail.Width, pictureBoxMonorail.Height);
+            _drawningMonorail.SetPosition(random.Next(10, 100), random.Next(10, 100));
+
+            Draw();
+        }
+
+        /// <summary>
+        /// Обработка нажатия кнопки "Создать современный монорельс"
+        /// </summary>
+        private void ButtonCreateModernMonorail_Click(object sender, EventArgs e)
+        {
+            CreateObject(nameof(DrawingModernMonorail));
+        }
+
+        /// <summary>
+        /// Обработка нажатия кнопки "Создать монорельс"
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void buttonCreateMonorail_Click(object sender, EventArgs e)
+        {
+            CreateObject(nameof(DrawingMonorail));
+        }
+
     }
 }
diff --git a/ProjectSportCar/Scripts/DirectionType.cs b/ProjectSportCar/Scripts/Monorail/Drawnings/DirectionType.cs
similarity index 89%
rename from ProjectSportCar/Scripts/DirectionType.cs
rename to ProjectSportCar/Scripts/Monorail/Drawnings/DirectionType.cs
index b3c2733..1851297 100644
--- a/ProjectSportCar/Scripts/DirectionType.cs
+++ b/ProjectSportCar/Scripts/Monorail/Drawnings/DirectionType.cs
@@ -1,4 +1,4 @@
-namespace ProjectMonorail.Scripts
+namespace ProjectMonorail.Scripts.Monorail.Drawnings
 {
     /// <summary>
     /// Направление перемещения
diff --git a/ProjectSportCar/Scripts/Monorail/Drawnings/DrawingModernMonorail.cs b/ProjectSportCar/Scripts/Monorail/Drawnings/DrawingModernMonorail.cs
new file mode 100644
index 0000000..be1faf7
--- /dev/null
+++ b/ProjectSportCar/Scripts/Monorail/Drawnings/DrawingModernMonorail.cs
@@ -0,0 +1,137 @@
+using System.Drawing.Drawing2D;
+using ProjectMonorail.Scripts.Monorail.Entities;
+
+namespace ProjectMonorail.Scripts.Monorail.Drawnings
+{
+    /// <summary>
+    /// Класс, отвечающий за прорисовку и перемещение объекта-сущности
+    /// </summary>
+    public class DrawingModernMonorail : DrawingMonorail
+    {
+        /// <summary>
+        /// Конструктор
+        /// </summary>
+        /// <param name="speed">Скорость</param>
+        /// <param name="weight">Вес</param>
+        /// <param name="bodyColor">Основной цвет</param>
+        /// <param name="additionalColor">Дополнительный цвет</param>
+        /// <param name="monorailTrack">Признак наличия монорельсового пути</param>
+        /// <param name="cabin">Признак наличия кабиныы</param>
+        public DrawingModernMonorail(int speed, double weight, Color bodyColor, Color additionalColor, bool monorailTrack, bool cabin) : base((cabin ? 170 : 90), 40)
+        {
+            EntityMonorail = new EntityModernMonorail(speed, weight, bodyColor, additionalColor, monorailTrack, cabin);
+        }
+
+        /// <summary>
+        /// Прорисовка объекта
+        /// </summary>
+        public override void DrawTransport(Graphics g)
+        {
+            if (EntityMonorail == null || EntityMonorail is not EntityModernMonorail entityModernMonorail || !_startPositionX.HasValue || !_startPositionY.HasValue) return;
+
+            Pen pen_Body = new Pen(EntityMonorail.BodyColor, 1.5f);
+            Pen pen_Additional = new Pen(entityModernMonorail.AdditionalColor, 1.5f);
+
+            Brush brush_Body = new SolidBrush(EntityMonorail.BodyColor);
+            Brush brush_Additional = new SolidBrush(entityModernMonorail.AdditionalColor);
+
+
+            base.DrawTransport(g);
+
+            //Перекраска окон первого монорельса
+            g.DrawRectangle(pen_Additional, _startPositionX.Value + 14, _startPositionY.Value + 2, 5, 6);
+            g.DrawRectangle(pen_Additional, _startPositionX.Value + 21, _startPositionY.Value + 2, 5, 6);
+            g.DrawRectangle(pen_Additional, _startPositionX.Value + 70, _startPositionY.Value + 2, 5, 6);
+
+            if (entityModernMonorail.MonorailTrack)
+            {
+                if (entityModernMonorail.Cabin)
+                {
+                    g.FillRectangle(brush_Additional, _startPositionX.Value, _startPositionY.Value + 35, 170, 5);
+                }
+                else
+                {
+                    g.FillRectangle(brush_Additional, _startPositionX.Value, _startPositionY.Value + 35, 86, 5);
+                }
+            }
+
+            //Колеса
+            Brush brush_White = new SolidBrush(Color.White);
+            g.FillEllipse(brush_White, _startPositionX.Value + 10, _startPositionY.Value + 30, 10, 10);
+            g.DrawEllipse(pen_Body, _startPositionX.Value + 10, _startPositionY.Value + 30, 10, 10);
+
+            g.FillEllipse(brush_White, _startPositionX.Value + 25, _startPositionY.Value + 30, 10, 10);
+            g.DrawEllipse(pen_Body, _startPositionX.Value + 25, _startPositionY.Value + 30, 10, 10);
+
+            g.FillEllipse(brush_White, _startPositionX.Value + 65, _startPositionY.Value + 30, 10, 10);
+            g.DrawEllipse(pen_Body, _startPositionX.Value + 65, _startPositionY.Value + 30, 10, 10);
+
+            g.FillEllipse(brush_White, _startPositionX.Value + 50, _startPositionY.Value + 30, 10, 10);
+            g.DrawEllipse(pen_Body, _startPositionX.Value + 50, _startPositionY.Value + 30, 10, 10);
+
+
+            if (entityModernMonorail.Cabin)
+            {
+                int offset = 170;
+                //Кузов монорельса
+                GraphicsPath pointsMonorailBody_RightBody = new GraphicsPath();
+                pointsMonorailBody_RightBody.AddLine(_startPositionX.Value - 8 + offset, _startPositionY.Value + 10, _startPositionX.Value - 13 + offset, _startPositionY.Value);
+                pointsMonorailBody_RightBody.AddLine(_startPositionX.Value - 13 + offset, _startPositionY.Value, _startPositionX.Value - 80 + offset, _startPositionY.Value);
+                pointsMonorailBody_RightBody.AddLine(_startPositionX.Value - 80 + offset, _startPositionY.Value, _startPositionX.Value - 80 + offset, _startPositionY.Value + 25);
+                pointsMonorailBody_RightBody.AddLine(_startPositionX.Value - 80 + offset, _startPositionY.Value + 25, _startPositionX.Value - 8 + offset, _startPositionY.Value + 25);
+                pointsMonorailBody_RightBody.AddLine(_startPositionX.Value - 8 + offset, _startPositionY.Value + 25, _startPositionX.Value - 8 + offset, _startPositionY.Value + 10);
+                g.DrawLine(pen_Body, _startPositionX.Value - 8 + offset, _startPositionY.Value + 10, _startPositionX.Value - 30 + offset, _startPositionY.Value + 10);
+                g.DrawLine(pen_Body, _startPositionX.Value - 39 + offset, _startPositionY.Value + 10, _startPositionX.Value - 80 + offset, _startPositionY.Value + 10);
+                g.DrawPath(pen_Body, pointsMonorailBody_RightBody);
+
+                //Дверь
+                g.DrawRectangle(pen_Body, _startPositionX.Value - 39 + offset, _startPositionY.Value + 5, 9, 15);
+
+                //Окна
+                g.DrawRectangle(pen_Additional, _startPositionX.Value - 20 + offset, _startPositionY.Value + 2, 5, 6);
+                g.DrawRectangle(pen_Additional, _startPositionX.Value - 27 + offset, _startPositionY.Value + 2, 5, 6);
+                g.DrawRectangle(pen_Additional, _startPositionX.Value - 76 + offset, _startPositionY.Value + 2, 5, 6);
+
+                //Связка монорельса
+                g.FillRectangle(brush_Body, _startPositionX.Value - 87 + offset, _startPositionY.Value + 2, 7, 22);
+
+                //Нижняя часть монорельса
+                PointF[] pointsLowerPartMonorail_2_LeftSide = new PointF[8];
+                pointsLowerPartMonorail_2_LeftSide[0] = new PointF(_startPositionX.Value + offset, _startPositionY.Value + 30);
+                pointsLowerPartMonorail_2_LeftSide[1] = new PointF(_startPositionX.Value - 8 + offset, _startPositionY.Value + 25);
+                pointsLowerPartMonorail_2_LeftSide[2] = new PointF(_startPositionX.Value - 72 + offset, _startPositionY.Value + 25);
+                pointsLowerPartMonorail_2_LeftSide[3] = new PointF(_startPositionX.Value - 36 + offset, _startPositionY.Value + 25);
+                pointsLowerPartMonorail_2_LeftSide[4] = new PointF(_startPositionX.Value - 36 + offset, _startPositionY.Value + 32);
+                pointsLowerPartMonorail_2_LeftSide[5] = new PointF(_startPositionX.Value - 15 + offset, _startPositionY.Value + 32);
+                pointsLowerPartMonorail_2_LeftSide[6] = new PointF(_startPositionX.Value - 15 + offset, _startPositionY.Value + 35);
+                pointsLowerPartMonorail_2_LeftSide[7] = new PointF(_startPositionX.Value + offset, _startPositionY.Value + 32);
+                g.FillPolygon(brush_Body, pointsLowerPartMonorail_2_LeftSide);
+
+                PointF[] pointsLowerPartMonorail_2_RightSide = new PointF[7];
+                pointsLowerPartMonorail_2_RightSide[0] = new PointF(_startPositionX.Value - 86 + offset, _startPositionY.Value + 30);
+                pointsLowerPartMonorail_2_RightSide[1] = new PointF(_startPositionX.Value - 80 + offset, _startPositionY.Value + 25);
+                pointsLowerPartMonorail_2_RightSide[2] = new PointF(_startPositionX.Value - 50 + offset, _startPositionY.Value + 25);
+                pointsLowerPartMonorail_2_RightSide[3] = new PointF(_startPositionX.Value - 50 + offset, _startPositionY.Value + 32);
+                pointsLowerPartMonorail_2_RightSide[4] = new PointF(_startPositionX.Value - 69 + offset, _startPositionY.Value + 32);
+                pointsLowerPartMonorail_2_RightSide[5] = new PointF(_startPositionX.Value - 79 + offset, _startPositionY.Value + 35);
+                pointsLowerPartMonorail_2_RightSide[6] = new PointF(_startPositionX.Value - 86 + offset, _startPositionY.Value + 32);
+                g.FillPolygon(brush_Body, pointsLowerPartMonorail_2_RightSide);
+                g.FillRectangle(brush_Body, _startPositionX.Value - 80 + offset, _startPositionY.Value + 25, 70, 3);
+
+
+                //Колеса
+                g.FillEllipse(brush_White, _startPositionX.Value - 20 + offset, _startPositionY.Value + 30, 10, 10);
+                g.DrawEllipse(pen_Body, _startPositionX.Value - 20 + offset, _startPositionY.Value + 30, 10, 10);
+
+                g.FillEllipse(brush_White, _startPositionX.Value - 35 + offset, _startPositionY.Value + 30, 10, 10);
+                g.DrawEllipse(pen_Body, _startPositionX.Value - 35 + offset, _startPositionY.Value + 30, 10, 10);
+
+                g.FillEllipse(brush_White, _startPositionX.Value - 75 + offset, _startPositionY.Value + 30, 10, 10);
+                g.DrawEllipse(pen_Body, _startPositionX.Value - 75 + offset, _startPositionY.Value + 30, 10, 10);
+
+                g.FillEllipse(brush_White, _startPositionX.Value - 60 + offset, _startPositionY.Value + 30, 10, 10);
+                g.DrawEllipse(pen_Body, _startPositionX.Value - 60 + offset, _startPositionY.Value + 30, 10, 10);
+            }
+        }
+    }
+}
diff --git a/ProjectSportCar/Scripts/Monorail/DrawMonorail.cs b/ProjectSportCar/Scripts/Monorail/Drawnings/DrawingMonorail.cs
similarity index 57%
rename from ProjectSportCar/Scripts/Monorail/DrawMonorail.cs
rename to ProjectSportCar/Scripts/Monorail/Drawnings/DrawingMonorail.cs
index 5e26aba..aadc1e3 100644
--- a/ProjectSportCar/Scripts/Monorail/DrawMonorail.cs
+++ b/ProjectSportCar/Scripts/Monorail/Drawnings/DrawingMonorail.cs
@@ -1,13 +1,17 @@
-using System.Drawing.Drawing2D;
+using ProjectMonorail.Scripts.Monorail.Entities;
+using System.Drawing.Drawing2D;
 
-namespace ProjectMonorail.Scripts.Locomative
+namespace ProjectMonorail.Scripts.Monorail.Drawnings
 {
-    public class DrawMonorail
+    /// <summary>
+    /// Класс, отвечающий за прорисовку и перемещение базового объекта-сущности
+    /// </summary>
+    public class DrawingMonorail
     {
         /// <summary>
         /// Класс-сущность
         /// </summary>
-        public EntityMonorail? EntityMonorail { get; private set; }
+        public EntityMonorail? EntityMonorail { get; protected set; }
 
         /// <summary>
         /// Ширина окна
@@ -20,45 +24,55 @@ namespace ProjectMonorail.Scripts.Locomative
         private int? _pictureHeight;
 
         /// <summary>
-        /// Левая координата прорисовки автомобиля
+        /// Левая координата прорисовки монорельса
         /// </summary>
-        private int? _startPositionX;
+        protected int? _startPositionX;
 
         /// <summary>
-        /// Верхняя кооридната прорисовки автомобиля
+        /// Верхняя кооридната прорисовки монорельса
         /// </summary>
-        private int? _startPositionY;
+        protected int? _startPositionY;
 
         /// <summary>
-        /// Ширина прорисовки автомобиля
+        /// Ширина прорисовки монорельса
         /// </summary>
-        private int _drawningMonorailWidth = 110;
+        private readonly int _drawningMonorailWidth = 90;
 
         /// <summary>
-        /// Высота прорисовки автомобиля
+        /// Высота прорисовки монорельса
         /// </summary>
         private readonly int _drawningMonorailHeight = 40;
 
-        /// <summary>
-        /// Инициализация свойств
-        /// </summary>
-        /// <param name="speed">Скорость</param>
-        /// <param name="weight">Вес</param>
-        /// <param name="bodyColor">Основной цвет</param>
-        /// <param name="additionalColor">Дополнительный цвет</param>
-        /// <param name="monorailTrack">Признак наличия монорельсового пути</param>
-        /// <param name="cabin">Признак наличия кабиныы</param>
-        public void Initialization(int speed, double weight, Color bodyColor, Color additionalColor, bool monorailTrack, bool cabin)
+        private DrawingMonorail() 
         {
-            EntityMonorail = new EntityMonorail();
-            EntityMonorail.Initialization(speed, weight, bodyColor, additionalColor, monorailTrack, cabin);
-            _drawningMonorailWidth = cabin ? 170 : 90;
             _pictureWidth = null;
             _pictureHeight = null;
             _startPositionX = null;
             _startPositionY = null;
         }
 
+        /// <summary>
+        /// Конструктор
+        /// </summary>
+        /// <param name="speed">Скорость</param>
+        /// <param name="weight">Вес</param>
+        /// <param name="bodyColor">Основной цвет</param>
+        public DrawingMonorail(int speed, double weight, Color bodyColor) : this()
+        {
+            EntityMonorail = new EntityMonorail(speed, weight, bodyColor);
+        }
+
+        /// <summary>
+        /// Конструктор для наследников
+        /// </summary>
+        /// <param name="drawningMonorailWidth">Ширина прорисовки монорельса</param>
+        /// <param name="drawningMonorailHeight">Высота прорисовки монорельса</param>
+        protected DrawingMonorail(int drawningMonorailWidth, int drawningMonorailHeight) : this()
+        {
+            _drawningMonorailWidth = drawningMonorailWidth;
+            _drawningMonorailHeight = drawningMonorailHeight;
+        }
+
         /// <summary>
         /// Установка границ поля
         /// </summary>
@@ -69,7 +83,7 @@ namespace ProjectMonorail.Scripts.Locomative
         {
             // TODO проверка, что объект "влезает" в размеры поля
             // если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена
-            if (_drawningMonorailWidth > width || _drawningMonorailHeight > height) return false; 
+            if (_drawningMonorailWidth > width || _drawningMonorailHeight > height) return false;
 
             if (_startPositionX.HasValue && _startPositionY.HasValue)
             {
@@ -164,15 +178,13 @@ namespace ProjectMonorail.Scripts.Locomative
         /// <summary>
         /// Прорисовка объекта
         /// </summary>
-        public void DrawTransport(Graphics g)
+        public virtual void DrawTransport(Graphics g)
         {
             if (EntityMonorail == null || !_startPositionX.HasValue || !_startPositionY.HasValue) return;
 
             Pen pen_Body = new Pen(EntityMonorail.BodyColor, 1.5f);
-            Pen pen_Additional = new Pen(EntityMonorail.AdditionalColor, 1.5f);
 
             Brush brush_Body = new SolidBrush(EntityMonorail.BodyColor);
-            Brush brush_Additional = new SolidBrush(EntityMonorail.AdditionalColor);
 
 
             //Кузов монорельса
@@ -190,9 +202,9 @@ namespace ProjectMonorail.Scripts.Locomative
             g.DrawRectangle(pen_Body, _startPositionX.Value + 30, _startPositionY.Value + 5, 9, 15);
 
             //Окна
-            g.DrawRectangle(pen_Additional, _startPositionX.Value + 14, _startPositionY.Value + 2, 5, 6);
-            g.DrawRectangle(pen_Additional, _startPositionX.Value + 21, _startPositionY.Value + 2, 5, 6);
-            g.DrawRectangle(pen_Additional, _startPositionX.Value + 70, _startPositionY.Value + 2, 5, 6);
+            g.DrawRectangle(pen_Body, _startPositionX.Value + 14, _startPositionY.Value + 2, 5, 6);
+            g.DrawRectangle(pen_Body, _startPositionX.Value + 21, _startPositionY.Value + 2, 5, 6);
+            g.DrawRectangle(pen_Body, _startPositionX.Value + 70, _startPositionY.Value + 2, 5, 6);
 
             //Связка монорельса
             g.FillRectangle(brush_Body, _startPositionX.Value + 80, _startPositionY.Value + 2, 7, 22);
@@ -220,18 +232,6 @@ namespace ProjectMonorail.Scripts.Locomative
             g.FillPolygon(brush_Body, pointsLowerPartMonorail_RightSide);
             g.FillRectangle(brush_Body, _startPositionX.Value + 8, _startPositionY.Value + 25, 70, 3);
 
-            if (EntityMonorail.MonorailTrack)
-            {
-                if (EntityMonorail.Cabin)
-                {
-                    g.FillRectangle(brush_Additional, _startPositionX.Value, _startPositionY.Value + 35, 170, 5);
-                }
-                else
-                {
-                    g.FillRectangle(brush_Additional, _startPositionX.Value, _startPositionY.Value + 35, 86, 5);
-                }
-            }
-
             //Колеса
             Brush brush_White = new SolidBrush(Color.White);
             g.FillEllipse(brush_White, _startPositionX.Value + 10, _startPositionY.Value + 30, 10, 10);
@@ -245,70 +245,6 @@ namespace ProjectMonorail.Scripts.Locomative
 
             g.FillEllipse(brush_White, _startPositionX.Value + 50, _startPositionY.Value + 30, 10, 10);
             g.DrawEllipse(pen_Body, _startPositionX.Value + 50, _startPositionY.Value + 30, 10, 10);
-
-            
-            if (EntityMonorail.Cabin)
-            {
-                int offset = 170;
-                //Кузов монорельса
-                GraphicsPath pointsMonorailBody_RightBody = new GraphicsPath();
-                pointsMonorailBody_RightBody.AddLine(_startPositionX.Value - 8 + offset, _startPositionY.Value + 10, _startPositionX.Value - 13 + offset, _startPositionY.Value);
-                pointsMonorailBody_RightBody.AddLine(_startPositionX.Value - 13 + offset, _startPositionY.Value, _startPositionX.Value - 80 + offset, _startPositionY.Value);
-                pointsMonorailBody_RightBody.AddLine(_startPositionX.Value - 80 + offset, _startPositionY.Value, _startPositionX.Value - 80 + offset, _startPositionY.Value + 25);
-                pointsMonorailBody_RightBody.AddLine(_startPositionX.Value - 80 + offset, _startPositionY.Value + 25, _startPositionX.Value - 8 + offset, _startPositionY.Value + 25);
-                pointsMonorailBody_RightBody.AddLine(_startPositionX.Value - 8 + offset, _startPositionY.Value + 25, _startPositionX.Value - 8 + offset, _startPositionY.Value + 10);
-                g.DrawLine(pen_Body, _startPositionX.Value - 8 + offset, _startPositionY.Value + 10, _startPositionX.Value - 30 + offset, _startPositionY.Value + 10);
-                g.DrawLine(pen_Body, _startPositionX.Value - 39 + offset, _startPositionY.Value + 10, _startPositionX.Value - 80 + offset, _startPositionY.Value + 10);
-                g.DrawPath(pen_Body, pointsMonorailBody_RightBody);
-
-                //Дверь
-                g.DrawRectangle(pen_Body, _startPositionX.Value - 39 + offset, _startPositionY.Value + 5, 9, 15);
-
-                //Окна
-                g.DrawRectangle(pen_Additional, _startPositionX.Value - 20 + offset, _startPositionY.Value + 2, 5, 6);
-                g.DrawRectangle(pen_Additional, _startPositionX.Value - 27 + offset, _startPositionY.Value + 2, 5, 6);
-                g.DrawRectangle(pen_Additional, _startPositionX.Value - 76 + offset, _startPositionY.Value + 2, 5, 6);
-
-                //Связка монорельса
-                g.FillRectangle(brush_Body, _startPositionX.Value - 87 + offset, _startPositionY.Value + 2, 7, 22);
-
-                //Нижняя часть монорельса
-                PointF[] pointsLowerPartMonorail_2_LeftSide = new PointF[8];
-                pointsLowerPartMonorail_2_LeftSide[0] = new PointF(_startPositionX.Value + offset, _startPositionY.Value + 30);
-                pointsLowerPartMonorail_2_LeftSide[1] = new PointF(_startPositionX.Value - 8 + offset, _startPositionY.Value + 25);
-                pointsLowerPartMonorail_2_LeftSide[2] = new PointF(_startPositionX.Value - 72 + offset, _startPositionY.Value + 25);
-                pointsLowerPartMonorail_2_LeftSide[3] = new PointF(_startPositionX.Value - 36 + offset, _startPositionY.Value + 25);
-                pointsLowerPartMonorail_2_LeftSide[4] = new PointF(_startPositionX.Value - 36 + offset, _startPositionY.Value + 32);
-                pointsLowerPartMonorail_2_LeftSide[5] = new PointF(_startPositionX.Value - 15 + offset, _startPositionY.Value + 32);
-                pointsLowerPartMonorail_2_LeftSide[6] = new PointF(_startPositionX.Value - 15 + offset, _startPositionY.Value + 35);
-                pointsLowerPartMonorail_2_LeftSide[7] = new PointF(_startPositionX.Value + offset, _startPositionY.Value + 32);
-                g.FillPolygon(brush_Body, pointsLowerPartMonorail_2_LeftSide);
-
-                PointF[] pointsLowerPartMonorail_2_RightSide = new PointF[7];
-                pointsLowerPartMonorail_2_RightSide[0] = new PointF(_startPositionX.Value - 86 + offset, _startPositionY.Value + 30);
-                pointsLowerPartMonorail_2_RightSide[1] = new PointF(_startPositionX.Value - 80 + offset, _startPositionY.Value + 25);
-                pointsLowerPartMonorail_2_RightSide[2] = new PointF(_startPositionX.Value - 50 + offset, _startPositionY.Value + 25);
-                pointsLowerPartMonorail_2_RightSide[3] = new PointF(_startPositionX.Value - 50 + offset, _startPositionY.Value + 32);
-                pointsLowerPartMonorail_2_RightSide[4] = new PointF(_startPositionX.Value - 69 + offset, _startPositionY.Value + 32);
-                pointsLowerPartMonorail_2_RightSide[5] = new PointF(_startPositionX.Value - 79 + offset, _startPositionY.Value + 35);
-                pointsLowerPartMonorail_2_RightSide[6] = new PointF(_startPositionX.Value - 86 + offset, _startPositionY.Value + 32);
-                g.FillPolygon(brush_Body, pointsLowerPartMonorail_2_RightSide);
-                g.FillRectangle(brush_Body, _startPositionX.Value - 80 + offset, _startPositionY.Value + 25, 70, 3);
-
-
-                //Колеса
-                g.FillEllipse(brush_White, _startPositionX.Value - 20 + offset, _startPositionY.Value + 30, 10, 10);
-                g.DrawEllipse(pen_Body, _startPositionX.Value - 20 + offset, _startPositionY.Value + 30, 10, 10);
-
-                g.FillEllipse(brush_White, _startPositionX.Value - 35 + offset, _startPositionY.Value + 30, 10, 10);
-                g.DrawEllipse(pen_Body, _startPositionX.Value - 35 + offset, _startPositionY.Value + 30, 10, 10);
-
-                g.FillEllipse(brush_White, _startPositionX.Value - 75 + offset, _startPositionY.Value + 30, 10, 10);
-                g.DrawEllipse(pen_Body, _startPositionX.Value - 75 + offset, _startPositionY.Value + 30, 10, 10);
-
-                g.FillEllipse(brush_White, _startPositionX.Value - 60 + offset, _startPositionY.Value + 30, 10, 10);
-                g.DrawEllipse(pen_Body, _startPositionX.Value - 60 + offset, _startPositionY.Value + 30, 10, 10);
-            }
         }
     }
 }
diff --git a/ProjectSportCar/Scripts/Monorail/EntityMonorail.cs b/ProjectSportCar/Scripts/Monorail/Entities/EntityModernMonorail.cs
similarity index 62%
rename from ProjectSportCar/Scripts/Monorail/EntityMonorail.cs
rename to ProjectSportCar/Scripts/Monorail/Entities/EntityModernMonorail.cs
index b1b500c..2fe635d 100644
--- a/ProjectSportCar/Scripts/Monorail/EntityMonorail.cs
+++ b/ProjectSportCar/Scripts/Monorail/Entities/EntityModernMonorail.cs
@@ -1,22 +1,10 @@
-namespace ProjectMonorail
+namespace ProjectMonorail.Scripts.Monorail.Entities
 {
-    public class EntityMonorail
+    /// <summary>
+    /// Класс-сущности "Современный монорельс" 
+    /// </summary>
+    public class EntityModernMonorail : EntityMonorail
     {
-        /// <summary>
-        /// Скорость
-        /// </summary>
-        public int Speed { get; private set; }
-
-        /// <summary>
-        /// Вес
-        /// </summary>
-        public double Weight { get; private set; }
-
-        /// <summary>
-        /// Основной цвет
-        /// </summary>
-        public Color BodyColor { get; private set; }
-
         /// <summary>
         /// Дополнительный цвет (для опциональных элементов)
         /// </summary>
@@ -32,11 +20,6 @@
         /// </summary>
         public bool Cabin { get; private set; }
 
-        /// <summary>
-        /// Шаг перемещения автомобиля
-        /// </summary>
-        public double Step => Speed * 100 / Weight;
-
         /// <summary>
         /// Инициальзация полей объекта-класса спортивного автомобиля
         /// </summary>
@@ -46,11 +29,8 @@
         /// <param name="additionalColor">Дополнительный цвет</param>
         /// <param name="monorailTrack">Признак наличия монорельсового пути</param>
         /// <param name="cabin">Признак наличия кабины</param>
-        public void Initialization(int speed, double weight, Color bodyColor, Color additionalColor, bool monorailTrack, bool cabin)
+        public EntityModernMonorail(int speed, double weight, Color bodyColor, Color additionalColor, bool monorailTrack, bool cabin) : base(speed, weight, bodyColor)
         {
-            Speed = speed;
-            Weight = weight;
-            BodyColor = bodyColor;
             AdditionalColor = additionalColor;
             MonorailTrack = monorailTrack;
             Cabin = cabin;
diff --git a/ProjectSportCar/Scripts/Monorail/Entities/EntityMonorail.cs b/ProjectSportCar/Scripts/Monorail/Entities/EntityMonorail.cs
new file mode 100644
index 0000000..62591c7
--- /dev/null
+++ b/ProjectSportCar/Scripts/Monorail/Entities/EntityMonorail.cs
@@ -0,0 +1,41 @@
+namespace ProjectMonorail.Scripts.Monorail.Entities
+{
+    /// <summary>
+    /// Класс-сущности "Монорельс"
+    /// </summary>
+    public class EntityMonorail
+    {
+        /// <summary>
+        /// Скорость
+        /// </summary>
+        public int Speed { get; private set; }
+
+        /// <summary>
+        /// Вес
+        /// </summary>
+        public double Weight { get; private set; }
+
+        /// <summary>
+        /// Основной цвет
+        /// </summary>
+        public Color BodyColor { get; private set; }
+
+        /// <summary>
+        /// Шаг перемещения автомобиля
+        /// </summary>
+        public double Step => Speed * 100 / Weight;
+
+        /// <summary>
+        /// Конструктор сущности
+        /// </summary>
+        /// <param name="speed">Скорость</param>
+        /// <param name="weight">Вес автомобиля</param>
+        /// <param name="bodyColor">Основной цвет</param>
+        public EntityMonorail(int speed, double weight, Color bodyColor)
+        {
+            Speed = speed;
+            Weight = weight;
+            BodyColor = bodyColor;
+        }
+    }
+}
-- 
2.25.1


From fd7eae9fa3acce458e04c5ef29936919fdb1ea8a Mon Sep 17 00:00:00 2001
From: LESN1K <vl-taras73@mail.ru>
Date: Sat, 9 Mar 2024 20:05:26 +0400
Subject: [PATCH 2/3] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?=
 =?UTF-8?q?=D0=B8=D0=B5=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5?=
 =?UTF-8?q?=20=D0=BF=D0=B0=D0=BF=D0=BA=D0=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../FormMonorail.Designer.cs                        |   0
 .../FormMonorail.cs                                 |   0
 .../FormMonorail.resx                               |   0
 {ProjectSportCar => ProjectMonorail}/Program.cs     |   0
 .../ProjectMonorail.csproj                          |   0
 .../ProjectMonorail.sln                             |   0
 .../Properties/Resources.Designer.cs                |   0
 .../Properties/Resources.resx                       |   0
 .../Resources/Arrows/ArrowDown.png                  | Bin
 .../Resources/Arrows/ArrowLeft.png                  | Bin
 .../Resources/Arrows/ArrowRight.png                 | Bin
 .../Resources/Arrows/ArrowUp.png                    | Bin
 .../Resources/Reference/Monorail.png                | Bin
 .../Scripts/Monorail/Drawnings/DirectionType.cs     |   0
 .../Monorail/Drawnings/DrawingModernMonorail.cs     |   0
 .../Scripts/Monorail/Drawnings/DrawingMonorail.cs   |   0
 .../Monorail/Entities/EntityModernMonorail.cs       |   0
 .../Scripts/Monorail/Entities/EntityMonorail.cs     |   0
 18 files changed, 0 insertions(+), 0 deletions(-)
 rename {ProjectSportCar => ProjectMonorail}/FormMonorail.Designer.cs (100%)
 rename {ProjectSportCar => ProjectMonorail}/FormMonorail.cs (100%)
 rename {ProjectSportCar => ProjectMonorail}/FormMonorail.resx (100%)
 rename {ProjectSportCar => ProjectMonorail}/Program.cs (100%)
 rename {ProjectSportCar => ProjectMonorail}/ProjectMonorail.csproj (100%)
 rename {ProjectSportCar => ProjectMonorail}/ProjectMonorail.sln (100%)
 rename {ProjectSportCar => ProjectMonorail}/Properties/Resources.Designer.cs (100%)
 rename {ProjectSportCar => ProjectMonorail}/Properties/Resources.resx (100%)
 rename {ProjectSportCar => ProjectMonorail}/Resources/Arrows/ArrowDown.png (100%)
 rename {ProjectSportCar => ProjectMonorail}/Resources/Arrows/ArrowLeft.png (100%)
 rename {ProjectSportCar => ProjectMonorail}/Resources/Arrows/ArrowRight.png (100%)
 rename {ProjectSportCar => ProjectMonorail}/Resources/Arrows/ArrowUp.png (100%)
 rename {ProjectSportCar => ProjectMonorail}/Resources/Reference/Monorail.png (100%)
 rename {ProjectSportCar => ProjectMonorail}/Scripts/Monorail/Drawnings/DirectionType.cs (100%)
 rename {ProjectSportCar => ProjectMonorail}/Scripts/Monorail/Drawnings/DrawingModernMonorail.cs (100%)
 rename {ProjectSportCar => ProjectMonorail}/Scripts/Monorail/Drawnings/DrawingMonorail.cs (100%)
 rename {ProjectSportCar => ProjectMonorail}/Scripts/Monorail/Entities/EntityModernMonorail.cs (100%)
 rename {ProjectSportCar => ProjectMonorail}/Scripts/Monorail/Entities/EntityMonorail.cs (100%)

diff --git a/ProjectSportCar/FormMonorail.Designer.cs b/ProjectMonorail/FormMonorail.Designer.cs
similarity index 100%
rename from ProjectSportCar/FormMonorail.Designer.cs
rename to ProjectMonorail/FormMonorail.Designer.cs
diff --git a/ProjectSportCar/FormMonorail.cs b/ProjectMonorail/FormMonorail.cs
similarity index 100%
rename from ProjectSportCar/FormMonorail.cs
rename to ProjectMonorail/FormMonorail.cs
diff --git a/ProjectSportCar/FormMonorail.resx b/ProjectMonorail/FormMonorail.resx
similarity index 100%
rename from ProjectSportCar/FormMonorail.resx
rename to ProjectMonorail/FormMonorail.resx
diff --git a/ProjectSportCar/Program.cs b/ProjectMonorail/Program.cs
similarity index 100%
rename from ProjectSportCar/Program.cs
rename to ProjectMonorail/Program.cs
diff --git a/ProjectSportCar/ProjectMonorail.csproj b/ProjectMonorail/ProjectMonorail.csproj
similarity index 100%
rename from ProjectSportCar/ProjectMonorail.csproj
rename to ProjectMonorail/ProjectMonorail.csproj
diff --git a/ProjectSportCar/ProjectMonorail.sln b/ProjectMonorail/ProjectMonorail.sln
similarity index 100%
rename from ProjectSportCar/ProjectMonorail.sln
rename to ProjectMonorail/ProjectMonorail.sln
diff --git a/ProjectSportCar/Properties/Resources.Designer.cs b/ProjectMonorail/Properties/Resources.Designer.cs
similarity index 100%
rename from ProjectSportCar/Properties/Resources.Designer.cs
rename to ProjectMonorail/Properties/Resources.Designer.cs
diff --git a/ProjectSportCar/Properties/Resources.resx b/ProjectMonorail/Properties/Resources.resx
similarity index 100%
rename from ProjectSportCar/Properties/Resources.resx
rename to ProjectMonorail/Properties/Resources.resx
diff --git a/ProjectSportCar/Resources/Arrows/ArrowDown.png b/ProjectMonorail/Resources/Arrows/ArrowDown.png
similarity index 100%
rename from ProjectSportCar/Resources/Arrows/ArrowDown.png
rename to ProjectMonorail/Resources/Arrows/ArrowDown.png
diff --git a/ProjectSportCar/Resources/Arrows/ArrowLeft.png b/ProjectMonorail/Resources/Arrows/ArrowLeft.png
similarity index 100%
rename from ProjectSportCar/Resources/Arrows/ArrowLeft.png
rename to ProjectMonorail/Resources/Arrows/ArrowLeft.png
diff --git a/ProjectSportCar/Resources/Arrows/ArrowRight.png b/ProjectMonorail/Resources/Arrows/ArrowRight.png
similarity index 100%
rename from ProjectSportCar/Resources/Arrows/ArrowRight.png
rename to ProjectMonorail/Resources/Arrows/ArrowRight.png
diff --git a/ProjectSportCar/Resources/Arrows/ArrowUp.png b/ProjectMonorail/Resources/Arrows/ArrowUp.png
similarity index 100%
rename from ProjectSportCar/Resources/Arrows/ArrowUp.png
rename to ProjectMonorail/Resources/Arrows/ArrowUp.png
diff --git a/ProjectSportCar/Resources/Reference/Monorail.png b/ProjectMonorail/Resources/Reference/Monorail.png
similarity index 100%
rename from ProjectSportCar/Resources/Reference/Monorail.png
rename to ProjectMonorail/Resources/Reference/Monorail.png
diff --git a/ProjectSportCar/Scripts/Monorail/Drawnings/DirectionType.cs b/ProjectMonorail/Scripts/Monorail/Drawnings/DirectionType.cs
similarity index 100%
rename from ProjectSportCar/Scripts/Monorail/Drawnings/DirectionType.cs
rename to ProjectMonorail/Scripts/Monorail/Drawnings/DirectionType.cs
diff --git a/ProjectSportCar/Scripts/Monorail/Drawnings/DrawingModernMonorail.cs b/ProjectMonorail/Scripts/Monorail/Drawnings/DrawingModernMonorail.cs
similarity index 100%
rename from ProjectSportCar/Scripts/Monorail/Drawnings/DrawingModernMonorail.cs
rename to ProjectMonorail/Scripts/Monorail/Drawnings/DrawingModernMonorail.cs
diff --git a/ProjectSportCar/Scripts/Monorail/Drawnings/DrawingMonorail.cs b/ProjectMonorail/Scripts/Monorail/Drawnings/DrawingMonorail.cs
similarity index 100%
rename from ProjectSportCar/Scripts/Monorail/Drawnings/DrawingMonorail.cs
rename to ProjectMonorail/Scripts/Monorail/Drawnings/DrawingMonorail.cs
diff --git a/ProjectSportCar/Scripts/Monorail/Entities/EntityModernMonorail.cs b/ProjectMonorail/Scripts/Monorail/Entities/EntityModernMonorail.cs
similarity index 100%
rename from ProjectSportCar/Scripts/Monorail/Entities/EntityModernMonorail.cs
rename to ProjectMonorail/Scripts/Monorail/Entities/EntityModernMonorail.cs
diff --git a/ProjectSportCar/Scripts/Monorail/Entities/EntityMonorail.cs b/ProjectMonorail/Scripts/Monorail/Entities/EntityMonorail.cs
similarity index 100%
rename from ProjectSportCar/Scripts/Monorail/Entities/EntityMonorail.cs
rename to ProjectMonorail/Scripts/Monorail/Entities/EntityMonorail.cs
-- 
2.25.1


From ec5f6e654ca1771c98791e65af77d8037b8938a6 Mon Sep 17 00:00:00 2001
From: LESN1K <vl-taras73@mail.ru>
Date: Sun, 10 Mar 2024 13:50:57 +0400
Subject: [PATCH 3/3] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?=
 =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81=D1=82=D1=80=D0=B0=D1=82=D0=B5=D0=B3?=
 =?UTF-8?q?=D0=B8=D0=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ProjectMonorail/FormMonorail.Designer.cs      |  26 ++++
 ProjectMonorail/FormMonorail.cs               |  59 +++++++-
 .../Monorail/Drawnings/DirectionType.cs       |   5 +
 .../Monorail/Drawnings/DrawingMonorail.cs     |  23 +++
 .../MovementStrategy/AbstractStrategy.cs      | 133 ++++++++++++++++++
 .../MovementStrategy/IMoveableObject.cs       |  25 ++++
 .../Monorail/MovementStrategy/MoveToCenter.cs |  52 +++++++
 .../MovementStrategy/MoveToRightDownBorder.cs |  36 +++++
 .../MovementStrategy/MoveableMonorail.cs      |  61 ++++++++
 .../MovementStrategy/MovementDirection.cs     |  29 ++++
 .../MovementStrategy/ObjectParameters.cs      |  74 ++++++++++
 .../MovementStrategy/StrategyStatus.cs        |  23 +++
 12 files changed, 545 insertions(+), 1 deletion(-)
 create mode 100644 ProjectMonorail/Scripts/Monorail/MovementStrategy/AbstractStrategy.cs
 create mode 100644 ProjectMonorail/Scripts/Monorail/MovementStrategy/IMoveableObject.cs
 create mode 100644 ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveToCenter.cs
 create mode 100644 ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveToRightDownBorder.cs
 create mode 100644 ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveableMonorail.cs
 create mode 100644 ProjectMonorail/Scripts/Monorail/MovementStrategy/MovementDirection.cs
 create mode 100644 ProjectMonorail/Scripts/Monorail/MovementStrategy/ObjectParameters.cs
 create mode 100644 ProjectMonorail/Scripts/Monorail/MovementStrategy/StrategyStatus.cs

diff --git a/ProjectMonorail/FormMonorail.Designer.cs b/ProjectMonorail/FormMonorail.Designer.cs
index 61d6b4e..2f42482 100644
--- a/ProjectMonorail/FormMonorail.Designer.cs
+++ b/ProjectMonorail/FormMonorail.Designer.cs
@@ -35,6 +35,8 @@
             pictureBoxMonorail = new PictureBox();
             buttonCreateModernMonorail = new Button();
             buttonCreateMonorail = new Button();
+            comboBoxStrategy = new ComboBox();
+            buttonStrategyStep = new Button();
             ((System.ComponentModel.ISupportInitialize)pictureBoxMonorail).BeginInit();
             SuspendLayout();
             // 
@@ -118,11 +120,33 @@
             buttonCreateMonorail.UseVisualStyleBackColor = true;
             buttonCreateMonorail.Click += buttonCreateMonorail_Click;
             // 
+            // comboBoxStrategy
+            // 
+            comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList;
+            comboBoxStrategy.FormattingEnabled = true;
+            comboBoxStrategy.Items.AddRange(new object[] { "К центру", "К краю" });
+            comboBoxStrategy.Location = new Point(680, 12);
+            comboBoxStrategy.Name = "comboBoxStrategy";
+            comboBoxStrategy.Size = new Size(121, 23);
+            comboBoxStrategy.TabIndex = 7;
+            // 
+            // buttonStrategyStep
+            // 
+            buttonStrategyStep.Location = new Point(704, 41);
+            buttonStrategyStep.Name = "buttonStrategyStep";
+            buttonStrategyStep.Size = new Size(75, 23);
+            buttonStrategyStep.TabIndex = 8;
+            buttonStrategyStep.Text = "Шаг";
+            buttonStrategyStep.UseVisualStyleBackColor = true;
+            buttonStrategyStep.Click += buttonStrategyStep_Click;
+            // 
             // FormMonorail
             // 
             AutoScaleDimensions = new SizeF(7F, 15F);
             AutoScaleMode = AutoScaleMode.Font;
             ClientSize = new Size(813, 474);
+            Controls.Add(buttonStrategyStep);
+            Controls.Add(comboBoxStrategy);
             Controls.Add(buttonCreateMonorail);
             Controls.Add(buttonCreateModernMonorail);
             Controls.Add(buttonMove_Up);
@@ -145,5 +169,7 @@
         private PictureBox pictureBoxMonorail;
         private Button buttonCreateModernMonorail;
         private Button buttonCreateMonorail;
+        private ComboBox comboBoxStrategy;
+        private Button buttonStrategyStep;
     }
 }
\ No newline at end of file
diff --git a/ProjectMonorail/FormMonorail.cs b/ProjectMonorail/FormMonorail.cs
index b86977a..63dc9c2 100644
--- a/ProjectMonorail/FormMonorail.cs
+++ b/ProjectMonorail/FormMonorail.cs
@@ -1,14 +1,30 @@
 using ProjectMonorail.Scripts.Monorail.Drawnings;
+using ProjectMonorail.Scripts.Monorail.MovementStrategy;
 
 namespace ProjectMonorail
 {
+    /// <summary>
+    /// Форма работы с объектом "Монорельс"
+    /// </summary>
     public partial class FormMonorail : Form
     {
+        /// <summary>
+        /// Поле-объект для прорисовки объекта
+        /// </summary>
         private DrawingMonorail? _drawningMonorail;
 
+        /// <summary>
+        /// Стратегия перемещения
+        /// </summary>
+        private AbstractStrategy? _strategy;
+
+        /// <summary>
+        /// Конструктор формы
+        /// </summary>
         public FormMonorail()
         {
             InitializeComponent();
+            _strategy = null;
         }
 
         /// <summary>
@@ -72,7 +88,7 @@ namespace ProjectMonorail
                 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)),
                 randomTrack,
-                (randomTrack? Convert.ToBoolean(random.Next(0, 2)) : true));
+                (randomTrack ? Convert.ToBoolean(random.Next(0, 2)) : true));
                     break;
                 default:
                     return;
@@ -80,6 +96,8 @@ namespace ProjectMonorail
 
             _drawningMonorail.SetPictureSize(pictureBoxMonorail.Width, pictureBoxMonorail.Height);
             _drawningMonorail.SetPosition(random.Next(10, 100), random.Next(10, 100));
+            _strategy = null;
+            comboBoxStrategy.Enabled = true;
 
             Draw();
         }
@@ -102,5 +120,44 @@ namespace ProjectMonorail
             CreateObject(nameof(DrawingMonorail));
         }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void buttonStrategyStep_Click(object sender, EventArgs e)
+        {
+            if (_drawningMonorail == null) return;
+
+            if (comboBoxStrategy.Enabled)
+            {
+                _strategy = comboBoxStrategy.SelectedIndex switch
+                {
+                    0 => new MoveToCenter(),
+                    1 => new MoveToRightDownBorder(),
+                    _ => null,
+                };
+                if (_strategy == null)
+                {
+                    return;
+                }
+                _strategy.SetData(new MoveableMonorail(_drawningMonorail), pictureBoxMonorail.Width, pictureBoxMonorail.Height);
+            }
+
+            if (_strategy == null)
+            {
+                return;
+            }
+
+            comboBoxStrategy.Enabled = false;
+            _strategy.MakeStep();
+            Draw();
+
+            if (_strategy.GetStatus() == StrategyStatus.Finish)
+            {
+                comboBoxStrategy.Enabled = true;
+                _strategy = null;
+            } 
+        }
     }
 }
diff --git a/ProjectMonorail/Scripts/Monorail/Drawnings/DirectionType.cs b/ProjectMonorail/Scripts/Monorail/Drawnings/DirectionType.cs
index 1851297..867b820 100644
--- a/ProjectMonorail/Scripts/Monorail/Drawnings/DirectionType.cs
+++ b/ProjectMonorail/Scripts/Monorail/Drawnings/DirectionType.cs
@@ -5,6 +5,11 @@
     /// </summary>
     public enum DirectionType
     {
+        /// <summary>
+        /// Неизвестное направление
+        /// </summary>
+        Unknow = -1,
+
         /// <summary>
         /// Вверх
         /// </summary>
diff --git a/ProjectMonorail/Scripts/Monorail/Drawnings/DrawingMonorail.cs b/ProjectMonorail/Scripts/Monorail/Drawnings/DrawingMonorail.cs
index aadc1e3..11ef869 100644
--- a/ProjectMonorail/Scripts/Monorail/Drawnings/DrawingMonorail.cs
+++ b/ProjectMonorail/Scripts/Monorail/Drawnings/DrawingMonorail.cs
@@ -43,6 +43,29 @@ namespace ProjectMonorail.Scripts.Monorail.Drawnings
         /// </summary>
         private readonly int _drawningMonorailHeight = 40;
 
+        /// <summary>
+        /// Координаты X объекта
+        /// </summary>
+        public int? GetPositionX => _startPositionX;
+
+        /// <summary>
+        /// Координаты Y объекта
+        /// </summary>
+        public int? GetPositionY => _startPositionY;
+
+        /// <summary>
+        /// Ширина объекта
+        /// </summary>
+        public int GetWidth => _drawningMonorailWidth;
+
+        /// <summary>
+        /// Высота объекта
+        /// </summary>
+        public int GetHeight => _drawningMonorailHeight;
+
+        /// <summary>
+        /// Пустой конструкотор
+        /// </summary>
         private DrawingMonorail() 
         {
             _pictureWidth = null;
diff --git a/ProjectMonorail/Scripts/Monorail/MovementStrategy/AbstractStrategy.cs b/ProjectMonorail/Scripts/Monorail/MovementStrategy/AbstractStrategy.cs
new file mode 100644
index 0000000..76249ae
--- /dev/null
+++ b/ProjectMonorail/Scripts/Monorail/MovementStrategy/AbstractStrategy.cs
@@ -0,0 +1,133 @@
+namespace ProjectMonorail.Scripts.Monorail.MovementStrategy
+{
+    public abstract class AbstractStrategy
+    {
+        /// <summary>
+        /// Перемещаемый объект
+        /// </summary>
+        private IMoveableObject? _moveableObject;
+
+        /// <summary>
+        /// Статус перемещения
+        /// </summary>
+        private StrategyStatus _state = StrategyStatus.NotInit;
+
+        /// <summary>
+        /// Ширина поля
+        /// </summary>
+        protected int FieldWidth { get; private set; }
+
+        /// <summary>
+        /// Высота поля
+        /// </summary>
+        protected int FieldHeight { get; private set; }
+
+        /// <summary>
+        /// Статус перемещения
+        /// </summary>
+        public StrategyStatus GetStatus() { return _state; }
+
+        /// <summary>
+        /// Установка данных
+        /// </summary>
+        /// <param name="moveableObject">Перемещаемый объект</param>
+        /// <param name="width">Ширина поля</param>
+        /// <param name="height">Высота поля</param>
+        public void SetData(IMoveableObject moveableObject, int width, int height)
+        {
+            if (moveableObject == null)
+            {
+                _state = StrategyStatus.NotInit;
+                return;
+            }
+            _state = StrategyStatus.InProgress;
+            _moveableObject = moveableObject;
+            FieldWidth = width;
+            FieldHeight = height;
+        }
+
+        /// <summary>
+        /// Шаг перемещения
+        /// </summary>
+        public void MakeStep()
+        {
+            if (_state != StrategyStatus.InProgress)
+            {
+                return;
+            }
+            if (IsTargetDestinaion())
+            {
+                _state = StrategyStatus.Finish;
+                return;
+            }
+            MoveToTarget();
+        }
+
+        /// <summary>
+        /// Перемещение влево
+        /// </summary>
+        /// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
+        protected bool MoveLeft() => MoveTo(MovementDirection.Left);
+
+        /// <summary>
+        /// Перемещение вправо
+        /// </summary>
+        /// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
+        protected bool MoveRight() => MoveTo(MovementDirection.Right);
+
+        /// <summary>
+        /// Перемещение вверх
+        /// </summary>
+        /// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
+        protected bool MoveUp() => MoveTo(MovementDirection.Up);
+
+        /// <summary>
+        /// Перемещение вниз
+        /// </summary>
+        /// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
+        protected bool MoveDown() => MoveTo(MovementDirection.Down);
+
+        /// <summary>
+        /// Параметры объекта
+        /// </summary>
+        protected ObjectParameters? GetObjectParameters => _moveableObject?.GetObjectPosition;
+
+        /// <summary>
+        /// Шаг объекта
+        /// </summary>
+        /// <returns></returns>
+        protected int? GetStep()
+        {
+            if (_state != StrategyStatus.InProgress)
+            {
+                return null;
+            }
+            return _moveableObject?.GetStep;
+        }
+
+        /// <summary>
+        /// Перемещение к цели
+        /// </summary>
+        protected abstract void MoveToTarget();
+
+        /// <summary>
+        /// Достигнута ли цель
+        /// </summary>
+        /// <returns></returns>
+        protected abstract bool IsTargetDestinaion();
+
+        /// <summary>
+        /// Попытка перемещения в требуемом направлении
+        /// </summary>
+        /// <param name="movementDirection">Направление</param>
+        /// <returns>Результат попытки (true - удалось переместиться, false - неудача)</returns>
+        private bool MoveTo(MovementDirection movementDirection)
+        {
+            if (_state != StrategyStatus.InProgress)
+            {
+                return false;
+            }
+            return _moveableObject?.TryMoveObject(movementDirection) ?? false;
+        }
+    }
+}
diff --git a/ProjectMonorail/Scripts/Monorail/MovementStrategy/IMoveableObject.cs b/ProjectMonorail/Scripts/Monorail/MovementStrategy/IMoveableObject.cs
new file mode 100644
index 0000000..40f7999
--- /dev/null
+++ b/ProjectMonorail/Scripts/Monorail/MovementStrategy/IMoveableObject.cs
@@ -0,0 +1,25 @@
+namespace ProjectMonorail.Scripts.Monorail.MovementStrategy
+{
+    /// <summary>
+    /// Интерфейс для работы с перемещаемым объектом
+    /// </summary>I
+    public interface IMoveableObject
+    {
+        /// <summary>
+        /// Получение координаты объекта
+        /// </summary>
+        ObjectParameters? GetObjectPosition { get; }
+
+        /// <summary>
+        /// Шаг объекта
+        /// </summary>
+        int GetStep { get; }
+
+        /// <summary>
+        /// Попытка переместить объект в указанном направлении
+        /// </summary>
+        /// <param name="direction">Направление</param>
+        /// <returns>true - объект перемещен, false - перемещение невозможно</returns>
+        bool TryMoveObject(MovementDirection direction);
+    }
+}
diff --git a/ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveToCenter.cs b/ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveToCenter.cs
new file mode 100644
index 0000000..17d522f
--- /dev/null
+++ b/ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveToCenter.cs
@@ -0,0 +1,52 @@
+namespace ProjectMonorail.Scripts.Monorail.MovementStrategy
+{
+    /// <summary>
+    /// Стратегия перемещения объекта в центр экрана
+    /// </summary>
+    public class MoveToCenter : AbstractStrategy
+    {
+        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/ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveToRightDownBorder.cs b/ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveToRightDownBorder.cs
new file mode 100644
index 0000000..849a140
--- /dev/null
+++ b/ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveToRightDownBorder.cs
@@ -0,0 +1,36 @@
+namespace ProjectMonorail.Scripts.Monorail.MovementStrategy
+{
+    /// <summary>
+    /// Стратегия перемещения объекта в левый нижний угл экрана
+    /// </summary>
+    public class MoveToRightDownBorder : AbstractStrategy
+    {
+        protected override bool IsTargetDestinaion()
+        {
+            ObjectParameters? objParams = GetObjectParameters;
+            if (objParams == null) return false;
+
+            return objParams.RightBorder + GetStep() >= FieldWidth 
+                && objParams.DownBorder + GetStep() >= FieldHeight;
+        }
+
+        protected override void MoveToTarget()
+        {
+            ObjectParameters? objParams = GetObjectParameters;
+            if (objParams == null) return;
+
+            int diffX = objParams.LeftBorder - FieldWidth;
+            if (Math.Abs(diffX) > GetStep())
+            {
+                MoveRight();
+            }
+
+            int diffY = objParams.DownBorder - FieldHeight;
+            if (Math.Abs(diffY) > GetStep())
+            {
+                MoveDown();
+            }
+        }
+
+    }
+}
diff --git a/ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveableMonorail.cs b/ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveableMonorail.cs
new file mode 100644
index 0000000..47c4e8e
--- /dev/null
+++ b/ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveableMonorail.cs
@@ -0,0 +1,61 @@
+using ProjectMonorail.Scripts.Monorail.Drawnings;
+
+namespace ProjectMonorail.Scripts.Monorail.MovementStrategy
+{
+    /// <summary>
+    /// Класс-реализация IMoveableObject с использованием DrawingMonorail
+    /// </summary>
+    public class MoveableMonorail : IMoveableObject
+    {
+        /// <summary>
+        /// Поле-объект класса DrawingMonorail или его наследника
+        /// </summary>
+        private readonly DrawingMonorail _drawingMonorail;
+
+        /// <summary>
+        /// Конструктор
+        /// </summary>
+        /// <param name="drawingMonorail">Объект класса DrawingMonorail</param>
+        public MoveableMonorail(DrawingMonorail drawingMonorail)
+        {
+            _drawingMonorail = drawingMonorail;
+        }
+
+        public ObjectParameters? GetObjectPosition
+        {
+            get
+            {
+                if (_drawingMonorail == null || _drawingMonorail.EntityMonorail == null || !_drawingMonorail.GetPositionX.HasValue || !_drawingMonorail.GetPositionY.HasValue) return null;
+                return new ObjectParameters(_drawingMonorail.GetPositionX.Value, _drawingMonorail.GetPositionY.Value, _drawingMonorail.GetWidth, _drawingMonorail.GetHeight);
+            }
+        }
+
+        public int GetStep => (int)(_drawingMonorail?.EntityMonorail?.Step ?? 0);
+
+        public bool TryMoveObject(MovementDirection direction)
+        {
+            if (_drawingMonorail == null || _drawingMonorail.EntityMonorail == null)
+            {
+                return false;
+            }
+            return _drawingMonorail.MoveTransport(GetDirectionType(direction));
+        }
+
+        /// <summary>
+        /// Конвертация из MovementDirection в DirectionType
+        /// </summary>
+        /// <param name="direction">MovementDirection</param>
+        /// <returns>DirectionType</returns>
+        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/ProjectMonorail/Scripts/Monorail/MovementStrategy/MovementDirection.cs b/ProjectMonorail/Scripts/Monorail/MovementStrategy/MovementDirection.cs
new file mode 100644
index 0000000..c03904b
--- /dev/null
+++ b/ProjectMonorail/Scripts/Monorail/MovementStrategy/MovementDirection.cs
@@ -0,0 +1,29 @@
+namespace ProjectMonorail.Scripts.Monorail.MovementStrategy
+{
+    /// <summary>
+    /// Направление перемещения
+    /// </summary>
+    public enum MovementDirection
+    {
+        /// <summary>
+        /// Вверх
+        /// </summary>
+        Up = 1,
+
+        /// <summary>
+        /// Вниз
+        /// </summary>
+        Down = 2,
+
+        /// <summary>
+        /// Влево
+        /// </summary>
+        Left = 3,
+
+        /// <summary>
+        /// Вправо
+        /// </summary>
+        Right = 4
+
+    }
+}
diff --git a/ProjectMonorail/Scripts/Monorail/MovementStrategy/ObjectParameters.cs b/ProjectMonorail/Scripts/Monorail/MovementStrategy/ObjectParameters.cs
new file mode 100644
index 0000000..fb8f09b
--- /dev/null
+++ b/ProjectMonorail/Scripts/Monorail/MovementStrategy/ObjectParameters.cs
@@ -0,0 +1,74 @@
+namespace ProjectMonorail.Scripts.Monorail.MovementStrategy
+{
+    /// <summary>
+    /// Параметры-координаты объекта
+    /// </summary>
+    public class ObjectParameters
+    {
+        /// <summary>
+        /// Координата X
+        /// </summary>
+        private readonly int _x;
+
+        /// <summary>
+        /// Координата Y
+        /// </summary>
+        private readonly int _y;
+
+        /// <summary>
+        /// Ширина объекта
+        /// </summary>
+        private readonly int _width;
+
+        /// <summary>
+        /// Высота объекта
+        /// </summary>
+        private readonly int _height;
+
+        /// <summary>
+        /// Левая граница
+        /// </summary>
+        public int LeftBorder => _x;
+
+        /// <summary>
+        /// Верхняя граница
+        /// </summary>
+        public int TopBorder => _y;
+
+        /// <summary>
+        /// Правая граница
+        /// </summary>
+        public int RightBorder => _x + _width;
+
+        /// <summary>
+        /// Нижняя граница
+        /// </summary>
+        public int DownBorder => _y + _height;
+
+        /// <summary>
+        /// Середина объекта
+        /// </summary>
+        public int ObjectMiddleHorizontal => _x + _width / 2;
+
+        /// <summary>
+        /// Середина объекта
+        /// </summary>
+        public int ObjectMiddleVertical => _y + _height / 2;
+
+        /// <summary>
+        /// Конструктор
+        /// </summary>
+        /// <param name="x">Координата X</param>
+        /// <param name="y">Координата Y</param>
+        /// <param name="width">Ширина объекта</param>
+        /// <param name="height">Высота объекта</param>
+        public ObjectParameters(int x, int y, int width, int height)
+        {
+            _x = x;
+            _y = y;
+            _width = width;
+            _height = height;
+        }
+
+    }
+}
diff --git a/ProjectMonorail/Scripts/Monorail/MovementStrategy/StrategyStatus.cs b/ProjectMonorail/Scripts/Monorail/MovementStrategy/StrategyStatus.cs
new file mode 100644
index 0000000..c6a9558
--- /dev/null
+++ b/ProjectMonorail/Scripts/Monorail/MovementStrategy/StrategyStatus.cs
@@ -0,0 +1,23 @@
+namespace ProjectMonorail.Scripts.Monorail.MovementStrategy
+{
+    /// <summary>
+    /// Статус выполнения операции перемещения
+    /// </summary>
+    public enum StrategyStatus
+    {
+        /// <summary>
+        /// Все готово к началу
+        /// </summary>
+        NotInit,
+
+        /// <summary>
+        /// Выполняется
+        /// </summary>
+        InProgress,
+
+        /// <summary>
+        /// Завершено
+        /// </summary>
+        Finish
+    }
+}
\ No newline at end of file
-- 
2.25.1