From bd9378b2350e24227720136f68e2f27b5b7f169d Mon Sep 17 00:00:00 2001 From: ilyaryabovv Date: Sun, 4 Feb 2024 19:31:37 +0400 Subject: [PATCH 1/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 --- .../ProjectStormtrooper/DirectionType.cs | 24 ++ .../DrawingStormtrooper.cs | 210 ++++++++++++++++++ .../ProjectStormtrooper/EntityStormtrooper.cs | 75 +++++++ .../ProjectStormtrooper/Form1.Designer.cs | 39 ---- .../ProjectStormtrooper/Form1.cs | 10 - .../FormStormtrooper.Designer.cs | 135 +++++++++++ .../ProjectStormtrooper/FormStormtrooper.cs | 106 +++++++++ .../{Form1.resx => FormStormtrooper.resx} | 50 ++--- .../ProjectStormtrooper/Program.cs | 2 +- .../ProjectStormtrooper.csproj | 15 ++ .../Properties/Resources.Designer.cs | 103 +++++++++ .../Properties/Resources.resx | 133 +++++++++++ .../Resources/arrowDown.png | Bin 0 -> 2250 bytes .../Resources/arrowLeft.png | Bin 0 -> 2211 bytes .../Resources/arrowRight.png | Bin 0 -> 2165 bytes .../ProjectStormtrooper/Resources/arrowUp.png | Bin 0 -> 2099 bytes 16 files changed, 827 insertions(+), 75 deletions(-) create mode 100644 ProjectStormtrooper/ProjectStormtrooper/DirectionType.cs create mode 100644 ProjectStormtrooper/ProjectStormtrooper/DrawingStormtrooper.cs create mode 100644 ProjectStormtrooper/ProjectStormtrooper/EntityStormtrooper.cs delete mode 100644 ProjectStormtrooper/ProjectStormtrooper/Form1.Designer.cs delete mode 100644 ProjectStormtrooper/ProjectStormtrooper/Form1.cs create mode 100644 ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.Designer.cs create mode 100644 ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs rename ProjectStormtrooper/ProjectStormtrooper/{Form1.resx => FormStormtrooper.resx} (93%) create mode 100644 ProjectStormtrooper/ProjectStormtrooper/Properties/Resources.Designer.cs create mode 100644 ProjectStormtrooper/ProjectStormtrooper/Properties/Resources.resx create mode 100644 ProjectStormtrooper/ProjectStormtrooper/Resources/arrowDown.png create mode 100644 ProjectStormtrooper/ProjectStormtrooper/Resources/arrowLeft.png create mode 100644 ProjectStormtrooper/ProjectStormtrooper/Resources/arrowRight.png create mode 100644 ProjectStormtrooper/ProjectStormtrooper/Resources/arrowUp.png diff --git a/ProjectStormtrooper/ProjectStormtrooper/DirectionType.cs b/ProjectStormtrooper/ProjectStormtrooper/DirectionType.cs new file mode 100644 index 0000000..c1a12a6 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/DirectionType.cs @@ -0,0 +1,24 @@ +namespace ProjectStormtrooper; + +/// +/// Направление перемещения +/// +public enum DirectionType +{ + /// + /// Вверх + /// + Up = 1, + /// + /// Вниз + /// + Down = 2, + /// + /// Влево + /// + Left = 3, + /// + /// Вправо + /// + Right = 4 +} diff --git a/ProjectStormtrooper/ProjectStormtrooper/DrawingStormtrooper.cs b/ProjectStormtrooper/ProjectStormtrooper/DrawingStormtrooper.cs new file mode 100644 index 0000000..80ca03f --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/DrawingStormtrooper.cs @@ -0,0 +1,210 @@ + +namespace ProjectStormtrooper; +/// +/// Класс, отвечающий за прорисовку и перемещение объекта-сущности +/// +public class DrawingStormtrooper +{ + + public EntityStormtrooper? EntityStormtrooper { get; private set; } + + + /// + /// Ширина окна + /// + private int? _pictureWidth; + + /// + /// Высота окна + /// + private int? _pictureHeight; + + /// + /// Левая координата прорисовки бомбардировщика + /// + private int? _startPosX; + + /// + /// Верхняя кооридната прорисовки бомбардировщика + /// + private int? _startPosY; + + /// + /// Ширина прорисовки бомбардировщика + /// + private readonly int _drawningStormtrooperWidth = 140; + + /// + /// Высота прорисовки бомбардировщика + /// + private readonly int _drawningStormtrooperHeight = 135; + + /// + /// Инициализация свойств + /// + /// Скорость + /// Вес + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия двигателей + /// Признак наличия бомб + /// Признак наличия ракет + public void Init(int speed, double weight, Color bodyColor, Color + additionalColor, bool engines, bool bombs, bool rockets) + { + EntityStormtrooper = new EntityStormtrooper(); + EntityStormtrooper.Init(speed, weight, bodyColor, additionalColor, + engines, bombs, rockets); + _pictureWidth = null; + _pictureHeight = null; + _startPosX = null; + _startPosY = null; + } + + /// + /// Установка границ поля + /// + /// Ширина поля + /// Высота поля + /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах + public bool SetPictureSize(int width, int height) + { + // TODO проверка, что объект "влезает" в размеры поля + // если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена + if (width < _drawningStormtrooperWidth || height < _drawningStormtrooperHeight) return false; + _pictureWidth = width; + _pictureHeight = height; + return true; + } + /// + /// Установка позиции + /// + /// Координата X + /// Координата Y + public void SetPosition(int x, int y) + { + if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) + { + return; + } + // TODO если при установке объекта в эти координаты, он будет "выходить" за границы формы + // то надо изменить координаты, чтобы он оставался в этих границах + if (x + _drawningStormtrooperWidth > _pictureWidth) + { + _startPosX = x - (x + _drawningStormtrooperWidth - _pictureWidth); + } + else + { + _startPosX = x; + } + + if (y + _drawningStormtrooperHeight > _pictureHeight) + { + _startPosY = y - (y + _drawningStormtrooperHeight - _pictureHeight); + } + else + { + _startPosY = y; + } + } + + /// + /// Изменение направления перемещения + /// + /// Направление + /// true - перемещене выполнено, false - перемещение невозможно + public bool MoveTransport(DirectionType direction) + { + if (EntityStormtrooper == null || !_startPosX.HasValue || + !_startPosY.HasValue) + { + return false; + } + switch (direction) + { + //влево + case DirectionType.Left: + if (_startPosX.Value - EntityStormtrooper.Step > 0) + { + _startPosX -= (int)EntityStormtrooper.Step; + } + return true; + //вверх + case DirectionType.Up: + if (_startPosY.Value - EntityStormtrooper.Step > 0) + { + _startPosY -= (int)EntityStormtrooper.Step; + } + return true; + // вправо + case DirectionType.Right: + //TODO прописать логику сдвига в право + if (_startPosX + _drawningStormtrooperWidth + EntityStormtrooper.Step < _pictureWidth) + { + _startPosX += (int)EntityStormtrooper.Step; + }; + return true; + //вниз + case DirectionType.Down: + //TODO прописать логику сдвига в вниз + if (_startPosY + _drawningStormtrooperHeight + EntityStormtrooper.Step < _pictureHeight) + { + _startPosY += (int)EntityStormtrooper.Step; + } + return true; + default: + return false; + } + } + /// + /// Прорисовка объекта + /// + /// + public void DrawTransport(Graphics g) + { + if (EntityStormtrooper == null || !_startPosX.HasValue || + !_startPosY.HasValue) + { + return; + } + Pen pen = new(Color.Black); + Brush additionalBrush = new SolidBrush(EntityStormtrooper.AdditionalColor); + //Тело бомбардировщика + g.DrawRectangle(pen, _startPosX.Value + 20, _startPosY.Value + 60, 120, 20); + //Задние крылья бомбардировщика + g.DrawLine(pen, _startPosX.Value + 140, _startPosY.Value + 30, _startPosX.Value + 140, _startPosY.Value + 110); + g.DrawLine(pen, _startPosX.Value + 140, _startPosY.Value + 110, _startPosX.Value + 120, _startPosY.Value + 90); + g.DrawLine(pen, _startPosX.Value + 120, _startPosY.Value + 90, _startPosX.Value + 120, _startPosY.Value + 80); + g.DrawLine(pen, _startPosX.Value + 140, _startPosY.Value + 30, _startPosX.Value + 120, _startPosY.Value + 50); + g.DrawLine(pen, _startPosX.Value + 120, _startPosY.Value + 50, _startPosX.Value + 120, _startPosY.Value + 60); + //Крылья бомбардировщика + g.DrawLine(pen, _startPosX.Value + 50, _startPosY.Value, _startPosX.Value + 50, _startPosY.Value + 60); + g.DrawLine(pen, _startPosX.Value + 50, _startPosY.Value + 80, _startPosX.Value + 50, _startPosY.Value + 135); + g.DrawLine(pen, _startPosX.Value + 50, _startPosY.Value + 135, _startPosX.Value + 60, _startPosY.Value + 135); + g.DrawLine(pen, _startPosX.Value + 60, _startPosY.Value + 135, _startPosX.Value + 65, _startPosY.Value + 80); + g.DrawLine(pen, _startPosX.Value + 50, _startPosY.Value, _startPosX.Value + 60, _startPosY.Value); + g.DrawLine(pen, _startPosX.Value + 60, _startPosY.Value, _startPosX.Value + 65, _startPosY.Value + 60); + ///Нос бомбардировщика + Point[] Nose = new Point[3]; + Nose[0].X = _startPosX.Value + 20; Nose[0].Y = _startPosY.Value + 80; + Nose[1].X = _startPosX.Value; Nose[1].Y = _startPosY.Value + 70; + Nose[2].X = _startPosX.Value + 20; Nose[2].Y = _startPosY.Value + 60; + g.FillPolygon(additionalBrush, Nose); + //Ракеты бомбардировщика + if (EntityStormtrooper.Rockets) + { + g.FillRectangle(additionalBrush, _startPosX.Value + 35, _startPosY.Value + 20, 15, 5); + g.FillRectangle(additionalBrush, _startPosX.Value + 35, _startPosY.Value + 110, 15, 5); + + } + //Бомбы бомбардировщика + if (EntityStormtrooper.Bombs) + { + g.FillRectangle(additionalBrush, _startPosX.Value + 40, _startPosY.Value + 40, 10, 10); + g.FillRectangle(additionalBrush, _startPosX.Value + 40, _startPosY.Value + 90, 10, 10); + } + } +} + + + diff --git a/ProjectStormtrooper/ProjectStormtrooper/EntityStormtrooper.cs b/ProjectStormtrooper/ProjectStormtrooper/EntityStormtrooper.cs new file mode 100644 index 0000000..8eef6d4 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/EntityStormtrooper.cs @@ -0,0 +1,75 @@ +namespace ProjectStormtrooper; + +/// +/// Класс-сущность "Бомбардировщик" +/// +public class EntityStormtrooper +{ + + /// + /// Скорость + /// + 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 Engines { get; private set; } + + /// + /// Признак (опция) наличия ракет + /// + public bool Rockets { get; private set; } + + /// + /// Признак (опция) наличия бомб + /// + public bool Bombs { get; private set; } + + /// + /// Шаг перемещения бомбардировщика + /// + public double Step => Speed * 100 / Weight; + + + + /// + /// Инициализация полей объекта-класса спортивного автомобиля + /// + /// Скорость + /// Вес автомобиля + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия двигателей + /// Признак наличия бомб + /// Признак наличия ракет + public void Init(int speed, double weight, Color bodyColor, Color + additionalColor, bool engines, bool bombs, bool rockets) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + AdditionalColor = additionalColor; + Engines = engines; + Bombs = bombs; + Rockets = rockets; + } +} + + diff --git a/ProjectStormtrooper/ProjectStormtrooper/Form1.Designer.cs b/ProjectStormtrooper/ProjectStormtrooper/Form1.Designer.cs deleted file mode 100644 index 68d6185..0000000 --- a/ProjectStormtrooper/ProjectStormtrooper/Form1.Designer.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace ProjectStormtrooper -{ - 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/ProjectStormtrooper/ProjectStormtrooper/Form1.cs b/ProjectStormtrooper/ProjectStormtrooper/Form1.cs deleted file mode 100644 index 638b855..0000000 --- a/ProjectStormtrooper/ProjectStormtrooper/Form1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace ProjectStormtrooper -{ - public partial class Form1 : Form - { - public Form1() - { - InitializeComponent(); - } - } -} \ No newline at end of file diff --git a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.Designer.cs b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.Designer.cs new file mode 100644 index 0000000..42787eb --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.Designer.cs @@ -0,0 +1,135 @@ +namespace ProjectStormtrooper +{ + partial class FormStormtrooper + { + /// + /// 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() + { + buttonCreateStormtrooper = new Button(); + buttonUp = new Button(); + buttonRight = new Button(); + buttonDown = new Button(); + buttonLeft = new Button(); + pictureBoxStormtrooper = new PictureBox(); + ((System.ComponentModel.ISupportInitialize)pictureBoxStormtrooper).BeginInit(); + SuspendLayout(); + // + // buttonCreateStormtrooper + // + buttonCreateStormtrooper.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateStormtrooper.Location = new Point(35, 693); + buttonCreateStormtrooper.Name = "buttonCreateStormtrooper"; + buttonCreateStormtrooper.Size = new Size(126, 32); + buttonCreateStormtrooper.TabIndex = 0; + buttonCreateStormtrooper.Text = "Создать"; + buttonCreateStormtrooper.UseVisualStyleBackColor = true; + buttonCreateStormtrooper.Click += buttonCreate_Click; + // + // buttonUp + // + buttonUp.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonUp.BackgroundImage = Properties.Resources.arrowUp; + buttonUp.BackgroundImageLayout = ImageLayout.Stretch; + buttonUp.Location = new Point(1130, 633); + buttonUp.Name = "buttonUp"; + buttonUp.Size = new Size(35, 35); + buttonUp.TabIndex = 1; + buttonUp.UseVisualStyleBackColor = true; + buttonUp.Click += ButtonMove_Click; + // + // buttonRight + // + buttonRight.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonRight.BackgroundImage = Properties.Resources.arrowRight; + buttonRight.BackgroundImageLayout = ImageLayout.Stretch; + buttonRight.Location = new Point(1171, 674); + buttonRight.Name = "buttonRight"; + buttonRight.Size = new Size(35, 35); + buttonRight.TabIndex = 2; + buttonRight.UseVisualStyleBackColor = true; + buttonRight.Click += ButtonMove_Click; + // + // buttonDown + // + buttonDown.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonDown.BackgroundImage = Properties.Resources.arrowDown; + buttonDown.BackgroundImageLayout = ImageLayout.Stretch; + buttonDown.Location = new Point(1130, 674); + buttonDown.Name = "buttonDown"; + buttonDown.Size = new Size(35, 35); + buttonDown.TabIndex = 3; + buttonDown.UseVisualStyleBackColor = true; + buttonDown.Click += ButtonMove_Click; + // + // buttonLeft + // + buttonLeft.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonLeft.BackgroundImage = Properties.Resources.arrowLeft; + buttonLeft.BackgroundImageLayout = ImageLayout.Stretch; + buttonLeft.Location = new Point(1089, 674); + buttonLeft.Name = "buttonLeft"; + buttonLeft.Size = new Size(35, 35); + buttonLeft.TabIndex = 4; + buttonLeft.UseVisualStyleBackColor = true; + buttonLeft.Click += ButtonMove_Click; + // + // pictureBoxStormtrooper + // + pictureBoxStormtrooper.Dock = DockStyle.Fill; + pictureBoxStormtrooper.Location = new Point(0, 0); + pictureBoxStormtrooper.Name = "pictureBoxStormtrooper"; + pictureBoxStormtrooper.Size = new Size(1260, 737); + pictureBoxStormtrooper.TabIndex = 5; + pictureBoxStormtrooper.TabStop = false; + pictureBoxStormtrooper.Click += ButtonMove_Click; + // + // FormStormtrooper + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1260, 737); + Controls.Add(buttonLeft); + Controls.Add(buttonDown); + Controls.Add(buttonRight); + Controls.Add(buttonUp); + Controls.Add(buttonCreateStormtrooper); + Controls.Add(pictureBoxStormtrooper); + Name = "FormStormtrooper"; + Text = "Бомбардировщик"; + ((System.ComponentModel.ISupportInitialize)pictureBoxStormtrooper).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Button buttonCreateStormtrooper; + private Button buttonUp; + private Button buttonRight; + private Button buttonDown; + private Button buttonLeft; + private PictureBox pictureBoxStormtrooper; + } +} \ No newline at end of file diff --git a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs new file mode 100644 index 0000000..b5e1126 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs @@ -0,0 +1,106 @@ + +namespace ProjectStormtrooper +{ + /// + /// Форма работы с объектом "Бомбардировщик" + /// + public partial class FormStormtrooper : Form + { + /// + /// Поле-объект для прорисовки объекта + /// + private DrawingStormtrooper? _drawningStormtrooper; + + /// + /// Конструктор формы + /// + public FormStormtrooper() + { + InitializeComponent(); + } + + + /// + /// Метод прорисовки бомбардировщика + /// + private void Draw() + { + if (_drawningStormtrooper == null) + { + return; + } + Bitmap bmp = new(pictureBoxStormtrooper.Width, + pictureBoxStormtrooper.Height); + Graphics gr = Graphics.FromImage(bmp); + _drawningStormtrooper.DrawTransport(gr); + pictureBoxStormtrooper.Image = bmp; + } + + /// + /// Обработка нажатия кнопки "Создать" + /// + /// + /// + private void buttonCreate_Click(object sender, EventArgs e) + { + Random random = new(); + _drawningStormtrooper = new DrawingStormtrooper(); + + _drawningStormtrooper.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))); + _drawningStormtrooper.SetPictureSize(pictureBoxStormtrooper.Width, + pictureBoxStormtrooper.Height); + _drawningStormtrooper.SetPosition(random.Next(10, 100), random.Next(10, + 100)); + Draw(); + + } + + + + /// + /// Перемещение объекта по форме (нажатие кнопок навигации) + /// + /// + /// + private void ButtonMove_Click(object sender, EventArgs e) + { + if (_drawningStormtrooper == null) + { + return; + } + string name = ((Button)sender)?.Name ?? string.Empty; + bool result = false; + switch (name) + { + case "buttonUp": + result = + _drawningStormtrooper.MoveTransport(DirectionType.Up); + break; + case "buttonDown": + result = + _drawningStormtrooper.MoveTransport(DirectionType.Down); + break; + case "buttonLeft": + result = + _drawningStormtrooper.MoveTransport(DirectionType.Left); + break; + case "buttonRight": + result = + _drawningStormtrooper.MoveTransport(DirectionType.Right); + break; + } + if (result) + { + Draw(); + } + } + + } +} diff --git a/ProjectStormtrooper/ProjectStormtrooper/Form1.resx b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.resx similarity index 93% rename from ProjectStormtrooper/ProjectStormtrooper/Form1.resx rename to ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.resx index 1af7de1..af32865 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/Form1.resx +++ b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.resx @@ -1,17 +1,17 @@  - diff --git a/ProjectStormtrooper/ProjectStormtrooper/Program.cs b/ProjectStormtrooper/ProjectStormtrooper/Program.cs index 763f0aa..3db6e41 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/Program.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/Program.cs @@ -11,7 +11,7 @@ namespace ProjectStormtrooper // 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 FormStormtrooper()); } } } \ No newline at end of file diff --git a/ProjectStormtrooper/ProjectStormtrooper/ProjectStormtrooper.csproj b/ProjectStormtrooper/ProjectStormtrooper/ProjectStormtrooper.csproj index e1a0735..244387d 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/ProjectStormtrooper.csproj +++ b/ProjectStormtrooper/ProjectStormtrooper/ProjectStormtrooper.csproj @@ -8,4 +8,19 @@ enable + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + \ No newline at end of file diff --git a/ProjectStormtrooper/ProjectStormtrooper/Properties/Resources.Designer.cs b/ProjectStormtrooper/ProjectStormtrooper/Properties/Resources.Designer.cs new file mode 100644 index 0000000..572fd94 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/Properties/Resources.Designer.cs @@ -0,0 +1,103 @@ +//------------------------------------------------------------------------------ +// +// Этот код создан программой. +// Исполняемая версия:4.0.30319.42000 +// +// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +// повторной генерации кода. +// +//------------------------------------------------------------------------------ + +namespace ProjectStormtrooper.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("ProjectStormtrooper.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 arrowDown { + get { + object obj = ResourceManager.GetObject("arrowDown", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrowLeft { + get { + object obj = ResourceManager.GetObject("arrowLeft", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrowRight { + get { + object obj = ResourceManager.GetObject("arrowRight", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrowUp { + get { + object obj = ResourceManager.GetObject("arrowUp", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/ProjectStormtrooper/ProjectStormtrooper/Properties/Resources.resx b/ProjectStormtrooper/ProjectStormtrooper/Properties/Resources.resx new file mode 100644 index 0000000..dc6b4c5 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/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\arrowDown.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\arrowLeft.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\arrowRight.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\arrowUp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/ProjectStormtrooper/ProjectStormtrooper/Resources/arrowDown.png b/ProjectStormtrooper/ProjectStormtrooper/Resources/arrowDown.png new file mode 100644 index 0000000000000000000000000000000000000000..770f129f939b25e72ab9f448d43e922da1ea9037 GIT binary patch literal 2250 zcmd6p+f!3l6vl%FNJ0T~B34i&ghs~1phXNdh;Sra5(LlDLkyt`8H$!rC`e-=D8&$g zAY!LB5mf3Sc-dy6jYtq3@Dj#isaQu67!WE}X-zUfYrWM==}G^EzWA_aeQWJ+e)G+K z*;|XGC;QTZXe1KJSCk^$L?U@)5GA2_5u1@Fzbc}6lx|91Pdaydv4a@MJK!{!L^^-a z=Z)Nxn5o4nnWZF>U$477`aTDrkVuqlkr2kpwoQ#^m5vG))}Y^X%+7j8YX%PAjTNO* zYKJ@h3I5FZr+k#2{YZk{IpZ1{4%cx?ao)qYvZ7NlaN+5{6aQYTAQXxD}jM}ACSV=#aG z42|^zg<#S6uwpU=F!3$S&|6nRzj@rK-ZR^OTH#|IAQM_mwL&Zt-EgT6U!D z?e}xH%RP(iG9-1?4x^PeX1IatPgMd)G7)sv%Muk}XPK_CdES<&_uXpESwaQ6RdOuZ z619j>@eVdP=>QAl`z}43Z@ar2+i$iWQ~4+yEMuZn9uezh`GP^%R@QE-mR+t_&?O7A zeujDDi53dC;miwMAJHb$1pE-W9!b53@~pJng#^y!#$7o;;Pw!>^~aNZ6oGDB>xwWh z%X@Czom#Y7R^!HfdhaI8>viKg@}J`RP&aNgG6DI??8X%~u|eKrH?DACzAf^R8#AkAr`$N{&@GrZ=*BJ2eU9swxpD0Z-qefNgM;0t4iJu;FBw=t z{u4K|kK)`hm`r%bl95@qF+5->`)XzL;$k)&yAg{kD=()@y3}}O8aB%^6*uGCmKt|Z zxW~f5eTIDng}Zwx7^d5OGy#V6OEc^7qK#NI z%XEUOSR_;?SjF{tX95~+{3nRb4=k;z)z8`Nk(2XjRzpfI>=U8r|8w_SYQufqPoV&mN>(xhrHzw{#=B` zgqlj}wo0ucS)=q*k4B?Y4d%u)Rc$aY_CxWU|+hV+FS=R!k#s&lbWiC9M$z%8}F zZ-ew66O_{J*Qu^fvT~h4;2|Hc!EcMO@KBQrvXyI{LX9$5Er>>28q5)?2;EMlx+2Ls zmhliYv>cxFM_ZcA+bNt7t@9Dbq%MwwCqFmTuN?catE3S;NoN-2cE79#PvTm;8cTkK z&`HMiu3Inv2u3GEtR>%-JP0!MXU=)j{O5$s(0^F-DEi?wo=~@cyMH~tlZ#GfU8qS! zF4cmax{*0yU@R58G`hT%jx7l_j(zfUg2FinWfbuhWn>*0os4MnOhH8SjA_2Oj;#9t zoeb^q79k==#*(3eCbEuQ$D#LlijmBE01c)BVxi@rXT4LA%p(9AR&>{&d&`6Qn2KqPa?DiGI6Y;m7(qI=DqsSx4U73-FMHj{)IW1S Y*6h|6>=}Pf{69#d#B|}g^*QQ)0ltJv$^ZZW literal 0 HcmV?d00001 diff --git a/ProjectStormtrooper/ProjectStormtrooper/Resources/arrowLeft.png b/ProjectStormtrooper/ProjectStormtrooper/Resources/arrowLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..98438bc5bbbf92ba598c54263fb7645bde6bc8d2 GIT binary patch literal 2211 zcmb`J?N<|L8pZ=Um>CTugaKC;PaqKOj8q#06kkdp6hVkY2^lL`a#Yl&s6kt_A}UQ} zFr~ggTq+_uEE>`|acXNF=t}8Gj~qO^MPMnYTP4<71#uVD6{N7w!#}WJ`eCj-FW2v$ z`{bNlcgiw!$r5Z1CK8DxDXX+=MIx^(@EF8C;NPy6}{Zl}&Vbn9gEq%!vI z2RHM(7E2esyFa2P>N+=3{=9FK?osSLk$9wF)JH*c-qYn-hjIl>nnrn*pk(|a6Czfz zqVKJ^qUsO5+!Fg}Wc0r?h-KF#jc;sidMj_?!h=H(E?v5GPj|8FA@=@%THE(1nP+uz zMSnYznijjR+*v$1@p}QXLQHniL=H->qlp@n?AJPmtd0x@6H*m=+j~}rl)(;)$u)Ar zt7>jIKyN#UlGSBIk&f!qX7MV2zrU4E9>uqtfCpm8^s&23J#dxuLg~3skvw%`!!%X7(=;-aYOV zzO-JMt+zcu&7lltmiB~c@t#l?p$RsLs*oF~W1LFm;#8(|&{vLd8UVMg(SOq0UZCbM z23smN`!m=+vDur!8pQ)1Ej}#kv6T_OgtPXz+8-G#1sy1PC-c3Hq(-CZc{~&!j)mqUs>f$SP?T84=(zid;%`EeB}o&s-OP+xijHFOi?m}t>_)D zp^4|Fu0n;Y!=7K8mU+Im>yD>(;ntF}C;4v|kMn2lAH$X@*$SHYAZiESSC~xA17Dx+ z<$}J6Tn3vTuh1htxH!z!GFhoOR^e*dnrTw%5x4$`M2quDA#=lB zEye(k7lYkRj2Hr&Yn2{f23wvG*$m8e0S|oi$Tu0~q!#Z@UAi*V)e_bHV45B|Td#OV z6H-mmn_8S^!gm7gZdNgv)|?ZdNAk99z=3XG9|-h)V-QfYVYVK5*>OS5V1xDP+d;Y2 z_S5QuJoz|l?!80sNFu7*I?Um&pgxC-itFsPS{0Nj@M7{JGGT?Vk?iwFS6=iRgc zc<>YkV0?ibz%B{`nFV_R;QX}%02#MT066DL6acX0+fo2L`A7nQkikFzH1$RRV2^qQ z)Tn5vizA^%Pn`$Og`SzvpEfaqol}CJdf=R%kB=$xNajtlO26u7qT9J zz4(!|AaSSX^k}jV@3>Ii@6CgMMVJg zw}quo8CT)Z@z461z|qpa_6Ts~8n#~tg*m1h8maU#SeX5*7W%XFDp;7DKZVsfrmz#K z5W7Er3&eI=J0aG)VH9G64M`At**S&n-!_Hy-L}EkTsQ@dRrUGMk+&@bHnQz0tRYRI z7PjJa82b#YHPqXn_8=c8ikiwl|=iW@nKJRPF zq4@-f&@|g(8@GO_@nDVU0Mm*O`-9{mVe-h0ZON2eYHR}$1~ie9%ZzOrszPR@YB^Q7 zn~MQ)mJQ>qiWg2>qnBE2FT`dq4`!D2gtfx_v(Y50q3kl_lCxZ3xO>+E5SZC8FahwE z^~w^9?RV5X&4a!6?@_hFge|AZ!9=QBW~^F61^XMTR#VkLlc`|2u?n2ajr2U0Cc%g+ z_BVq39#^@giPWf_7e=g(gEYB3nHsI+g^z@Gg9p0t2R zaKP#)rOBdnY9Ht$Uuai(u%FlwU8tVRcDd+!Ac7Kp5qLMG+ z)Q9=b8cuEFJ3r^t<$R}uQ#<(16P&t+?=0so+mBiB4R9jz=nU~MWqrTim`5#Ggh=~9I literal 0 HcmV?d00001 diff --git a/ProjectStormtrooper/ProjectStormtrooper/Resources/arrowRight.png b/ProjectStormtrooper/ProjectStormtrooper/Resources/arrowRight.png new file mode 100644 index 0000000000000000000000000000000000000000..8878515bccfaf3f2bb7831c91746848855c9e404 GIT binary patch literal 2165 zcmcJR{Z|ub7RLi6I!Tr0#c7X}ZbL*ud9=P%tfFEFL0*iJ(8(~+lyz31P*gyK;tShG zCrd_IU{^fLVXd~=9yS|?>137>1toUe>g%4D+n*;(d1nJj{a$4<e{8qC@uZ=wt!M) zVImGHka0OHClUnNg`XwaR`-$PQLJ=W${QJIKa5ThsLPEIf$qA|X$4x!qn8wDCy!1; z9KJ)GN1tL*0s!yG8O2n zG{;&KbITeW?B&R4RsOv=p{mtCMY68BZgf&j*SGq2ACUsu{$mv!c_Lms5HF~Vj=fu% zIJbZ5kCI7OU816i1d%`%o!F~D7QNU2j2AZm6U2uES^{w(#DNe8CWzAtblm8u(9&yo z|HxvYN?+ZT&D<&u7Pd%%IsIp!W?fs{70(5f&#FgbICAwO@dpLkk>#k-(%0JjlZypu zMfH_zhOG&9v`D7NV8;>3qzQI3N+x}<ucoAO4slHQG^_DBd9c zq^1*%jv2j>%lYr6Gw-RYZ-QV&a9=9xI@mw$2q-i7@LrBoYDa4bw7?*S6=;=CtN_M| zVFInvixt2{;`gr=74=>zFG#F%I5XdR_0F4uNBPag4`gM7oyEUkT^IXnqgmHvfAR?_ zG8kiFoG1H}o2AIN+!ga!`6InJq@~B75B?a-%0wqCH)HzJF~xnrH5n6rC93N1Rg?5M zMcz&l`tJDtZfBfJsl%tF$QxcwJ}d9eixUIN9R~b@Yk89(kh%mAY^zv^1^@mK3l^-z zT=ii;kXnhkr>+HByl^)bT6}Rm8CtyGjVH>g?12`!0V}k4x9PQDl3;vc9Tx1q+6;ol z?<@qtUV0(~~pwR0 z=QuL)j({uLYD%fOtUPD!I$T)tjcPcJacb&#+-l#tj9L|~JA2auveuDiEXyh%#j^KL z*I-%RKQ~}md9fSUD+_R;)N8?o*9yCF;SRJN7k0NLmn@CAV##;62U>dmlFG_EpSATmUaZWA z1G?PagL9TISKzn3vgfyWEdN#9m>8ZNl{HU4gST7=wp@LO_t6%{`Db_NJS^J1MFycS z-8{XTl}BrbhhTrZy}yS1-}q1iNBWO=$F?%gWqfD_Z1x@{X{@?6#xZ%%%Sbw!zzpJ82B_%~9)z_i21!N3;#_F@C0uz@vsCk=w6wsoa3tkzT5 z2##mQj(3!QV?#h`&$#TH3{MKTsD49ueTt7yhd{RA{p`_**2g@TFNA+Dj@ zAr6GN7TnlJpeT)f4(rl+2EhR%%*ST1dHcY;??>4tV!+(_q#gpTH&Q<|Nr5!aU_Lf~ zJ2roVZK5ckd{bp_R?!a*dUv-;0fYHiCV{@v`PS#aO=810$@A`{Aq`!hN%1=2{w9jo z3-@yr)eF6o)q@)Fc$h1&~6d+yW(D01=c_1{ZQ6AR)mwbn()5Rn)?Wj+n|sDMA)V z1dCH$qgI%>R$aCMA`}E#(I%sG0^(>PAlB*74k|&Y)+%>TJ)n*3WL&*rpLxrUuXJNY3{!)-!bp5J0Nf9^wfJi z0?jy=ycRv~<+r(|wGlFwexB;V4W%HM;BX`Vk<0Wl_fOnr;3n}znRk;d_cWP1c7WlZ zNAb1JxtO!|Oc{}>%reASK?HT8J?Vr!Q$%FOZ1SLmFzUp!U4d0NM~d@vVZXe=DC+Er zC28oydcxWCf@87m3(!ogI#`o~Bpb+mN6uG9TZP#m`R6<51bJUXQbM=&I(w;tr}ZiM zY!t&IjN%%SzX~nbLpW!ss`bdd<7C@66hn~rBAj}1QQw8(DMs;kkNL|`Q8qA51&C3R z5}4dU@1r6aFinO;p&}TV0!0~i=Xoh!b2K0vo!}A9bh-C2TN_Tc-FrOF%j@K7lTM4) z*qs{*XJLDl9LY}y`30`)tfg5daqX>;0JMOuDd54cZVCT1k$*&ly&72Cr2ySo>xvT= z_eM~MvewKbyjRTA7W3;0228C|yqtAI^6-X&a7Mp%`DpjERLz7hS~_t5b<4=q{E>W< z_!_J5=JV(6HkAtShT_nMuSk_j{W8q@oIh-0yL&O6ijc&>Db=BoMr$*7hQby2W;%!a8C#yVtAxqO2*V z!VQ&@Md-8w1oMZwSw*qLSe<21iOh3{A+9pdIW^+YQH;gew?4sqwMx&(-x4FV78B1KxcLhm1AXp?rZbwtm z0&o|b-Aw4i;euGZK17pZvb3#6Q)lgWv*S?`a^5Bgr}ya)meS&BXIrQ+lH3 zOUue&bc+If$OSt@)_#*at(5pG%cP{A4My^FuztBMr zvPUo+%=ACWbCsLiiz_)(tf`&ET!qD+WS=vWy#i2LXL}PxwKDxzVp`zoZ{OiNHKg$e zqkRKtLlRZVnLm?g-5}Sh#{(0pbv-0UEG+7@srr+BZ?rq7pOJsC!;i)jI zL!nilJ9)<;*}otJC0iYI@3~HmL$aL~^nvkKhm01?ckB|dAOyu&9a37jqOnV)v~V*n z4Y^OxK$ksmj7jMI+uTA|Ck+(1X~fo9M_KGbNp;5-y7J-O<<@3;ecUA#x?4c=bnDnf zwKU+8CL&4pP+}3m6Eo73rrjDiW!xjs=WSA{XhWF)9>* zU1XwX98-r`MX7+XUqpXwB4XpTnPs_THk*ICB8Y8;H+;MGNqoD!>ey5BNcrJVjVFt* z{onmpo?!W7{ng%&e<+KMjm@F&Q<==uJQ6&*O8?Ldz^Ih|o8807$yBk2d`w Date: Mon, 5 Feb 2024 17:58:20 +0400 Subject: [PATCH 2/9] =?UTF-8?q?=D0=92=D0=BD=D0=B5=D1=81=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=B2=20=D0=BA=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DrawingStormtrooper.cs | 34 +++++++++++++++---- .../ProjectStormtrooper/EntityStormtrooper.cs | 4 --- .../ProjectStormtrooper/FormStormtrooper.cs | 13 ++----- 3 files changed, 31 insertions(+), 20 deletions(-) diff --git a/ProjectStormtrooper/ProjectStormtrooper/DrawingStormtrooper.cs b/ProjectStormtrooper/ProjectStormtrooper/DrawingStormtrooper.cs index 80ca03f..9e88c65 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/DrawingStormtrooper.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/DrawingStormtrooper.cs @@ -1,14 +1,10 @@ - -namespace ProjectStormtrooper; +namespace ProjectStormtrooper; /// /// Класс, отвечающий за прорисовку и перемещение объекта-сущности /// public class DrawingStormtrooper { - public EntityStormtrooper? EntityStormtrooper { get; private set; } - - /// /// Ширина окна /// @@ -74,6 +70,25 @@ public class DrawingStormtrooper if (width < _drawningStormtrooperWidth || height < _drawningStormtrooperHeight) return false; _pictureWidth = width; _pictureHeight = height; + if (_startPosX != null && _startPosY != null) + { + if (_startPosX + _drawningStormtrooperWidth > _pictureWidth) + { + _startPosX = -_drawningStormtrooperWidth + _pictureWidth; + } + else if (_startPosX < 0) + { + _startPosX = 0; + } + if (_startPosY + _drawningStormtrooperHeight > _pictureHeight) + { + _startPosY = -_drawningStormtrooperHeight + _pictureHeight; + } + else if (_startPosY < 0) + { + _startPosY = 0; + } + } return true; } /// @@ -93,15 +108,22 @@ public class DrawingStormtrooper { _startPosX = x - (x + _drawningStormtrooperWidth - _pictureWidth); } + else if (x < 0) + { + _startPosX = 0; + } else { _startPosX = x; } - if (y + _drawningStormtrooperHeight > _pictureHeight) { _startPosY = y - (y + _drawningStormtrooperHeight - _pictureHeight); } + else if (y < 0) + { + _startPosY = 0; + } else { _startPosY = y; diff --git a/ProjectStormtrooper/ProjectStormtrooper/EntityStormtrooper.cs b/ProjectStormtrooper/ProjectStormtrooper/EntityStormtrooper.cs index 8eef6d4..8ee508f 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/EntityStormtrooper.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/EntityStormtrooper.cs @@ -5,7 +5,6 @@ /// public class EntityStormtrooper { - /// /// Скорость /// @@ -26,7 +25,6 @@ public class EntityStormtrooper /// public Color AdditionalColor { get; private set; } - /// /// Признак (опция) наличия двигателей /// @@ -47,8 +45,6 @@ public class EntityStormtrooper /// public double Step => Speed * 100 / Weight; - - /// /// Инициализация полей объекта-класса спортивного автомобиля /// diff --git a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs index b5e1126..cbc6efa 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs @@ -1,5 +1,4 @@ - -namespace ProjectStormtrooper +namespace ProjectStormtrooper { /// /// Форма работы с объектом "Бомбардировщик" @@ -45,7 +44,6 @@ namespace ProjectStormtrooper { Random random = new(); _drawningStormtrooper = new DrawingStormtrooper(); - _drawningStormtrooper.Init(random.Next(100, 300), random.Next(1000, 3000), Color.FromArgb(random.Next(0, 256), random.Next(0, 256), @@ -54,16 +52,12 @@ namespace ProjectStormtrooper random.Next(0, 256)), Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2))); - _drawningStormtrooper.SetPictureSize(pictureBoxStormtrooper.Width, - pictureBoxStormtrooper.Height); - _drawningStormtrooper.SetPosition(random.Next(10, 100), random.Next(10, - 100)); + _drawningStormtrooper.SetPictureSize(pictureBoxStormtrooper.Width,pictureBoxStormtrooper.Height); + _drawningStormtrooper.SetPosition(random.Next(10, 100), random.Next(10,100)); Draw(); } - - /// /// Перемещение объекта по форме (нажатие кнопок навигации) /// @@ -101,6 +95,5 @@ namespace ProjectStormtrooper Draw(); } } - } } From 701a08c5833771f7b9dee40291e1b72d06798eef Mon Sep 17 00:00:00 2001 From: ilyaryabovv Date: Mon, 5 Feb 2024 19:47:44 +0400 Subject: [PATCH 3/9] =?UTF-8?q?=D0=95=D1=89=D1=91=20=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ProjectStormtrooper/ProjectStormtrooper/DrawingStormtrooper.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ProjectStormtrooper/ProjectStormtrooper/DrawingStormtrooper.cs b/ProjectStormtrooper/ProjectStormtrooper/DrawingStormtrooper.cs index 9e88c65..9b31d37 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/DrawingStormtrooper.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/DrawingStormtrooper.cs @@ -190,6 +190,7 @@ public class DrawingStormtrooper return; } Pen pen = new(Color.Black); + Brush bodyColorBrush = new SolidBrush(EntityStormtrooper.BodyColor); Brush additionalBrush = new SolidBrush(EntityStormtrooper.AdditionalColor); //Тело бомбардировщика g.DrawRectangle(pen, _startPosX.Value + 20, _startPosY.Value + 60, 120, 20); @@ -211,7 +212,7 @@ public class DrawingStormtrooper Nose[0].X = _startPosX.Value + 20; Nose[0].Y = _startPosY.Value + 80; Nose[1].X = _startPosX.Value; Nose[1].Y = _startPosY.Value + 70; Nose[2].X = _startPosX.Value + 20; Nose[2].Y = _startPosY.Value + 60; - g.FillPolygon(additionalBrush, Nose); + g.FillPolygon(bodyColorBrush, Nose); //Ракеты бомбардировщика if (EntityStormtrooper.Rockets) { From d70125006c20f1645e6b63d741a8fbb5479877ed Mon Sep 17 00:00:00 2001 From: ilyaryabovv Date: Sat, 17 Feb 2024 19:33:33 +0400 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 | 0 .../Drawnings/DrawingStormtrooper.cs | 56 +++++++++++ .../DrawningBaseStormtrooper.cs} | 97 +++++++++---------- .../Entities/EntityBaseStormtrooper.cs | 40 ++++++++ .../Entities/EntityStormtrooper.cs | 41 ++++++++ .../ProjectStormtrooper/EntityStormtrooper.cs | 71 -------------- .../FormStormtrooper.Designer.cs | 22 ++++- .../ProjectStormtrooper/FormStormtrooper.cs | 69 ++++++++----- 8 files changed, 248 insertions(+), 148 deletions(-) rename ProjectStormtrooper/ProjectStormtrooper/{ => Drawnings}/DirectionType.cs (100%) create mode 100644 ProjectStormtrooper/ProjectStormtrooper/Drawnings/DrawingStormtrooper.cs rename ProjectStormtrooper/ProjectStormtrooper/{DrawingStormtrooper.cs => Drawnings/DrawningBaseStormtrooper.cs} (74%) create mode 100644 ProjectStormtrooper/ProjectStormtrooper/Entities/EntityBaseStormtrooper.cs create mode 100644 ProjectStormtrooper/ProjectStormtrooper/Entities/EntityStormtrooper.cs delete mode 100644 ProjectStormtrooper/ProjectStormtrooper/EntityStormtrooper.cs diff --git a/ProjectStormtrooper/ProjectStormtrooper/DirectionType.cs b/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DirectionType.cs similarity index 100% rename from ProjectStormtrooper/ProjectStormtrooper/DirectionType.cs rename to ProjectStormtrooper/ProjectStormtrooper/Drawnings/DirectionType.cs diff --git a/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DrawingStormtrooper.cs b/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DrawingStormtrooper.cs new file mode 100644 index 0000000..edd944e --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DrawingStormtrooper.cs @@ -0,0 +1,56 @@ +using ProjectStormtrooper.Entities; +namespace ProjectStormtrooper.Drawnings; + +/// +/// Класс, отвечающий за прорисовку и перемещение объекта-сущности +/// +public class DrawingStormtrooper : DrawningBaseStormtrooper +{ + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия бомб + /// Признак наличия ракет + public DrawingStormtrooper(int speed, double weight, Color bodyColor, Color additionalColor, bool bombs, bool rockets) : base(140, 135) + { + EntityBaseStormtrooper = new EntityStormtrooper(speed, weight, bodyColor, additionalColor, bombs, rockets); + } + + + + /// + /// Прорисовка объекта + /// + /// + public override void DrawTransport(Graphics g) + { + if (EntityBaseStormtrooper == null ||EntityBaseStormtrooper is not EntityStormtrooper entityStormtrooper|| !_startPosX.HasValue ||!_startPosY.HasValue) + { + return; + } + Pen pen = new(Color.Black); + Brush additionalBrush = new SolidBrush(entityStormtrooper.AdditionalColor); + + base.DrawTransport(g); + //Ракеты бомбардировщика + if (entityStormtrooper.Rockets) + { + g.FillRectangle(additionalBrush, _startPosX.Value + 35, _startPosY.Value + 20, 15, 5); + g.FillRectangle(additionalBrush, _startPosX.Value + 35, _startPosY.Value + 110, 15, 5); + + } + //Бомбы бомбардировщика + if (entityStormtrooper.Bombs) + { + g.FillRectangle(additionalBrush, _startPosX.Value + 40, _startPosY.Value + 40, 10, 10); + g.FillRectangle(additionalBrush, _startPosX.Value + 40, _startPosY.Value + 90, 10, 10); + } + } +} + + + diff --git a/ProjectStormtrooper/ProjectStormtrooper/DrawingStormtrooper.cs b/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DrawningBaseStormtrooper.cs similarity index 74% rename from ProjectStormtrooper/ProjectStormtrooper/DrawingStormtrooper.cs rename to ProjectStormtrooper/ProjectStormtrooper/Drawnings/DrawningBaseStormtrooper.cs index 9b31d37..d1b3255 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/DrawingStormtrooper.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DrawningBaseStormtrooper.cs @@ -1,10 +1,10 @@ -namespace ProjectStormtrooper; -/// -/// Класс, отвечающий за прорисовку и перемещение объекта-сущности -/// -public class DrawingStormtrooper +using ProjectStormtrooper.Entities; + +namespace ProjectStormtrooper.Drawnings; + +public class DrawningBaseStormtrooper { - public EntityStormtrooper? EntityStormtrooper { get; private set; } + public EntityBaseStormtrooper? EntityBaseStormtrooper { get; protected set; } /// /// Ширина окна /// @@ -18,12 +18,12 @@ public class DrawingStormtrooper /// /// Левая координата прорисовки бомбардировщика /// - private int? _startPosX; + protected int? _startPosX; /// /// Верхняя кооридната прорисовки бомбардировщика /// - private int? _startPosY; + protected int? _startPosY; /// /// Ширина прорисовки бомбардировщика @@ -36,27 +36,38 @@ public class DrawingStormtrooper private readonly int _drawningStormtrooperHeight = 135; /// - /// Инициализация свойств + /// Пустой конструктор /// - /// Скорость - /// Вес - /// Основной цвет - /// Дополнительный цвет - /// Признак наличия двигателей - /// Признак наличия бомб - /// Признак наличия ракет - public void Init(int speed, double weight, Color bodyColor, Color - additionalColor, bool engines, bool bombs, bool rockets) + public DrawningBaseStormtrooper() { - EntityStormtrooper = new EntityStormtrooper(); - EntityStormtrooper.Init(speed, weight, bodyColor, additionalColor, - engines, bombs, rockets); _pictureWidth = null; _pictureHeight = null; _startPosX = null; _startPosY = null; } + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + public DrawningBaseStormtrooper(int speed, double weight, Color bodyColor) : this() + { + EntityBaseStormtrooper = new EntityBaseStormtrooper(speed, weight, bodyColor); + } + + /// + /// Конструктор для наследников + /// + /// Ширина прорисовки бомбардировщика + /// Высота прорисовки бомбардировщика + protected DrawningBaseStormtrooper(int drawningStormtrooperWidth ,int drawningStormtrooperHeight ) : this() + { + _drawningStormtrooperHeight= drawningStormtrooperHeight; + _drawningStormtrooperWidth= drawningStormtrooperWidth; + } + /// /// Установка границ поля /// @@ -79,7 +90,7 @@ public class DrawingStormtrooper else if (_startPosX < 0) { _startPosX = 0; - } + } if (_startPosY + _drawningStormtrooperHeight > _pictureHeight) { _startPosY = -_drawningStormtrooperHeight + _pictureHeight; @@ -137,7 +148,7 @@ public class DrawingStormtrooper /// true - перемещене выполнено, false - перемещение невозможно public bool MoveTransport(DirectionType direction) { - if (EntityStormtrooper == null || !_startPosX.HasValue || + if (EntityBaseStormtrooper == null || !_startPosX.HasValue || !_startPosY.HasValue) { return false; @@ -146,32 +157,32 @@ public class DrawingStormtrooper { //влево case DirectionType.Left: - if (_startPosX.Value - EntityStormtrooper.Step > 0) + if (_startPosX.Value - EntityBaseStormtrooper.Step > 0) { - _startPosX -= (int)EntityStormtrooper.Step; + _startPosX -= (int)EntityBaseStormtrooper.Step; } return true; //вверх case DirectionType.Up: - if (_startPosY.Value - EntityStormtrooper.Step > 0) + if (_startPosY.Value - EntityBaseStormtrooper.Step > 0) { - _startPosY -= (int)EntityStormtrooper.Step; + _startPosY -= (int)EntityBaseStormtrooper.Step; } return true; // вправо case DirectionType.Right: //TODO прописать логику сдвига в право - if (_startPosX + _drawningStormtrooperWidth + EntityStormtrooper.Step < _pictureWidth) + if (_startPosX + _drawningStormtrooperWidth + EntityBaseStormtrooper.Step < _pictureWidth) { - _startPosX += (int)EntityStormtrooper.Step; + _startPosX += (int)EntityBaseStormtrooper.Step; }; return true; //вниз case DirectionType.Down: //TODO прописать логику сдвига в вниз - if (_startPosY + _drawningStormtrooperHeight + EntityStormtrooper.Step < _pictureHeight) + if (_startPosY + _drawningStormtrooperHeight + EntityBaseStormtrooper.Step < _pictureHeight) { - _startPosY += (int)EntityStormtrooper.Step; + _startPosY += (int)EntityBaseStormtrooper.Step; } return true; default: @@ -182,16 +193,16 @@ public class DrawingStormtrooper /// Прорисовка объекта /// /// - public void DrawTransport(Graphics g) + public virtual void DrawTransport(Graphics g) { - if (EntityStormtrooper == null || !_startPosX.HasValue || + if (EntityBaseStormtrooper == null || !_startPosX.HasValue || !_startPosY.HasValue) { return; } Pen pen = new(Color.Black); - Brush bodyColorBrush = new SolidBrush(EntityStormtrooper.BodyColor); - Brush additionalBrush = new SolidBrush(EntityStormtrooper.AdditionalColor); + Brush bodyColorBrush = new SolidBrush(EntityBaseStormtrooper.BodyColor); + //Тело бомбардировщика g.DrawRectangle(pen, _startPosX.Value + 20, _startPosY.Value + 60, 120, 20); //Задние крылья бомбардировщика @@ -213,21 +224,7 @@ public class DrawingStormtrooper Nose[1].X = _startPosX.Value; Nose[1].Y = _startPosY.Value + 70; Nose[2].X = _startPosX.Value + 20; Nose[2].Y = _startPosY.Value + 60; g.FillPolygon(bodyColorBrush, Nose); - //Ракеты бомбардировщика - if (EntityStormtrooper.Rockets) - { - g.FillRectangle(additionalBrush, _startPosX.Value + 35, _startPosY.Value + 20, 15, 5); - g.FillRectangle(additionalBrush, _startPosX.Value + 35, _startPosY.Value + 110, 15, 5); - - } - //Бомбы бомбардировщика - if (EntityStormtrooper.Bombs) - { - g.FillRectangle(additionalBrush, _startPosX.Value + 40, _startPosY.Value + 40, 10, 10); - g.FillRectangle(additionalBrush, _startPosX.Value + 40, _startPosY.Value + 90, 10, 10); - } + } } - - diff --git a/ProjectStormtrooper/ProjectStormtrooper/Entities/EntityBaseStormtrooper.cs b/ProjectStormtrooper/ProjectStormtrooper/Entities/EntityBaseStormtrooper.cs new file mode 100644 index 0000000..9f67ba4 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/Entities/EntityBaseStormtrooper.cs @@ -0,0 +1,40 @@ +namespace ProjectStormtrooper.Entities; +/// +/// Класс-сущность "Базовый Бомбардировщик" +/// +public class EntityBaseStormtrooper +{ + /// + /// Скорость + /// + 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 EntityBaseStormtrooper(int speed, double weight, Color bodyColor) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + } +} diff --git a/ProjectStormtrooper/ProjectStormtrooper/Entities/EntityStormtrooper.cs b/ProjectStormtrooper/ProjectStormtrooper/Entities/EntityStormtrooper.cs new file mode 100644 index 0000000..1a52a13 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/Entities/EntityStormtrooper.cs @@ -0,0 +1,41 @@ +namespace ProjectStormtrooper.Entities; + +/// +/// Класс-сущность "Бомбардировщик" +/// +public class EntityStormtrooper : EntityBaseStormtrooper +{ + + /// + /// Дополнительный цвет (для опциональных элементов) + /// + public Color AdditionalColor { get; protected set; } + + /// + /// Признак (опция) наличия ракет + /// + public bool Rockets { get; private set; } + + /// + /// Признак (опция) наличия бомб + /// + public bool Bombs { get; private set; } + + /// + /// Конструктор + /// + /// Скорость + /// Вес бомбардировщика + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия бомб + /// Признак наличия ракет + public EntityStormtrooper(int speed, double weight, Color bodyColor, Color additionalColor, bool bombs, bool rockets) : base(speed, weight, bodyColor) + { + AdditionalColor = additionalColor; + Bombs = bombs; + Rockets = rockets; + } +} + + diff --git a/ProjectStormtrooper/ProjectStormtrooper/EntityStormtrooper.cs b/ProjectStormtrooper/ProjectStormtrooper/EntityStormtrooper.cs deleted file mode 100644 index 8ee508f..0000000 --- a/ProjectStormtrooper/ProjectStormtrooper/EntityStormtrooper.cs +++ /dev/null @@ -1,71 +0,0 @@ -namespace ProjectStormtrooper; - -/// -/// Класс-сущность "Бомбардировщик" -/// -public class EntityStormtrooper -{ - /// - /// Скорость - /// - 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 Engines { get; private set; } - - /// - /// Признак (опция) наличия ракет - /// - public bool Rockets { get; private set; } - - /// - /// Признак (опция) наличия бомб - /// - public bool Bombs { get; private set; } - - /// - /// Шаг перемещения бомбардировщика - /// - public double Step => Speed * 100 / Weight; - - /// - /// Инициализация полей объекта-класса спортивного автомобиля - /// - /// Скорость - /// Вес автомобиля - /// Основной цвет - /// Дополнительный цвет - /// Признак наличия двигателей - /// Признак наличия бомб - /// Признак наличия ракет - public void Init(int speed, double weight, Color bodyColor, Color - additionalColor, bool engines, bool bombs, bool rockets) - { - Speed = speed; - Weight = weight; - BodyColor = bodyColor; - AdditionalColor = additionalColor; - Engines = engines; - Bombs = bombs; - Rockets = rockets; - } -} - - diff --git a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.Designer.cs b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.Designer.cs index 42787eb..596bc70 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.Designer.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.Designer.cs @@ -34,19 +34,20 @@ buttonDown = new Button(); buttonLeft = new Button(); pictureBoxStormtrooper = new PictureBox(); + buttonCreateBaseStormtrooper = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxStormtrooper).BeginInit(); SuspendLayout(); // // buttonCreateStormtrooper // buttonCreateStormtrooper.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; - buttonCreateStormtrooper.Location = new Point(35, 693); + buttonCreateStormtrooper.Location = new Point(21, 693); buttonCreateStormtrooper.Name = "buttonCreateStormtrooper"; - buttonCreateStormtrooper.Size = new Size(126, 32); + buttonCreateStormtrooper.Size = new Size(260, 32); buttonCreateStormtrooper.TabIndex = 0; - buttonCreateStormtrooper.Text = "Создать"; + buttonCreateStormtrooper.Text = "Создать бомбардировщик"; buttonCreateStormtrooper.UseVisualStyleBackColor = true; - buttonCreateStormtrooper.Click += buttonCreate_Click; + buttonCreateStormtrooper.Click += buttonCreateStormtrooper_Click; // // buttonUp // @@ -106,11 +107,23 @@ pictureBoxStormtrooper.TabStop = false; pictureBoxStormtrooper.Click += ButtonMove_Click; // + // buttonCreateBaseStormtrooper + // + buttonCreateBaseStormtrooper.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateBaseStormtrooper.Location = new Point(287, 693); + buttonCreateBaseStormtrooper.Name = "buttonCreateBaseStormtrooper"; + buttonCreateBaseStormtrooper.Size = new Size(260, 32); + buttonCreateBaseStormtrooper.TabIndex = 6; + buttonCreateBaseStormtrooper.Text = "Создать базовый бомбардировщик"; + buttonCreateBaseStormtrooper.UseVisualStyleBackColor = true; + buttonCreateBaseStormtrooper.Click += buttonCreateBaseStormtrooper_Click; + // // FormStormtrooper // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(1260, 737); + Controls.Add(buttonCreateBaseStormtrooper); Controls.Add(buttonLeft); Controls.Add(buttonDown); Controls.Add(buttonRight); @@ -131,5 +144,6 @@ private Button buttonDown; private Button buttonLeft; private PictureBox pictureBoxStormtrooper; + private Button buttonCreateBaseStormtrooper; } } \ No newline at end of file diff --git a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs index cbc6efa..af82085 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs @@ -1,4 +1,6 @@ -namespace ProjectStormtrooper +using ProjectStormtrooper.Drawnings; + +namespace ProjectStormtrooper { /// /// Форма работы с объектом "Бомбардировщик" @@ -8,7 +10,7 @@ /// /// Поле-объект для прорисовки объекта /// - private DrawingStormtrooper? _drawningStormtrooper; + private DrawningBaseStormtrooper? _drawningBaseStormtrooper; /// /// Конструктор формы @@ -24,38 +26,57 @@ /// private void Draw() { - if (_drawningStormtrooper == null) + if (_drawningBaseStormtrooper == null) { return; } Bitmap bmp = new(pictureBoxStormtrooper.Width, pictureBoxStormtrooper.Height); Graphics gr = Graphics.FromImage(bmp); - _drawningStormtrooper.DrawTransport(gr); + _drawningBaseStormtrooper.DrawTransport(gr); pictureBoxStormtrooper.Image = bmp; } + /// + /// Создание объекта класса-перемещения + /// + /// Тип создаваемого объекта + private void CreateObject(string type) + { + Random random = new(); + switch (type) + { + case nameof(DrawningBaseStormtrooper): + _drawningBaseStormtrooper = new DrawningBaseStormtrooper(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(DrawingStormtrooper): + _drawningBaseStormtrooper = new DrawingStormtrooper(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; + } + + _drawningBaseStormtrooper.SetPictureSize(pictureBoxStormtrooper.Width, pictureBoxStormtrooper.Height); + _drawningBaseStormtrooper.SetPosition(random.Next(10, 100), random.Next(10, 100)); + Draw(); + } /// /// Обработка нажатия кнопки "Создать" /// /// /// - private void buttonCreate_Click(object sender, EventArgs e) + private void buttonCreateStormtrooper_Click(object sender, EventArgs e) { - Random random = new(); - _drawningStormtrooper = new DrawingStormtrooper(); - _drawningStormtrooper.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))); - _drawningStormtrooper.SetPictureSize(pictureBoxStormtrooper.Width,pictureBoxStormtrooper.Height); - _drawningStormtrooper.SetPosition(random.Next(10, 100), random.Next(10,100)); - Draw(); + CreateObject(nameof(DrawingStormtrooper)); + } + private void buttonCreateBaseStormtrooper_Click(object sender, EventArgs e) + { + CreateObject(nameof(DrawningBaseStormtrooper)); } /// @@ -65,7 +86,7 @@ /// private void ButtonMove_Click(object sender, EventArgs e) { - if (_drawningStormtrooper == null) + if (_drawningBaseStormtrooper == null) { return; } @@ -75,19 +96,19 @@ { case "buttonUp": result = - _drawningStormtrooper.MoveTransport(DirectionType.Up); + _drawningBaseStormtrooper.MoveTransport(DirectionType.Up); break; case "buttonDown": result = - _drawningStormtrooper.MoveTransport(DirectionType.Down); + _drawningBaseStormtrooper.MoveTransport(DirectionType.Down); break; case "buttonLeft": result = - _drawningStormtrooper.MoveTransport(DirectionType.Left); + _drawningBaseStormtrooper.MoveTransport(DirectionType.Left); break; case "buttonRight": result = - _drawningStormtrooper.MoveTransport(DirectionType.Right); + _drawningBaseStormtrooper.MoveTransport(DirectionType.Right); break; } if (result) @@ -95,5 +116,7 @@ Draw(); } } + + } } From 2f4c58fbc63fb0a27f367d80dc7c17e6c5d8f86c Mon Sep 17 00:00:00 2001 From: ilyaryabovv Date: Sun, 18 Feb 2024 19:26:51 +0400 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 | 4 + .../Drawnings/DrawningBaseStormtrooper.cs | 20 +++ .../FormStormtrooper.Designer.cs | 26 ++++ .../ProjectStormtrooper/FormStormtrooper.cs | 46 +++++- .../MovementStrategy/AbstractStrategy.cs | 140 ++++++++++++++++++ .../MovementStrategy/IMoveableObjects.cs | 24 +++ .../MovementStrategy/MoveToBorder.cs | 31 ++++ .../MovementStrategy/MoveToCenter.cs | 53 +++++++ .../MovementStrategy/MoveableStormtrooper.cs | 56 +++++++ .../MovementStrategy/MovementDirection.cs | 25 ++++ .../MovementStrategy/ObjectParameters.cs | 72 +++++++++ .../MovementStrategy/StrategyStatus.cs | 18 +++ 12 files changed, 514 insertions(+), 1 deletion(-) create mode 100644 ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/AbstractStrategy.cs create mode 100644 ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/IMoveableObjects.cs create mode 100644 ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MoveToBorder.cs create mode 100644 ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MoveToCenter.cs create mode 100644 ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MoveableStormtrooper.cs create mode 100644 ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MovementDirection.cs create mode 100644 ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/ObjectParameters.cs create mode 100644 ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/StrategyStatus.cs diff --git a/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DirectionType.cs b/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DirectionType.cs index c1a12a6..6240396 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DirectionType.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DirectionType.cs @@ -5,6 +5,10 @@ /// public enum DirectionType { + /// + /// Неизвестное значение + /// + Unknow= -1, /// /// Вверх /// diff --git a/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DrawningBaseStormtrooper.cs b/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DrawningBaseStormtrooper.cs index d1b3255..5aaf5b3 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DrawningBaseStormtrooper.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DrawningBaseStormtrooper.cs @@ -35,6 +35,26 @@ public class DrawningBaseStormtrooper /// private readonly int _drawningStormtrooperHeight = 135; + /// + /// Координата X объекта + /// + public int? GetPosX => _startPosX; + + /// + /// Координата Y объекта + /// + public int? GetPosY => _startPosY; + + /// + /// Ширина объекта + /// + public int GetWidth => _drawningStormtrooperWidth; + + /// + /// Высота объекта + /// + public int GetHeight => _drawningStormtrooperHeight; + /// /// Пустой конструктор /// diff --git a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.Designer.cs b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.Designer.cs index 596bc70..702bd9e 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.Designer.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.Designer.cs @@ -35,6 +35,8 @@ buttonLeft = new Button(); pictureBoxStormtrooper = new PictureBox(); buttonCreateBaseStormtrooper = new Button(); + comboBoxStrategy = new ComboBox(); + ButtonStrategyStep = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxStormtrooper).BeginInit(); SuspendLayout(); // @@ -118,11 +120,33 @@ buttonCreateBaseStormtrooper.UseVisualStyleBackColor = true; buttonCreateBaseStormtrooper.Click += buttonCreateBaseStormtrooper_Click; // + // comboBoxStrategy + // + comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxStrategy.FormattingEnabled = true; + comboBoxStrategy.Items.AddRange(new object[] { "К центру", "К краю" }); + comboBoxStrategy.Location = new Point(1127, 12); + comboBoxStrategy.Name = "comboBoxStrategy"; + comboBoxStrategy.Size = new Size(121, 23); + comboBoxStrategy.TabIndex = 7; + // + // ButtonStrategyStep + // + ButtonStrategyStep.Location = new Point(1173, 41); + ButtonStrategyStep.Name = "ButtonStrategyStep"; + ButtonStrategyStep.Size = new Size(75, 23); + ButtonStrategyStep.TabIndex = 8; + ButtonStrategyStep.Text = "Шаг"; + ButtonStrategyStep.UseVisualStyleBackColor = true; + ButtonStrategyStep.Click += ButtonStrategyStep_Click; + // // FormStormtrooper // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(1260, 737); + Controls.Add(ButtonStrategyStep); + Controls.Add(comboBoxStrategy); Controls.Add(buttonCreateBaseStormtrooper); Controls.Add(buttonLeft); Controls.Add(buttonDown); @@ -145,5 +169,7 @@ private Button buttonLeft; private PictureBox pictureBoxStormtrooper; private Button buttonCreateBaseStormtrooper; + private ComboBox comboBoxStrategy; + private Button ButtonStrategyStep; } } \ No newline at end of file diff --git a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs index af82085..d138b22 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs @@ -1,4 +1,5 @@ using ProjectStormtrooper.Drawnings; +using ProjectStormtrooper.MovementStrategy; namespace ProjectStormtrooper { @@ -12,12 +13,15 @@ namespace ProjectStormtrooper /// private DrawningBaseStormtrooper? _drawningBaseStormtrooper; + private AbstractStrategy? _strategy; + /// /// Конструктор формы /// public FormStormtrooper() { InitializeComponent(); + _strategy = null; } @@ -62,6 +66,8 @@ namespace ProjectStormtrooper _drawningBaseStormtrooper.SetPictureSize(pictureBoxStormtrooper.Width, pictureBoxStormtrooper.Height); _drawningBaseStormtrooper.SetPosition(random.Next(10, 100), random.Next(10, 100)); + _strategy = null; + comboBoxStrategy.Enabled = true; Draw(); } /// @@ -86,6 +92,7 @@ namespace ProjectStormtrooper /// private void ButtonMove_Click(object sender, EventArgs e) { + if (_drawningBaseStormtrooper == null) { return; @@ -117,6 +124,43 @@ namespace ProjectStormtrooper } } - + private void ButtonStrategyStep_Click(object sender, EventArgs e) + { + + if (_drawningBaseStormtrooper == null) + { + return; + } + + if (comboBoxStrategy.Enabled) + { + _strategy = comboBoxStrategy.SelectedIndex switch + { + 0 => new MoveToCenter(), + 1 => new MoveToBorder(), + _ => null, + }; + if (_strategy == null) + { + return; + } + _strategy.SetData(new MoveableStormtrooper(_drawningBaseStormtrooper), pictureBoxStormtrooper.Width, pictureBoxStormtrooper.Height); + } + + if (_strategy == null) + { + return; + } + comboBoxStrategy.Enabled = false; + _strategy.MakeStep(); + Draw(); + + if (_strategy.GetStatus() == StrategyStatus.Finish) + { + comboBoxStrategy.Enabled = true; + _strategy = null; + } + } } + } diff --git a/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/AbstractStrategy.cs b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/AbstractStrategy.cs new file mode 100644 index 0000000..04507a6 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/AbstractStrategy.cs @@ -0,0 +1,140 @@ +namespace ProjectStormtrooper.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/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/IMoveableObjects.cs b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/IMoveableObjects.cs new file mode 100644 index 0000000..9886158 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/IMoveableObjects.cs @@ -0,0 +1,24 @@ +namespace ProjectStormtrooper.MovementStrategy; + +/// +/// Интерфейс для работы с перемещаемым объектом +/// +public interface IMoveableObject +{ + /// + /// Получение координаты объекта + /// + ObjectParameters? GetObjectPosition { get; } + + /// + /// Шаг объекта + /// + int GetStep { get; } + + /// + /// Попытка переместить объект в указанном направлении + /// + /// Направление + /// true - объект перемещен, false - перемещение невозможно + bool TryMoveObject(MovementDirection direction); +} \ No newline at end of file diff --git a/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MoveToBorder.cs b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MoveToBorder.cs new file mode 100644 index 0000000..d13a51d --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MoveToBorder.cs @@ -0,0 +1,31 @@ +namespace ProjectStormtrooper.MovementStrategy; + +public class MoveToBorder : AbstractStrategy +{ + protected override bool IsTargetDestinaion() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) + { + return false; + } + return objParams.LeftBorder - GetStep() <= 0 || + objParams.RightBorder + GetStep() >= FieldWidth || + objParams.TopBorder - GetStep() <= 0 + || objParams.ObjectMiddleVertical + GetStep() >= FieldHeight; + } + + protected override void MoveToTarget() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) + { + return; + } + //реализация в правый нижний угол + int x = objParams.RightBorder; + if (x + GetStep() < FieldWidth) MoveRight(); + int y = objParams.DownBorder; + if (y + GetStep() < FieldHeight) MoveDown(); + } +} diff --git a/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MoveToCenter.cs b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MoveToCenter.cs new file mode 100644 index 0000000..8d996b6 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MoveToCenter.cs @@ -0,0 +1,53 @@ +using ProjectStormtrooper.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/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MoveableStormtrooper.cs b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MoveableStormtrooper.cs new file mode 100644 index 0000000..7c461c3 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MoveableStormtrooper.cs @@ -0,0 +1,56 @@ +using ProjectStormtrooper.Drawnings; + +namespace ProjectStormtrooper.MovementStrategy; +/// +/// Класс реализация IMoveableObject с использованием DrawningBaseStormtrooper +/// +public class MoveableStormtrooper : IMoveableObject +{ + private DrawningBaseStormtrooper? _stormtrooper ; + + public MoveableStormtrooper(DrawningBaseStormtrooper stormtrooper) + { + _stormtrooper = stormtrooper; + } + public ObjectParameters? GetObjectPosition + { + get + { + if( _stormtrooper == null||_stormtrooper.EntityBaseStormtrooper==null || !_stormtrooper.GetPosX.HasValue || !_stormtrooper.GetPosY.HasValue) + { + return null; + } + return new ObjectParameters(_stormtrooper.GetPosX.Value, _stormtrooper.GetPosY.Value, _stormtrooper.GetWidth, _stormtrooper.GetHeight); + } + } + public int GetStep =>(int)(_stormtrooper?.EntityBaseStormtrooper?.Step ?? 0); + + public bool TryMoveObject(MovementDirection direction) + { + if (_stormtrooper == null || _stormtrooper.EntityBaseStormtrooper == null) + { + return false; + } + + return _stormtrooper.MoveTransport(GetDirectionType(direction)); + } + + /// + /// Конвертация из MovementDirection в DirectionType + /// + /// MovementDirection + /// DirectionType + private static DirectionType GetDirectionType(MovementDirection direction) + { + return direction switch + { + MovementDirection.Left => DirectionType.Left, + MovementDirection.Right => DirectionType.Right, + MovementDirection.Up => DirectionType.Up, + MovementDirection.Down => DirectionType.Down, + _ => DirectionType.Unknow, + }; + } +} + + diff --git a/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MovementDirection.cs b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MovementDirection.cs new file mode 100644 index 0000000..2124b25 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MovementDirection.cs @@ -0,0 +1,25 @@ + +namespace ProjectStormtrooper.MovementStrategy; +/// +/// Направление перемещения +/// +public enum MovementDirection +{ + /// + /// Вверх + /// + Up = 1, + /// + /// Вниз + /// + Down = 2, + /// + /// Влево + /// + Left = 3, + /// + /// Вправо + /// + Right = 4 +} + diff --git a/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/ObjectParameters.cs b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/ObjectParameters.cs new file mode 100644 index 0000000..85dfddf --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/ObjectParameters.cs @@ -0,0 +1,72 @@ +namespace ProjectStormtrooper.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/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/StrategyStatus.cs b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/StrategyStatus.cs new file mode 100644 index 0000000..725fb1d --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/StrategyStatus.cs @@ -0,0 +1,18 @@ + +namespace ProjectStormtrooper.MovementStrategy; + +public enum StrategyStatus +{ + /// + /// Все готово к началу + /// + NotInit, + /// + /// Выполняется + /// + InProgress, + /// + /// Завершено + /// + Finish +} From a22e2833b2b80a2349d704dd12bf10a43907a667 Mon Sep 17 00:00:00 2001 From: ilyaryabovv Date: Mon, 19 Feb 2024 14:07:50 +0400 Subject: [PATCH 6/9] =?UTF-8?q?=D0=9D=D0=B0=D0=B2=D1=91=D0=BB=20=D0=BA?= =?UTF-8?q?=D1=80=D0=B0=D1=81=D0=BE=D1=82=D1=83,=20=D1=83=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=BB=20=D0=BF=D1=83=D1=81=D1=82=D1=8B=D0=B5=20=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectStormtrooper/Drawnings/DrawingStormtrooper.cs | 3 --- .../Drawnings/DrawningBaseStormtrooper.cs | 3 --- .../ProjectStormtrooper/FormStormtrooper.cs | 8 -------- .../MovementStrategy/AbstractStrategy.cs | 5 ----- .../ProjectStormtrooper/MovementStrategy/MoveToBorder.cs | 6 +++--- .../ProjectStormtrooper/MovementStrategy/MoveToCenter.cs | 3 +-- .../MovementStrategy/MovementDirection.cs | 3 +-- .../MovementStrategy/StrategyStatus.cs | 3 +-- 8 files changed, 6 insertions(+), 28 deletions(-) diff --git a/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DrawingStormtrooper.cs b/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DrawingStormtrooper.cs index edd944e..d8c1982 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DrawingStormtrooper.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DrawingStormtrooper.cs @@ -19,9 +19,6 @@ public class DrawingStormtrooper : DrawningBaseStormtrooper { EntityBaseStormtrooper = new EntityStormtrooper(speed, weight, bodyColor, additionalColor, bombs, rockets); } - - - /// /// Прорисовка объекта /// diff --git a/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DrawningBaseStormtrooper.cs b/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DrawningBaseStormtrooper.cs index 5aaf5b3..c6d6575 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DrawningBaseStormtrooper.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/Drawnings/DrawningBaseStormtrooper.cs @@ -1,5 +1,4 @@ using ProjectStormtrooper.Entities; - namespace ProjectStormtrooper.Drawnings; public class DrawningBaseStormtrooper @@ -222,7 +221,6 @@ public class DrawningBaseStormtrooper } Pen pen = new(Color.Black); Brush bodyColorBrush = new SolidBrush(EntityBaseStormtrooper.BodyColor); - //Тело бомбардировщика g.DrawRectangle(pen, _startPosX.Value + 20, _startPosY.Value + 60, 120, 20); //Задние крылья бомбардировщика @@ -244,7 +242,6 @@ public class DrawningBaseStormtrooper Nose[1].X = _startPosX.Value; Nose[1].Y = _startPosY.Value + 70; Nose[2].X = _startPosX.Value + 20; Nose[2].Y = _startPosY.Value + 60; g.FillPolygon(bodyColorBrush, Nose); - } } diff --git a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs index d138b22..c1bda8f 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs @@ -14,7 +14,6 @@ namespace ProjectStormtrooper private DrawningBaseStormtrooper? _drawningBaseStormtrooper; private AbstractStrategy? _strategy; - /// /// Конструктор формы /// @@ -23,8 +22,6 @@ namespace ProjectStormtrooper InitializeComponent(); _strategy = null; } - - /// /// Метод прорисовки бомбардировщика /// @@ -40,7 +37,6 @@ namespace ProjectStormtrooper _drawningBaseStormtrooper.DrawTransport(gr); pictureBoxStormtrooper.Image = bmp; } - /// /// Создание объекта класса-перемещения /// @@ -63,7 +59,6 @@ namespace ProjectStormtrooper default: return; } - _drawningBaseStormtrooper.SetPictureSize(pictureBoxStormtrooper.Width, pictureBoxStormtrooper.Height); _drawningBaseStormtrooper.SetPosition(random.Next(10, 100), random.Next(10, 100)); _strategy = null; @@ -84,7 +79,6 @@ namespace ProjectStormtrooper { CreateObject(nameof(DrawningBaseStormtrooper)); } - /// /// Перемещение объекта по форме (нажатие кнопок навигации) /// @@ -92,7 +86,6 @@ namespace ProjectStormtrooper /// private void ButtonMove_Click(object sender, EventArgs e) { - if (_drawningBaseStormtrooper == null) { return; @@ -162,5 +155,4 @@ namespace ProjectStormtrooper } } } - } diff --git a/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/AbstractStrategy.cs b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/AbstractStrategy.cs index 04507a6..cba80d2 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/AbstractStrategy.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/AbstractStrategy.cs @@ -1,6 +1,5 @@ namespace ProjectStormtrooper.MovementStrategy; - /// /// Класс-стратегия перемещения объекта /// @@ -44,7 +43,6 @@ public abstract class AbstractStrategy _state = StrategyStatus.NotInit; return; } - _state = StrategyStatus.InProgress; _moveableObject = moveableObject; FieldWidth = width; @@ -60,13 +58,11 @@ public abstract class AbstractStrategy { return; } - if (IsTargetDestinaion()) { _state = StrategyStatus.Finish; return; } - MoveToTarget(); } @@ -134,7 +130,6 @@ public abstract class AbstractStrategy { return false; } - return _moveableObject?.TryMoveObject(movementDirection) ?? false; } } \ No newline at end of file diff --git a/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MoveToBorder.cs b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MoveToBorder.cs index d13a51d..0e18375 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MoveToBorder.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MoveToBorder.cs @@ -1,5 +1,7 @@ namespace ProjectStormtrooper.MovementStrategy; - +/// +/// Стратегия перемещения объекта в правый нижний угол +/// public class MoveToBorder : AbstractStrategy { protected override bool IsTargetDestinaion() @@ -14,7 +16,6 @@ public class MoveToBorder : AbstractStrategy objParams.TopBorder - GetStep() <= 0 || objParams.ObjectMiddleVertical + GetStep() >= FieldHeight; } - protected override void MoveToTarget() { ObjectParameters? objParams = GetObjectParameters; @@ -22,7 +23,6 @@ public class MoveToBorder : AbstractStrategy { return; } - //реализация в правый нижний угол int x = objParams.RightBorder; if (x + GetStep() < FieldWidth) MoveRight(); int y = objParams.DownBorder; diff --git a/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MoveToCenter.cs b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MoveToCenter.cs index 8d996b6..5c06695 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MoveToCenter.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MoveToCenter.cs @@ -15,7 +15,6 @@ public class MoveToCenter : AbstractStrategy 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; @@ -36,7 +35,7 @@ public class MoveToCenter : AbstractStrategy MoveRight(); } } - + int diffY = objParams.ObjectMiddleVertical - FieldHeight / 2; if (Math.Abs(diffY) > GetStep()) { diff --git a/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MovementDirection.cs b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MovementDirection.cs index 2124b25..ca78f1d 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MovementDirection.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/MovementDirection.cs @@ -1,5 +1,4 @@ - -namespace ProjectStormtrooper.MovementStrategy; +namespace ProjectStormtrooper.MovementStrategy; /// /// Направление перемещения /// diff --git a/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/StrategyStatus.cs b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/StrategyStatus.cs index 725fb1d..f4464ec 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/StrategyStatus.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/MovementStrategy/StrategyStatus.cs @@ -1,5 +1,4 @@ - -namespace ProjectStormtrooper.MovementStrategy; +namespace ProjectStormtrooper.MovementStrategy; public enum StrategyStatus { From 11d60d40763a6b6914f7f3a5ab448b3c55e4c9bd Mon Sep 17 00:00:00 2001 From: ilyaryabovv Date: Sun, 3 Mar 2024 19:47:56 +0400 Subject: [PATCH 7/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 | 115 +++++++++++ .../ICollectionGenericObjects.cs | 48 +++++ .../MassiveGenericObjects.cs | 110 +++++++++++ .../StormtrooperSharingService.cs | 64 +++++++ .../FormStormtrooper.Designer.cs | 29 --- .../ProjectStormtrooper/FormStormtrooper.cs | 55 ++---- .../FormStormtrooperCollection.Designer.cs | 168 ++++++++++++++++ .../FormStormtrooperCollection.cs | 180 ++++++++++++++++++ .../FormStormtrooperCollection.resx | 120 ++++++++++++ .../ProjectStormtrooper/Program.cs | 2 +- 10 files changed, 818 insertions(+), 73 deletions(-) create mode 100644 ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/AbstractCompany.cs create mode 100644 ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/ICollectionGenericObjects.cs create mode 100644 ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/MassiveGenericObjects.cs create mode 100644 ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/StormtrooperSharingService.cs create mode 100644 ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.Designer.cs create mode 100644 ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.cs create mode 100644 ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.resx diff --git a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/AbstractCompany.cs b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/AbstractCompany.cs new file mode 100644 index 0000000..722123b --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/AbstractCompany.cs @@ -0,0 +1,115 @@ +using ProjectStormtrooper.Drawnings; +namespace ProjectStormtrooper.CollectionGenericObjects; + +/// +/// Абстракция компании, хранящий коллекцию бомбардировщиков +/// +public abstract class AbstractCompany +{ + /// + /// Размер места (ширина) + /// + protected readonly int _placeSizeWidth = 220; + + /// + /// Размер места (высота) + /// + protected readonly int _placeSizeHeight = 155; + + /// + /// Ширина окна + /// + 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 bool operator +(AbstractCompany company, DrawningBaseStormtrooper stormtrooper) + { + return company._collection?.Insert(stormtrooper) ?? false; + } + + /// + /// Перегрузка оператора удаления для класса + /// + /// Компания + /// Номер удаляемого объекта + /// + public static bool operator -(AbstractCompany company, int position) + { + return company._collection?.Remove(position) ?? false; + } + + /// + /// Получение случайного объекта из коллекции + /// + /// + public DrawningBaseStormtrooper? 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) + { + DrawningBaseStormtrooper? 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/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/ICollectionGenericObjects.cs b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/ICollectionGenericObjects.cs new file mode 100644 index 0000000..a5e5039 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/ICollectionGenericObjects.cs @@ -0,0 +1,48 @@ +namespace ProjectStormtrooper.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/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/MassiveGenericObjects.cs b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/MassiveGenericObjects.cs new file mode 100644 index 0000000..b21e76a --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/MassiveGenericObjects.cs @@ -0,0 +1,110 @@ + +namespace ProjectStormtrooper.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) + { + // TODO проверка позиции + if (position >= _collection.Length || position < 0) return null; + return _collection[position]; + } + + public bool Insert(T obj) + { + // TODO вставка в свободное место набора + int index = 0; + while(index< _collection.Length) + { + if (_collection[index] == null) { + _collection[index] = obj; + return true; + } + index++; + } + return false; + } + + public bool Insert(T obj, int position) + { + // TODO проверка позиции + // TODO проверка, что элемент массива по этой позиции пустой, если нет, то + // ищется свободное место после этой позиции и идет вставка туда + // если нет после, ищем до + // TODO вставка + if (position >= _collection.Length || position < 0) return false; + if (_collection[position] == null) + { + _collection[position] = obj; + return true; + } + int index = position + 1; + while (index < _collection.Length) + { + if (_collection[index] == null) + { + _collection[index] = obj; + return true; + } + index++; + } + index = position - 1; + while (index >= 0) + { + if (_collection[index] == null) + { + _collection[index] = obj; + return true; + } + index--; + } + return false; + } + + public bool Remove(int position) + { + // TODO проверка позиции + // TODO удаление объекта из массива, присвоив элементу массива значение null + if (position >= _collection.Length || position < 0) return false; + _collection[position] = null; + return true; + } +} \ No newline at end of file diff --git a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/StormtrooperSharingService.cs b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/StormtrooperSharingService.cs new file mode 100644 index 0000000..fb320c9 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/StormtrooperSharingService.cs @@ -0,0 +1,64 @@ +using ProjectStormtrooper.Drawnings; +namespace ProjectStormtrooper.CollectionGenericObjects; +/// +/// Реализация абстрактной компании - бомбардиршеринг +/// +public class StormtrooperSharingService : AbstractCompany +{ + /// + /// Конструктор + /// + /// + /// + /// + public StormtrooperSharingService(int picWidth, int picHeight, ICollectionGenericObjects collection) : base(picWidth, picHeight, collection) + { + } + + + protected override void DrawBackgound(Graphics g) + { + int width = _pictureWidth / _placeSizeWidth; + int height = _pictureHeight / _placeSizeHeight; + Pen pen = new(Color.Black, 2); + for (int i = 0; i < width; i++) + { + for (int j = 0; j < height + 1; ++j) + { + g.DrawLine(pen, i * _placeSizeWidth+15, j * _placeSizeHeight, i * _placeSizeWidth+15 + _placeSizeWidth-55, j * _placeSizeHeight); + g.DrawLine(pen, i * _placeSizeWidth+15, j * _placeSizeHeight, i * _placeSizeWidth+15, j * _placeSizeHeight -_placeSizeHeight); + } + } + } + + protected override void SetObjectsPosition() + { + int width = _pictureWidth / _placeSizeWidth; + int height = _pictureHeight / _placeSizeHeight; + + int curWidth = 0; + int curHeight = 0; + + for (int i = 0; i < (_collection?.Count ?? 0); i++) + { + if (_collection.Get(i) != null) + { + _collection.Get(i).SetPictureSize(_pictureWidth, _pictureHeight); + _collection.Get(i).SetPosition(_placeSizeWidth * curWidth + 20, curHeight * _placeSizeHeight + 4); + } + + if (curWidth < width-1) + curWidth++; + else + { + curWidth = 0; + curHeight++; + } + if (curHeight > height) + { + return; + } + } + + } +} diff --git a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.Designer.cs b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.Designer.cs index 702bd9e..302bb60 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.Designer.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.Designer.cs @@ -28,29 +28,16 @@ /// private void InitializeComponent() { - buttonCreateStormtrooper = new Button(); buttonUp = new Button(); buttonRight = new Button(); buttonDown = new Button(); buttonLeft = new Button(); pictureBoxStormtrooper = new PictureBox(); - buttonCreateBaseStormtrooper = new Button(); comboBoxStrategy = new ComboBox(); ButtonStrategyStep = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxStormtrooper).BeginInit(); SuspendLayout(); // - // buttonCreateStormtrooper - // - buttonCreateStormtrooper.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; - buttonCreateStormtrooper.Location = new Point(21, 693); - buttonCreateStormtrooper.Name = "buttonCreateStormtrooper"; - buttonCreateStormtrooper.Size = new Size(260, 32); - buttonCreateStormtrooper.TabIndex = 0; - buttonCreateStormtrooper.Text = "Создать бомбардировщик"; - buttonCreateStormtrooper.UseVisualStyleBackColor = true; - buttonCreateStormtrooper.Click += buttonCreateStormtrooper_Click; - // // buttonUp // buttonUp.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; @@ -109,17 +96,6 @@ pictureBoxStormtrooper.TabStop = false; pictureBoxStormtrooper.Click += ButtonMove_Click; // - // buttonCreateBaseStormtrooper - // - buttonCreateBaseStormtrooper.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; - buttonCreateBaseStormtrooper.Location = new Point(287, 693); - buttonCreateBaseStormtrooper.Name = "buttonCreateBaseStormtrooper"; - buttonCreateBaseStormtrooper.Size = new Size(260, 32); - buttonCreateBaseStormtrooper.TabIndex = 6; - buttonCreateBaseStormtrooper.Text = "Создать базовый бомбардировщик"; - buttonCreateBaseStormtrooper.UseVisualStyleBackColor = true; - buttonCreateBaseStormtrooper.Click += buttonCreateBaseStormtrooper_Click; - // // comboBoxStrategy // comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList; @@ -147,12 +123,10 @@ ClientSize = new Size(1260, 737); Controls.Add(ButtonStrategyStep); Controls.Add(comboBoxStrategy); - Controls.Add(buttonCreateBaseStormtrooper); Controls.Add(buttonLeft); Controls.Add(buttonDown); Controls.Add(buttonRight); Controls.Add(buttonUp); - Controls.Add(buttonCreateStormtrooper); Controls.Add(pictureBoxStormtrooper); Name = "FormStormtrooper"; Text = "Бомбардировщик"; @@ -161,14 +135,11 @@ } #endregion - - private Button buttonCreateStormtrooper; private Button buttonUp; private Button buttonRight; private Button buttonDown; private Button buttonLeft; private PictureBox pictureBoxStormtrooper; - private Button buttonCreateBaseStormtrooper; private ComboBox comboBoxStrategy; private Button ButtonStrategyStep; } diff --git a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs index c1bda8f..5ad37d2 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs @@ -17,6 +17,17 @@ namespace ProjectStormtrooper /// /// Конструктор формы /// + public DrawningBaseStormtrooper SetStormtrooper + { + set + { + _drawningBaseStormtrooper = value; + _drawningBaseStormtrooper.SetPictureSize(pictureBoxStormtrooper.Width, pictureBoxStormtrooper.Height); + comboBoxStrategy.Enabled = true; + _strategy = null; + Draw(); + } + } public FormStormtrooper() { InitializeComponent(); @@ -37,48 +48,7 @@ namespace ProjectStormtrooper _drawningBaseStormtrooper.DrawTransport(gr); pictureBoxStormtrooper.Image = bmp; } - /// - /// Создание объекта класса-перемещения - /// - /// Тип создаваемого объекта - private void CreateObject(string type) - { - Random random = new(); - switch (type) - { - case nameof(DrawningBaseStormtrooper): - _drawningBaseStormtrooper = new DrawningBaseStormtrooper(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(DrawingStormtrooper): - _drawningBaseStormtrooper = new DrawingStormtrooper(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; - } - _drawningBaseStormtrooper.SetPictureSize(pictureBoxStormtrooper.Width, pictureBoxStormtrooper.Height); - _drawningBaseStormtrooper.SetPosition(random.Next(10, 100), random.Next(10, 100)); - _strategy = null; - comboBoxStrategy.Enabled = true; - Draw(); - } - /// - /// Обработка нажатия кнопки "Создать" - /// - /// - /// - private void buttonCreateStormtrooper_Click(object sender, EventArgs e) - { - CreateObject(nameof(DrawingStormtrooper)); - } - private void buttonCreateBaseStormtrooper_Click(object sender, EventArgs e) - { - CreateObject(nameof(DrawningBaseStormtrooper)); - } /// /// Перемещение объекта по форме (нажатие кнопок навигации) /// @@ -116,10 +86,9 @@ namespace ProjectStormtrooper Draw(); } } - private void ButtonStrategyStep_Click(object sender, EventArgs e) { - + if (_drawningBaseStormtrooper == null) { return; diff --git a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.Designer.cs b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.Designer.cs new file mode 100644 index 0000000..327c1b6 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.Designer.cs @@ -0,0 +1,168 @@ +namespace ProjectStormtrooper +{ + partial class FormStormtrooperCollection + { + /// + /// 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(); + buttonRemoveStormtrooper = new Button(); + maskedTextBoxPosition = new MaskedTextBox(); + buttonAddStormtrooper = new Button(); + buttonAddBaseStormtrooper = 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(buttonRemoveStormtrooper); + groupBoxTools.Controls.Add(maskedTextBoxPosition); + groupBoxTools.Controls.Add(buttonAddStormtrooper); + groupBoxTools.Controls.Add(buttonAddBaseStormtrooper); + groupBoxTools.Controls.Add(comboBoxSelectorCompany); + groupBoxTools.Dock = DockStyle.Right; + groupBoxTools.Location = new Point(898, 0); + groupBoxTools.Name = "groupBoxTools"; + groupBoxTools.Size = new Size(225, 659); + groupBoxTools.TabIndex = 0; + groupBoxTools.TabStop = false; + groupBoxTools.Text = "Инструменты"; + // + // buttonRefresh + // + buttonRefresh.Location = new Point(6, 563); + buttonRefresh.Name = "buttonRefresh"; + buttonRefresh.Size = new Size(213, 52); + buttonRefresh.TabIndex = 6; + buttonRefresh.Text = "Обновить"; + buttonRefresh.UseVisualStyleBackColor = true; + buttonRefresh.Click += buttonRefresh_Click; + // + // buttonGoToCheck + // + buttonGoToCheck.Location = new Point(6, 378); + buttonGoToCheck.Name = "buttonGoToCheck"; + buttonGoToCheck.Size = new Size(213, 52); + buttonGoToCheck.TabIndex = 5; + buttonGoToCheck.Text = "Передать на тесты"; + buttonGoToCheck.UseVisualStyleBackColor = true; + buttonGoToCheck.Click += buttonGoToCheck_Click; + // + // buttonRemoveStormtrooper + // + buttonRemoveStormtrooper.Location = new Point(6, 265); + buttonRemoveStormtrooper.Name = "buttonRemoveStormtrooper"; + buttonRemoveStormtrooper.Size = new Size(213, 52); + buttonRemoveStormtrooper.TabIndex = 4; + buttonRemoveStormtrooper.Text = "Удалить бомбардировщик"; + buttonRemoveStormtrooper.UseVisualStyleBackColor = true; + buttonRemoveStormtrooper.Click += buttonRemoveStormtrooper_Click; + // + // maskedTextBoxPosition + // + maskedTextBoxPosition.Location = new Point(6, 226); + maskedTextBoxPosition.Mask = "00"; + maskedTextBoxPosition.Name = "maskedTextBoxPosition"; + maskedTextBoxPosition.Size = new Size(213, 23); + maskedTextBoxPosition.TabIndex = 3; + maskedTextBoxPosition.ValidatingType = typeof(int); + // + // buttonAddStormtrooper + // + buttonAddStormtrooper.Location = new Point(6, 124); + buttonAddStormtrooper.Name = "buttonAddStormtrooper"; + buttonAddStormtrooper.Size = new Size(213, 52); + buttonAddStormtrooper.TabIndex = 2; + buttonAddStormtrooper.Text = "Добавление бомбардировщика"; + buttonAddStormtrooper.UseVisualStyleBackColor = true; + buttonAddStormtrooper.Click += buttonAddStormtrooper_Click; + // + // buttonAddBaseStormtrooper + // + buttonAddBaseStormtrooper.Location = new Point(6, 66); + buttonAddBaseStormtrooper.Name = "buttonAddBaseStormtrooper"; + buttonAddBaseStormtrooper.Size = new Size(213, 52); + buttonAddBaseStormtrooper.TabIndex = 1; + buttonAddBaseStormtrooper.Text = "Добавление базового бомбардировщика"; + buttonAddBaseStormtrooper.UseVisualStyleBackColor = true; + buttonAddBaseStormtrooper.Click += buttonAddBaseStormtrooper_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(213, 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(898, 659); + pictureBox.TabIndex = 1; + pictureBox.TabStop = false; + // + // FormStormtrooperCollection + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1123, 659); + Controls.Add(pictureBox); + Controls.Add(groupBoxTools); + Name = "FormStormtrooperCollection"; + Text = "Коллекция бомбардировщиков"; + groupBoxTools.ResumeLayout(false); + groupBoxTools.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)pictureBox).EndInit(); + ResumeLayout(false); + } + + #endregion + + private GroupBox groupBoxTools; + private ComboBox comboBoxSelectorCompany; + private Button buttonRemoveStormtrooper; + private MaskedTextBox maskedTextBoxPosition; + private Button buttonAddStormtrooper; + private Button buttonAddBaseStormtrooper; + private PictureBox pictureBox; + private Button buttonRefresh; + private Button buttonGoToCheck; + } +} \ No newline at end of file diff --git a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.cs b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.cs new file mode 100644 index 0000000..805ef99 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.cs @@ -0,0 +1,180 @@ +using ProjectStormtrooper.CollectionGenericObjects; +using ProjectStormtrooper.Drawnings; +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 ProjectStormtrooper; +/// +/// Форма работы с компанией и ее коллекцией +/// +public partial class FormStormtrooperCollection : Form +{ + /// + /// Компания + /// + private AbstractCompany? _company; + /// + /// Конструктор + /// + public FormStormtrooperCollection() + { + InitializeComponent(); + } + /// + /// Выбор компании + /// + /// + /// + private void comboBoxSelectorCompany_SelectedIndexChanged(object sender, EventArgs e) + { + switch (comboBoxSelectorCompany.Text) + { + case "Хранилище": + _company = new StormtrooperSharingService(pictureBox.Width, pictureBox.Height, new MassiveGenericObjects()); + break; + } + } + /// + /// Создание объекта класса-перемещения + /// + /// + private void CreateObject(string type) + { + if (_company == null) + { + return; + } + Random random = new(); + DrawningBaseStormtrooper drawningBaseStormtrooper; + switch (type) + { + case nameof(DrawningBaseStormtrooper): + drawningBaseStormtrooper = new DrawningBaseStormtrooper(random.Next(100, 300), random.Next(1000, 3000), GetColor(random)); + break; + case nameof(DrawingStormtrooper): + drawningBaseStormtrooper = new DrawingStormtrooper(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 + drawningBaseStormtrooper) + { + 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 buttonAddStormtrooper_Click(object sender, EventArgs e) => CreateObject(nameof(DrawingStormtrooper)); + /// + /// Добавление базового бомбардировщика + /// + /// + /// + private void buttonAddBaseStormtrooper_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningBaseStormtrooper)); + /// + /// Удаление объекта + /// + /// + /// + private void buttonRemoveStormtrooper_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(maskedTextBoxPosition.Text) || _company == null) + { + return; + } + if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + { + return; + } + + int pos = Convert.ToInt32(maskedTextBoxPosition.Text); + if (_company - pos) + { + MessageBox.Show("Объект удалён"); + pictureBox.Image = _company.Show(); + } + else + { + MessageBox.Show("Не удалось удалить объект"); + } + + } + /// + /// Передача объекта в другую форму + /// + /// + /// + private void buttonGoToCheck_Click(object sender, EventArgs e) + { + if (_company == null) + { + return; + } + DrawningBaseStormtrooper? stormtrooper= null; + int counter = 100; + while(stormtrooper == null) + { + stormtrooper = _company.GetRandomObject(); + counter--; + if (counter < -0) + { + break; + } + } + if (stormtrooper == null) + { + return; + } + FormStormtrooper form = new() + { + SetStormtrooper = stormtrooper + }; + form.ShowDialog(); + + } + /// + /// Перерисовка коллекции + /// + /// + /// + private void buttonRefresh_Click(object sender, EventArgs e) + { + if (_company == null) + { + return; + } + pictureBox.Image = _company.Show(); + } +} + diff --git a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.resx b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.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/ProjectStormtrooper/ProjectStormtrooper/Program.cs b/ProjectStormtrooper/ProjectStormtrooper/Program.cs index 3db6e41..41063d3 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/Program.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/Program.cs @@ -11,7 +11,7 @@ namespace ProjectStormtrooper // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new FormStormtrooper()); + Application.Run(new FormStormtrooperCollection()); } } } \ No newline at end of file From 458092c11cfe74f4091d037d2027f0cda926fb4a Mon Sep 17 00:00:00 2001 From: ilyaryabovv Date: Thu, 7 Mar 2024 16:30:27 +0400 Subject: [PATCH 8/9] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractCompany.cs | 16 ++++++----- .../ICollectionGenericObjects.cs | 6 ++-- .../MassiveGenericObjects.cs | 28 +++++++++---------- .../StormtrooperSharingService.cs | 16 ++++------- .../ProjectStormtrooper/FormStormtrooper.cs | 1 + .../FormStormtrooperCollection.cs | 6 ++-- 6 files changed, 36 insertions(+), 37 deletions(-) diff --git a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/AbstractCompany.cs b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/AbstractCompany.cs index 722123b..3062187 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/AbstractCompany.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/AbstractCompany.cs @@ -25,12 +25,16 @@ public abstract class AbstractCompany /// Высота окна /// protected readonly int _pictureHeight; - + protected static int amountOfObjects = 0; /// /// Коллекция бомбардировщиков /// protected ICollectionGenericObjects? _collection = null; + public static int getAmountOfObjects() { + return amountOfObjects; + } + /// /// Вычисление максимального количества элементов, который можно разместить в окне /// @@ -56,9 +60,9 @@ public abstract class AbstractCompany /// Компания /// Добавляемый объект /// - public static bool operator +(AbstractCompany company, DrawningBaseStormtrooper stormtrooper) + public static int operator +(AbstractCompany company, DrawningBaseStormtrooper stormtrooper) { - return company._collection?.Insert(stormtrooper) ?? false; + return company._collection.Insert(stormtrooper); } /// @@ -67,9 +71,9 @@ public abstract class AbstractCompany /// Компания /// Номер удаляемого объекта /// - public static bool operator -(AbstractCompany company, int position) + public static DrawningBaseStormtrooper operator -(AbstractCompany company, int position) { - return company._collection?.Remove(position) ?? false; + return company._collection.Remove(position); } /// @@ -91,14 +95,12 @@ public abstract class AbstractCompany Bitmap bitmap = new(_pictureWidth, _pictureHeight); Graphics graphics = Graphics.FromImage(bitmap); DrawBackgound(graphics); - SetObjectsPosition(); for (int i = 0; i < (_collection?.Count ?? 0); ++i) { DrawningBaseStormtrooper? obj = _collection?.Get(i); obj?.DrawTransport(graphics); } - return bitmap; } diff --git a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/ICollectionGenericObjects.cs b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/ICollectionGenericObjects.cs index a5e5039..372b2ce 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/ICollectionGenericObjects.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/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/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/MassiveGenericObjects.cs b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/MassiveGenericObjects.cs index b21e76a..85dc44d 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/MassiveGenericObjects.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/MassiveGenericObjects.cs @@ -1,4 +1,4 @@ - +using ProjectStormtrooper.Drawnings; namespace ProjectStormtrooper.CollectionGenericObjects; /// @@ -32,7 +32,6 @@ public class MassiveGenericObjects : ICollectionGenericObjects } } } - /// /// Конструктор /// @@ -48,7 +47,7 @@ public class MassiveGenericObjects : ICollectionGenericObjects return _collection[position]; } - public bool Insert(T obj) + public int Insert(T obj) { // TODO вставка в свободное место набора int index = 0; @@ -56,25 +55,25 @@ public class MassiveGenericObjects : ICollectionGenericObjects { if (_collection[index] == null) { _collection[index] = obj; - return true; + return index; } index++; } - return false; + return -1; } - public bool Insert(T obj, int position) + public int Insert(T obj, int position) { // TODO проверка позиции // TODO проверка, что элемент массива по этой позиции пустой, если нет, то // ищется свободное место после этой позиции и идет вставка туда // если нет после, ищем до // TODO вставка - if (position >= _collection.Length || position < 0) return false; + if (position >= _collection.Length || position < 0) return -1; if (_collection[position] == null) { _collection[position] = obj; - return true; + return position; } int index = position + 1; while (index < _collection.Length) @@ -82,7 +81,7 @@ public class MassiveGenericObjects : ICollectionGenericObjects if (_collection[index] == null) { _collection[index] = obj; - return true; + return index; } index++; } @@ -92,19 +91,20 @@ public class MassiveGenericObjects : ICollectionGenericObjects if (_collection[index] == null) { _collection[index] = obj; - return true; + return index; } index--; } - return false; + return -1; } - public bool Remove(int position) + public T? Remove(int position) { // TODO проверка позиции // TODO удаление объекта из массива, присвоив элементу массива значение null - if (position >= _collection.Length || position < 0) return false; + if (position >= _collection.Length || position < 0) return null; + T temp = _collection[position]; _collection[position] = null; - return true; + return temp; } } \ No newline at end of file diff --git a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/StormtrooperSharingService.cs b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/StormtrooperSharingService.cs index fb320c9..e8143f5 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/StormtrooperSharingService.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/StormtrooperSharingService.cs @@ -14,8 +14,6 @@ public class StormtrooperSharingService : AbstractCompany public StormtrooperSharingService(int picWidth, int picHeight, ICollectionGenericObjects collection) : base(picWidth, picHeight, collection) { } - - protected override void DrawBackgound(Graphics g) { int width = _pictureWidth / _placeSizeWidth; @@ -35,23 +33,20 @@ public class StormtrooperSharingService : AbstractCompany { int width = _pictureWidth / _placeSizeWidth; int height = _pictureHeight / _placeSizeHeight; - - int curWidth = 0; + int curWidth = width-1; int curHeight = 0; - for (int i = 0; i < (_collection?.Count ?? 0); i++) { if (_collection.Get(i) != null) { _collection.Get(i).SetPictureSize(_pictureWidth, _pictureHeight); - _collection.Get(i).SetPosition(_placeSizeWidth * curWidth + 20, curHeight * _placeSizeHeight + 4); + _collection.Get(i).SetPosition(_placeSizeWidth * curWidth + 15, curHeight * _placeSizeHeight + 3); } - - if (curWidth < width-1) - curWidth++; + if (curWidth >0) + curWidth--; else { - curWidth = 0; + curWidth = width -1; curHeight++; } if (curHeight > height) @@ -59,6 +54,5 @@ public class StormtrooperSharingService : AbstractCompany return; } } - } } diff --git a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs index 5ad37d2..6c7306a 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooper.cs @@ -86,6 +86,7 @@ namespace ProjectStormtrooper Draw(); } } + private void ButtonStrategyStep_Click(object sender, EventArgs e) { diff --git a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.cs b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.cs index 805ef99..5be0f14 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.cs @@ -65,7 +65,8 @@ public partial class FormStormtrooperCollection : Form default: return; } - if (_company + drawningBaseStormtrooper) + int tempSize = StormtrooperSharingService.getAmountOfObjects(); + if (_company + drawningBaseStormtrooper != -1) { MessageBox.Show("Объект добавлен"); pictureBox.Image = _company.Show(); @@ -119,7 +120,8 @@ public partial class FormStormtrooperCollection : Form } int pos = Convert.ToInt32(maskedTextBoxPosition.Text); - if (_company - pos) + int tempSize = StormtrooperSharingService.getAmountOfObjects(); + if (_company-pos!=null) { MessageBox.Show("Объект удалён"); pictureBox.Image = _company.Show(); From 2a4faa18db4990e63ce50bf90cf6fa3db22eaa83 Mon Sep 17 00:00:00 2001 From: ilyaryabovv Date: Fri, 29 Mar 2024 19:58:37 +0400 Subject: [PATCH 9/9] =?UTF-8?q?4=20=D0=BB=D0=B0=D0=B1=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CollectionType.cs | 20 ++ .../ListGenericObjects.cs | 79 +++++++ .../MassiveGenericObjects.cs | 2 +- .../StorageCollection.cs | 78 +++++++ .../FormStormtrooperCollection.Designer.cs | 203 ++++++++++++++---- .../FormStormtrooperCollection.cs | 128 +++++++++-- 6 files changed, 453 insertions(+), 57 deletions(-) create mode 100644 ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/CollectionType.cs create mode 100644 ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/ListGenericObjects.cs create mode 100644 ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/StorageCollection.cs diff --git a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/CollectionType.cs b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/CollectionType.cs new file mode 100644 index 0000000..a2c9295 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/CollectionType.cs @@ -0,0 +1,20 @@ +namespace ProjectStormtrooper.CollectionGenericObjects; + +/// +/// Тип коллекции +/// +public enum CollectionType +{ + /// + /// Неопределено + /// + None = 0, + /// + /// Массив + /// + Massive = 1, + /// + /// Список + /// + List = 2 +} \ No newline at end of file diff --git a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/ListGenericObjects.cs b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/ListGenericObjects.cs new file mode 100644 index 0000000..0e15a69 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/ListGenericObjects.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectStormtrooper.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) + { + // TODO проверка позиции + if( position>= 0 && position < Count) + { + return _collection[position]; + } + return null; + } + public int Insert(T obj) + { + // TODO проверка, что не превышено максимальное количество элементов + // TODO вставка в конец набора + if (Count <= _maxCount) + { + _collection.Add(obj); + return Count; + } + return -1; + } + public int Insert(T obj, int position) + { + // TODO проверка, что не превышено максимальное количество элементов + // TODO проверка позиции + // TODO вставка по позиции + if (Count < _maxCount && position>=0 && position < _maxCount) + { + _collection.Insert(position, obj); + return position; + } + return -1; + } + public T Remove(int position) + { + // TODO проверка позиции + // TODO удаление объекта из списка + T temp = _collection[position]; + if(position>=0 && position < _maxCount) + { + _collection.RemoveAt(position); + return temp; + } + return null; + } + +} + diff --git a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/MassiveGenericObjects.cs b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/MassiveGenericObjects.cs index 85dc44d..2556922 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/MassiveGenericObjects.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/MassiveGenericObjects.cs @@ -40,7 +40,7 @@ public class MassiveGenericObjects : ICollectionGenericObjects _collection = Array.Empty(); } - public T? Get(int position) + public T Get(int position) { // TODO проверка позиции if (position >= _collection.Length || position < 0) return null; diff --git a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/StorageCollection.cs b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/StorageCollection.cs new file mode 100644 index 0000000..0c51784 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/StorageCollection.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectStormtrooper.CollectionGenericObjects; + +/// +/// Класс-хранилище коллекций +/// +/// +public class StorageCollection +where T : class +{ + /// + /// Словарь (хранилище) с коллекциями + /// + readonly Dictionary> _storages; + /// + /// Возвращение списка названий коллекций + /// + public List Keys => _storages.Keys.ToList(); + /// + /// Конструктор + /// + public StorageCollection() + { + _storages = new Dictionary>(); + } + /// + /// Добавление коллекции в хранилище + /// + /// Название коллекции + /// тип коллекции + public void AddCollection(string name, CollectionType collectionType) + { + // TODO проверка, что name не пустой и нет в словаре записи с таким ключом + // TODO Прописать логику для добавления + if(!(collectionType == CollectionType.None) && !_storages.ContainsKey(name)){ + if(collectionType== CollectionType.List) + { + _storages.Add(name, new ListGenericObjects()); + } + else if (collectionType == CollectionType.Massive) + { + _storages.Add(name, new MassiveGenericObjects()); + } + } + } + /// + /// Удаление коллекции + /// + /// Название коллекции + public void DelCollection(string name) + { + // TODO Прописать логику для удаления коллекции + if (_storages.ContainsKey(name)) { _storages.Remove(name); } + } + /// + /// Доступ к коллекции + /// + /// Название коллекции + /// + public ICollectionGenericObjects? this[string name] + { + get + { + // TODO Продумать логику получения объекта + if (_storages.ContainsKey(name)) + { + return _storages[name]; + } + return null; + } + } +} + diff --git a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.Designer.cs b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.Designer.cs index 327c1b6..9dbb7dc 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.Designer.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.Designer.cs @@ -29,26 +29,34 @@ private void InitializeComponent() { groupBoxTools = new GroupBox(); + panelCompanyTools = new Panel(); + buttonCreateCompany = new Button(); + buttonAddBaseStormtrooper = new Button(); + buttonAddStormtrooper = new Button(); buttonRefresh = new Button(); + maskedTextBoxPosition = new MaskedTextBox(); buttonGoToCheck = new Button(); buttonRemoveStormtrooper = new Button(); - maskedTextBoxPosition = new MaskedTextBox(); - buttonAddStormtrooper = new Button(); - buttonAddBaseStormtrooper = 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(); comboBoxSelectorCompany = new ComboBox(); pictureBox = new PictureBox(); groupBoxTools.SuspendLayout(); + panelCompanyTools.SuspendLayout(); + panelStorage.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)pictureBox).BeginInit(); SuspendLayout(); // // groupBoxTools // - groupBoxTools.Controls.Add(buttonRefresh); - groupBoxTools.Controls.Add(buttonGoToCheck); - groupBoxTools.Controls.Add(buttonRemoveStormtrooper); - groupBoxTools.Controls.Add(maskedTextBoxPosition); - groupBoxTools.Controls.Add(buttonAddStormtrooper); - groupBoxTools.Controls.Add(buttonAddBaseStormtrooper); + groupBoxTools.Controls.Add(panelCompanyTools); + groupBoxTools.Controls.Add(panelStorage); groupBoxTools.Controls.Add(comboBoxSelectorCompany); groupBoxTools.Dock = DockStyle.Right; groupBoxTools.Location = new Point(898, 0); @@ -58,9 +66,55 @@ groupBoxTools.TabStop = false; groupBoxTools.Text = "Инструменты"; // + // panelCompanyTools + // + panelCompanyTools.Controls.Add(buttonCreateCompany); + panelCompanyTools.Controls.Add(buttonAddBaseStormtrooper); + panelCompanyTools.Controls.Add(buttonAddStormtrooper); + panelCompanyTools.Controls.Add(buttonRefresh); + panelCompanyTools.Controls.Add(maskedTextBoxPosition); + panelCompanyTools.Controls.Add(buttonGoToCheck); + panelCompanyTools.Controls.Add(buttonRemoveStormtrooper); + panelCompanyTools.Dock = DockStyle.Bottom; + panelCompanyTools.Enabled = false; + panelCompanyTools.Location = new Point(3, 299); + panelCompanyTools.Name = "panelCompanyTools"; + panelCompanyTools.Size = new Size(219, 357); + panelCompanyTools.TabIndex = 8; + // + // buttonCreateCompany + // + buttonCreateCompany.Location = new Point(3, 3); + buttonCreateCompany.Name = "buttonCreateCompany"; + buttonCreateCompany.Size = new Size(213, 23); + buttonCreateCompany.TabIndex = 7; + buttonCreateCompany.Text = "Создать компанию"; + buttonCreateCompany.UseVisualStyleBackColor = true; + buttonCreateCompany.Click += buttonCreateCompany_Click; + // + // buttonAddBaseStormtrooper + // + buttonAddBaseStormtrooper.Location = new Point(3, 90); + buttonAddBaseStormtrooper.Name = "buttonAddBaseStormtrooper"; + buttonAddBaseStormtrooper.Size = new Size(213, 52); + buttonAddBaseStormtrooper.TabIndex = 1; + buttonAddBaseStormtrooper.Text = "Добавление базового бомбардировщика"; + buttonAddBaseStormtrooper.UseVisualStyleBackColor = true; + buttonAddBaseStormtrooper.Click += buttonAddBaseStormtrooper_Click; + // + // buttonAddStormtrooper + // + buttonAddStormtrooper.Location = new Point(3, 32); + buttonAddStormtrooper.Name = "buttonAddStormtrooper"; + buttonAddStormtrooper.Size = new Size(213, 52); + buttonAddStormtrooper.TabIndex = 2; + buttonAddStormtrooper.Text = "Добавление бомбардировщика"; + buttonAddStormtrooper.UseVisualStyleBackColor = true; + buttonAddStormtrooper.Click += buttonAddStormtrooper_Click; + // // buttonRefresh // - buttonRefresh.Location = new Point(6, 563); + buttonRefresh.Location = new Point(3, 293); buttonRefresh.Name = "buttonRefresh"; buttonRefresh.Size = new Size(213, 52); buttonRefresh.TabIndex = 6; @@ -68,9 +122,18 @@ buttonRefresh.UseVisualStyleBackColor = true; buttonRefresh.Click += buttonRefresh_Click; // + // maskedTextBoxPosition + // + maskedTextBoxPosition.Location = new Point(3, 148); + maskedTextBoxPosition.Mask = "00"; + maskedTextBoxPosition.Name = "maskedTextBoxPosition"; + maskedTextBoxPosition.Size = new Size(213, 23); + maskedTextBoxPosition.TabIndex = 3; + maskedTextBoxPosition.ValidatingType = typeof(int); + // // buttonGoToCheck // - buttonGoToCheck.Location = new Point(6, 378); + buttonGoToCheck.Location = new Point(3, 235); buttonGoToCheck.Name = "buttonGoToCheck"; buttonGoToCheck.Size = new Size(213, 52); buttonGoToCheck.TabIndex = 5; @@ -80,7 +143,7 @@ // // buttonRemoveStormtrooper // - buttonRemoveStormtrooper.Location = new Point(6, 265); + buttonRemoveStormtrooper.Location = new Point(3, 177); buttonRemoveStormtrooper.Name = "buttonRemoveStormtrooper"; buttonRemoveStormtrooper.Size = new Size(213, 52); buttonRemoveStormtrooper.TabIndex = 4; @@ -88,34 +151,87 @@ buttonRemoveStormtrooper.UseVisualStyleBackColor = true; buttonRemoveStormtrooper.Click += buttonRemoveStormtrooper_Click; // - // maskedTextBoxPosition + // panelStorage // - maskedTextBoxPosition.Location = new Point(6, 226); - maskedTextBoxPosition.Mask = "00"; - maskedTextBoxPosition.Name = "maskedTextBoxPosition"; - maskedTextBoxPosition.Size = new Size(213, 23); - maskedTextBoxPosition.TabIndex = 3; - maskedTextBoxPosition.ValidatingType = typeof(int); + 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(219, 242); + panelStorage.TabIndex = 7; // - // buttonAddStormtrooper + // buttonCollectionDel // - buttonAddStormtrooper.Location = new Point(6, 124); - buttonAddStormtrooper.Name = "buttonAddStormtrooper"; - buttonAddStormtrooper.Size = new Size(213, 52); - buttonAddStormtrooper.TabIndex = 2; - buttonAddStormtrooper.Text = "Добавление бомбардировщика"; - buttonAddStormtrooper.UseVisualStyleBackColor = true; - buttonAddStormtrooper.Click += buttonAddStormtrooper_Click; + buttonCollectionDel.Location = new Point(3, 211); + buttonCollectionDel.Name = "buttonCollectionDel"; + buttonCollectionDel.Size = new Size(213, 23); + buttonCollectionDel.TabIndex = 6; + buttonCollectionDel.Text = "Удалить коллекцию"; + buttonCollectionDel.UseVisualStyleBackColor = true; + buttonCollectionDel.Click += buttonCollectionDel_Click; // - // buttonAddBaseStormtrooper + // listBoxCollection // - buttonAddBaseStormtrooper.Location = new Point(6, 66); - buttonAddBaseStormtrooper.Name = "buttonAddBaseStormtrooper"; - buttonAddBaseStormtrooper.Size = new Size(213, 52); - buttonAddBaseStormtrooper.TabIndex = 1; - buttonAddBaseStormtrooper.Text = "Добавление базового бомбардировщика"; - buttonAddBaseStormtrooper.UseVisualStyleBackColor = true; - buttonAddBaseStormtrooper.Click += buttonAddBaseStormtrooper_Click; + listBoxCollection.FormattingEnabled = true; + listBoxCollection.ItemHeight = 15; + listBoxCollection.Location = new Point(3, 111); + listBoxCollection.Name = "listBoxCollection"; + listBoxCollection.Size = new Size(213, 94); + listBoxCollection.TabIndex = 5; + // + // buttonCollectionAdd + // + buttonCollectionAdd.Location = new Point(3, 82); + buttonCollectionAdd.Name = "buttonCollectionAdd"; + buttonCollectionAdd.Size = new Size(213, 23); + buttonCollectionAdd.TabIndex = 4; + buttonCollectionAdd.Text = "Добавить коллекцию"; + buttonCollectionAdd.UseVisualStyleBackColor = true; + buttonCollectionAdd.Click += buttonCollectionAdd_Click; + // + // radioButtonList + // + radioButtonList.AutoSize = true; + radioButtonList.Location = new Point(106, 57); + 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(33, 57); + 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, 28); + textBoxCollectionName.Name = "textBoxCollectionName"; + textBoxCollectionName.Size = new Size(213, 23); + textBoxCollectionName.TabIndex = 1; + // + // labelCollectionName + // + labelCollectionName.AutoSize = true; + labelCollectionName.Location = new Point(50, 10); + labelCollectionName.Name = "labelCollectionName"; + labelCollectionName.Size = new Size(122, 15); + labelCollectionName.TabIndex = 0; + labelCollectionName.Text = "Название коллекции"; // // comboBoxSelectorCompany // @@ -123,7 +239,7 @@ comboBoxSelectorCompany.DropDownStyle = ComboBoxStyle.DropDownList; comboBoxSelectorCompany.FormattingEnabled = true; comboBoxSelectorCompany.Items.AddRange(new object[] { "Хранилище" }); - comboBoxSelectorCompany.Location = new Point(6, 22); + comboBoxSelectorCompany.Location = new Point(6, 267); comboBoxSelectorCompany.Name = "comboBoxSelectorCompany"; comboBoxSelectorCompany.Size = new Size(213, 23); comboBoxSelectorCompany.TabIndex = 0; @@ -148,7 +264,10 @@ Name = "FormStormtrooperCollection"; Text = "Коллекция бомбардировщиков"; groupBoxTools.ResumeLayout(false); - groupBoxTools.PerformLayout(); + panelCompanyTools.ResumeLayout(false); + panelCompanyTools.PerformLayout(); + panelStorage.ResumeLayout(false); + panelStorage.PerformLayout(); ((System.ComponentModel.ISupportInitialize)pictureBox).EndInit(); ResumeLayout(false); } @@ -164,5 +283,15 @@ private PictureBox pictureBox; private Button buttonRefresh; private Button buttonGoToCheck; + private Panel panelStorage; + private RadioButton radioButtonList; + private RadioButton radioButtonMassive; + private TextBox textBoxCollectionName; + private Label labelCollectionName; + private Button buttonCreateCompany; + private Button buttonCollectionDel; + private ListBox listBoxCollection; + private Button buttonCollectionAdd; + private Panel panelCompanyTools; } } \ No newline at end of file diff --git a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.cs b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.cs index 5be0f14..d4eaaed 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.cs @@ -1,14 +1,5 @@ using ProjectStormtrooper.CollectionGenericObjects; using ProjectStormtrooper.Drawnings; -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 ProjectStormtrooper; /// @@ -16,6 +7,11 @@ namespace ProjectStormtrooper; /// public partial class FormStormtrooperCollection : Form { + /// + /// Хранилище коллекций + /// + private readonly StorageCollection _storageCollection; + /// /// Компания /// @@ -26,6 +22,7 @@ public partial class FormStormtrooperCollection : Form public FormStormtrooperCollection() { InitializeComponent(); + _storageCollection = new(); } /// /// Выбор компании @@ -34,12 +31,7 @@ public partial class FormStormtrooperCollection : Form /// private void comboBoxSelectorCompany_SelectedIndexChanged(object sender, EventArgs e) { - switch (comboBoxSelectorCompany.Text) - { - case "Хранилище": - _company = new StormtrooperSharingService(pictureBox.Width, pictureBox.Height, new MassiveGenericObjects()); - break; - } + panelCompanyTools.Enabled = true; } /// /// Создание объекта класса-перемещения @@ -59,7 +51,7 @@ public partial class FormStormtrooperCollection : Form drawningBaseStormtrooper = new DrawningBaseStormtrooper(random.Next(100, 300), random.Next(1000, 3000), GetColor(random)); break; case nameof(DrawingStormtrooper): - drawningBaseStormtrooper = new DrawingStormtrooper(random.Next(100, 300), random.Next(1000, 3000),GetColor(random),GetColor(random), + drawningBaseStormtrooper = new DrawingStormtrooper(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: @@ -121,7 +113,7 @@ public partial class FormStormtrooperCollection : Form int pos = Convert.ToInt32(maskedTextBoxPosition.Text); int tempSize = StormtrooperSharingService.getAmountOfObjects(); - if (_company-pos!=null) + if (_company - pos != null) { MessageBox.Show("Объект удалён"); pictureBox.Image = _company.Show(); @@ -143,9 +135,9 @@ public partial class FormStormtrooperCollection : Form { return; } - DrawningBaseStormtrooper? stormtrooper= null; + DrawningBaseStormtrooper? stormtrooper = null; int counter = 100; - while(stormtrooper == null) + while (stormtrooper == null) { stormtrooper = _company.GetRandomObject(); counter--; @@ -178,5 +170,103 @@ public partial class FormStormtrooperCollection : 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); + RerfreshListBoxItems(); + + } + + /// + /// Удаление коллекции + /// + /// + /// + private void buttonCollectionDel_Click(object sender, EventArgs e) + { + // TODO прописать логику удаления элемента из коллекции + // нужно убедиться, что есть выбранная коллекция + // спросить у пользователя через MessageBox, что он подтверждает, что хочет удалить запись + // удалить и обновить ListBox + if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null) + { + MessageBox.Show("Коллекция не выбрана"); + return; + } + if (MessageBox.Show("Удалить коллекцию?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + { + return; + } + _storageCollection.DelCollection(listBoxCollection.SelectedItem.ToString()); + RerfreshListBoxItems(); + } + + /// + /// Создание компании + /// + /// + /// + 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 StormtrooperSharingService(pictureBox.Width, pictureBox.Height, collection); + break; + } + panelCompanyTools.Enabled = true; + RerfreshListBoxItems(); + + } + /// + /// Обновление списка в listBoxCollection + /// + private void RerfreshListBoxItems() + { + 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); + } + } + } } + +