From b05d49640882468e187fe2eac95901884707e353 Mon Sep 17 00:00:00 2001 From: devil_1nc Date: Tue, 13 Feb 2024 14:51:17 +0400 Subject: [PATCH 1/9] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B2=D0=B0=D1=8F=20?= =?UTF-8?q?=D1=87=D0=B0=D1=81=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectSeaplane/DirectionType.cs | 26 ++ .../ProjectSeaplane/DrawningSeaplane.cs | 268 ++++++++++++++++++ .../ProjectSeaplane/EntitySeaplane.cs | 68 +++++ .../ProjectSeaplane/Form1.Designer.cs | 39 --- ProjectSeaplane/ProjectSeaplane/Form1.cs | 10 - .../ProjectSeaplane/FormSeaplane.Designer.cs | 130 +++++++++ .../ProjectSeaplane/FormSeaplane.cs | 40 +++ .../{Form1.resx => FormSeaplane.resx} | 50 ++-- ProjectSeaplane/ProjectSeaplane/Program.cs | 2 +- .../ProjectSeaplane/ProjectSeaplane.csproj | 15 + .../Properties/Resources.Designer.cs | 103 +++++++ .../ProjectSeaplane/Properties/Resources.resx | 133 +++++++++ .../ProjectSeaplane/Resources/arrow_down.png | Bin 0 -> 7619 bytes .../ProjectSeaplane/Resources/arrow_left.png | Bin 0 -> 8208 bytes .../ProjectSeaplane/Resources/arrow_right.png | Bin 0 -> 7698 bytes .../ProjectSeaplane/Resources/arrow_up.png | Bin 0 -> 8048 bytes 16 files changed, 809 insertions(+), 75 deletions(-) create mode 100644 ProjectSeaplane/ProjectSeaplane/DirectionType.cs create mode 100644 ProjectSeaplane/ProjectSeaplane/DrawningSeaplane.cs create mode 100644 ProjectSeaplane/ProjectSeaplane/EntitySeaplane.cs delete mode 100644 ProjectSeaplane/ProjectSeaplane/Form1.Designer.cs delete mode 100644 ProjectSeaplane/ProjectSeaplane/Form1.cs create mode 100644 ProjectSeaplane/ProjectSeaplane/FormSeaplane.Designer.cs create mode 100644 ProjectSeaplane/ProjectSeaplane/FormSeaplane.cs rename ProjectSeaplane/ProjectSeaplane/{Form1.resx => FormSeaplane.resx} (93%) create mode 100644 ProjectSeaplane/ProjectSeaplane/Properties/Resources.Designer.cs create mode 100644 ProjectSeaplane/ProjectSeaplane/Properties/Resources.resx create mode 100644 ProjectSeaplane/ProjectSeaplane/Resources/arrow_down.png create mode 100644 ProjectSeaplane/ProjectSeaplane/Resources/arrow_left.png create mode 100644 ProjectSeaplane/ProjectSeaplane/Resources/arrow_right.png create mode 100644 ProjectSeaplane/ProjectSeaplane/Resources/arrow_up.png diff --git a/ProjectSeaplane/ProjectSeaplane/DirectionType.cs b/ProjectSeaplane/ProjectSeaplane/DirectionType.cs new file mode 100644 index 0000000..ef50542 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/DirectionType.cs @@ -0,0 +1,26 @@ +namespace ProjectSeaplane; +/// +/// Направление перемещения +/// +public enum DirectionType +{ + /// + /// Вверх + /// + Up = 1, + + /// + /// Вниз + /// + Down = 2, + + /// + /// Влево + /// + Left = 3, + + /// + /// Вправо + /// + Right = 4 +} \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/DrawningSeaplane.cs b/ProjectSeaplane/ProjectSeaplane/DrawningSeaplane.cs new file mode 100644 index 0000000..d1bd771 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/DrawningSeaplane.cs @@ -0,0 +1,268 @@ +namespace ProjectSeaplane; +/// +/// Класс, отвечающий за прорисовку и перемещение объекта-сущности +/// +public class DrawningSeaplane +{ + /// + /// Класс-сущность + /// + public EntitySeaplane? EntitySportCar { get; private set; } + /// + /// Ширина окна + /// + private int? _pictureWidth; + /// + /// Высота окна + /// + private int? _pictureHeight; + /// + /// Левая координата прорисовки автомобиля + /// + private int? _startPosX; + /// + /// Верхняя кооридната прорисовки автомобиля + /// + private int? _startPosY; + /// + /// Ширина прорисовки автомобиля + /// + private readonly int _drawningCarWidth = 110; + /// + /// Высота прорисовки автомобиля + /// + private readonly int _drawningCarHeight = 60; + /// + /// Инициализация свойств + /// + /// Скорость + /// Вес + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия обвеса + /// Признак наличия антикрыла + /// Признак наличия гоночной полосы + public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyKit, bool wing, bool sportLine) + { + EntitySportCar = new EntitySeaplane(); + EntitySportCar.Init(speed, weight, bodyColor, additionalColor, + bodyKit, wing, sportLine); + _pictureWidth = null; + _pictureHeight = null; + _startPosX = null; + _startPosY = null; + } + /// + /// Установка границ поля + /// + /// Ширина поля + /// Высота поля + /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах + public bool SetPictureSize(int width, int height) + { + // TODO проверка, что объект "влезает" в размеры поля + // если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена + _pictureWidth = width; + _pictureHeight = height; + return true; + } + /// + /// Установка позиции + /// + /// Координата X + /// Координата Y + public void SetPosition(int x, int y) + { + if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) + { + return; + } + // TODO если при установке объекта в эти координаты, он будет + "выходить" за границы формы + // то надо изменить координаты, чтобы он оставался в этих границах +12 + _startPosX = x; + _startPosY = y; + } + /// + /// Изменение направления перемещения + /// + /// Направление + /// true - перемещене выполнено, false - перемещение + невозможно +public bool MoveTransport(DirectionType direction) + { + if (EntitySportCar == null || !_startPosX.HasValue || + !_startPosY.HasValue) + { + return false; + } + switch (direction) + { + //влево + case DirectionType.Left: + if (_startPosX.Value - EntitySportCar.Step > 0) + { + _startPosX -= (int)EntitySportCar.Step; + } + return true; + //вверх + case DirectionType.Up: + if (_startPosY.Value - EntitySportCar.Step > 0) + { + _startPosY -= (int)EntitySportCar.Step; + } + return true; + // вправо + case DirectionType.Right: + //TODO прописать логику сдвига в право + return true; + //вниз + case DirectionType.Down: + //TODO прописать логику сдвига в вниз + return true; + default: + return false; + } + } + /// + /// Прорисовка объекта + /// + /// + public void DrawTransport(Graphics g) + { + if (EntitySportCar == null || !_startPosX.HasValue || + !_startPosY.HasValue) + { + return; + } + Pen pen = new(Color.Black); + Brush additionalBrush = new + SolidBrush(EntitySportCar.AdditionalColor); + // обвесы + 13 + if (EntitySportCar.BodyKit) + { + g.DrawEllipse(pen, _startPosX.Value + 90, _startPosY.Value, + 20, 20); + g.DrawEllipse(pen, _startPosX.Value + 90, _startPosY.Value + + 40, 20, 20); + g.DrawRectangle(pen, _startPosX.Value + 90, _startPosY.Value + + 10, 20, 40); + g.DrawRectangle(pen, _startPosX.Value + 90, _startPosY.Value, + 15, 15); + g.DrawRectangle(pen, _startPosX.Value + 90, _startPosY.Value + + 45, 15, 15); + g.FillEllipse(additionalBrush, _startPosX.Value + 90, + _startPosY.Value, 20, 20); + g.FillEllipse(additionalBrush, _startPosX.Value + 90, + _startPosY.Value + 40, 20, 20); + g.FillRectangle(additionalBrush, _startPosX.Value + 90, + _startPosY.Value + 10, 20, 40); + g.FillRectangle(additionalBrush, _startPosX.Value + 90, + _startPosY.Value + 1, 15, 15); + g.FillRectangle(additionalBrush, _startPosX.Value + 90, + _startPosY.Value + 45, 15, 15); + g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value, 20, + 20); + g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value + 40, + 20, 20); + g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 10, + 20, 40); + g.DrawRectangle(pen, _startPosX.Value + 5, _startPosY.Value, + 14, 15); + g.DrawRectangle(pen, _startPosX.Value + 5, _startPosY.Value + + 45, 14, 15); + g.FillEllipse(additionalBrush, _startPosX.Value, + _startPosY.Value, 20, 20); + g.FillEllipse(additionalBrush, _startPosX.Value, + _startPosY.Value + 40, 20, 20); + g.FillRectangle(additionalBrush, _startPosX.Value + 1, + _startPosY.Value + 10, 25, 40); + g.FillRectangle(additionalBrush, _startPosX.Value + 5, + _startPosY.Value + 1, 15, 15); + g.FillRectangle(additionalBrush, _startPosX.Value + 5, + _startPosY.Value + 45, 15, 15); + g.DrawRectangle(pen, _startPosX.Value + 35, _startPosY.Value, + 39, 15); + g.DrawRectangle(pen, _startPosX.Value + 35, _startPosY.Value + + 45, 39, 15); + g.FillRectangle(additionalBrush, _startPosX.Value + 35, + _startPosY.Value + 1, 40, 15); + g.FillRectangle(additionalBrush, _startPosX.Value + 35, + _startPosY.Value + 45, 40, 15); + } + //границы автомобиля + g.DrawEllipse(pen, _startPosX.Value + 10, _startPosY.Value + 5, 20, + 20); + g.DrawEllipse(pen, _startPosX.Value + 10, _startPosY.Value + 35, 20, + 20); + g.DrawEllipse(pen, _startPosX.Value + 80, _startPosY.Value + 5, 20, + 20); + 14 + g.DrawEllipse(pen, _startPosX.Value + 80, _startPosY.Value + 35, 20, + 20); + g.DrawRectangle(pen, _startPosX.Value + 9, _startPosY.Value + 15, 10, + 30); + g.DrawRectangle(pen, _startPosX.Value + 90, _startPosY.Value + 15, + 10, 30); + g.DrawRectangle(pen, _startPosX.Value + 20, _startPosY.Value + 4, 70, + 52); + //задние фары + Brush brRed = new SolidBrush(Color.Red); + g.FillEllipse(brRed, _startPosX.Value + 10, _startPosY.Value + 5, 20, + 20); + g.FillEllipse(brRed, _startPosX.Value + 10, _startPosY.Value + 35, + 20, 20); + //передние фары + Brush brYellow = new SolidBrush(Color.Yellow); + g.FillEllipse(brYellow, _startPosX.Value + 80, _startPosY.Value + 5, + 20, 20); + g.FillEllipse(brYellow, _startPosX.Value + 80, _startPosY.Value + 35, + 20, 20); + //кузов + Brush br = new SolidBrush(EntitySportCar.BodyColor); + g.FillRectangle(br, _startPosX.Value + 10, _startPosY.Value + 15, 10, + 30); + g.FillRectangle(br, _startPosX.Value + 90, _startPosY.Value + 15, 10, + 30); + g.FillRectangle(br, _startPosX.Value + 20, _startPosY.Value + 5, 70, + 50); + //стекла + Brush brBlue = new SolidBrush(Color.LightBlue); + g.FillRectangle(brBlue, _startPosX.Value + 70, _startPosY.Value + 10, + 5, 40); + g.FillRectangle(brBlue, _startPosX.Value + 30, _startPosY.Value + 10, + 5, 40); + g.FillRectangle(brBlue, _startPosX.Value + 35, _startPosY.Value + 8, + 35, 2); + g.FillRectangle(brBlue, _startPosX.Value + 35, _startPosY.Value + 51, + 35, 2); + //выделяем рамкой крышу + g.DrawRectangle(pen, _startPosX.Value + 35, _startPosY.Value + 10, + 35, 40); + g.DrawRectangle(pen, _startPosX.Value + 75, _startPosY.Value + 15, + 25, 30); + g.DrawRectangle(pen, _startPosX.Value + 10, _startPosY.Value + 15, + 15, 30); + // спортивная линия + if (EntitySportCar.SportLine) + { + g.FillRectangle(additionalBrush, _startPosX.Value + 75, + _startPosY.Value + 23, 25, 15); + g.FillRectangle(additionalBrush, _startPosX.Value + 35, + _startPosY.Value + 23, 35, 15); + g.FillRectangle(additionalBrush, _startPosX.Value + 10, + _startPosY.Value + 23, 20, 15); + } + // крыло + if (EntitySportCar.Wing) + 15 + { + g.FillRectangle(additionalBrush, _startPosX.Value, + _startPosY.Value + 5, 10, 50); + g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 5, + 10, 50); + } + } +} \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/EntitySeaplane.cs b/ProjectSeaplane/ProjectSeaplane/EntitySeaplane.cs new file mode 100644 index 0000000..3503966 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/EntitySeaplane.cs @@ -0,0 +1,68 @@ +namespace ProjectSeaplane; +/// +/// Класс-сущность "Спортивный автомобиль" +/// +public class EntitySeaplane +{ + /// + /// Скорость + /// + public int Speed { get; private set; } + + /// + /// Вес + /// + public double Weight { get; private set; } + + /// + /// Основной цвет + /// + public Color BodyColor { get; private set; } + + /// + /// Дополнительный цвет (для опциональных элементов) + /// + public Color AdditionalColor { get; private set; } + + /// + /// Признак (опция) наличия обвеса + /// + public bool BodyKit { get; private set; } + + /// + /// Признак (опция) наличия антикрыла + /// + public bool Wing { get; private set; } + + /// + /// Признак (опция) наличия гоночной полосы + /// + public bool SportLine { get; private set; } + + /// + /// Шаг перемещения автомобиля + /// + public double Step => Speed * 100 / Weight; + + /// + /// Инициализация полей объекта-класса спортивного автомобиля + /// + /// Скорость + /// Вес автомобиля + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия обвеса + /// Признак наличия антикрыла + /// Признак наличия гоночной полосы + public void Init(int speed, double weight, Color bodyColor, Color + additionalColor, bool bodyKit, bool wing, bool sportLine) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + AdditionalColor = additionalColor; + BodyKit = bodyKit; + Wing = wing; + SportLine = sportLine; + } +} diff --git a/ProjectSeaplane/ProjectSeaplane/Form1.Designer.cs b/ProjectSeaplane/ProjectSeaplane/Form1.Designer.cs deleted file mode 100644 index 8e222d3..0000000 --- a/ProjectSeaplane/ProjectSeaplane/Form1.Designer.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace ProjectSeaplane -{ - partial class Form1 - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 450); - this.Text = "Form1"; - } - - #endregion - } -} \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/Form1.cs b/ProjectSeaplane/ProjectSeaplane/Form1.cs deleted file mode 100644 index 4a978b3..0000000 --- a/ProjectSeaplane/ProjectSeaplane/Form1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace ProjectSeaplane -{ - public partial class Form1 : Form - { - public Form1() - { - InitializeComponent(); - } - } -} \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/FormSeaplane.Designer.cs b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.Designer.cs new file mode 100644 index 0000000..7ef955e --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.Designer.cs @@ -0,0 +1,130 @@ +namespace ProjectSeaplane +{ + partial class FormSeaplane + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + pictureBoxSeaplane = new PictureBox(); + buttonCreate = new Button(); + buttonLeft = new Button(); + buttonUp = new Button(); + buttonDown = new Button(); + buttonRight = new Button(); + ((System.ComponentModel.ISupportInitialize)pictureBoxSeaplane).BeginInit(); + SuspendLayout(); + // + // pictureBoxSeaplane + // + pictureBoxSeaplane.Dock = DockStyle.Fill; + pictureBoxSeaplane.Location = new Point(0, 0); + pictureBoxSeaplane.Name = "pictureBoxSeaplane"; + pictureBoxSeaplane.Size = new Size(850, 539); + pictureBoxSeaplane.TabIndex = 0; + pictureBoxSeaplane.TabStop = false; + // + // buttonCreate + // + buttonCreate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreate.Location = new Point(12, 504); + buttonCreate.Name = "buttonCreate"; + buttonCreate.Size = new Size(75, 23); + buttonCreate.TabIndex = 1; + buttonCreate.Text = "Создать"; + buttonCreate.UseVisualStyleBackColor = true; + buttonCreate.Click += buttonCreate_Click; + // + // buttonLeft + // + buttonLeft.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonLeft.BackgroundImage = Properties.Resources.arrow_left; + buttonLeft.BackgroundImageLayout = ImageLayout.Stretch; + buttonLeft.Location = new Point(718, 490); + buttonLeft.Name = "buttonLeft"; + buttonLeft.Size = new Size(35, 35); + buttonLeft.TabIndex = 2; + buttonLeft.UseVisualStyleBackColor = true; + // + // buttonUp + // + buttonUp.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonUp.BackgroundImage = Properties.Resources.arrow_up; + buttonUp.BackgroundImageLayout = ImageLayout.Stretch; + buttonUp.Location = new Point(758, 450); + buttonUp.Name = "buttonUp"; + buttonUp.Size = new Size(35, 35); + buttonUp.TabIndex = 3; + buttonUp.UseVisualStyleBackColor = true; + // + // buttonDown + // + buttonDown.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonDown.BackgroundImage = Properties.Resources.arrow_down; + buttonDown.BackgroundImageLayout = ImageLayout.Stretch; + buttonDown.Location = new Point(758, 490); + buttonDown.Name = "buttonDown"; + buttonDown.Size = new Size(35, 35); + buttonDown.TabIndex = 4; + buttonDown.UseVisualStyleBackColor = true; + // + // buttonRight + // + buttonRight.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonRight.BackgroundImage = Properties.Resources.arrow_right; + buttonRight.BackgroundImageLayout = ImageLayout.Stretch; + buttonRight.Location = new Point(799, 490); + buttonRight.Name = "buttonRight"; + buttonRight.Size = new Size(35, 35); + buttonRight.TabIndex = 5; + buttonRight.UseVisualStyleBackColor = true; + // + // FormSeaplane + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(850, 539); + Controls.Add(buttonRight); + Controls.Add(buttonDown); + Controls.Add(buttonUp); + Controls.Add(buttonLeft); + Controls.Add(buttonCreate); + Controls.Add(pictureBoxSeaplane); + Name = "FormSeaplane"; + Text = "Гидросамолёт"; + ((System.ComponentModel.ISupportInitialize)pictureBoxSeaplane).EndInit(); + ResumeLayout(false); + } + + #endregion + + private PictureBox pictureBoxSeaplane; + private Button buttonCreate; + private Button buttonLeft; + private Button buttonUp; + private Button buttonDown; + private Button buttonRight; + } +} \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/FormSeaplane.cs b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.cs new file mode 100644 index 0000000..86c3f21 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ProjectSeaplane +{ + public partial class FormSeaplane : Form + { + private DrawningSeaplane? _drawningSeaplane; + + public FormSeaplane() + { + InitializeComponent(); + } + + private void ButtonCreate_Click(object sender, EventArgs e) + { + Random random = new(); + _drawningSeaplane = new DrawningSeaplane(); + _drawningSeaplane.Init(random.Next(100, 300), random.Next(1000, 3000), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), + Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2))); + _drawningSeaplane.SetPictureSize(pictureBoxSeaplane.Width, pictureBoxSeaplane.Height); + _drawningSeaplane.SetPosition(random.Next(10, 100), random.Next(10, 100)); + + Bitmap bmp = new(pictureBoxSeaplane.Width, pictureBoxSeaplane.Height); + Graphics gr = Graphics.FromImage(bmp); + _drawningSeaplane.DrawTransport(gr); + pictureBoxSeaplane.Image = bmp; + + } + } +} diff --git a/ProjectSeaplane/ProjectSeaplane/Form1.resx b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.resx similarity index 93% rename from ProjectSeaplane/ProjectSeaplane/Form1.resx rename to ProjectSeaplane/ProjectSeaplane/FormSeaplane.resx index 1af7de1..af32865 100644 --- a/ProjectSeaplane/ProjectSeaplane/Form1.resx +++ b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.resx @@ -1,17 +1,17 @@  - diff --git a/ProjectSeaplane/ProjectSeaplane/Program.cs b/ProjectSeaplane/ProjectSeaplane/Program.cs index bcf84b2..4e58da8 100644 --- a/ProjectSeaplane/ProjectSeaplane/Program.cs +++ b/ProjectSeaplane/ProjectSeaplane/Program.cs @@ -11,7 +11,7 @@ namespace ProjectSeaplane // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new Form1()); + Application.Run(new FormSeaplane()); } } } \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/ProjectSeaplane.csproj b/ProjectSeaplane/ProjectSeaplane/ProjectSeaplane.csproj index e1a0735..244387d 100644 --- a/ProjectSeaplane/ProjectSeaplane/ProjectSeaplane.csproj +++ b/ProjectSeaplane/ProjectSeaplane/ProjectSeaplane.csproj @@ -8,4 +8,19 @@ enable + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/Properties/Resources.Designer.cs b/ProjectSeaplane/ProjectSeaplane/Properties/Resources.Designer.cs new file mode 100644 index 0000000..ff77389 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/Properties/Resources.Designer.cs @@ -0,0 +1,103 @@ +//------------------------------------------------------------------------------ +// +// Этот код создан программой. +// Исполняемая версия:4.0.30319.42000 +// +// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +// повторной генерации кода. +// +//------------------------------------------------------------------------------ + +namespace ProjectSeaplane.Properties { + using System; + + + /// + /// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д. + /// + // Этот класс создан автоматически классом StronglyTypedResourceBuilder + // с помощью такого средства, как ResGen или Visual Studio. + // Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen + // с параметром /str или перестройте свой проект VS. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ProjectSeaplane.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Перезаписывает свойство CurrentUICulture текущего потока для всех + /// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrow_down { + get { + object obj = ResourceManager.GetObject("arrow_down", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrow_left { + get { + object obj = ResourceManager.GetObject("arrow_left", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrow_right { + get { + object obj = ResourceManager.GetObject("arrow_right", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrow_up { + get { + object obj = ResourceManager.GetObject("arrow_up", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/ProjectSeaplane/ProjectSeaplane/Properties/Resources.resx b/ProjectSeaplane/ProjectSeaplane/Properties/Resources.resx new file mode 100644 index 0000000..47aca23 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/Properties/Resources.resx @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\arrow_down.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\arrow_left.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\arrow_right.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\arrow_up.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/Resources/arrow_down.png b/ProjectSeaplane/ProjectSeaplane/Resources/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..769dc0c8f55edbdb6a4e66541c0a10b2ecce1f5a GIT binary patch literal 7619 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 literal 0 HcmV?d00001 diff --git a/ProjectSeaplane/ProjectSeaplane/Resources/arrow_left.png b/ProjectSeaplane/ProjectSeaplane/Resources/arrow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..2460900445e78085f89dab5719af5ac4afe291c9 GIT binary patch literal 8208 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 literal 0 HcmV?d00001 From a1e7d192d88721f508ea794c1cb5bf0d33f8a1f1 Mon Sep 17 00:00:00 2001 From: ShuryginDima Date: Mon, 26 Feb 2024 22:32:27 +0300 Subject: [PATCH 2/9] =?UTF-8?q?=D0=9B=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=20=E2=84=961?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectSeaplane/DrawningSeaplane.cs | 482 ++++++++---------- .../ProjectSeaplane/EntitySeaplane.cs | 30 +- .../ProjectSeaplane/FormSeaplane.Designer.cs | 40 +- .../ProjectSeaplane/FormSeaplane.cs | 111 ++-- 4 files changed, 327 insertions(+), 336 deletions(-) diff --git a/ProjectSeaplane/ProjectSeaplane/DrawningSeaplane.cs b/ProjectSeaplane/ProjectSeaplane/DrawningSeaplane.cs index d1bd771..72eba68 100644 --- a/ProjectSeaplane/ProjectSeaplane/DrawningSeaplane.cs +++ b/ProjectSeaplane/ProjectSeaplane/DrawningSeaplane.cs @@ -1,268 +1,214 @@ -namespace ProjectSeaplane; -/// -/// Класс, отвечающий за прорисовку и перемещение объекта-сущности -/// -public class DrawningSeaplane -{ - /// - /// Класс-сущность - /// - public EntitySeaplane? EntitySportCar { get; private set; } - /// - /// Ширина окна - /// - private int? _pictureWidth; - /// - /// Высота окна - /// - private int? _pictureHeight; - /// - /// Левая координата прорисовки автомобиля - /// - private int? _startPosX; - /// - /// Верхняя кооридната прорисовки автомобиля - /// - private int? _startPosY; - /// - /// Ширина прорисовки автомобиля - /// - private readonly int _drawningCarWidth = 110; - /// - /// Высота прорисовки автомобиля - /// - private readonly int _drawningCarHeight = 60; - /// - /// Инициализация свойств - /// - /// Скорость - /// Вес - /// Основной цвет - /// Дополнительный цвет - /// Признак наличия обвеса - /// Признак наличия антикрыла - /// Признак наличия гоночной полосы - public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyKit, bool wing, bool sportLine) - { - EntitySportCar = new EntitySeaplane(); - EntitySportCar.Init(speed, weight, bodyColor, additionalColor, - bodyKit, wing, sportLine); - _pictureWidth = null; - _pictureHeight = null; - _startPosX = null; - _startPosY = null; - } - /// - /// Установка границ поля - /// - /// Ширина поля - /// Высота поля - /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах - public bool SetPictureSize(int width, int height) - { - // TODO проверка, что объект "влезает" в размеры поля - // если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена - _pictureWidth = width; - _pictureHeight = height; - return true; - } - /// - /// Установка позиции - /// - /// Координата X - /// Координата Y - public void SetPosition(int x, int y) - { - if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) - { - return; - } - // TODO если при установке объекта в эти координаты, он будет - "выходить" за границы формы - // то надо изменить координаты, чтобы он оставался в этих границах -12 - _startPosX = x; - _startPosY = y; - } - /// - /// Изменение направления перемещения - /// - /// Направление - /// true - перемещене выполнено, false - перемещение - невозможно -public bool MoveTransport(DirectionType direction) - { - if (EntitySportCar == null || !_startPosX.HasValue || - !_startPosY.HasValue) - { - return false; - } - switch (direction) - { - //влево - case DirectionType.Left: - if (_startPosX.Value - EntitySportCar.Step > 0) - { - _startPosX -= (int)EntitySportCar.Step; - } - return true; - //вверх - case DirectionType.Up: - if (_startPosY.Value - EntitySportCar.Step > 0) - { - _startPosY -= (int)EntitySportCar.Step; - } - return true; - // вправо - case DirectionType.Right: - //TODO прописать логику сдвига в право - return true; - //вниз - case DirectionType.Down: - //TODO прописать логику сдвига в вниз - return true; - default: - return false; - } - } - /// - /// Прорисовка объекта - /// - /// - public void DrawTransport(Graphics g) - { - if (EntitySportCar == null || !_startPosX.HasValue || - !_startPosY.HasValue) - { - return; - } - Pen pen = new(Color.Black); - Brush additionalBrush = new - SolidBrush(EntitySportCar.AdditionalColor); - // обвесы - 13 - if (EntitySportCar.BodyKit) - { - g.DrawEllipse(pen, _startPosX.Value + 90, _startPosY.Value, - 20, 20); - g.DrawEllipse(pen, _startPosX.Value + 90, _startPosY.Value + - 40, 20, 20); - g.DrawRectangle(pen, _startPosX.Value + 90, _startPosY.Value + - 10, 20, 40); - g.DrawRectangle(pen, _startPosX.Value + 90, _startPosY.Value, - 15, 15); - g.DrawRectangle(pen, _startPosX.Value + 90, _startPosY.Value + - 45, 15, 15); - g.FillEllipse(additionalBrush, _startPosX.Value + 90, - _startPosY.Value, 20, 20); - g.FillEllipse(additionalBrush, _startPosX.Value + 90, - _startPosY.Value + 40, 20, 20); - g.FillRectangle(additionalBrush, _startPosX.Value + 90, - _startPosY.Value + 10, 20, 40); - g.FillRectangle(additionalBrush, _startPosX.Value + 90, - _startPosY.Value + 1, 15, 15); - g.FillRectangle(additionalBrush, _startPosX.Value + 90, - _startPosY.Value + 45, 15, 15); - g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value, 20, - 20); - g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value + 40, - 20, 20); - g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 10, - 20, 40); - g.DrawRectangle(pen, _startPosX.Value + 5, _startPosY.Value, - 14, 15); - g.DrawRectangle(pen, _startPosX.Value + 5, _startPosY.Value + - 45, 14, 15); - g.FillEllipse(additionalBrush, _startPosX.Value, - _startPosY.Value, 20, 20); - g.FillEllipse(additionalBrush, _startPosX.Value, - _startPosY.Value + 40, 20, 20); - g.FillRectangle(additionalBrush, _startPosX.Value + 1, - _startPosY.Value + 10, 25, 40); - g.FillRectangle(additionalBrush, _startPosX.Value + 5, - _startPosY.Value + 1, 15, 15); - g.FillRectangle(additionalBrush, _startPosX.Value + 5, - _startPosY.Value + 45, 15, 15); - g.DrawRectangle(pen, _startPosX.Value + 35, _startPosY.Value, - 39, 15); - g.DrawRectangle(pen, _startPosX.Value + 35, _startPosY.Value + - 45, 39, 15); - g.FillRectangle(additionalBrush, _startPosX.Value + 35, - _startPosY.Value + 1, 40, 15); - g.FillRectangle(additionalBrush, _startPosX.Value + 35, - _startPosY.Value + 45, 40, 15); - } - //границы автомобиля - g.DrawEllipse(pen, _startPosX.Value + 10, _startPosY.Value + 5, 20, - 20); - g.DrawEllipse(pen, _startPosX.Value + 10, _startPosY.Value + 35, 20, - 20); - g.DrawEllipse(pen, _startPosX.Value + 80, _startPosY.Value + 5, 20, - 20); - 14 - g.DrawEllipse(pen, _startPosX.Value + 80, _startPosY.Value + 35, 20, - 20); - g.DrawRectangle(pen, _startPosX.Value + 9, _startPosY.Value + 15, 10, - 30); - g.DrawRectangle(pen, _startPosX.Value + 90, _startPosY.Value + 15, - 10, 30); - g.DrawRectangle(pen, _startPosX.Value + 20, _startPosY.Value + 4, 70, - 52); - //задние фары - Brush brRed = new SolidBrush(Color.Red); - g.FillEllipse(brRed, _startPosX.Value + 10, _startPosY.Value + 5, 20, - 20); - g.FillEllipse(brRed, _startPosX.Value + 10, _startPosY.Value + 35, - 20, 20); - //передние фары - Brush brYellow = new SolidBrush(Color.Yellow); - g.FillEllipse(brYellow, _startPosX.Value + 80, _startPosY.Value + 5, - 20, 20); - g.FillEllipse(brYellow, _startPosX.Value + 80, _startPosY.Value + 35, - 20, 20); - //кузов - Brush br = new SolidBrush(EntitySportCar.BodyColor); - g.FillRectangle(br, _startPosX.Value + 10, _startPosY.Value + 15, 10, - 30); - g.FillRectangle(br, _startPosX.Value + 90, _startPosY.Value + 15, 10, - 30); - g.FillRectangle(br, _startPosX.Value + 20, _startPosY.Value + 5, 70, - 50); - //стекла - Brush brBlue = new SolidBrush(Color.LightBlue); - g.FillRectangle(brBlue, _startPosX.Value + 70, _startPosY.Value + 10, - 5, 40); - g.FillRectangle(brBlue, _startPosX.Value + 30, _startPosY.Value + 10, - 5, 40); - g.FillRectangle(brBlue, _startPosX.Value + 35, _startPosY.Value + 8, - 35, 2); - g.FillRectangle(brBlue, _startPosX.Value + 35, _startPosY.Value + 51, - 35, 2); - //выделяем рамкой крышу - g.DrawRectangle(pen, _startPosX.Value + 35, _startPosY.Value + 10, - 35, 40); - g.DrawRectangle(pen, _startPosX.Value + 75, _startPosY.Value + 15, - 25, 30); - g.DrawRectangle(pen, _startPosX.Value + 10, _startPosY.Value + 15, - 15, 30); - // спортивная линия - if (EntitySportCar.SportLine) - { - g.FillRectangle(additionalBrush, _startPosX.Value + 75, - _startPosY.Value + 23, 25, 15); - g.FillRectangle(additionalBrush, _startPosX.Value + 35, - _startPosY.Value + 23, 35, 15); - g.FillRectangle(additionalBrush, _startPosX.Value + 10, - _startPosY.Value + 23, 20, 15); - } - // крыло - if (EntitySportCar.Wing) - 15 - { - g.FillRectangle(additionalBrush, _startPosX.Value, - _startPosY.Value + 5, 10, 50); - g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 5, - 10, 50); - } - } -} \ No newline at end of file +namespace ProjectSeaplane; +/// +/// Класс, отвечающий за прорисовку и перемещение объекта-сущности +/// +public class DrawningSeaplane +{ + /// + /// Класс-сущность + /// + public EntitySeaplane? EntitySeaplane { get; private set; } + + /// + /// Ширина окна + /// + private int? _pictureWidth; + + /// + /// Высота окна + /// + private int? _pictureHeight; + + /// + /// Левая координата прорисовки гидросамолёта + /// + private int? _startPosX; + + /// + /// Верхняя кооридната прорисовки гидросамолёта + /// + private int? _startPosY; + + /// + /// Ширина прорисовки гидросамолёта + /// + private readonly int _drawningSeaplaneWidth = 130; + + /// + /// Высота прорисовки гидросамолёта + /// + private readonly int _drawningSeaplaneHeight = 50; + + /// + /// Инициализация свойств + /// + /// Скорость + /// Вес + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия поплавков + /// Признак наличия лодки + public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool floats, bool boat) + { + EntitySeaplane = new EntitySeaplane(); + EntitySeaplane.Init(speed, weight, bodyColor, additionalColor, floats, boat); + _pictureWidth = null; + _pictureHeight = null; + _startPosX = null; + _startPosY = null; + } + + /// + /// Установка границ поля + /// + /// Ширина поля + /// Высота поля + /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах + public bool SetPictureSize(int width, int height) + { + // TODO проверка, что объект "влезает" в размеры поля + // если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена + _pictureWidth = width; + _pictureHeight = height; + return true; + } + + /// + /// Установка позиции + /// + /// Координата X + /// Координата Y + public void SetPosition(int x, int y) + { + if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) + { + return; + } + // TODO если при установке объекта в эти координаты, он будет "выходить" за границы формы + // то надо изменить координаты, чтобы он оставался в этих границах + + _startPosX = x; + _startPosY = y; + } + + /// + /// Изменение направления перемещения + /// + /// Направление + /// true - перемещене выполнено, false - перемещение невозможно + public bool MoveTransport(DirectionType direction) + { + if (EntitySeaplane == null || !_startPosX.HasValue || !_startPosY.HasValue) + { + return false; + } + + switch (direction) + { + //влево + case DirectionType.Left: + if (_startPosX.Value - EntitySeaplane.Step > 0) + { + _startPosX -= (int)EntitySeaplane.Step; + } + return true; + //вверх + case DirectionType.Up: + if (_startPosY.Value - EntitySeaplane.Step > 0) + { + _startPosY -= (int)EntitySeaplane.Step; + } + return true; + // вправо + case DirectionType.Right: + if (_startPosX.Value + _drawningSeaplaneWidth + EntitySeaplane.Step < _pictureWidth) + { + _startPosX += (int)EntitySeaplane.Step; + } + return true; + //вниз + case DirectionType.Down: + + if (_startPosY.Value + _drawningSeaplaneHeight + EntitySeaplane.Step < _pictureHeight) + { + _startPosY += (int)EntitySeaplane.Step; + } + return true; + default: + return false; + } + } + /// + /// Прорисовка объекта + /// + /// + public void DrawTransport(Graphics g) + { + if (EntitySeaplane == null || !_startPosX.HasValue || !_startPosY.HasValue) + { + return; + } + Pen pen = new(Color.Black, 2); + Brush additionalBrush = new SolidBrush(EntitySeaplane.AdditionalColor); + + + + //Отрисовка основных частей самолёта + Brush br = new SolidBrush(EntitySeaplane.BodyColor); + g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value + 20, 20, 20); + g.FillEllipse(br, _startPosX.Value, _startPosY.Value + 20, 20, 20); + Point point1 = new Point(_startPosX.Value + 10, _startPosY.Value); + Point point2 = new Point(_startPosX.Value + 40, _startPosY.Value + 20); + Point point3 = new Point(_startPosX.Value + 100, _startPosY.Value + 20); + Point point4 = new Point(_startPosX.Value + 130, _startPosY.Value + 30); + Point point5 = new Point(_startPosX.Value + 100, _startPosY.Value + 40); + Point point6 = new Point(_startPosX.Value + 10, _startPosY.Value + 40); + Point[] points = { point1, point2, point3, point4, point5, point6 }; + g.FillPolygon(br, points); + g.DrawPolygon(pen, points); + g.DrawLine(pen, _startPosX.Value + 10, _startPosY.Value + 20, _startPosX.Value + 40, _startPosY.Value + 20); + g.DrawLine(pen, _startPosX.Value + 100, _startPosY.Value + 20, _startPosX.Value + 100, _startPosY.Value + 40); + g.DrawLine(pen, _startPosX.Value + 100, _startPosY.Value + 30, _startPosX.Value + 130, _startPosY.Value + 30); + + //Крылья + g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value + 20, 25, 5); + g.FillEllipse(br, _startPosX.Value, _startPosY.Value + 20, 25, 5); + g.DrawEllipse(pen, _startPosX.Value + 30, _startPosY.Value + 25, 40, 10); + g.FillEllipse(br, _startPosX.Value + 30, _startPosY.Value + 25, 40, 10); + + + //Шасси + g.DrawRectangle(pen, _startPosX.Value + 38, _startPosY.Value + 40, 4, 5); + g.DrawRectangle(pen, _startPosX.Value + 88, _startPosY.Value + 40, 4, 5); + g.DrawEllipse(pen, _startPosX.Value + 35, _startPosY.Value + 45, 5, 5); + g.DrawEllipse(pen, _startPosX.Value + 42, _startPosY.Value + 45, 5, 5); + g.DrawEllipse(pen, _startPosX.Value + 87, _startPosY.Value + 45, 5, 5); + + g.FillRectangle(br, _startPosX.Value + 38, _startPosY.Value + 40, 4, 5); + g.FillRectangle(br, _startPosX.Value + 88, _startPosY.Value + 40, 4, 5); + g.FillEllipse(br, _startPosX.Value + 35, _startPosY.Value + 45, 5, 5); + g.FillEllipse(br, _startPosX.Value + 42, _startPosY.Value + 45, 5, 5); + g.FillEllipse(br, _startPosX.Value + 87, _startPosY.Value + 45, 5, 5); + + + //Надувнвя лодка + if (EntitySeaplane.Boat) + { + g.DrawEllipse(pen, _startPosX.Value + 50, _startPosY.Value + 15, 30, 10); + g.FillEllipse(additionalBrush, _startPosX.Value + 50, _startPosY.Value + 15, 30, 10); + + } + + //Поплавки + if (EntitySeaplane.Floats) + { + g.DrawRectangle(pen, _startPosX.Value + 30, _startPosY.Value + 30, 4, 15); + g.FillRectangle(additionalBrush, _startPosX.Value + 30, _startPosY.Value + 30, 4, 15); + g.DrawRectangle(pen, _startPosX.Value + 66, _startPosY.Value + 30, 4, 15); + g.FillRectangle(additionalBrush, _startPosX.Value + 66, _startPosY.Value + 30, 4, 15); + g.DrawEllipse(pen, _startPosX.Value + 20, _startPosY.Value + 40, 70, 10); + g.FillEllipse(additionalBrush, _startPosX.Value + 20, _startPosY.Value + 40, 70, 10); + + } + } +} diff --git a/ProjectSeaplane/ProjectSeaplane/EntitySeaplane.cs b/ProjectSeaplane/ProjectSeaplane/EntitySeaplane.cs index 3503966..625ccfc 100644 --- a/ProjectSeaplane/ProjectSeaplane/EntitySeaplane.cs +++ b/ProjectSeaplane/ProjectSeaplane/EntitySeaplane.cs @@ -1,6 +1,6 @@ namespace ProjectSeaplane; /// -/// Класс-сущность "Спортивный автомобиль" +/// Класс-сущность "Гидросамолёт" /// public class EntitySeaplane { @@ -24,45 +24,39 @@ public class EntitySeaplane /// public Color AdditionalColor { get; private set; } - /// - /// Признак (опция) наличия обвеса - /// - public bool BodyKit { get; private set; } /// - /// Признак (опция) наличия антикрыла + /// Признак (опция) наличия поплавков /// - public bool Wing { get; private set; } + public bool Floats { get; private set; } /// - /// Признак (опция) наличия гоночной полосы + /// Признак (опция) наличия лодки /// - public bool SportLine { get; private set; } + public bool Boat { get; private set; } /// - /// Шаг перемещения автомобиля + /// Шаг перемещения гидросамолёта /// public double Step => Speed * 100 / Weight; /// - /// Инициализация полей объекта-класса спортивного автомобиля + /// Инициализация полей объекта-класса гидросамолёта /// /// Скорость /// Вес автомобиля /// Основной цвет /// Дополнительный цвет - /// Признак наличия обвеса - /// Признак наличия антикрыла - /// Признак наличия гоночной полосы + /// Признак наличия поплавков + /// Признак наличия лодки public void Init(int speed, double weight, Color bodyColor, Color - additionalColor, bool bodyKit, bool wing, bool sportLine) + additionalColor, bool floats, bool boat) { Speed = speed; Weight = weight; BodyColor = bodyColor; AdditionalColor = additionalColor; - BodyKit = bodyKit; - Wing = wing; - SportLine = sportLine; + Floats = floats; + Boat = boat; } } diff --git a/ProjectSeaplane/ProjectSeaplane/FormSeaplane.Designer.cs b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.Designer.cs index 7ef955e..fde1660 100644 --- a/ProjectSeaplane/ProjectSeaplane/FormSeaplane.Designer.cs +++ b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.Designer.cs @@ -29,7 +29,7 @@ private void InitializeComponent() { pictureBoxSeaplane = new PictureBox(); - buttonCreate = new Button(); + buttonCreateSeaplane = new Button(); buttonLeft = new Button(); buttonUp = new Button(); buttonDown = new Button(); @@ -42,75 +42,79 @@ pictureBoxSeaplane.Dock = DockStyle.Fill; pictureBoxSeaplane.Location = new Point(0, 0); pictureBoxSeaplane.Name = "pictureBoxSeaplane"; - pictureBoxSeaplane.Size = new Size(850, 539); + pictureBoxSeaplane.Size = new Size(900, 500); pictureBoxSeaplane.TabIndex = 0; pictureBoxSeaplane.TabStop = false; // - // buttonCreate + // buttonCreateSeaplane // - buttonCreate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; - buttonCreate.Location = new Point(12, 504); - buttonCreate.Name = "buttonCreate"; - buttonCreate.Size = new Size(75, 23); - buttonCreate.TabIndex = 1; - buttonCreate.Text = "Создать"; - buttonCreate.UseVisualStyleBackColor = true; - buttonCreate.Click += buttonCreate_Click; + buttonCreateSeaplane.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateSeaplane.Location = new Point(12, 465); + buttonCreateSeaplane.Name = "buttonCreateSeaplane"; + buttonCreateSeaplane.Size = new Size(75, 23); + buttonCreateSeaplane.TabIndex = 1; + buttonCreateSeaplane.Text = "Создать"; + buttonCreateSeaplane.UseVisualStyleBackColor = true; + buttonCreateSeaplane.Click += ButtonCreateSeaplane_Click; // // buttonLeft // buttonLeft.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonLeft.BackgroundImage = Properties.Resources.arrow_left; buttonLeft.BackgroundImageLayout = ImageLayout.Stretch; - buttonLeft.Location = new Point(718, 490); + buttonLeft.Location = new Point(768, 451); buttonLeft.Name = "buttonLeft"; buttonLeft.Size = new Size(35, 35); buttonLeft.TabIndex = 2; buttonLeft.UseVisualStyleBackColor = true; + buttonLeft.Click += ButtonMove_Click; // // buttonUp // buttonUp.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonUp.BackgroundImage = Properties.Resources.arrow_up; buttonUp.BackgroundImageLayout = ImageLayout.Stretch; - buttonUp.Location = new Point(758, 450); + buttonUp.Location = new Point(808, 411); buttonUp.Name = "buttonUp"; buttonUp.Size = new Size(35, 35); buttonUp.TabIndex = 3; buttonUp.UseVisualStyleBackColor = true; + buttonUp.Click += ButtonMove_Click; // // buttonDown // buttonDown.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonDown.BackgroundImage = Properties.Resources.arrow_down; buttonDown.BackgroundImageLayout = ImageLayout.Stretch; - buttonDown.Location = new Point(758, 490); + buttonDown.Location = new Point(808, 451); buttonDown.Name = "buttonDown"; buttonDown.Size = new Size(35, 35); buttonDown.TabIndex = 4; buttonDown.UseVisualStyleBackColor = true; + buttonDown.Click += ButtonMove_Click; // // buttonRight // buttonRight.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonRight.BackgroundImage = Properties.Resources.arrow_right; buttonRight.BackgroundImageLayout = ImageLayout.Stretch; - buttonRight.Location = new Point(799, 490); + buttonRight.Location = new Point(849, 451); buttonRight.Name = "buttonRight"; buttonRight.Size = new Size(35, 35); buttonRight.TabIndex = 5; buttonRight.UseVisualStyleBackColor = true; + buttonRight.Click += ButtonMove_Click; // // FormSeaplane // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(850, 539); + ClientSize = new Size(900, 500); Controls.Add(buttonRight); Controls.Add(buttonDown); Controls.Add(buttonUp); Controls.Add(buttonLeft); - Controls.Add(buttonCreate); + Controls.Add(buttonCreateSeaplane); Controls.Add(pictureBoxSeaplane); Name = "FormSeaplane"; Text = "Гидросамолёт"; @@ -121,7 +125,7 @@ #endregion private PictureBox pictureBoxSeaplane; - private Button buttonCreate; + private Button buttonCreateSeaplane; private Button buttonLeft; private Button buttonUp; private Button buttonDown; diff --git a/ProjectSeaplane/ProjectSeaplane/FormSeaplane.cs b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.cs index 86c3f21..8781929 100644 --- a/ProjectSeaplane/ProjectSeaplane/FormSeaplane.cs +++ b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.cs @@ -1,40 +1,87 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; - -namespace ProjectSeaplane +namespace ProjectSeaplane; +/// +/// Форма работы с объектом "Спортивный автомобиль" +/// +public partial class FormSeaplane : Form { - public partial class FormSeaplane : Form + /// + /// Поле-объект для прорисовки объекта + /// + private DrawningSeaplane? _drawningSeaplane; + /// + /// Конструктор формы + /// + public FormSeaplane() { - private DrawningSeaplane? _drawningSeaplane; - - public FormSeaplane() + InitializeComponent(); + } + /// + /// Метод прорисовки машины + /// + private void Draw() + { + if (_drawningSeaplane == null) { - InitializeComponent(); + return; } - - private void ButtonCreate_Click(object sender, EventArgs e) + Bitmap bmp = new(pictureBoxSeaplane.Width, pictureBoxSeaplane.Height); + Graphics gr = Graphics.FromImage(bmp); + _drawningSeaplane.DrawTransport(gr); + pictureBoxSeaplane.Image = bmp; + } + /// + /// Обработка нажатия кнопки "Создать" + /// + /// + /// + private void ButtonCreateSeaplane_Click(object sender, EventArgs e) + { + Random random = new(); + _drawningSeaplane = new DrawningSeaplane(); + + _drawningSeaplane.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))); + _drawningSeaplane.SetPictureSize(pictureBoxSeaplane.Width, pictureBoxSeaplane.Height); + _drawningSeaplane.SetPosition(random.Next(10, 100), random.Next(10, 100)); + Draw(); + } + /// + /// Перемещение объекта по форме (нажатие кнопок навигации) + /// + /// + /// + private void ButtonMove_Click(object sender, EventArgs e) + { + if (_drawningSeaplane == null) { - Random random = new(); - _drawningSeaplane = new DrawningSeaplane(); - _drawningSeaplane.Init(random.Next(100, 300), random.Next(1000, 3000), - Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), - Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), - Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2))); - _drawningSeaplane.SetPictureSize(pictureBoxSeaplane.Width, pictureBoxSeaplane.Height); - _drawningSeaplane.SetPosition(random.Next(10, 100), random.Next(10, 100)); - - Bitmap bmp = new(pictureBoxSeaplane.Width, pictureBoxSeaplane.Height); - Graphics gr = Graphics.FromImage(bmp); - _drawningSeaplane.DrawTransport(gr); - pictureBoxSeaplane.Image = bmp; - + return; + } + string name = ((Button)sender)?.Name ?? string.Empty; + bool result = false; + switch (name) + { + case "buttonUp": + result = + _drawningSeaplane.MoveTransport(DirectionType.Up); + break; + case "buttonDown": + result = + _drawningSeaplane.MoveTransport(DirectionType.Down); + break; + case "buttonLeft": + result = + _drawningSeaplane.MoveTransport(DirectionType.Left); + break; + case "buttonRight": + result = + _drawningSeaplane.MoveTransport(DirectionType.Right); + break; + } + if (result) + { + Draw(); } } } From 8b930c99d4b477ba145f8f6bccd70ead95e0a14a Mon Sep 17 00:00:00 2001 From: devil_1nc Date: Tue, 27 Feb 2024 13:55:02 +0400 Subject: [PATCH 3/9] =?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=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BE?= =?UTF-8?q?=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectSeaplane/DrawningSeaplane.cs | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/ProjectSeaplane/ProjectSeaplane/DrawningSeaplane.cs b/ProjectSeaplane/ProjectSeaplane/DrawningSeaplane.cs index 72eba68..fddee39 100644 --- a/ProjectSeaplane/ProjectSeaplane/DrawningSeaplane.cs +++ b/ProjectSeaplane/ProjectSeaplane/DrawningSeaplane.cs @@ -66,10 +66,19 @@ public class DrawningSeaplane /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах public bool SetPictureSize(int width, int height) { - // TODO проверка, что объект "влезает" в размеры поля - // если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена + + + if (height < _drawningSeaplaneHeight || width < _drawningSeaplaneWidth) + { + return false; + } + + _pictureWidth = width; _pictureHeight = height; + + if (_startPosX.HasValue && _drawningSeaplaneWidth + _startPosX > width) _startPosX = _pictureWidth - _drawningSeaplaneWidth; + if (_startPosY.HasValue && _drawningSeaplaneHeight + _startPosY > height) _startPosY = _pictureHeight - _drawningSeaplaneHeight; return true; } @@ -84,8 +93,22 @@ public class DrawningSeaplane { return; } - // TODO если при установке объекта в эти координаты, он будет "выходить" за границы формы - // то надо изменить координаты, чтобы он оставался в этих границах + if (x < 0) + { + x = 0; + } + if (x + _drawningSeaplaneWidth > _pictureWidth.Value) + { + x = _pictureWidth.Value - _drawningSeaplaneWidth; + } + if (y < 0) + { + y = 0; + } + if (y + _drawningSeaplaneHeight > _pictureHeight.Value) + { + y = _pictureHeight.Value - _drawningSeaplaneHeight; + } _startPosX = x; _startPosY = y; From fdeb174e9033eee03b91858dd35234d2d0b63883 Mon Sep 17 00:00:00 2001 From: ShuryginDima Date: Sun, 10 Mar 2024 16:04:36 +0300 Subject: [PATCH 4/9] =?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 --- .../{ => Drawnings}/DirectionType.cs | 2 +- .../DrawningPlane.cs} | 113 +++++++++--------- .../Drawnings/DrawningSeaplane.cs | 55 +++++++++ .../ProjectSeaplane/Entities/EntityPlane.cs | 49 ++++++++ .../{ => Entities}/EntitySeaplane.cs | 30 +---- .../ProjectSeaplane/FormSeaplane.Designer.cs | 18 ++- .../ProjectSeaplane/FormSeaplane.cs | 77 +++++++----- 7 files changed, 228 insertions(+), 116 deletions(-) rename ProjectSeaplane/ProjectSeaplane/{ => Drawnings}/DirectionType.cs (90%) rename ProjectSeaplane/ProjectSeaplane/{DrawningSeaplane.cs => Drawnings/DrawningPlane.cs} (70%) create mode 100644 ProjectSeaplane/ProjectSeaplane/Drawnings/DrawningSeaplane.cs create mode 100644 ProjectSeaplane/ProjectSeaplane/Entities/EntityPlane.cs rename ProjectSeaplane/ProjectSeaplane/{ => Entities}/EntitySeaplane.cs (66%) diff --git a/ProjectSeaplane/ProjectSeaplane/DirectionType.cs b/ProjectSeaplane/ProjectSeaplane/Drawnings/DirectionType.cs similarity index 90% rename from ProjectSeaplane/ProjectSeaplane/DirectionType.cs rename to ProjectSeaplane/ProjectSeaplane/Drawnings/DirectionType.cs index ef50542..274b265 100644 --- a/ProjectSeaplane/ProjectSeaplane/DirectionType.cs +++ b/ProjectSeaplane/ProjectSeaplane/Drawnings/DirectionType.cs @@ -1,4 +1,4 @@ -namespace ProjectSeaplane; +namespace ProjectSeaplane.Drawnings; /// /// Направление перемещения /// diff --git a/ProjectSeaplane/ProjectSeaplane/DrawningSeaplane.cs b/ProjectSeaplane/ProjectSeaplane/Drawnings/DrawningPlane.cs similarity index 70% rename from ProjectSeaplane/ProjectSeaplane/DrawningSeaplane.cs rename to ProjectSeaplane/ProjectSeaplane/Drawnings/DrawningPlane.cs index fddee39..850f600 100644 --- a/ProjectSeaplane/ProjectSeaplane/DrawningSeaplane.cs +++ b/ProjectSeaplane/ProjectSeaplane/Drawnings/DrawningPlane.cs @@ -1,13 +1,18 @@ -namespace ProjectSeaplane; -/// -/// Класс, отвечающий за прорисовку и перемещение объекта-сущности -/// -public class DrawningSeaplane +using ProjectSeaplane.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectSeaplane.Drawnings; + +public class DrawningPlane { /// /// Класс-сущность /// - public EntitySeaplane? EntitySeaplane { get; private set; } + public EntityPlane? EntityPlane { get; protected set; } /// /// Ширина окна @@ -22,42 +27,56 @@ public class DrawningSeaplane /// /// Левая координата прорисовки гидросамолёта /// - private int? _startPosX; + protected int? _startPosX; /// /// Верхняя кооридната прорисовки гидросамолёта /// - private int? _startPosY; + protected int? _startPosY; /// /// Ширина прорисовки гидросамолёта /// - private readonly int _drawningSeaplaneWidth = 130; + private readonly int _drawningPlaneWidth = 130; /// /// Высота прорисовки гидросамолёта /// - private readonly int _drawningSeaplaneHeight = 50; + private readonly int _drawningPlaneHeight = 45; /// - /// Инициализация свойств + /// Пустой конструктор /// - /// Скорость - /// Вес - /// Основной цвет - /// Дополнительный цвет - /// Признак наличия поплавков - /// Признак наличия лодки - public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool floats, bool boat) + private DrawningPlane() { - EntitySeaplane = new EntitySeaplane(); - EntitySeaplane.Init(speed, weight, bodyColor, additionalColor, floats, boat); _pictureWidth = null; _pictureHeight = null; _startPosX = null; _startPosY = null; } + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + public DrawningPlane(int speed, double weight, Color bodyColor) : this() + { + EntityPlane = new EntityPlane(speed, weight, bodyColor); + } + + /// + /// Конструктор для наследников + /// + /// Ширина прорисовки гидросамолёта + /// Высота прорисовки гидросамолёта + protected DrawningPlane(int _drawningPlaneWidth, int _drawningPlaneHeight) : this() + { + _drawningPlaneWidth = drawningPlaneWidth; + _pictureHeight = drawningPlaneHeight; + } + /// /// Установка границ поля /// @@ -66,7 +85,7 @@ public class DrawningSeaplane /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах public bool SetPictureSize(int width, int height) { - + if (height < _drawningSeaplaneHeight || width < _drawningSeaplaneWidth) { @@ -121,7 +140,7 @@ public class DrawningSeaplane /// true - перемещене выполнено, false - перемещение невозможно public bool MoveTransport(DirectionType direction) { - if (EntitySeaplane == null || !_startPosX.HasValue || !_startPosY.HasValue) + if (EntityPlane == null || !_startPosX.HasValue || !_startPosY.HasValue) { return false; } @@ -130,31 +149,31 @@ public class DrawningSeaplane { //влево case DirectionType.Left: - if (_startPosX.Value - EntitySeaplane.Step > 0) + if (_startPosX.Value - EntityPlane.Step > 0) { - _startPosX -= (int)EntitySeaplane.Step; + _startPosX -= (int)EntityPlane.Step; } return true; //вверх case DirectionType.Up: - if (_startPosY.Value - EntitySeaplane.Step > 0) + if (_startPosY.Value - EntityPlane.Step > 0) { - _startPosY -= (int)EntitySeaplane.Step; + _startPosY -= (int)EntityPlane.Step; } return true; // вправо case DirectionType.Right: - if (_startPosX.Value + _drawningSeaplaneWidth + EntitySeaplane.Step < _pictureWidth) + if (_startPosX.Value + _drawningSeaplaneWidth + EntityPlane.Step < _pictureWidth) { - _startPosX += (int)EntitySeaplane.Step; + _startPosX += (int)EntityPlane.Step; } return true; //вниз case DirectionType.Down: - if (_startPosY.Value + _drawningSeaplaneHeight + EntitySeaplane.Step < _pictureHeight) + if (_startPosY.Value + _drawningSeaplaneHeight + EntityPlane.Step < _pictureHeight) { - _startPosY += (int)EntitySeaplane.Step; + _startPosY += (int)EntityPlane.Step; } return true; default: @@ -165,19 +184,16 @@ public class DrawningSeaplane /// Прорисовка объекта /// /// - public void DrawTransport(Graphics g) + public virtual void DrawTransport(Graphics g) { - if (EntitySeaplane == null || !_startPosX.HasValue || !_startPosY.HasValue) + if (EntityPlane == null || !_startPosX.HasValue || !_startPosY.HasValue) { return; } Pen pen = new(Color.Black, 2); - Brush additionalBrush = new SolidBrush(EntitySeaplane.AdditionalColor); - - //Отрисовка основных частей самолёта - Brush br = new SolidBrush(EntitySeaplane.BodyColor); + Brush br = new SolidBrush(EntityPlane.BodyColor); g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value + 20, 20, 20); g.FillEllipse(br, _startPosX.Value, _startPosY.Value + 20, 20, 20); Point point1 = new Point(_startPosX.Value + 10, _startPosY.Value); @@ -192,7 +208,7 @@ public class DrawningSeaplane g.DrawLine(pen, _startPosX.Value + 10, _startPosY.Value + 20, _startPosX.Value + 40, _startPosY.Value + 20); g.DrawLine(pen, _startPosX.Value + 100, _startPosY.Value + 20, _startPosX.Value + 100, _startPosY.Value + 40); g.DrawLine(pen, _startPosX.Value + 100, _startPosY.Value + 30, _startPosX.Value + 130, _startPosY.Value + 30); - + //Крылья g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value + 20, 25, 5); g.FillEllipse(br, _startPosX.Value, _startPosY.Value + 20, 25, 5); @@ -212,26 +228,5 @@ public class DrawningSeaplane g.FillEllipse(br, _startPosX.Value + 35, _startPosY.Value + 45, 5, 5); g.FillEllipse(br, _startPosX.Value + 42, _startPosY.Value + 45, 5, 5); g.FillEllipse(br, _startPosX.Value + 87, _startPosY.Value + 45, 5, 5); - - - //Надувнвя лодка - if (EntitySeaplane.Boat) - { - g.DrawEllipse(pen, _startPosX.Value + 50, _startPosY.Value + 15, 30, 10); - g.FillEllipse(additionalBrush, _startPosX.Value + 50, _startPosY.Value + 15, 30, 10); - - } - - //Поплавки - if (EntitySeaplane.Floats) - { - g.DrawRectangle(pen, _startPosX.Value + 30, _startPosY.Value + 30, 4, 15); - g.FillRectangle(additionalBrush, _startPosX.Value + 30, _startPosY.Value + 30, 4, 15); - g.DrawRectangle(pen, _startPosX.Value + 66, _startPosY.Value + 30, 4, 15); - g.FillRectangle(additionalBrush, _startPosX.Value + 66, _startPosY.Value + 30, 4, 15); - g.DrawEllipse(pen, _startPosX.Value + 20, _startPosY.Value + 40, 70, 10); - g.FillEllipse(additionalBrush, _startPosX.Value + 20, _startPosY.Value + 40, 70, 10); - - } } -} +} \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/Drawnings/DrawningSeaplane.cs b/ProjectSeaplane/ProjectSeaplane/Drawnings/DrawningSeaplane.cs new file mode 100644 index 0000000..7a32c92 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/Drawnings/DrawningSeaplane.cs @@ -0,0 +1,55 @@ +using ProjectSeaplane.Entities; +using System.Drawing; + +namespace ProjectSeaplane.Drawnings; +/// +/// Класс, отвечающий за прорисовку и перемещение объекта-сущности +/// +public class DrawningSeaplane : DrawningPlane +{ + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия поплавков + /// Признак наличия лодки + public DrawningSeaplane(int speed, double weight, Color bodyColor, Color additionalColor, bool floats, bool boat) : base(130, 50) + { + EntityPlane = new EntitySeaplane(speed, weight, bodyColor, additionalColor, floats, boat); + } + + public override void DrawTransport(Graphics g) + { + if (EntityPlane == null || EntityPlane is not EntitySeaplane seaplane || !_startPosX.HasValue || !_startPosY.HasValue) + { + return; + } + + Pen pen = new(Color.Black, 2); + Brush additionalBrush = new SolidBrush(seaplane.AdditionalColor); + + base.DrawTransport(g); + + //Надувнвя лодка + if (seaplane.Boat) + { + g.DrawEllipse(pen, _startPosX.Value + 50, _startPosY.Value + 15, 30, 10); + g.FillEllipse(additionalBrush, _startPosX.Value + 50, _startPosY.Value + 15, 30, 10); + + } + + //Поплавки + if (seaplane.Floats) + { + g.DrawRectangle(pen, _startPosX.Value + 30, _startPosY.Value + 30, 4, 15); + g.FillRectangle(additionalBrush, _startPosX.Value + 30, _startPosY.Value + 30, 4, 15); + g.DrawRectangle(pen, _startPosX.Value + 66, _startPosY.Value + 30, 4, 15); + g.FillRectangle(additionalBrush, _startPosX.Value + 66, _startPosY.Value + 30, 4, 15); + g.DrawEllipse(pen, _startPosX.Value + 20, _startPosY.Value + 40, 70, 10); + g.FillEllipse(additionalBrush, _startPosX.Value + 20, _startPosY.Value + 40, 70, 10); + } + } +} diff --git a/ProjectSeaplane/ProjectSeaplane/Entities/EntityPlane.cs b/ProjectSeaplane/ProjectSeaplane/Entities/EntityPlane.cs new file mode 100644 index 0000000..3e3dac9 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/Entities/EntityPlane.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.NetworkInformation; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectSeaplane.Entities; + +/// +/// Класс-сущность "Самолёт" +/// + +public class EntityPlane +{ + /// + /// Скорость + /// + 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 EntityPlane(int speed, double weight, Color bodyColor) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + } +} diff --git a/ProjectSeaplane/ProjectSeaplane/EntitySeaplane.cs b/ProjectSeaplane/ProjectSeaplane/Entities/EntitySeaplane.cs similarity index 66% rename from ProjectSeaplane/ProjectSeaplane/EntitySeaplane.cs rename to ProjectSeaplane/ProjectSeaplane/Entities/EntitySeaplane.cs index 625ccfc..113ec5b 100644 --- a/ProjectSeaplane/ProjectSeaplane/EntitySeaplane.cs +++ b/ProjectSeaplane/ProjectSeaplane/Entities/EntitySeaplane.cs @@ -1,24 +1,9 @@ -namespace ProjectSeaplane; +namespace ProjectSeaplane.Entities; /// /// Класс-сущность "Гидросамолёт" /// -public class EntitySeaplane +public class EntitySeaplane : EntityPlane { - /// - /// Скорость - /// - public int Speed { get; private set; } - - /// - /// Вес - /// - public double Weight { get; private set; } - - /// - /// Основной цвет - /// - public Color BodyColor { get; private set; } - /// /// Дополнительный цвет (для опциональных элементов) /// @@ -35,11 +20,6 @@ public class EntitySeaplane /// public bool Boat { get; private set; } - /// - /// Шаг перемещения гидросамолёта - /// - public double Step => Speed * 100 / Weight; - /// /// Инициализация полей объекта-класса гидросамолёта /// @@ -49,12 +29,8 @@ public class EntitySeaplane /// Дополнительный цвет /// Признак наличия поплавков /// Признак наличия лодки - public void Init(int speed, double weight, Color bodyColor, Color - additionalColor, bool floats, bool boat) + public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool floats, bool boat) { - Speed = speed; - Weight = weight; - BodyColor = bodyColor; AdditionalColor = additionalColor; Floats = floats; Boat = boat; diff --git a/ProjectSeaplane/ProjectSeaplane/FormSeaplane.Designer.cs b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.Designer.cs index fde1660..59c5859 100644 --- a/ProjectSeaplane/ProjectSeaplane/FormSeaplane.Designer.cs +++ b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.Designer.cs @@ -34,6 +34,7 @@ buttonUp = new Button(); buttonDown = new Button(); buttonRight = new Button(); + buttonCreatePlane = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxSeaplane).BeginInit(); SuspendLayout(); // @@ -51,9 +52,9 @@ buttonCreateSeaplane.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; buttonCreateSeaplane.Location = new Point(12, 465); buttonCreateSeaplane.Name = "buttonCreateSeaplane"; - buttonCreateSeaplane.Size = new Size(75, 23); + buttonCreateSeaplane.Size = new Size(196, 23); buttonCreateSeaplane.TabIndex = 1; - buttonCreateSeaplane.Text = "Создать"; + buttonCreateSeaplane.Text = "Создать гидросамолёт"; buttonCreateSeaplane.UseVisualStyleBackColor = true; buttonCreateSeaplane.Click += ButtonCreateSeaplane_Click; // @@ -105,11 +106,23 @@ buttonRight.UseVisualStyleBackColor = true; buttonRight.Click += ButtonMove_Click; // + // buttonCreatePlane + // + buttonCreatePlane.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreatePlane.Location = new Point(214, 465); + buttonCreatePlane.Name = "buttonCreatePlane"; + buttonCreatePlane.Size = new Size(196, 23); + buttonCreatePlane.TabIndex = 6; + buttonCreatePlane.Text = "Создать самолёт"; + buttonCreatePlane.UseVisualStyleBackColor = true; + buttonCreatePlane.Click += buttonCreatePlane_Click; + // // FormSeaplane // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(900, 500); + Controls.Add(buttonCreatePlane); Controls.Add(buttonRight); Controls.Add(buttonDown); Controls.Add(buttonUp); @@ -130,5 +143,6 @@ private Button buttonUp; private Button buttonDown; private Button buttonRight; + private Button buttonCreatePlane; } } \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/FormSeaplane.cs b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.cs index 8781929..cd79f6d 100644 --- a/ProjectSeaplane/ProjectSeaplane/FormSeaplane.cs +++ b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.cs @@ -1,4 +1,6 @@ -namespace ProjectSeaplane; +using ProjectSeaplane.Drawnings; + +namespace ProjectSeaplane; /// /// Форма работы с объектом "Спортивный автомобиль" /// @@ -7,7 +9,7 @@ public partial class FormSeaplane : Form /// /// Поле-объект для прорисовки объекта /// - private DrawningSeaplane? _drawningSeaplane; + private DrawningPlane? _drawningPlane; /// /// Конструктор формы /// @@ -20,33 +22,58 @@ public partial class FormSeaplane : Form /// private void Draw() { - if (_drawningSeaplane == null) + if (_drawningPlane == null) { return; } Bitmap bmp = new(pictureBoxSeaplane.Width, pictureBoxSeaplane.Height); Graphics gr = Graphics.FromImage(bmp); - _drawningSeaplane.DrawTransport(gr); + _drawningPlane.DrawTransport(gr); pictureBoxSeaplane.Image = bmp; } + /// - /// Обработка нажатия кнопки "Создать" + /// Создание объекта класса-перемещения + /// + /// Тип создаваемого объекта + private void CreateObject(string type) + { + Random random = new(); + switch (type) + { + case nameof(DrawningPlane): + _drawningPlane = new DrawningPlane(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(DrawningSeaplane): + _drawningPlane = new DrawningSeaplane(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; + } + _drawningPlane.SetPictureSize(pictureBoxSeaplane.Width, pictureBoxSeaplane.Height); + _drawningPlane.SetPosition(random.Next(10, 100), random.Next(10, 100)); + Draw(); + } + + + /// + /// Обработка нажатия кнопки "Создать гидросамолёт" /// /// /// - private void ButtonCreateSeaplane_Click(object sender, EventArgs e) - { - Random random = new(); - _drawningSeaplane = new DrawningSeaplane(); - - _drawningSeaplane.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))); - _drawningSeaplane.SetPictureSize(pictureBoxSeaplane.Width, pictureBoxSeaplane.Height); - _drawningSeaplane.SetPosition(random.Next(10, 100), random.Next(10, 100)); - Draw(); - } + private void ButtonCreateSeaplane_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningSeaplane)); + + /// + /// Обработка нажатия кнопки "Создать самолёт" + /// + /// + /// + private void buttonCreatePlane_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningPlane)); + /// /// Перемещение объекта по форме (нажатие кнопок навигации) /// @@ -54,7 +81,7 @@ public partial class FormSeaplane : Form /// private void ButtonMove_Click(object sender, EventArgs e) { - if (_drawningSeaplane == null) + if (_drawningPlane == null) { return; } @@ -63,20 +90,16 @@ public partial class FormSeaplane : Form switch (name) { case "buttonUp": - result = - _drawningSeaplane.MoveTransport(DirectionType.Up); + result = _drawningPlane.MoveTransport(DirectionType.Up); break; case "buttonDown": - result = - _drawningSeaplane.MoveTransport(DirectionType.Down); + result = _drawningPlane.MoveTransport(DirectionType.Down); break; case "buttonLeft": - result = - _drawningSeaplane.MoveTransport(DirectionType.Left); + result = _drawningPlane.MoveTransport(DirectionType.Left); break; case "buttonRight": - result = - _drawningSeaplane.MoveTransport(DirectionType.Right); + result = _drawningPlane.MoveTransport(DirectionType.Right); break; } if (result) From c2ae9d68b408f1df11282b718a2a469ec27b9890 Mon Sep 17 00:00:00 2001 From: ShuryginDima Date: Mon, 11 Mar 2024 21:10:39 +0300 Subject: [PATCH 5/9] =?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 --- .../Drawnings/DirectionType.cs | 5 + .../Drawnings/DrawningPlane.cs | 58 +++++--- .../Drawnings/DrawningSeaplane.cs | 1 - .../ProjectSeaplane/Entities/EntityPlane.cs | 11 +- .../Entities/EntitySeaplane.cs | 4 + .../ProjectSeaplane/FormSeaplane.Designer.cs | 28 +++- .../ProjectSeaplane/FormSeaplane.cs | 55 ++++++- .../MovementStrategy/AbstractStrategy.cs | 138 ++++++++++++++++++ .../MovementStrategy/IMoveableObject.cs | 24 +++ .../MovementStrategy/MoveToBorder.cs | 51 +++++++ .../MovementStrategy/MoveToCenter.cs | 50 +++++++ .../MovementStrategy/MoveablePlane.cs | 61 ++++++++ .../MovementStrategy/MovementDirection.cs | 32 ++++ .../MovementStrategy/ObjectParameters.cs | 72 +++++++++ .../MovementStrategy/StrategyStatus.cs | 22 +++ 15 files changed, 577 insertions(+), 35 deletions(-) create mode 100644 ProjectSeaplane/ProjectSeaplane/MovementStrategy/AbstractStrategy.cs create mode 100644 ProjectSeaplane/ProjectSeaplane/MovementStrategy/IMoveableObject.cs create mode 100644 ProjectSeaplane/ProjectSeaplane/MovementStrategy/MoveToBorder.cs create mode 100644 ProjectSeaplane/ProjectSeaplane/MovementStrategy/MoveToCenter.cs create mode 100644 ProjectSeaplane/ProjectSeaplane/MovementStrategy/MoveablePlane.cs create mode 100644 ProjectSeaplane/ProjectSeaplane/MovementStrategy/MovementDirection.cs create mode 100644 ProjectSeaplane/ProjectSeaplane/MovementStrategy/ObjectParameters.cs create mode 100644 ProjectSeaplane/ProjectSeaplane/MovementStrategy/StrategyStatus.cs diff --git a/ProjectSeaplane/ProjectSeaplane/Drawnings/DirectionType.cs b/ProjectSeaplane/ProjectSeaplane/Drawnings/DirectionType.cs index 274b265..81916f2 100644 --- a/ProjectSeaplane/ProjectSeaplane/Drawnings/DirectionType.cs +++ b/ProjectSeaplane/ProjectSeaplane/Drawnings/DirectionType.cs @@ -4,6 +4,11 @@ /// public enum DirectionType { + /// + /// Неизвестное направление + /// + Unknow = -1, + /// /// Вверх /// diff --git a/ProjectSeaplane/ProjectSeaplane/Drawnings/DrawningPlane.cs b/ProjectSeaplane/ProjectSeaplane/Drawnings/DrawningPlane.cs index 850f600..adb5ead 100644 --- a/ProjectSeaplane/ProjectSeaplane/Drawnings/DrawningPlane.cs +++ b/ProjectSeaplane/ProjectSeaplane/Drawnings/DrawningPlane.cs @@ -1,12 +1,10 @@ using ProjectSeaplane.Entities; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace ProjectSeaplane.Drawnings; +/// +/// Класс, отвечающий за прорисовку и перемещение базового объекта-сущности +/// public class DrawningPlane { /// @@ -25,25 +23,42 @@ public class DrawningPlane private int? _pictureHeight; /// - /// Левая координата прорисовки гидросамолёта + /// Левая координата прорисовки самолёта /// protected int? _startPosX; /// - /// Верхняя кооридната прорисовки гидросамолёта + /// Верхняя кооридната прорисовки самолёта /// protected int? _startPosY; /// - /// Ширина прорисовки гидросамолёта + /// Ширина прорисовки самолёта /// private readonly int _drawningPlaneWidth = 130; /// - /// Высота прорисовки гидросамолёта + /// Высота прорисовки самолёта /// private readonly int _drawningPlaneHeight = 45; + /// + /// Координата X объекта + /// + public int? GetPosX => _startPosX; + /// + /// Координата Y объекта + /// + public int? GetPosY => _startPosY; + /// + /// Ширина объекта + /// + public int GetWidth => _drawningPlaneWidth; + /// + /// Высота объекта + /// + public int GetHeight => _drawningPlaneHeight; + /// /// Пустой конструктор /// @@ -71,10 +86,10 @@ public class DrawningPlane /// /// Ширина прорисовки гидросамолёта /// Высота прорисовки гидросамолёта - protected DrawningPlane(int _drawningPlaneWidth, int _drawningPlaneHeight) : this() + protected DrawningPlane(int drawningPlaneWidth, int drawningPlaneHeight) : this() { _drawningPlaneWidth = drawningPlaneWidth; - _pictureHeight = drawningPlaneHeight; + _drawningPlaneHeight = drawningPlaneHeight; } /// @@ -86,18 +101,16 @@ public class DrawningPlane public bool SetPictureSize(int width, int height) { - - if (height < _drawningSeaplaneHeight || width < _drawningSeaplaneWidth) + if (height < _drawningPlaneHeight || width < _drawningPlaneWidth) { return false; } - _pictureWidth = width; _pictureHeight = height; - if (_startPosX.HasValue && _drawningSeaplaneWidth + _startPosX > width) _startPosX = _pictureWidth - _drawningSeaplaneWidth; - if (_startPosY.HasValue && _drawningSeaplaneHeight + _startPosY > height) _startPosY = _pictureHeight - _drawningSeaplaneHeight; + if (_startPosX.HasValue && _drawningPlaneWidth + _startPosX > width) _startPosX = _pictureWidth - _drawningPlaneWidth; + if (_startPosY.HasValue && _drawningPlaneHeight + _startPosY > height) _startPosY = _pictureHeight - _drawningPlaneHeight; return true; } @@ -116,17 +129,17 @@ public class DrawningPlane { x = 0; } - if (x + _drawningSeaplaneWidth > _pictureWidth.Value) + if (x + _drawningPlaneWidth > _pictureWidth.Value) { - x = _pictureWidth.Value - _drawningSeaplaneWidth; + x = _pictureWidth.Value - _drawningPlaneWidth; } if (y < 0) { y = 0; } - if (y + _drawningSeaplaneHeight > _pictureHeight.Value) + if (y + _drawningPlaneHeight > _pictureHeight.Value) { - y = _pictureHeight.Value - _drawningSeaplaneHeight; + y = _pictureHeight.Value - _drawningPlaneHeight; } _startPosX = x; @@ -163,7 +176,7 @@ public class DrawningPlane return true; // вправо case DirectionType.Right: - if (_startPosX.Value + _drawningSeaplaneWidth + EntityPlane.Step < _pictureWidth) + if (_startPosX.Value + _drawningPlaneWidth + EntityPlane.Step < _pictureWidth) { _startPosX += (int)EntityPlane.Step; } @@ -171,7 +184,7 @@ public class DrawningPlane //вниз case DirectionType.Down: - if (_startPosY.Value + _drawningSeaplaneHeight + EntityPlane.Step < _pictureHeight) + if (_startPosY.Value + _drawningPlaneHeight + EntityPlane.Step < _pictureHeight) { _startPosY += (int)EntityPlane.Step; } @@ -180,6 +193,7 @@ public class DrawningPlane return false; } } + /// /// Прорисовка объекта /// diff --git a/ProjectSeaplane/ProjectSeaplane/Drawnings/DrawningSeaplane.cs b/ProjectSeaplane/ProjectSeaplane/Drawnings/DrawningSeaplane.cs index 7a32c92..68f7500 100644 --- a/ProjectSeaplane/ProjectSeaplane/Drawnings/DrawningSeaplane.cs +++ b/ProjectSeaplane/ProjectSeaplane/Drawnings/DrawningSeaplane.cs @@ -1,5 +1,4 @@ using ProjectSeaplane.Entities; -using System.Drawing; namespace ProjectSeaplane.Drawnings; /// diff --git a/ProjectSeaplane/ProjectSeaplane/Entities/EntityPlane.cs b/ProjectSeaplane/ProjectSeaplane/Entities/EntityPlane.cs index 3e3dac9..f8fc121 100644 --- a/ProjectSeaplane/ProjectSeaplane/Entities/EntityPlane.cs +++ b/ProjectSeaplane/ProjectSeaplane/Entities/EntityPlane.cs @@ -1,17 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.NetworkInformation; -using System.Runtime.InteropServices; -using System.Text; -using System.Threading.Tasks; - -namespace ProjectSeaplane.Entities; +namespace ProjectSeaplane.Entities; /// /// Класс-сущность "Самолёт" /// - public class EntityPlane { /// diff --git a/ProjectSeaplane/ProjectSeaplane/Entities/EntitySeaplane.cs b/ProjectSeaplane/ProjectSeaplane/Entities/EntitySeaplane.cs index 113ec5b..de0ade8 100644 --- a/ProjectSeaplane/ProjectSeaplane/Entities/EntitySeaplane.cs +++ b/ProjectSeaplane/ProjectSeaplane/Entities/EntitySeaplane.cs @@ -4,6 +4,10 @@ /// public class EntitySeaplane : EntityPlane { + public EntitySeaplane(int speed, double weight, Color bodyColor, Color additionalColor, bool floats, bool boat) : base(speed, weight, bodyColor) + { + } + /// /// Дополнительный цвет (для опциональных элементов) /// diff --git a/ProjectSeaplane/ProjectSeaplane/FormSeaplane.Designer.cs b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.Designer.cs index 59c5859..e8589d4 100644 --- a/ProjectSeaplane/ProjectSeaplane/FormSeaplane.Designer.cs +++ b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.Designer.cs @@ -35,6 +35,8 @@ buttonDown = new Button(); buttonRight = new Button(); buttonCreatePlane = new Button(); + comboBoxStrategy = new ComboBox(); + buttonStrategyStep = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxSeaplane).BeginInit(); SuspendLayout(); // @@ -115,13 +117,35 @@ buttonCreatePlane.TabIndex = 6; buttonCreatePlane.Text = "Создать самолёт"; buttonCreatePlane.UseVisualStyleBackColor = true; - buttonCreatePlane.Click += buttonCreatePlane_Click; + buttonCreatePlane.Click += ButtonCreatePlane_Click; + // + // comboBoxStrategy + // + comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxStrategy.FormattingEnabled = true; + comboBoxStrategy.Items.AddRange(new object[] { "К центру", "К краю" }); + comboBoxStrategy.Location = new Point(763, 12); + comboBoxStrategy.Name = "comboBoxStrategy"; + comboBoxStrategy.Size = new Size(121, 23); + comboBoxStrategy.TabIndex = 7; + // + // buttonStrategyStep + // + buttonStrategyStep.Location = new Point(808, 41); + buttonStrategyStep.Name = "buttonStrategyStep"; + buttonStrategyStep.Size = new Size(75, 23); + buttonStrategyStep.TabIndex = 8; + buttonStrategyStep.Text = "Шаг"; + buttonStrategyStep.UseVisualStyleBackColor = true; + buttonStrategyStep.Click += ButtonStrategyStep_Click; // // FormSeaplane // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(900, 500); + Controls.Add(buttonStrategyStep); + Controls.Add(comboBoxStrategy); Controls.Add(buttonCreatePlane); Controls.Add(buttonRight); Controls.Add(buttonDown); @@ -144,5 +168,7 @@ private Button buttonDown; private Button buttonRight; private Button buttonCreatePlane; + private ComboBox comboBoxStrategy; + private Button buttonStrategyStep; } } \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/FormSeaplane.cs b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.cs index cd79f6d..566db95 100644 --- a/ProjectSeaplane/ProjectSeaplane/FormSeaplane.cs +++ b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.cs @@ -1,4 +1,5 @@ using ProjectSeaplane.Drawnings; +using ProjectSeaplane.MovementStrategy; namespace ProjectSeaplane; /// @@ -10,13 +11,21 @@ public partial class FormSeaplane : Form /// Поле-объект для прорисовки объекта /// private DrawningPlane? _drawningPlane; + + /// + /// Стратегия перемещения + /// + private AbstractStrategy? _strategy; + /// /// Конструктор формы /// public FormSeaplane() { InitializeComponent(); + _strategy = null; } + /// /// Метод прорисовки машины /// @@ -56,6 +65,9 @@ public partial class FormSeaplane : Form } _drawningPlane.SetPictureSize(pictureBoxSeaplane.Width, pictureBoxSeaplane.Height); _drawningPlane.SetPosition(random.Next(10, 100), random.Next(10, 100)); + _strategy = null; + comboBoxStrategy.Enabled = true; + Draw(); } @@ -72,7 +84,7 @@ public partial class FormSeaplane : Form /// /// /// - private void buttonCreatePlane_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningPlane)); + private void ButtonCreatePlane_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningPlane)); /// /// Перемещение объекта по форме (нажатие кнопок навигации) @@ -107,4 +119,45 @@ public partial class FormSeaplane : Form Draw(); } } + + /// + /// Обработка нажатия кнопки "Шаг" + /// + /// + /// + private void ButtonStrategyStep_Click(object sender, EventArgs e) + { + if (_drawningPlane == null) + { + return; + } + if (comboBoxStrategy.Enabled) + { + _strategy = comboBoxStrategy.SelectedIndex switch + { + 0 => new MoveToCenter(), + 1 => new MoveToBorder(), + _ => null, + }; + if (_strategy == null) + { + return; + } + _strategy.SetData(new MoveablePlane(_drawningPlane), pictureBoxSeaplane.Width, pictureBoxSeaplane.Height); + } + if (_strategy == null) + { + return; + } + + comboBoxStrategy.Enabled = false; + _strategy.MakeStep(); + Draw(); + + if (_strategy.GetStatus() == StrategyStatus.Finish) + { + comboBoxStrategy.Enabled = true; + _strategy = null; + } + } } diff --git a/ProjectSeaplane/ProjectSeaplane/MovementStrategy/AbstractStrategy.cs b/ProjectSeaplane/ProjectSeaplane/MovementStrategy/AbstractStrategy.cs new file mode 100644 index 0000000..2750643 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/MovementStrategy/AbstractStrategy.cs @@ -0,0 +1,138 @@ +namespace ProjectSeaplane.MovementStrategy; + +/// +/// Класс перемещения объекта +/// +public abstract class AbstractStrategy +{ + /// + /// Перемещаемый объект + /// + private IMoveableObject? _moveableObject; + + /// + /// Статус перемещения + /// + private StrategyStatus _state = StrategyStatus.NotInit; + + /// + /// Ширина поля + /// + protected int FieldWidth { get; private set; } + + /// + /// Высота поля + /// + protected int FieldHeight { get; private set; } + + /// + /// Статус перемещения + /// + public StrategyStatus GetStatus() { return _state; } + + /// + /// Установка данных + /// + /// Перемещаемый объект + /// Ширина поля + /// Высота поля + public void SetData(IMoveableObject moveableObject, int width, int height) + { + if (moveableObject == null) + { + _state = StrategyStatus.NotInit; + return; + } + + _state = StrategyStatus.InProgress; + _moveableObject = moveableObject; + FieldWidth = width; + FieldHeight = height; + } + + /// + /// Шаг перемещения + /// + public void MakeStep() + { + if (_state != StrategyStatus.InProgress) + { + return; + } + + if (IsTargetDestinaion()) + { + _state = StrategyStatus.Finish; + return; + } + + MoveToTarget(); + } + + /// + /// Перемещение влево + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveLeft() => MoveTo(MovementDirection.Left); + + /// + /// Перемещение вправо + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveRight() => MoveTo(MovementDirection.Right); + + /// + /// Перемещение вверх + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveUp() => MoveTo(MovementDirection.Up); + + /// + /// Перемещение вниз + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveDown() => MoveTo(MovementDirection.Down); + + /// + /// Параметры объекта + /// + protected ObjectParameters? GetObjectParameters => _moveableObject?.GetObjectPosition; + + /// + /// Шаг объекта + /// + /// + protected int? GetStep() + { + if (_state != StrategyStatus.InProgress) + { + return null; + } + return _moveableObject?.GetStep; + } + + /// + /// Перемещение к цели + /// + protected abstract void MoveToTarget(); + + /// + /// Достигнута ли цель + /// + /// + protected abstract bool IsTargetDestinaion(); + + /// + /// Попытка перемещения в требуемом направлении + /// + /// Направление + /// Результат попытки (true - удалось переместиться, false - неудача) + private bool MoveTo(MovementDirection movementDirection) + { + if (_state != StrategyStatus.InProgress) + { + return false; + } + return _moveableObject?.TryMoveObject(movementDirection) ?? false; + } +} \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/MovementStrategy/IMoveableObject.cs b/ProjectSeaplane/ProjectSeaplane/MovementStrategy/IMoveableObject.cs new file mode 100644 index 0000000..2e61bb1 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/MovementStrategy/IMoveableObject.cs @@ -0,0 +1,24 @@ +namespace ProjectSeaplane.MovementStrategy; + +/// +/// Интерфейс для работы с перемещаемым объектом +/// +public interface IMoveableObject +{ + /// + /// Получение координаты объекта + /// + ObjectParameters? GetObjectPosition { get; } + + /// + /// Шаг объекта + /// + int GetStep { get; } + + /// + /// Попытка переместить объект в указанном направлении + /// + /// Направление + /// true - объект перемещен, false - перемещение невозможно + bool TryMoveObject(MovementDirection direction); +} diff --git a/ProjectSeaplane/ProjectSeaplane/MovementStrategy/MoveToBorder.cs b/ProjectSeaplane/ProjectSeaplane/MovementStrategy/MoveToBorder.cs new file mode 100644 index 0000000..2b3c748 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/MovementStrategy/MoveToBorder.cs @@ -0,0 +1,51 @@ +namespace ProjectSeaplane.MovementStrategy; + +/// +/// Стратегия перемещения объекта в угол экрана +/// + +public class MoveToBorder : 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.RightBorder - FieldWidth; + if (Math.Abs(diffX) > GetStep()) + { + if (diffX > 0) + { + MoveLeft(); + } + else + { + MoveRight(); + } + } + int diffY = objParams.DownBorder - FieldHeight; + if (Math.Abs(diffY) > GetStep()) + { + if (diffY > 0) + { + MoveUp(); + } + else + { + MoveDown(); + } + } + } +} \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/MovementStrategy/MoveToCenter.cs b/ProjectSeaplane/ProjectSeaplane/MovementStrategy/MoveToCenter.cs new file mode 100644 index 0000000..12012c2 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/MovementStrategy/MoveToCenter.cs @@ -0,0 +1,50 @@ +namespace ProjectSeaplane.MovementStrategy; + +/// +/// Стратегия перемещения объекта в центр экрана +/// +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(); + } + } + } +} \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/MovementStrategy/MoveablePlane.cs b/ProjectSeaplane/ProjectSeaplane/MovementStrategy/MoveablePlane.cs new file mode 100644 index 0000000..e9852e1 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/MovementStrategy/MoveablePlane.cs @@ -0,0 +1,61 @@ +using ProjectSeaplane.Drawnings; + +namespace ProjectSeaplane.MovementStrategy; + +/// +/// Класс-реализация IMoveableObject с использованием DrawningPlane +/// +public class MoveablePlane : IMoveableObject +{ + /// + /// Поле-объект класса DrawningPlane или его наследника + /// + private readonly DrawningPlane? _plane = null; + + /// + /// Конструктор + /// + /// Объект класса DrawningPlane + public MoveablePlane(DrawningPlane plane) + { + _plane = plane; + } + public ObjectParameters? GetObjectPosition + { + get + { + if (_plane == null || _plane.EntityPlane == null || !_plane.GetPosX.HasValue || !_plane.GetPosY.HasValue) + { + return null; + } + return new ObjectParameters(_plane.GetPosX.Value, _plane.GetPosY.Value, _plane.GetWidth, _plane.GetHeight); + } + } + public int GetStep => (int)(_plane?.EntityPlane?.Step ?? 0); + public bool TryMoveObject(MovementDirection direction) + { + if (_plane == null || _plane.EntityPlane == null) + { + return false; + } + return _plane.MoveTransport(GetDirectionType(direction)); + } + + /// + /// Конвертация из MovementDirection в DirectionType + /// + /// MovementDirection + /// DirectionType + private static DirectionType GetDirectionType(MovementDirection direction) + { + return direction switch + { + MovementDirection.Left => DirectionType.Left, + MovementDirection.Right => DirectionType.Right, + MovementDirection.Up => DirectionType.Up, + MovementDirection.Down => DirectionType.Down, + _ => DirectionType.Unknow, + }; + } + +} \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/MovementStrategy/MovementDirection.cs b/ProjectSeaplane/ProjectSeaplane/MovementStrategy/MovementDirection.cs new file mode 100644 index 0000000..07ff2e8 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/MovementStrategy/MovementDirection.cs @@ -0,0 +1,32 @@ +namespace ProjectSeaplane.MovementStrategy; + +/// +/// Направление перемещения +/// +public enum MovementDirection +{ + /// + /// Неизвестное направление + /// + Unknow = -1, + + /// + /// Вверх + /// + Up = 1, + + /// + /// Вниз + /// + Down = 2, + + /// + /// Влево + /// + Left = 3, + + /// + /// Вправо + /// + Right = 4 +} diff --git a/ProjectSeaplane/ProjectSeaplane/MovementStrategy/ObjectParameters.cs b/ProjectSeaplane/ProjectSeaplane/MovementStrategy/ObjectParameters.cs new file mode 100644 index 0000000..ba982d9 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/MovementStrategy/ObjectParameters.cs @@ -0,0 +1,72 @@ +namespace ProjectSeaplane.MovementStrategy; + +/// +/// Параметры-координаты объекта +/// +public class ObjectParameters +{ + /// + /// Координата X + /// + private readonly int _x; + + /// + /// Координата Y + /// + private readonly int _y; + + /// + /// Ширина объекта + /// + private readonly int _width; + + /// + /// Высота объекта + /// + private readonly int _height; + + /// + /// Левая граница + /// + public int LeftBorder => _x; + + /// + /// Верхняя граница + /// + public int TopBorder => _y; + + /// + /// Правая граница + /// + public int RightBorder => _x + _width; + + /// + /// Нижняя граница + /// + public int DownBorder => _y + _height; + + /// + /// Середина объекта + /// + public int ObjectMiddleHorizontal => _x + _width / 2; + + /// + /// Середина объекта + /// + public int ObjectMiddleVertical => _y + _height / 2; + + /// + /// Конструктор + /// + /// Координата X + /// Координата Y + /// Ширина объекта + /// Высота объекта + public ObjectParameters(int x, int y, int width, int height) + { + _x = x; + _y = y; + _width = width; + _height = height; + } +} \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/MovementStrategy/StrategyStatus.cs b/ProjectSeaplane/ProjectSeaplane/MovementStrategy/StrategyStatus.cs new file mode 100644 index 0000000..020c989 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/MovementStrategy/StrategyStatus.cs @@ -0,0 +1,22 @@ +namespace ProjectSeaplane.MovementStrategy; + +/// +/// Статус выполнения операции перемещения +/// +public enum StrategyStatus +{ + /// + /// Все готово к началу + /// + NotInit, + + /// + /// Выполняется + /// + InProgress, + + /// + /// Завершено + /// + Finish +} From bc3d9cac6b784b9dc58eab01997d7880407bfa0d Mon Sep 17 00:00:00 2001 From: ShuryginDima Date: Wed, 13 Mar 2024 17:43:14 +0300 Subject: [PATCH 6/9] =?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=BF=D1=80=D0=B0=D0=B2=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ProjectSeaplane/ProjectSeaplane/Entities/EntitySeaplane.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/ProjectSeaplane/ProjectSeaplane/Entities/EntitySeaplane.cs b/ProjectSeaplane/ProjectSeaplane/Entities/EntitySeaplane.cs index de0ade8..e97ba9c 100644 --- a/ProjectSeaplane/ProjectSeaplane/Entities/EntitySeaplane.cs +++ b/ProjectSeaplane/ProjectSeaplane/Entities/EntitySeaplane.cs @@ -4,10 +4,6 @@ /// public class EntitySeaplane : EntityPlane { - public EntitySeaplane(int speed, double weight, Color bodyColor, Color additionalColor, bool floats, bool boat) : base(speed, weight, bodyColor) - { - } - /// /// Дополнительный цвет (для опциональных элементов) /// @@ -33,7 +29,7 @@ public class EntitySeaplane : EntityPlane /// Дополнительный цвет /// Признак наличия поплавков /// Признак наличия лодки - public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool floats, bool boat) + public EntitySeaplane(int speed, double weight, Color bodyColor, Color additionalColor, bool floats, bool boat) : base(speed, weight, bodyColor) { AdditionalColor = additionalColor; Floats = floats; From 34ea2c9158ba678f95cf7dab8dfa67f1d5aa70c5 Mon Sep 17 00:00:00 2001 From: ShuryginDima Date: Sun, 24 Mar 2024 09:38:55 +0300 Subject: [PATCH 7/9] =?UTF-8?q?=D0=9A=D0=BE=D0=BB=D0=BB=D0=B5=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ICollectionGenericObjects.cs | 48 +++++++++ .../MassiveGenericObjects.cs | 99 +++++++++++++++++++ 2 files changed, 147 insertions(+) create mode 100644 ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/ICollectionGenericObjects.cs create mode 100644 ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/MassiveGenericObjects.cs diff --git a/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/ICollectionGenericObjects.cs b/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/ICollectionGenericObjects.cs new file mode 100644 index 0000000..034dbfa --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/ICollectionGenericObjects.cs @@ -0,0 +1,48 @@ +namespace ProjectSeaplane.CollectionGenericObjects; + +/// +/// Интерфейс описания действий для набора хранимых объектов +/// +/// Параметр: ограничение - ссылочный тип +public interface ICollectionGenericObjects + where T : class +{ + /// + /// Количество объектов в коллекции + /// + int Count { get; } + + /// + /// Установка максимального количества элементов + /// + int SetMaxCount { set; } + + /// + /// Добавление объекта в коллекцию + /// + /// Добавляемый объект + /// true - вставка прошла удачно, false - вставка не удалась + bool Insert(T obj); + + /// + /// Добавление объекта в коллекцию на конкретную позицию + /// + /// Добавляемый объект + /// Позиция + /// true - вставка прошла удачно, false - вставка не удалась + bool Insert(T obj, int position); + + /// + /// Удаление объекта из коллекции с конкретной позиции + /// + /// Позиция + /// true - удаление прошло удачно, false - удаление не удалось + bool Remove(int position); + + /// + /// Получение объекта по позиции + /// + /// Позиция + /// Объект + T? Get(int position); +} \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/MassiveGenericObjects.cs b/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/MassiveGenericObjects.cs new file mode 100644 index 0000000..e970588 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/MassiveGenericObjects.cs @@ -0,0 +1,99 @@ +namespace ProjectSeaplane.CollectionGenericObjects; + +/// +/// Параметризованный набор объектов +/// +/// Параметр: ограничение - ссылочный тип +public class MassiveGenericObjects : ICollectionGenericObjects +where T : class +{ + /// + /// Массив объектов, которые храним + /// + private T?[] _collection; + public int Count => _collection.Length; + public int SetMaxCount + { + set + { + if (value > 0) + { + if (_collection.Length > 0) + { + Array.Resize(ref _collection, value); + } + else + { + _collection = new T?[value]; + } + } + } + } + + /// + /// Конструктор + /// + public MassiveGenericObjects() + { + _collection = Array.Empty(); + } + + public T? Get(int position) + { + if (position >= 0 && position < Count) + { + return _collection[position]; + } + else + { + return null; + } + } + + public bool Insert(T obj) + { + for (int i = 0; i < Count; ++i) + { + if (_collection[i] == null) + { + _collection[i] = obj; + return i; + } + } + return -1; + } + + public bool Insert(T obj, int position) + { + for (int i = position; i < Count; i++) + { + if (_collection[i] == null) + { + _collection[i] = obj; + return i; + } + } + for (int i = position - 1; i >= 0; --i) + { + if (_collection[i] == null) + { + _collection[i] = obj; + return i; + } + } + return -1; + } + + public bool Remove(int position) + { + if (position < 0 || position >= _collection.Count()) return null; + if (_collection[position] != null) + { + T obj = _collection[position]; + _collection[position] = null; + return obj; + + } + return null; + } +} \ No newline at end of file From 96ea01165a546486a16142c89e2bb7f2b3705681 Mon Sep 17 00:00:00 2001 From: ShuryginDima Date: Wed, 27 Mar 2024 15:43:21 +0300 Subject: [PATCH 8/9] =?UTF-8?q?=D0=9A=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractCompany.cs | 123 ++++++++++++ .../ICollectionGenericObjects.cs | 6 +- .../MassiveGenericObjects.cs | 19 +- .../PlaneSharingService.cs | 66 +++++++ .../FormPlaneCollection.Designer.cs | 173 ++++++++++++++++ .../ProjectSeaplane/FormPlaneCollection.cs | 186 ++++++++++++++++++ .../ProjectSeaplane/FormPlaneCollection.resx | 120 +++++++++++ .../ProjectSeaplane/FormSeaplane.Designer.cs | 40 +--- .../ProjectSeaplane/FormSeaplane.cs | 65 ++---- ProjectSeaplane/ProjectSeaplane/Program.cs | 2 +- 10 files changed, 710 insertions(+), 90 deletions(-) create mode 100644 ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/AbstractCompany.cs create mode 100644 ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/PlaneSharingService.cs create mode 100644 ProjectSeaplane/ProjectSeaplane/FormPlaneCollection.Designer.cs create mode 100644 ProjectSeaplane/ProjectSeaplane/FormPlaneCollection.cs create mode 100644 ProjectSeaplane/ProjectSeaplane/FormPlaneCollection.resx diff --git a/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/AbstractCompany.cs b/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/AbstractCompany.cs new file mode 100644 index 0000000..77409f4 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/AbstractCompany.cs @@ -0,0 +1,123 @@ +using ProjectSeaplane.Drawnings; + +namespace ProjectSeaplane.CollectionGenericObjects; + +/// +/// Абстракция компании, хранящий коллекцию самолётов +/// +public abstract class AbstractCompany +{ + /// + /// Размер места (ширина) + /// + protected readonly int _placeSizeWidth = 140; + + /// + /// Размер места (высота) + /// + protected readonly int _placeSizeHeight = 60; + + /// + /// Ширина окна + /// + protected readonly int _pictureWidth; + + /// + /// Высота окна + /// + protected readonly int _pictureHeight; + + /// + /// Коллекция самолётов + /// + protected ICollectionGenericObjects? _collection = null; + + /// + /// Вычисление максимального количества элементов, который можно разместить в окне + /// + private int GetMaxCount => _pictureWidth * _pictureHeight / (_placeSizeWidth * _placeSizeHeight); + + /// + /// Конструктор + /// + /// Ширина окна + /// Высота окна + /// Коллекция самолётов + public AbstractCompany(int picWidth, int picHeight, ICollectionGenericObjects collection) + { + _pictureWidth = picWidth; + _pictureHeight = picHeight; + _collection = collection; + _collection.SetMaxCount = GetMaxCount; + } + + /// + /// Перегрузка оператора сложения для класса + /// + /// Компания + /// Добавляемый объект + /// + public static int operator +(AbstractCompany company, DrawningPlane plane) + { + if (company._collection == null) + { + return -1; + } + return company._collection.Insert(plane); + } + + /// + /// Перегрузка оператора удаления для класса + /// + /// Компания + /// Номер удаляемого объекта + /// + public static DrawningPlane operator -(AbstractCompany company, int position) + { + if (company._collection == null) + { + return null; + } + return company._collection.Remove(position); + } + + /// + /// Получение случайного объекта из коллекции + /// + /// + public DrawningPlane? GetRandomObject() + { + Random rnd = new(); + return _collection?.Get(rnd.Next(GetMaxCount)); + } + + /// + /// Вывод всей коллекции + /// + /// + public Bitmap? Show() + { + Bitmap bitmap = new(_pictureWidth, _pictureHeight); + Graphics graphics = Graphics.FromImage(bitmap); + DrawBackgound(graphics); + + SetObjectsPosition(); + for (int i = 0; i < (_collection?.Count ?? 0); ++i) + { + DrawningPlane? obj = _collection?.Get(i); + obj?.DrawTransport(graphics); + } + return bitmap; + } + + /// + /// Вывод заднего фона + /// + /// + protected abstract void DrawBackgound(Graphics g); + + /// + /// Расстановка объектов + /// + protected abstract void SetObjectsPosition(); +} \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/ICollectionGenericObjects.cs b/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/ICollectionGenericObjects.cs index 034dbfa..63be330 100644 --- a/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/ICollectionGenericObjects.cs +++ b/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/ICollectionGenericObjects.cs @@ -22,7 +22,7 @@ public interface ICollectionGenericObjects /// /// Добавляемый объект /// true - вставка прошла удачно, false - вставка не удалась - bool Insert(T obj); + int Insert(T obj); /// /// Добавление объекта в коллекцию на конкретную позицию @@ -30,14 +30,14 @@ public interface ICollectionGenericObjects /// Добавляемый объект /// Позиция /// true - вставка прошла удачно, false - вставка не удалась - bool Insert(T obj, int position); + int Insert(T obj, int position); /// /// Удаление объекта из коллекции с конкретной позиции /// /// Позиция /// true - удаление прошло удачно, false - удаление не удалось - bool Remove(int position); + T? Remove(int position); /// /// Получение объекта по позиции diff --git a/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/MassiveGenericObjects.cs b/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/MassiveGenericObjects.cs index e970588..405596c 100644 --- a/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/MassiveGenericObjects.cs +++ b/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/MassiveGenericObjects.cs @@ -1,17 +1,21 @@ -namespace ProjectSeaplane.CollectionGenericObjects; +using ProjectSeaplane.Drawnings; + +namespace ProjectSeaplane.CollectionGenericObjects; /// /// Параметризованный набор объектов /// /// Параметр: ограничение - ссылочный тип public class MassiveGenericObjects : ICollectionGenericObjects -where T : class + where T : class { /// /// Массив объектов, которые храним /// private T?[] _collection; + public int Count => _collection.Length; + public int SetMaxCount { set @@ -50,7 +54,7 @@ where T : class } } - public bool Insert(T obj) + public int Insert(T obj) { for (int i = 0; i < Count; ++i) { @@ -63,7 +67,7 @@ where T : class return -1; } - public bool Insert(T obj, int position) + public int Insert(T obj, int position) { for (int i = position; i < Count; i++) { @@ -84,9 +88,12 @@ where T : class return -1; } - public bool Remove(int position) + public T? Remove(int position) { - if (position < 0 || position >= _collection.Count()) return null; + if (position < 0 || position >= _collection.Count()) + { + return null; + } if (_collection[position] != null) { T obj = _collection[position]; diff --git a/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/PlaneSharingService.cs b/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/PlaneSharingService.cs new file mode 100644 index 0000000..6e80060 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/PlaneSharingService.cs @@ -0,0 +1,66 @@ +using ProjectSeaplane.Drawnings; + +namespace ProjectSeaplane.CollectionGenericObjects; + +/// +/// Реализация абстрактной компании - плейншеринг +/// +public class PlaneSharingService : AbstractCompany +{ + private List> locCoord = new List>(); + private int countInRow; + private int countRow; + + /// + /// Конструктор + /// + /// + /// + /// + public PlaneSharingService(int picWidth, int picHeight, ICollectionGenericObjects? collection) : base(picWidth, picHeight, collection) + { + } + + protected override void DrawBackgound(Graphics g) + { + Pen pen = new Pen(Color.Brown); + int x = 1, y = 0; + while (y + _placeSizeHeight <= _pictureHeight) + { + int count = 0; + while (x + _placeSizeWidth <= _pictureWidth) + { + count++; + g.DrawLine(pen, x, y, x + _placeSizeWidth, y); + g.DrawLine(pen, x, y, x, y + _placeSizeHeight); + g.DrawLine(pen, x, y + _placeSizeHeight, x + _placeSizeWidth, y + _placeSizeHeight); + g.DrawLine(pen, x + _placeSizeWidth, y + _placeSizeHeight, x + _placeSizeWidth, y); + locCoord.Add(new Tuple(x, y)); + x += _placeSizeWidth + 2; + } + countInRow = count; + x = 1; + y += _placeSizeHeight + 5; + countRow++; + } + } + + protected override void SetObjectsPosition() + { + if (locCoord == null || _collection == null) + { + return; + } + int row = countRow, col = 1; + for (int i = 0; i < _collection?.Count; i++, col++) + { + _collection?.Get(i)?.SetPictureSize(_pictureWidth, _pictureHeight); + _collection?.Get(i)?.SetPosition(locCoord[row * countInRow - col].Item1 + 5, locCoord[row * countInRow - col].Item2 + 5); + if (col == countInRow) + { + col = 0; + row--; + } + } + } +} \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/FormPlaneCollection.Designer.cs b/ProjectSeaplane/ProjectSeaplane/FormPlaneCollection.Designer.cs new file mode 100644 index 0000000..c25addc --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/FormPlaneCollection.Designer.cs @@ -0,0 +1,173 @@ +namespace ProjectSeaplane +{ + partial class FormPlaneCollection + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + groupBoxTools = new GroupBox(); + buttonRefresh = new Button(); + buttonGoToCheck = new Button(); + buttonRemovePlane = new Button(); + maskedTextBoxPosition = new MaskedTextBox(); + buttonAddSeaplane = new Button(); + buttonAddPlane = new Button(); + comboBoxSelectorCompany = new ComboBox(); + pictureBox = new PictureBox(); + groupBoxTools.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)pictureBox).BeginInit(); + SuspendLayout(); + // + // groupBoxTools + // + groupBoxTools.Controls.Add(buttonRefresh); + groupBoxTools.Controls.Add(buttonGoToCheck); + groupBoxTools.Controls.Add(buttonRemovePlane); + groupBoxTools.Controls.Add(maskedTextBoxPosition); + groupBoxTools.Controls.Add(buttonAddSeaplane); + groupBoxTools.Controls.Add(buttonAddPlane); + groupBoxTools.Controls.Add(comboBoxSelectorCompany); + groupBoxTools.Dock = DockStyle.Right; + groupBoxTools.Location = new Point(710, 0); + groupBoxTools.Name = "groupBoxTools"; + groupBoxTools.Size = new Size(144, 529); + groupBoxTools.TabIndex = 0; + groupBoxTools.TabStop = false; + groupBoxTools.Text = "Инструменты"; + // + // buttonRefresh + // + buttonRefresh.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonRefresh.Location = new Point(6, 429); + buttonRefresh.Name = "buttonRefresh"; + buttonRefresh.Size = new Size(126, 44); + buttonRefresh.TabIndex = 6; + buttonRefresh.Text = "Обновить"; + buttonRefresh.UseVisualStyleBackColor = true; + buttonRefresh.Click += ButtonRefresh_Click; + // + // buttonGoToCheck + // + buttonGoToCheck.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonGoToCheck.Location = new Point(6, 346); + buttonGoToCheck.Name = "buttonGoToCheck"; + buttonGoToCheck.Size = new Size(126, 44); + buttonGoToCheck.TabIndex = 5; + buttonGoToCheck.Text = "Передать на тесты"; + buttonGoToCheck.UseVisualStyleBackColor = true; + buttonGoToCheck.Click += ButtonGoToCheck_Click; + // + // buttonRemovePlane + // + buttonRemovePlane.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonRemovePlane.Location = new Point(6, 265); + buttonRemovePlane.Name = "buttonRemovePlane"; + buttonRemovePlane.Size = new Size(126, 44); + buttonRemovePlane.TabIndex = 4; + buttonRemovePlane.Text = "Удалить самолёт"; + buttonRemovePlane.UseVisualStyleBackColor = true; + buttonRemovePlane.Click += ButtonRemovePlane_Click; + // + // maskedTextBoxPosition + // + maskedTextBoxPosition.Location = new Point(6, 208); + maskedTextBoxPosition.Mask = "00"; + maskedTextBoxPosition.Name = "maskedTextBoxPosition"; + maskedTextBoxPosition.Size = new Size(126, 23); + maskedTextBoxPosition.TabIndex = 3; + maskedTextBoxPosition.ValidatingType = typeof(int); + // + // buttonAddSeaplane + // + buttonAddSeaplane.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonAddSeaplane.Location = new Point(6, 126); + buttonAddSeaplane.Name = "buttonAddSeaplane"; + buttonAddSeaplane.Size = new Size(126, 44); + buttonAddSeaplane.TabIndex = 2; + buttonAddSeaplane.Text = "Добавление гидросамолёта"; + buttonAddSeaplane.UseVisualStyleBackColor = true; + buttonAddSeaplane.Click += ButtonAddSeaplane_Click; + // + // buttonAddPlane + // + buttonAddPlane.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonAddPlane.Location = new Point(6, 78); + buttonAddPlane.Name = "buttonAddPlane"; + buttonAddPlane.Size = new Size(126, 42); + buttonAddPlane.TabIndex = 1; + buttonAddPlane.Text = "Добавление самолёта"; + buttonAddPlane.UseVisualStyleBackColor = true; + buttonAddPlane.Click += ButtonAddPlane_Click; + // + // comboBoxSelectorCompany + // + comboBoxSelectorCompany.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + comboBoxSelectorCompany.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxSelectorCompany.FormattingEnabled = true; + comboBoxSelectorCompany.Items.AddRange(new object[] { "Хранилище" }); + comboBoxSelectorCompany.Location = new Point(6, 22); + comboBoxSelectorCompany.Name = "comboBoxSelectorCompany"; + comboBoxSelectorCompany.Size = new Size(126, 23); + comboBoxSelectorCompany.TabIndex = 0; + comboBoxSelectorCompany.SelectedIndexChanged += ComboBoxSelectorCompany_SelectedIndexChanged; + // + // pictureBox + // + pictureBox.Dock = DockStyle.Fill; + pictureBox.Location = new Point(0, 0); + pictureBox.Name = "pictureBox"; + pictureBox.Size = new Size(710, 529); + pictureBox.TabIndex = 1; + pictureBox.TabStop = false; + // + // FormPlaneCollection + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(854, 529); + Controls.Add(pictureBox); + Controls.Add(groupBoxTools); + Name = "FormPlaneCollection"; + Text = "Коллекция самолётов"; + groupBoxTools.ResumeLayout(false); + groupBoxTools.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)pictureBox).EndInit(); + ResumeLayout(false); + } + + #endregion + + private GroupBox groupBoxTools; + private ComboBox comboBoxSelectorCompany; + private Button buttonAddPlane; + private Button buttonAddSeaplane; + private Button buttonRemovePlane; + private MaskedTextBox maskedTextBoxPosition; + private PictureBox pictureBox; + private Button buttonRefresh; + private Button buttonGoToCheck; + } +} \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/FormPlaneCollection.cs b/ProjectSeaplane/ProjectSeaplane/FormPlaneCollection.cs new file mode 100644 index 0000000..d6367d8 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/FormPlaneCollection.cs @@ -0,0 +1,186 @@ +using ProjectSeaplane.CollectionGenericObjects; +using ProjectSeaplane.Drawnings; + +namespace ProjectSeaplane; + +/// +/// Форма работы с компанией и её коллекцией +/// +public partial class FormPlaneCollection : Form +{ + /// + /// Компания + /// + private AbstractCompany? _company = null; + + /// + /// Конструктор + /// + public FormPlaneCollection() + { + InitializeComponent(); + } + + /// + /// Выбор компании + /// + /// + /// + private void ComboBoxSelectorCompany_SelectedIndexChanged(object sender, EventArgs e) + { + switch (comboBoxSelectorCompany.Text) + { + case "Хранилище": + _company = new PlaneSharingService(pictureBox.Width, pictureBox.Height, new MassiveGenericObjects()); + break; + } + } + + /// + /// Добавление обычного самолёта + /// + /// + /// + private void ButtonAddPlane_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningPlane)); + + /// + /// Добавление гидросамолёта + /// + /// + /// + private void ButtonAddSeaplane_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningSeaplane)); + + /// + /// Создание объекта класса-перемещения + /// + /// Тип создаваемого объекта + private void CreateObject(string type) + { + if (_company == null) + { + return; + } + + Random random = new(); + DrawningPlane _drawningPlane; + switch (type) + { + case nameof(DrawningPlane): + _drawningPlane = new DrawningPlane(random.Next(100, 300), random.Next(1000, 3000), GetColor(random)); + break; + case nameof(DrawningSeaplane): + _drawningPlane = new DrawningSeaplane(random.Next(100, 300), random.Next(1000, 3000), + GetColor(random), + GetColor(random), + Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2))); + break; + default: + return; + } + + if ((_company + _drawningPlane) != -1) + { + MessageBox.Show("Объект добавлен"); + pictureBox.Image = _company.Show(); + } + else + { + MessageBox.Show("Не удалось добавить объект"); + } + } + + /// + /// Получение цвета + /// + /// Генератор случайных чисел + /// + private static Color GetColor(Random random) + { + Color color = Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)); + ColorDialog dialog = new(); + if (dialog.ShowDialog() == DialogResult.OK) + { + color = dialog.Color; + } + return color; + } + + /// + /// Удаление объекта + /// + /// + /// + private void ButtonRemovePlane_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(maskedTextBoxPosition.Text) || _company == null) + { + return; + } + + if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) + { + return; + } + + int pos = Convert.ToInt32(maskedTextBoxPosition.Text); + if ((_company - pos) != null) + { + MessageBox.Show("Объект удален"); + pictureBox.Image = _company.Show(); + } + else + { + MessageBox.Show("Не удалось удалить объект"); + } + + } + + /// + /// Передача объекта в другую форму + /// + /// + /// + private void ButtonGoToCheck_Click(object sender, EventArgs e) + { + if (_company == null) + { + return; + } + + DrawningPlane? plane = null; + int counter = 100; + while (plane == null) + { + plane = _company.GetRandomObject(); + counter--; + if (counter <= 0) + { + break; + } + } + + if (plane == null) + { + return; + } + + FormSeaplane form = new FormSeaplane(); + form.SetPlane = plane; + form.ShowDialog(); + } + + /// + /// Перерисовка коллекции + /// + /// + /// + private void ButtonRefresh_Click(object sender, EventArgs e) + { + if (_company == null) + { + return; + } + + pictureBox.Image = _company.Show(); + } +} diff --git a/ProjectSeaplane/ProjectSeaplane/FormPlaneCollection.resx b/ProjectSeaplane/ProjectSeaplane/FormPlaneCollection.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/FormPlaneCollection.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/FormSeaplane.Designer.cs b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.Designer.cs index e8589d4..0015250 100644 --- a/ProjectSeaplane/ProjectSeaplane/FormSeaplane.Designer.cs +++ b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.Designer.cs @@ -29,12 +29,10 @@ private void InitializeComponent() { pictureBoxSeaplane = new PictureBox(); - buttonCreateSeaplane = new Button(); buttonLeft = new Button(); buttonUp = new Button(); buttonDown = new Button(); buttonRight = new Button(); - buttonCreatePlane = new Button(); comboBoxStrategy = new ComboBox(); buttonStrategyStep = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxSeaplane).BeginInit(); @@ -45,27 +43,16 @@ pictureBoxSeaplane.Dock = DockStyle.Fill; pictureBoxSeaplane.Location = new Point(0, 0); pictureBoxSeaplane.Name = "pictureBoxSeaplane"; - pictureBoxSeaplane.Size = new Size(900, 500); + pictureBoxSeaplane.Size = new Size(900, 517); pictureBoxSeaplane.TabIndex = 0; pictureBoxSeaplane.TabStop = false; // - // buttonCreateSeaplane - // - buttonCreateSeaplane.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; - buttonCreateSeaplane.Location = new Point(12, 465); - buttonCreateSeaplane.Name = "buttonCreateSeaplane"; - buttonCreateSeaplane.Size = new Size(196, 23); - buttonCreateSeaplane.TabIndex = 1; - buttonCreateSeaplane.Text = "Создать гидросамолёт"; - buttonCreateSeaplane.UseVisualStyleBackColor = true; - buttonCreateSeaplane.Click += ButtonCreateSeaplane_Click; - // // buttonLeft // buttonLeft.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonLeft.BackgroundImage = Properties.Resources.arrow_left; buttonLeft.BackgroundImageLayout = ImageLayout.Stretch; - buttonLeft.Location = new Point(768, 451); + buttonLeft.Location = new Point(768, 468); buttonLeft.Name = "buttonLeft"; buttonLeft.Size = new Size(35, 35); buttonLeft.TabIndex = 2; @@ -77,7 +64,7 @@ buttonUp.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonUp.BackgroundImage = Properties.Resources.arrow_up; buttonUp.BackgroundImageLayout = ImageLayout.Stretch; - buttonUp.Location = new Point(808, 411); + buttonUp.Location = new Point(808, 428); buttonUp.Name = "buttonUp"; buttonUp.Size = new Size(35, 35); buttonUp.TabIndex = 3; @@ -89,7 +76,7 @@ buttonDown.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonDown.BackgroundImage = Properties.Resources.arrow_down; buttonDown.BackgroundImageLayout = ImageLayout.Stretch; - buttonDown.Location = new Point(808, 451); + buttonDown.Location = new Point(808, 468); buttonDown.Name = "buttonDown"; buttonDown.Size = new Size(35, 35); buttonDown.TabIndex = 4; @@ -101,24 +88,13 @@ buttonRight.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonRight.BackgroundImage = Properties.Resources.arrow_right; buttonRight.BackgroundImageLayout = ImageLayout.Stretch; - buttonRight.Location = new Point(849, 451); + buttonRight.Location = new Point(849, 468); buttonRight.Name = "buttonRight"; buttonRight.Size = new Size(35, 35); buttonRight.TabIndex = 5; buttonRight.UseVisualStyleBackColor = true; buttonRight.Click += ButtonMove_Click; // - // buttonCreatePlane - // - buttonCreatePlane.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; - buttonCreatePlane.Location = new Point(214, 465); - buttonCreatePlane.Name = "buttonCreatePlane"; - buttonCreatePlane.Size = new Size(196, 23); - buttonCreatePlane.TabIndex = 6; - buttonCreatePlane.Text = "Создать самолёт"; - buttonCreatePlane.UseVisualStyleBackColor = true; - buttonCreatePlane.Click += ButtonCreatePlane_Click; - // // comboBoxStrategy // comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList; @@ -143,15 +119,13 @@ // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(900, 500); + ClientSize = new Size(900, 517); Controls.Add(buttonStrategyStep); Controls.Add(comboBoxStrategy); - Controls.Add(buttonCreatePlane); Controls.Add(buttonRight); Controls.Add(buttonDown); Controls.Add(buttonUp); Controls.Add(buttonLeft); - Controls.Add(buttonCreateSeaplane); Controls.Add(pictureBoxSeaplane); Name = "FormSeaplane"; Text = "Гидросамолёт"; @@ -162,12 +136,10 @@ #endregion private PictureBox pictureBoxSeaplane; - private Button buttonCreateSeaplane; private Button buttonLeft; private Button buttonUp; private Button buttonDown; private Button buttonRight; - private Button buttonCreatePlane; private ComboBox comboBoxStrategy; private Button buttonStrategyStep; } diff --git a/ProjectSeaplane/ProjectSeaplane/FormSeaplane.cs b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.cs index 566db95..ff242e0 100644 --- a/ProjectSeaplane/ProjectSeaplane/FormSeaplane.cs +++ b/ProjectSeaplane/ProjectSeaplane/FormSeaplane.cs @@ -2,6 +2,7 @@ using ProjectSeaplane.MovementStrategy; namespace ProjectSeaplane; + /// /// Форма работы с объектом "Спортивный автомобиль" /// @@ -17,6 +18,21 @@ public partial class FormSeaplane : Form /// private AbstractStrategy? _strategy; + /// + /// Получение объекта + /// + public DrawningPlane SetPlane + { + set + { + _drawningPlane = value; + _drawningPlane.SetPictureSize(pictureBoxSeaplane.Width, pictureBoxSeaplane.Height); + comboBoxStrategy.Enabled = true; + _strategy = null; + Draw(); + } + } + /// /// Конструктор формы /// @@ -27,7 +43,7 @@ public partial class FormSeaplane : Form } /// - /// Метод прорисовки машины + /// Метод прорисовки самолёта /// private void Draw() { @@ -41,51 +57,6 @@ public partial class FormSeaplane : Form pictureBoxSeaplane.Image = bmp; } - /// - /// Создание объекта класса-перемещения - /// - /// Тип создаваемого объекта - private void CreateObject(string type) - { - Random random = new(); - switch (type) - { - case nameof(DrawningPlane): - _drawningPlane = new DrawningPlane(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(DrawningSeaplane): - _drawningPlane = new DrawningSeaplane(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; - } - _drawningPlane.SetPictureSize(pictureBoxSeaplane.Width, pictureBoxSeaplane.Height); - _drawningPlane.SetPosition(random.Next(10, 100), random.Next(10, 100)); - _strategy = null; - comboBoxStrategy.Enabled = true; - - Draw(); - } - - - /// - /// Обработка нажатия кнопки "Создать гидросамолёт" - /// - /// - /// - private void ButtonCreateSeaplane_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningSeaplane)); - - /// - /// Обработка нажатия кнопки "Создать самолёт" - /// - /// - /// - private void ButtonCreatePlane_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningPlane)); - /// /// Перемещение объекта по форме (нажатие кнопок навигации) /// @@ -131,6 +102,7 @@ public partial class FormSeaplane : Form { return; } + if (comboBoxStrategy.Enabled) { _strategy = comboBoxStrategy.SelectedIndex switch @@ -145,6 +117,7 @@ public partial class FormSeaplane : Form } _strategy.SetData(new MoveablePlane(_drawningPlane), pictureBoxSeaplane.Width, pictureBoxSeaplane.Height); } + if (_strategy == null) { return; diff --git a/ProjectSeaplane/ProjectSeaplane/Program.cs b/ProjectSeaplane/ProjectSeaplane/Program.cs index 4e58da8..0b08fb7 100644 --- a/ProjectSeaplane/ProjectSeaplane/Program.cs +++ b/ProjectSeaplane/ProjectSeaplane/Program.cs @@ -11,7 +11,7 @@ namespace ProjectSeaplane // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new FormSeaplane()); + Application.Run(new FormPlaneCollection()); } } } \ No newline at end of file From 1a801f926fe3282fe412c7e26cb694acb78e1fde Mon Sep 17 00:00:00 2001 From: ShuryginDima Date: Mon, 8 Apr 2024 15:56:17 +0300 Subject: [PATCH 9/9] =?UTF-8?q?4=20=D0=BB=D0=B0=D0=B1=D0=BE=D1=80=D0=B0?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CollectionType.cs | 22 +++ .../ListGenericObjects.cs | 60 ++++++ .../MassiveGenericObjects.cs | 20 +- .../StorageCollection.cs | 85 +++++++++ .../FormPlaneCollection.Designer.cs | 178 +++++++++++++++--- .../ProjectSeaplane/FormPlaneCollection.cs | 108 ++++++++++- 6 files changed, 431 insertions(+), 42 deletions(-) create mode 100644 ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/CollectionType.cs create mode 100644 ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/ListGenericObjects.cs create mode 100644 ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/StorageCollection.cs diff --git a/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/CollectionType.cs b/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/CollectionType.cs new file mode 100644 index 0000000..de79c68 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/CollectionType.cs @@ -0,0 +1,22 @@ +namespace ProjectSeaplane.CollectionGenericObjects; + +/// +/// Тип коллекции +/// +public enum CollectionType +{ + /// + /// Неопределено + /// + None = 0, + + /// + /// Массив + /// + Massive = 1, + + /// + /// Список + /// + List = 2 +} \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/ListGenericObjects.cs b/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/ListGenericObjects.cs new file mode 100644 index 0000000..3e94174 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/ListGenericObjects.cs @@ -0,0 +1,60 @@ +namespace ProjectSeaplane.CollectionGenericObjects; + +/// +/// Параметризованный набор объектов +/// +/// Параметр: ограничение - ссылочный тип +public class ListGenericObjects : ICollectionGenericObjects + where T : class +{ + /// + /// Список объектов, которые храним + /// + private readonly List _collection; + + /// + /// Максимально допустимое число объектов в списке + /// + private int _maxCount; + public int Count => _collection.Count; + public int SetMaxCount { set { if (value > 0) { _maxCount = value; } } } + + /// + /// Конструктор + /// + public ListGenericObjects() + { + _collection = new(); + } + public T? Get(int position) + { + if (position < 0 || position > _collection.Count) + { + return null; + } + return _collection[position]; + } + public int Insert(T obj) + { + return Insert(obj, _collection.Count); + } + public int Insert(T obj, int position) + { + if (_maxCount == _collection.Count || position < 0 || position > _collection.Count) + { + return -1; + } + _collection.Insert(position, obj); + return _collection.Count; + } + public T? Remove(int position) + { + if (position < 0 || position > _collection.Count) + { + return null; + } + T obj = _collection[position]; + _collection.RemoveAt(position); + return obj; + } +} \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/MassiveGenericObjects.cs b/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/MassiveGenericObjects.cs index 405596c..840ea93 100644 --- a/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/MassiveGenericObjects.cs +++ b/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/MassiveGenericObjects.cs @@ -56,19 +56,21 @@ public class MassiveGenericObjects : ICollectionGenericObjects public int Insert(T obj) { - for (int i = 0; i < Count; ++i) - { - if (_collection[i] == null) - { - _collection[i] = obj; - return i; - } - } - return -1; + return Insert(obj, 0); } public int Insert(T obj, int position) { + if (position < 0 || position >= Count) + { + return -1; + } + if (_collection[position] == null) + { + _collection[position] = obj; + return position; + } + for (int i = position; i < Count; i++) { if (_collection[i] == null) diff --git a/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/StorageCollection.cs b/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/StorageCollection.cs new file mode 100644 index 0000000..5950c32 --- /dev/null +++ b/ProjectSeaplane/ProjectSeaplane/CollectionGenericObjects/StorageCollection.cs @@ -0,0 +1,85 @@ +namespace ProjectSeaplane.CollectionGenericObjects; + +/// +/// Класс-хранилище коллекций +/// +/// +public class StorageCollection + where T : class +{ + /// + /// Словарь (хранилище) с коллекциями + /// + readonly Dictionary> _storage; + + /// + /// Возвращение списка названий коллекций + /// + public List Keys => _storage.Keys.ToList(); + + /// + /// Конструктор + /// + public StorageCollection() + { + _storage = new Dictionary>(); + } + + /// + /// Добавление коллекции в хранилище + /// + /// Название коллекции + /// тип коллекции + public void AddCollection(string name, CollectionType collectionType) + { + if (string.IsNullOrEmpty(name) || _storage.ContainsKey(name)) + { + return; + } + if (collectionType == CollectionType.None) + { + return; + } + if (collectionType == CollectionType.Massive) + { + _storage[name] = new MassiveGenericObjects(); + } + else if (collectionType == CollectionType.List) + { + _storage[name] = new ListGenericObjects(); + } + } + + /// + /// Удаление коллекции + /// + /// Название коллекции + public void DelCollection(string name) + { + if (name == null || !_storage.ContainsKey(name)) + { + return; + } + _storage.Remove(name); + } + + /// + /// Доступ к коллекции + /// + /// Название коллекции + /// + public ICollectionGenericObjects? this[string name] + { + get + { + if (_storage.ContainsKey(name)) + { + return _storage[name]; + } + else + { + return null; + } + } + } +} \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/FormPlaneCollection.Designer.cs b/ProjectSeaplane/ProjectSeaplane/FormPlaneCollection.Designer.cs index c25addc..cd005c1 100644 --- a/ProjectSeaplane/ProjectSeaplane/FormPlaneCollection.Designer.cs +++ b/ProjectSeaplane/ProjectSeaplane/FormPlaneCollection.Designer.cs @@ -29,6 +29,15 @@ private void InitializeComponent() { groupBoxTools = new GroupBox(); + buttonCreateCompany = new Button(); + panelStorage = new Panel(); + buttonCollectionDel = new Button(); + listBoxCollection = new ListBox(); + buttonCollectionAdd = new Button(); + radioButtonList = new RadioButton(); + radioButtonMassive = new RadioButton(); + textBoxCollectionName = new TextBox(); + labelCollectionName = new Label(); buttonRefresh = new Button(); buttonGoToCheck = new Button(); buttonRemovePlane = new Button(); @@ -37,33 +46,126 @@ buttonAddPlane = new Button(); comboBoxSelectorCompany = new ComboBox(); pictureBox = new PictureBox(); + panelCompanyTools = new Panel(); groupBoxTools.SuspendLayout(); + panelStorage.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)pictureBox).BeginInit(); + panelCompanyTools.SuspendLayout(); SuspendLayout(); // // groupBoxTools // - groupBoxTools.Controls.Add(buttonRefresh); - groupBoxTools.Controls.Add(buttonGoToCheck); - groupBoxTools.Controls.Add(buttonRemovePlane); - groupBoxTools.Controls.Add(maskedTextBoxPosition); - groupBoxTools.Controls.Add(buttonAddSeaplane); - groupBoxTools.Controls.Add(buttonAddPlane); + groupBoxTools.Controls.Add(panelCompanyTools); + groupBoxTools.Controls.Add(buttonCreateCompany); + groupBoxTools.Controls.Add(panelStorage); groupBoxTools.Controls.Add(comboBoxSelectorCompany); groupBoxTools.Dock = DockStyle.Right; - groupBoxTools.Location = new Point(710, 0); + groupBoxTools.Location = new Point(793, 0); groupBoxTools.Name = "groupBoxTools"; - groupBoxTools.Size = new Size(144, 529); + groupBoxTools.Size = new Size(144, 571); groupBoxTools.TabIndex = 0; groupBoxTools.TabStop = false; groupBoxTools.Text = "Инструменты"; // + // buttonCreateCompany + // + buttonCreateCompany.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonCreateCompany.Location = new Point(7, 285); + buttonCreateCompany.Name = "buttonCreateCompany"; + buttonCreateCompany.Size = new Size(126, 30); + buttonCreateCompany.TabIndex = 9; + buttonCreateCompany.Text = "Создать компанию"; + buttonCreateCompany.UseVisualStyleBackColor = true; + buttonCreateCompany.Click += ButtonCreateCompany_Click; + // + // panelStorage + // + panelStorage.Controls.Add(buttonCollectionDel); + panelStorage.Controls.Add(listBoxCollection); + panelStorage.Controls.Add(buttonCollectionAdd); + panelStorage.Controls.Add(radioButtonList); + panelStorage.Controls.Add(radioButtonMassive); + panelStorage.Controls.Add(textBoxCollectionName); + panelStorage.Controls.Add(labelCollectionName); + panelStorage.Dock = DockStyle.Top; + panelStorage.Location = new Point(3, 19); + panelStorage.Name = "panelStorage"; + panelStorage.Size = new Size(138, 231); + panelStorage.TabIndex = 7; + // + // buttonCollectionDel + // + buttonCollectionDel.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonCollectionDel.Location = new Point(3, 196); + buttonCollectionDel.Name = "buttonCollectionDel"; + buttonCollectionDel.Size = new Size(126, 30); + buttonCollectionDel.TabIndex = 8; + buttonCollectionDel.Text = "Удалить коллекцию"; + buttonCollectionDel.UseVisualStyleBackColor = true; + buttonCollectionDel.Click += ButtonCollectionDel_Click; + // + // listBoxCollection + // + listBoxCollection.FormattingEnabled = true; + listBoxCollection.ItemHeight = 15; + listBoxCollection.Location = new Point(3, 126); + listBoxCollection.Name = "listBoxCollection"; + listBoxCollection.Size = new Size(126, 64); + listBoxCollection.TabIndex = 5; + // + // buttonCollectionAdd + // + buttonCollectionAdd.Location = new Point(4, 81); + buttonCollectionAdd.Name = "buttonCollectionAdd"; + buttonCollectionAdd.Size = new Size(125, 39); + buttonCollectionAdd.TabIndex = 4; + buttonCollectionAdd.Text = "Добавить коллекцию"; + buttonCollectionAdd.UseVisualStyleBackColor = true; + buttonCollectionAdd.Click += ButtonCollectionAdd_Click; + // + // radioButtonList + // + radioButtonList.AutoSize = true; + radioButtonList.Location = new Point(69, 56); + radioButtonList.Name = "radioButtonList"; + radioButtonList.Size = new Size(66, 19); + radioButtonList.TabIndex = 3; + radioButtonList.TabStop = true; + radioButtonList.Text = "Список"; + radioButtonList.UseVisualStyleBackColor = true; + // + // radioButtonMassive + // + radioButtonMassive.AutoSize = true; + radioButtonMassive.Location = new Point(4, 56); + radioButtonMassive.Name = "radioButtonMassive"; + radioButtonMassive.Size = new Size(67, 19); + radioButtonMassive.TabIndex = 2; + radioButtonMassive.TabStop = true; + radioButtonMassive.Text = "Массив"; + radioButtonMassive.UseVisualStyleBackColor = true; + // + // textBoxCollectionName + // + textBoxCollectionName.Location = new Point(3, 27); + textBoxCollectionName.Name = "textBoxCollectionName"; + textBoxCollectionName.Size = new Size(126, 23); + textBoxCollectionName.TabIndex = 1; + // + // labelCollectionName + // + labelCollectionName.AutoSize = true; + labelCollectionName.Location = new Point(4, 9); + labelCollectionName.Name = "labelCollectionName"; + labelCollectionName.Size = new Size(125, 15); + labelCollectionName.TabIndex = 0; + labelCollectionName.Text = "Название коллекции:"; + // // buttonRefresh // - buttonRefresh.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - buttonRefresh.Location = new Point(6, 429); + buttonRefresh.Location = new Point(3, 202); buttonRefresh.Name = "buttonRefresh"; - buttonRefresh.Size = new Size(126, 44); + buttonRefresh.Size = new Size(126, 42); buttonRefresh.TabIndex = 6; buttonRefresh.Text = "Обновить"; buttonRefresh.UseVisualStyleBackColor = true; @@ -71,10 +173,9 @@ // // buttonGoToCheck // - buttonGoToCheck.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - buttonGoToCheck.Location = new Point(6, 346); + buttonGoToCheck.Location = new Point(4, 166); buttonGoToCheck.Name = "buttonGoToCheck"; - buttonGoToCheck.Size = new Size(126, 44); + buttonGoToCheck.Size = new Size(126, 30); buttonGoToCheck.TabIndex = 5; buttonGoToCheck.Text = "Передать на тесты"; buttonGoToCheck.UseVisualStyleBackColor = true; @@ -82,10 +183,9 @@ // // buttonRemovePlane // - buttonRemovePlane.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - buttonRemovePlane.Location = new Point(6, 265); + buttonRemovePlane.Location = new Point(4, 130); buttonRemovePlane.Name = "buttonRemovePlane"; - buttonRemovePlane.Size = new Size(126, 44); + buttonRemovePlane.Size = new Size(126, 30); buttonRemovePlane.TabIndex = 4; buttonRemovePlane.Text = "Удалить самолёт"; buttonRemovePlane.UseVisualStyleBackColor = true; @@ -93,7 +193,7 @@ // // maskedTextBoxPosition // - maskedTextBoxPosition.Location = new Point(6, 208); + maskedTextBoxPosition.Location = new Point(4, 101); maskedTextBoxPosition.Mask = "00"; maskedTextBoxPosition.Name = "maskedTextBoxPosition"; maskedTextBoxPosition.Size = new Size(126, 23); @@ -102,8 +202,7 @@ // // buttonAddSeaplane // - buttonAddSeaplane.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - buttonAddSeaplane.Location = new Point(6, 126); + buttonAddSeaplane.Location = new Point(3, 51); buttonAddSeaplane.Name = "buttonAddSeaplane"; buttonAddSeaplane.Size = new Size(126, 44); buttonAddSeaplane.TabIndex = 2; @@ -113,8 +212,7 @@ // // buttonAddPlane // - buttonAddPlane.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - buttonAddPlane.Location = new Point(6, 78); + buttonAddPlane.Location = new Point(4, 3); buttonAddPlane.Name = "buttonAddPlane"; buttonAddPlane.Size = new Size(126, 42); buttonAddPlane.TabIndex = 1; @@ -128,7 +226,7 @@ comboBoxSelectorCompany.DropDownStyle = ComboBoxStyle.DropDownList; comboBoxSelectorCompany.FormattingEnabled = true; comboBoxSelectorCompany.Items.AddRange(new object[] { "Хранилище" }); - comboBoxSelectorCompany.Location = new Point(6, 22); + comboBoxSelectorCompany.Location = new Point(6, 256); comboBoxSelectorCompany.Name = "comboBoxSelectorCompany"; comboBoxSelectorCompany.Size = new Size(126, 23); comboBoxSelectorCompany.TabIndex = 0; @@ -139,22 +237,40 @@ pictureBox.Dock = DockStyle.Fill; pictureBox.Location = new Point(0, 0); pictureBox.Name = "pictureBox"; - pictureBox.Size = new Size(710, 529); + pictureBox.Size = new Size(793, 571); pictureBox.TabIndex = 1; pictureBox.TabStop = false; // + // panelCompanyTools + // + panelCompanyTools.Controls.Add(buttonAddPlane); + panelCompanyTools.Controls.Add(buttonAddSeaplane); + panelCompanyTools.Controls.Add(buttonRefresh); + panelCompanyTools.Controls.Add(maskedTextBoxPosition); + panelCompanyTools.Controls.Add(buttonGoToCheck); + panelCompanyTools.Controls.Add(buttonRemovePlane); + panelCompanyTools.Dock = DockStyle.Bottom; + panelCompanyTools.Enabled = false; + panelCompanyTools.Location = new Point(3, 320); + panelCompanyTools.Name = "panelCompanyTools"; + panelCompanyTools.Size = new Size(138, 248); + panelCompanyTools.TabIndex = 10; + // // FormPlaneCollection // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(854, 529); + ClientSize = new Size(937, 571); Controls.Add(pictureBox); Controls.Add(groupBoxTools); Name = "FormPlaneCollection"; Text = "Коллекция самолётов"; groupBoxTools.ResumeLayout(false); - groupBoxTools.PerformLayout(); + panelStorage.ResumeLayout(false); + panelStorage.PerformLayout(); ((System.ComponentModel.ISupportInitialize)pictureBox).EndInit(); + panelCompanyTools.ResumeLayout(false); + panelCompanyTools.PerformLayout(); ResumeLayout(false); } @@ -169,5 +285,15 @@ private PictureBox pictureBox; private Button buttonRefresh; private Button buttonGoToCheck; + private Panel panelStorage; + private Label labelCollectionName; + private RadioButton radioButtonMassive; + private TextBox textBoxCollectionName; + private Button buttonCollectionAdd; + private RadioButton radioButtonList; + private ListBox listBoxCollection; + private Button buttonCollectionDel; + private Button buttonCreateCompany; + private Panel panelCompanyTools; } } \ No newline at end of file diff --git a/ProjectSeaplane/ProjectSeaplane/FormPlaneCollection.cs b/ProjectSeaplane/ProjectSeaplane/FormPlaneCollection.cs index d6367d8..a953ae7 100644 --- a/ProjectSeaplane/ProjectSeaplane/FormPlaneCollection.cs +++ b/ProjectSeaplane/ProjectSeaplane/FormPlaneCollection.cs @@ -8,6 +8,11 @@ namespace ProjectSeaplane; /// public partial class FormPlaneCollection : Form { + /// + /// Хранилише коллекций + /// + private readonly StorageCollection _storageCollection; + /// /// Компания /// @@ -19,6 +24,7 @@ public partial class FormPlaneCollection : Form public FormPlaneCollection() { InitializeComponent(); + _storageCollection = new(); } /// @@ -28,12 +34,7 @@ public partial class FormPlaneCollection : Form /// private void ComboBoxSelectorCompany_SelectedIndexChanged(object sender, EventArgs e) { - switch (comboBoxSelectorCompany.Text) - { - case "Хранилище": - _company = new PlaneSharingService(pictureBox.Width, pictureBox.Height, new MassiveGenericObjects()); - break; - } + panelCompanyTools.Enabled = false; } /// @@ -183,4 +184,97 @@ public partial class FormPlaneCollection : Form pictureBox.Image = _company.Show(); } -} + + /// + /// Добавление коллекции + /// + /// + /// + private void ButtonCollectionAdd_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(textBoxCollectionName.Text) || (!radioButtonList.Checked && !radioButtonMassive.Checked)) + { + MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + CollectionType collectionType = CollectionType.None; + if (radioButtonMassive.Checked) + { + collectionType = CollectionType.Massive; + } + else if (radioButtonList.Checked) + { + collectionType = CollectionType.List; + } + _storageCollection.AddCollection(textBoxCollectionName.Text, collectionType); + RefreshListBoxItems(); + } + + /// + /// Удаление коллекции + /// + /// + /// + private void ButtonCollectionDel_Click(object sender, EventArgs e) + { + if (listBoxCollection.SelectedIndex < 0) + { + MessageBox.Show("Сначала выберите коллекцию"); + return; + } + if (MessageBox.Show("Удалить коллекцию?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + { + return; + } + _storageCollection.DelCollection(listBoxCollection.SelectedItem?.ToString() ?? string.Empty); + RefreshListBoxItems(); + } + + + /// + /// Обновление списка в listBoxCollection + /// + private void RefreshListBoxItems() + { + listBoxCollection.Items.Clear(); + for (int i = 0; i < _storageCollection.Keys?.Count; ++i) + { + string? colName = _storageCollection.Keys?[i]; + if (!string.IsNullOrEmpty(colName)) + { + listBoxCollection.Items.Add(colName); + } + } + } + + /// + /// Создание компании + /// + /// + /// + private void ButtonCreateCompany_Click(object sender, EventArgs e) + { + if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null) + { + MessageBox.Show("Коллекция не выбрана"); + return; + } + + ICollectionGenericObjects? collection = _storageCollection[listBoxCollection.SelectedItem.ToString() ?? string.Empty]; + if (collection == null) + { + MessageBox.Show("Коллекция не проинициализирована"); + return; + } + + switch (comboBoxSelectorCompany.Text) + { + case "Хранилище": + _company = new PlaneSharingService(pictureBox.Width, pictureBox.Height, collection); + break; + } + panelCompanyTools.Enabled = true; + RefreshListBoxItems(); + } +} \ No newline at end of file