From 2cc24286b04ed539454f6786c233cfa8d82f0686 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=94=D0=BC=D0=B8?= =?UTF-8?q?=D1=82=D1=80=D0=B8=D0=B5=D0=B2?= Date: Sun, 23 Feb 2025 19:08:40 +0400 Subject: [PATCH] =?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=D0=BD=D0=BE=D0=B2=D1=8B=D1=85=20=D0=BA?= =?UTF-8?q?=D0=BB=D0=B0=D1=81=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{ => Drawnings}/DirectionType.cs | 2 +- .../ProjectAirbus/Drawnings/DrawningAirbus.cs | 62 +++++++++ .../DrawningBus.cs} | 126 +++++++++--------- .../{ => Entities}/EntityAirbus.cs | 31 +---- .../ProjectAirbus/Entities/EntityBus.cs | 41 ++++++ .../ProjectAirbus/FormAirbus.Designer.cs | 20 ++- ProjectAirbus/ProjectAirbus/FormAirbus.cs | 74 +++++++--- 7 files changed, 239 insertions(+), 117 deletions(-) rename ProjectAirbus/ProjectAirbus/{ => Drawnings}/DirectionType.cs (91%) create mode 100644 ProjectAirbus/ProjectAirbus/Drawnings/DrawningAirbus.cs rename ProjectAirbus/ProjectAirbus/{DrawningAirbus.cs => Drawnings/DrawningBus.cs} (65%) rename ProjectAirbus/ProjectAirbus/{ => Entities}/EntityAirbus.cs (61%) create mode 100644 ProjectAirbus/ProjectAirbus/Entities/EntityBus.cs diff --git a/ProjectAirbus/ProjectAirbus/DirectionType.cs b/ProjectAirbus/ProjectAirbus/Drawnings/DirectionType.cs similarity index 91% rename from ProjectAirbus/ProjectAirbus/DirectionType.cs rename to ProjectAirbus/ProjectAirbus/Drawnings/DirectionType.cs index ef677e4..68937fb 100644 --- a/ProjectAirbus/ProjectAirbus/DirectionType.cs +++ b/ProjectAirbus/ProjectAirbus/Drawnings/DirectionType.cs @@ -1,4 +1,4 @@ -namespace ProjectAirbus; +namespace ProjectAirbus.Drawnings; /// /// Направление перемещения diff --git a/ProjectAirbus/ProjectAirbus/Drawnings/DrawningAirbus.cs b/ProjectAirbus/ProjectAirbus/Drawnings/DrawningAirbus.cs new file mode 100644 index 0000000..8a90c90 --- /dev/null +++ b/ProjectAirbus/ProjectAirbus/Drawnings/DrawningAirbus.cs @@ -0,0 +1,62 @@ +using ProjectAirbus.Entities; + +namespace ProjectAirbus.Drawnings; + +/// +/// Класс, отвечающий за прорисовку и перемещение объекта-сущности +/// +public class DrawningAirbus : DrawningBus +{ + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия пассажирского отсека + /// Признак наличия двигателя + public DrawningAirbus(int speed, double weight, Color bodyColor, Color additionalColor, bool passengerSection, bool engines) : base(155, 70) + { + EntityBus = new EntityAirbus(speed, weight, bodyColor, additionalColor, passengerSection, engines); + } + + /// + /// Прорисовка объекта + /// + /// + public override void DrawTransport(Graphics g) + { + if (EntityBus == null || EntityBus is not EntityAirbus airbus || !_startPosX.HasValue || !_startPosY.HasValue) + { + return; + } + + Pen pen = new(Color.Black, 3); + Brush additionalBrush = new SolidBrush(airbus.AdditionalColor); + + // доп. отсек для пассажиров + Point[] pointsSection = + { + new Point(_startPosX.Value + 45, _startPosY.Value + 30), + new Point(_startPosX.Value + 65, _startPosY.Value + 20), + new Point(_startPosX.Value + 95, _startPosY.Value + 20), + new Point(_startPosX.Value + 115, _startPosY.Value + 30) + }; + + if (airbus.PassengerSection) + { + g.FillPolygon(additionalBrush, pointsSection); + g.DrawPolygon(pen, pointsSection); + } + + base.DrawTransport(g); + + //доп. двигатель + if (airbus.Engines) + { + g.FillEllipse(additionalBrush, _startPosX.Value, _startPosY.Value + 30, 35, 15); + g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value + 30, 35, 15); + } + } +} diff --git a/ProjectAirbus/ProjectAirbus/DrawningAirbus.cs b/ProjectAirbus/ProjectAirbus/Drawnings/DrawningBus.cs similarity index 65% rename from ProjectAirbus/ProjectAirbus/DrawningAirbus.cs rename to ProjectAirbus/ProjectAirbus/Drawnings/DrawningBus.cs index 3159429..56f728c 100644 --- a/ProjectAirbus/ProjectAirbus/DrawningAirbus.cs +++ b/ProjectAirbus/ProjectAirbus/Drawnings/DrawningBus.cs @@ -1,14 +1,17 @@ -namespace ProjectAirbus; +using ProjectAirbus.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; -/// -/// Класс, отвечающий за прорисовку и перемещение объекта-сущности -/// -public class DrawningAirbus +namespace ProjectAirbus.Drawnings; +public class DrawningBus { /// /// Класс-сущность /// - public EntityAirbus? EntityAirbus { get; private set; } + public EntityBus? EntityBus { get; protected set; } /// /// Ширина окна @@ -23,12 +26,12 @@ public class DrawningAirbus /// /// Левая координата прорисовки аэробуса /// - private int? _startPosX; + protected int? _startPosX; /// /// Верхняя кооридната прорисовки аэробуса /// - private int? _startPosY; + protected int? _startPosY; /// /// Ширина прорисовки аэробуса @@ -41,24 +44,38 @@ public class DrawningAirbus private readonly int _drawningAirbusHeight = 70; /// - /// Инициализация свойств + /// Пустой конструктор /// - /// Скорость - /// Вес - /// Основной цвет - /// Дополнительный цвет - /// Признак наличия пассажирского отсека - /// Признак наличия двигателя - public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool passengerSection, bool engines) + private DrawningBus() { - EntityAirbus = new EntityAirbus(); - EntityAirbus.Init(speed, weight, bodyColor, additionalColor, passengerSection, engines); _pictureWidth = null; _pictureHeight = null; _startPosX = null; _startPosY = null; } + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + public DrawningBus(int speed, double weight, Color bodyColor) : this() + { + EntityBus = new EntityBus(speed, weight, bodyColor); + } + + /// + /// Конструктор для наследников + /// + /// Ширина прорисовки аэробуса + /// Высота прорисовки аэробуса + protected DrawningBus(int drawningAirbusWidth, int drawningAirbusHeight) : this() + { + _drawningAirbusWidth = drawningAirbusWidth; + _drawningAirbusHeight = drawningAirbusHeight; + } + /// /// Установка границ поля /// @@ -105,7 +122,7 @@ public class DrawningAirbus if (x + _drawningAirbusWidth > _pictureWidth) { _startPosX = _pictureWidth - _drawningAirbusWidth; - } + } else if (x < 0) { _startPosX = 0; @@ -115,13 +132,13 @@ public class DrawningAirbus _startPosX = x; } - if (y + _drawningAirbusHeight > _pictureHeight) + if (y + _drawningAirbusHeight > _pictureHeight) { _startPosY = _pictureHeight - _drawningAirbusHeight; - } + } else if (y < 0) { - _startPosY= 0; + _startPosY = 0; } else { @@ -136,7 +153,7 @@ public class DrawningAirbus /// true - перемещене выполнено, false - перемещение невозможно public bool MoveTransport(DirectionType direction) { - if (EntityAirbus == null || !_startPosX.HasValue || !_startPosY.HasValue) + if (EntityBus == null || !_startPosX.HasValue || !_startPosY.HasValue) { return false; } @@ -145,30 +162,30 @@ public class DrawningAirbus { //влево case DirectionType.Left: - if (_startPosX.Value - EntityAirbus.Step > 0) + if (_startPosX.Value - EntityBus.Step > 0) { - _startPosX -= (int)EntityAirbus.Step; + _startPosX -= (int)EntityBus.Step; } return true; //вверх case DirectionType.Up: - if (_startPosY.Value - EntityAirbus.Step > 0) + if (_startPosY.Value - EntityBus.Step > 0) { - _startPosY -= (int)EntityAirbus.Step; + _startPosY -= (int)EntityBus.Step; } return true; // вправо case DirectionType.Right: - if (_startPosX.Value + EntityAirbus.Step + _drawningAirbusWidth < _pictureWidth) + if (_startPosX.Value + EntityBus.Step + _drawningAirbusWidth < _pictureWidth) { - _startPosX += (int)EntityAirbus.Step; + _startPosX += (int)EntityBus.Step; } return true; //вниз case DirectionType.Down: - if (_startPosY.Value + EntityAirbus.Step + _drawningAirbusHeight < _pictureHeight) + if (_startPosY.Value + EntityBus.Step + _drawningAirbusHeight < _pictureHeight) { - _startPosY += (int)EntityAirbus.Step; + _startPosY += (int)EntityBus.Step; } return true; default: @@ -180,46 +197,30 @@ public class DrawningAirbus /// Прорисовка объекта /// /// - public void DrawTransport(Graphics g) + public virtual void DrawTransport(Graphics g) { - if (EntityAirbus == null || !_startPosX.HasValue || !_startPosY.HasValue) + if (EntityBus == null || !_startPosX.HasValue || !_startPosY.HasValue) { return; } Pen pen = new(Color.Black, 3); - Brush additionalBrush = new SolidBrush(EntityAirbus.AdditionalColor); - Point[] pointsSection = - { - new Point(_startPosX.Value + 45, _startPosY.Value + 30), - new Point(_startPosX.Value + 65, _startPosY.Value + 20), - new Point(_startPosX.Value + 95, _startPosY.Value + 20), - new Point(_startPosX.Value + 115, _startPosY.Value + 30) - }; - - // доп. отсек для пассажиров - if (EntityAirbus.PassengerSection) - { - g.FillPolygon(additionalBrush, pointsSection); - g.DrawPolygon(pen, pointsSection); - } - - //границы аэробуса + //границы Point[] pointsWing = { - new Point(_startPosX.Value + 1, _startPosY.Value + 1), - new Point(_startPosX.Value + 1, _startPosY.Value + 44), - new Point(_startPosX.Value + 45, _startPosY.Value + 44), - new Point(_startPosX.Value + 45, _startPosY.Value + 33), - new Point(_startPosX.Value + 25, _startPosY.Value + 33) + new Point(_startPosX.Value + 1, _startPosY.Value + 1), + new Point(_startPosX.Value + 1, _startPosY.Value + 44), + new Point(_startPosX.Value + 45, _startPosY.Value + 44), + new Point(_startPosX.Value + 45, _startPosY.Value + 33), + new Point(_startPosX.Value + 25, _startPosY.Value + 33) }; Point[] pointsWindow = { - new Point(_startPosX.Value + 115, _startPosY.Value + 33), - new Point(_startPosX.Value + 115, _startPosY.Value + 40), - new Point(_startPosX.Value + 155, _startPosY.Value + 40) + new Point(_startPosX.Value + 115, _startPosY.Value + 33), + new Point(_startPosX.Value + 115, _startPosY.Value + 40), + new Point(_startPosX.Value + 155, _startPosY.Value + 40) }; g.DrawLine(pen, _startPosX.Value, _startPosY.Value, _startPosX.Value, _startPosY.Value + 47); @@ -228,7 +229,7 @@ public class DrawningAirbus g.DrawArc(pen, _startPosX.Value, _startPosY.Value + 30, 150, 30, -45, 225); //закраска - Brush br = new SolidBrush(EntityAirbus.BodyColor); + Brush br = new SolidBrush(EntityBus.BodyColor); g.FillEllipse(br, _startPosX.Value + 1, _startPosY.Value + 31, 149, 29); g.FillPolygon(br, pointsWing); g.DrawLine(new Pen(Color.Black, 5), _startPosX.Value + 45, _startPosY.Value + 45, _startPosX.Value + 100, _startPosY.Value + 45); @@ -247,12 +248,5 @@ public class DrawningAirbus g.DrawLine(pen, _startPosX.Value + 115, _startPosY.Value + 33, _startPosX.Value + 115, _startPosY.Value + 40); g.DrawLine(pen, _startPosX.Value + 115, _startPosY.Value + 40, _startPosX.Value + 150, _startPosY.Value + 40); g.DrawLine(pen, _startPosX.Value + 150, _startPosY.Value + 40, _startPosX.Value + 115, _startPosY.Value + 33); - - //доп. двигатель - if (EntityAirbus.Engines) - { - g.FillEllipse(additionalBrush, _startPosX.Value, _startPosY.Value + 30, 35, 15); - g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value + 30, 35, 15); - } } } diff --git a/ProjectAirbus/ProjectAirbus/EntityAirbus.cs b/ProjectAirbus/ProjectAirbus/Entities/EntityAirbus.cs similarity index 61% rename from ProjectAirbus/ProjectAirbus/EntityAirbus.cs rename to ProjectAirbus/ProjectAirbus/Entities/EntityAirbus.cs index abdabaf..798c6fe 100644 --- a/ProjectAirbus/ProjectAirbus/EntityAirbus.cs +++ b/ProjectAirbus/ProjectAirbus/Entities/EntityAirbus.cs @@ -1,25 +1,10 @@ -namespace ProjectAirbus; +namespace ProjectAirbus.Entities; /// /// Класс-сущность "Аэробус" /// -public class EntityAirbus +public class EntityAirbus : EntityBus { - /// - /// Скорость - /// - public int Speed { get; private set; } - - /// - /// Вес - /// - public double Weight { get; private set; } - - /// - /// Основной цвет - /// - public Color BodyColor { get; private set; } - /// /// Дополнительный цвет (для опциональных элементов) /// @@ -37,12 +22,7 @@ public class EntityAirbus /// - /// Шаг перемещения автомобиля - /// - public double Step => Speed * 100 / Weight; - - /// - /// Инициализация полей объекта-класса аэробус + /// Конструктор /// /// Скорость /// Вес автомобиля @@ -50,11 +30,8 @@ public class EntityAirbus /// Дополнительный цвет /// Признак наличия доп. пассажирского отсека /// Признак наличия доп. двигателей - public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool passengerSection, bool engines) + public EntityAirbus(int speed, double weight, Color bodyColor, Color additionalColor, bool passengerSection, bool engines) : base(speed, weight, bodyColor) { - Speed = speed; - Weight = weight; - BodyColor = bodyColor; AdditionalColor = additionalColor; PassengerSection = passengerSection; Engines = engines; diff --git a/ProjectAirbus/ProjectAirbus/Entities/EntityBus.cs b/ProjectAirbus/ProjectAirbus/Entities/EntityBus.cs new file mode 100644 index 0000000..164d41d --- /dev/null +++ b/ProjectAirbus/ProjectAirbus/Entities/EntityBus.cs @@ -0,0 +1,41 @@ +namespace ProjectAirbus.Entities; + +/// +/// Класс-сущность "Самолет" +/// +public class EntityBus +{ + /// + /// Скорость + /// + public int Speed { get; private set; } + + /// + /// Вес + /// + public double Weight { get; private set; } + + /// + /// Основной цвет + /// + public Color BodyColor { get; private set; } + + /// + /// Шаг перемещения автомобиля + /// + public double Step => Speed * 100 / Weight; + + /// + /// Конструктор сущности + /// + /// Скорость + /// Вес автомобиля + /// Основной цвет + + public EntityBus(int speed, double weight, Color bodyColor) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + } +} diff --git a/ProjectAirbus/ProjectAirbus/FormAirbus.Designer.cs b/ProjectAirbus/ProjectAirbus/FormAirbus.Designer.cs index 065a471..3c43f1a 100644 --- a/ProjectAirbus/ProjectAirbus/FormAirbus.Designer.cs +++ b/ProjectAirbus/ProjectAirbus/FormAirbus.Designer.cs @@ -34,6 +34,7 @@ buttonRight = new Button(); buttonDown = new Button(); buttonUp = new Button(); + buttonCreateBus = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxAirbus).BeginInit(); SuspendLayout(); // @@ -51,11 +52,11 @@ buttonCreate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; buttonCreate.Location = new Point(22, 721); buttonCreate.Name = "buttonCreate"; - buttonCreate.Size = new Size(118, 41); + buttonCreate.Size = new Size(231, 41); buttonCreate.TabIndex = 1; - buttonCreate.Text = "Создать"; + buttonCreate.Text = "Создать аэробус"; buttonCreate.UseVisualStyleBackColor = true; - buttonCreate.Click += ButtonCreate_Click; + buttonCreate.Click += ButtonCreateAirbus_Click; // // buttonLeft // @@ -105,11 +106,23 @@ buttonUp.UseVisualStyleBackColor = true; buttonUp.Click += ButtonMove_Click; // + // buttonCreateBus + // + buttonCreateBus.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateBus.Location = new Point(291, 721); + buttonCreateBus.Name = "buttonCreateBus"; + buttonCreateBus.Size = new Size(231, 41); + buttonCreateBus.TabIndex = 6; + buttonCreateBus.Text = "Создать самолет"; + buttonCreateBus.UseVisualStyleBackColor = true; + buttonCreateBus.Click += buttonCreateBus_Click; + // // FormAirbus // AutoScaleDimensions = new SizeF(13F, 32F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(1401, 784); + Controls.Add(buttonCreateBus); Controls.Add(buttonUp); Controls.Add(buttonDown); Controls.Add(buttonRight); @@ -130,5 +143,6 @@ private Button buttonRight; private Button buttonDown; private Button buttonUp; + private Button buttonCreateBus; } } \ No newline at end of file diff --git a/ProjectAirbus/ProjectAirbus/FormAirbus.cs b/ProjectAirbus/ProjectAirbus/FormAirbus.cs index 7e1ebd6..8f20af7 100644 --- a/ProjectAirbus/ProjectAirbus/FormAirbus.cs +++ b/ProjectAirbus/ProjectAirbus/FormAirbus.cs @@ -1,4 +1,6 @@ -namespace ProjectAirbus; +using ProjectAirbus.Drawnings; + +namespace ProjectAirbus; /// /// Форма работы с объектом "Аэробус" @@ -8,7 +10,7 @@ public partial class FormAirbus : Form /// /// Поле-объект для прорисовки объекта /// - private DrawningAirbus? _drawningAirbus; + private DrawningBus? _drawningBus; /// /// Конструктор формы @@ -23,33 +25,65 @@ public partial class FormAirbus : Form /// private void Draw() { - if (_drawningAirbus == null) + if (_drawningBus == null) { return; } Bitmap bmp = new(pictureBoxAirbus.Width, pictureBoxAirbus.Height); Graphics gr = Graphics.FromImage(bmp); - _drawningAirbus.DrawTransport(gr); + _drawningBus.DrawTransport(gr); pictureBoxAirbus.Image = bmp; } /// - /// Обработка нажатия кнопки "Создать" + /// Создание объекта класса-перемещения + /// + /// Тип создаваемого объекта + private void CreateObject(string type) + { + Random random = new(); + switch (type) + { + case nameof(DrawningBus): + _drawningBus = new DrawningBus(random.Next(100, 300), random.Next(1000, 3000), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256))); + break; + case nameof(DrawningAirbus): + _drawningBus = new DrawningAirbus(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))); + break; + default: + return; + } + + _drawningBus.SetPictureSize(pictureBoxAirbus.Width, pictureBoxAirbus.Height); + _drawningBus.SetPosition(random.Next(10, 100), random.Next(10, 100)); + _strategy = null; + comboBoxStrategy.Enabled = true; + Draw(); + } + + /// + /// Обработка нажатия кнопки "Создать аэробус" /// /// /// - private void ButtonCreate_Click(object sender, EventArgs e) + private void ButtonCreateAirbus_Click(object sender, EventArgs e) { - Random random = new(); - _drawningAirbus = new DrawningAirbus(); - _drawningAirbus.Init(random.Next(100, 300), random.Next(1000, 3000), - Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), - Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), - Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2))); - _drawningAirbus.SetPictureSize(pictureBoxAirbus.Width, pictureBoxAirbus.Height); - _drawningAirbus.SetPosition(random.Next(10, 100), random.Next(10, 100)); - Draw(); + CreateObject(nameof(DrawningAirbus)); + } + + /// + /// Обработка нажатия кнопки "Создать самолет" + /// + /// + /// + private void buttonCreateBus_Click(object sender, EventArgs e) + { + CreateObject(nameof(DrawningBus)); } /// @@ -59,7 +93,7 @@ public partial class FormAirbus : Form /// private void ButtonMove_Click(object sender, EventArgs e) { - if (_drawningAirbus == null) + if (_drawningBus == null) { return; } @@ -69,16 +103,16 @@ public partial class FormAirbus : Form switch (name) { case "buttonUp": - result = _drawningAirbus.MoveTransport(DirectionType.Up); + result = _drawningBus.MoveTransport(DirectionType.Up); break; case "buttonDown": - result = _drawningAirbus.MoveTransport(DirectionType.Down); + result = _drawningBus.MoveTransport(DirectionType.Down); break; case "buttonLeft": - result = _drawningAirbus.MoveTransport(DirectionType.Left); + result = _drawningBus.MoveTransport(DirectionType.Left); break; case "buttonRight": - result = _drawningAirbus.MoveTransport(DirectionType.Right); + result = _drawningBus.MoveTransport(DirectionType.Right); break; }