diff --git a/ProjectBomber/ProjectBomber/AbstractStrategy.cs b/ProjectBomber/ProjectBomber/AbstractStrategy.cs new file mode 100644 index 0000000..ad60a81 --- /dev/null +++ b/ProjectBomber/ProjectBomber/AbstractStrategy.cs @@ -0,0 +1,133 @@ +using ProjectBomber.MovementStrategy; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectBomber.MovementStrategy +{ + /// + /// Класс-стратегия перемещения объекта + /// + public abstract class AbstractStrategy + { + /// + /// Перемещаемый объект + /// + private IMoveableObject _moveableObject; + /// + /// Статус перемещения + /// + private Status _state = Status.NotInit; + /// + /// Ширина поля + /// + protected int FieldWidth { get; private set; } + /// + /// Высота поля + /// + protected int FieldHeight { get; private set; } + /// + /// Статус перемещения + /// + public Status GetStatus() { return _state; } + /// + /// Установка данных + /// + /// Перемещаемый объект + /// Ширина поля + /// Высота поля + public void SetData(IMoveableObject moveableObject, int width, int height) + { + if (moveableObject == null) + { + _state = Status.NotInit; + return; + } + _state = Status.InProgress; + _moveableObject = moveableObject; + FieldWidth = width; + FieldHeight = height; + } + /// + /// Шаг перемещения + /// + public void MakeStep() + { + if (_state != Status.InProgress) + { + return; + } + if (IsTargetDestinaion()) + { + _state = Status.Finish; + return; + } + MoveToTarget(); + } + /// + /// Перемещение влево + /// + /// Результат перемещения (true - удалось переместиться, false -неудача) + protected bool MoveLeft() => MoveTo(DirectionType.Left); + /// + /// Перемещение вправо + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveRight() => MoveTo(DirectionType.Right); + /// + /// Перемещение вверх + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveUp() => MoveTo(DirectionType.Up); + /// + /// Перемещение вниз + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveDown() => MoveTo(DirectionType.Down); + /// + /// Параметры объекта + /// + protected ObjectParameters GetObjectParameters => _moveableObject?.GetObjectPosition; + /// + /// Шаг объекта + /// + /// + protected int? GetStep() + { + if (_state != Status.InProgress) + { + return null; + } + return _moveableObject?.GetStep; + } + /// + /// Перемещение к цели + /// + protected abstract void MoveToTarget(); + /// + /// Достигнута ли цель + /// + /// + protected abstract bool IsTargetDestinaion(); + /// + /// Попытка перемещения в требуемом направлении + /// + /// Направление + /// Результат попытки (true - удалось переместиться, false - неудача) + private bool MoveTo(DirectionType directionType) + { + if (_state != Status.InProgress) + { + return false; + } + if (_moveableObject?.CheckCanMove(directionType) ?? false) + { + _moveableObject.MoveObject(directionType); + return true; + } + return false; + } + } +} diff --git a/ProjectBomber/ProjectBomber/DrawningBomber.cs b/ProjectBomber/ProjectBomber/DrawningBomber.cs index bb91c43..5594cbc 100644 --- a/ProjectBomber/ProjectBomber/DrawningBomber.cs +++ b/ProjectBomber/ProjectBomber/DrawningBomber.cs @@ -1,4 +1,5 @@ -using System; +using ProjectBomber.Entities; +using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; @@ -6,14 +7,17 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace ProjectBomber +namespace ProjectBomber.DrawningObjects { - internal class DrawningBomber + /// + /// Класс, отвечающий за прорисовку и перемещение объекта-сущности + /// + public class DrawningBomber { /// /// Класс-сущность /// - public EntityBomber EntityBomber { get; private set; } + public EntityBomber EntityBomber { get; protected set; } /// /// Ширина окна /// @@ -25,47 +29,114 @@ namespace ProjectBomber /// /// Левая координата прорисовки бомбардировщика /// - private int _startPosX; + protected int _startPosX; /// /// Верхняя кооридната прорисовки бомбардировщика /// - private int _startPosY; + protected int _startPosY; /// /// Ширина прорисовки бомбардировщика /// - private int _bomberWidth = 50; + protected readonly int _bomberWidth = 60; /// /// Высота прорисовки бомбардировщика /// - private int _bomberHeight = 110; + protected readonly int _bomberHeight = 55; /// - /// Инициализация свойств + /// Конструктор /// /// Скорость /// Вес - /// Цвет крыльев - /// Дополнительный цвет - /// Признак наличия бомб - /// Признак наличия топливных баков - /// Признак наличия полосы + /// Основной цвет /// Ширина картинки /// Высота картинки - /// true - объект создан, false - проверка не пройдена, нельзя создать объект в этих размерах - public bool Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bombs, bool fuelTanks, bool line, int width, int height, int bomberwidth, int bomberheight) + public DrawningBomber(int speed, double weight, Color bodyColor, int width, int height) { _pictureWidth = width; _pictureHeight = height; - _bomberWidth = bomberwidth; - _bomberHeight = bomberheight; - EntityBomber = new EntityBomber(); - EntityBomber.Init(speed, weight, bodyColor, additionalColor, bombs, fuelTanks, line); + EntityBomber = new EntityBomber(speed, weight, bodyColor); if ((_bomberWidth >= _pictureWidth) || (_bomberHeight >= _pictureHeight)) { - Console.WriteLine("Объект не прошел проверку"); + Console.WriteLine("Проверка не пройдена, нельзя создать объект в этих размерах"); + if (_bomberWidth >= _pictureWidth) + { + _bomberWidth = _pictureWidth - _bomberWidth; + } + if (_bomberHeight >= _pictureHeight) + { + _bomberHeight = _pictureHeight - _bomberHeight; + } + } + else + { + Console.WriteLine("Объект создан"); + } + } + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + /// Ширина картинки + /// Высота картинки + /// Ширина прорисовки бомбардировщика + /// Высота прорисовки бомбардировщика + protected DrawningBomber(int speed, double weight, Color bodyColor, int width, int height, int bomberWidth, int bomberHeight) + { + _pictureWidth = width; + _pictureHeight = height; + _bomberWidth = bomberWidth; + _bomberHeight = bomberHeight; + EntityBomber = new EntityBomber(speed, weight, bodyColor); + } + /// + /// Координата X объекта + /// + public int GetPosX => _startPosX; + /// + /// Координата Y объекта + /// + public int GetPosY => _startPosY; + /// + /// Ширина объекта + /// + public int GetWidth => _bomberWidth; + /// + /// Высота объекта + /// + public int GetHeight => _bomberHeight; + /// + /// Проверка, что объект может переместится по указанному направлению + /// + /// Направление + /// true - можно переместится по указанному направлению + public bool CanMove(DirectionType direction) + { + if (EntityBomber == null) + { return false; } - return true; + if (direction == DirectionType.Left) + { + return _startPosX - EntityBomber.Step > 0; + } + else if (direction == DirectionType.Up) + { + return _startPosY - EntityBomber.Step > 0; + } + else if (direction == DirectionType.Down) + { + return _startPosY + EntityBomber.Step < _pictureHeight; + } + else if (direction == DirectionType.Right) + { + return _startPosX + EntityBomber.Step < _pictureWidth; + } + + return false; // Возвращаем false в случае неподдерживаемого направления } + /// /// Установка позиции /// @@ -73,6 +144,7 @@ namespace ProjectBomber /// Координата Y public void SetPosition(int x, int y) { + // TODO: Изменение x, y, если при установке объект выходит за границы _startPosX = x; _startPosY = y; // если выходит за границы, возвращаем на форму @@ -135,25 +207,14 @@ namespace ProjectBomber break; } } - /// - /// Прорисовка объекта - /// - /// - public void DrawTransport(Graphics g) + public virtual void DrawTransport(Graphics g) { if (EntityBomber == null) { return; } Pen pen = new Pen(Color.Black); - Brush additionalBrush = new SolidBrush(EntityBomber.AdditionalColor); Brush bodyBrush = new SolidBrush(EntityBomber.BodyColor); - // Бомбы - if (EntityBomber.Bombs) - { - g.FillRectangle(additionalBrush, _startPosX + 15, _startPosY + 18, 18, 4); - g.FillRectangle(additionalBrush, _startPosX + 15, _startPosY + 48, 18, 4); - } // крыло 1 GraphicsPath path = new GraphicsPath(); path.StartFigure(); @@ -212,17 +273,6 @@ namespace ProjectBomber g.FillPath(brOrange, path1); // Рисуем контур линии g.DrawPath(pen, path1); - // баки с топливом - if (EntityBomber.FuelTanks) - { - g.FillRectangle(additionalBrush, _startPosX + 40, _startPosY + 28, 10, 3); - g.FillRectangle(additionalBrush, _startPosX + 40, _startPosY + 40, 10, 3); - } - // линия - if (EntityBomber.Line) - { - g.FillRectangle(additionalBrush, _startPosX + 10, _startPosY + 34, 50, 2); - } } } } diff --git a/ProjectBomber/ProjectBomber/DrawningBomberAdvanced.cs b/ProjectBomber/ProjectBomber/DrawningBomberAdvanced.cs new file mode 100644 index 0000000..9ca1cda --- /dev/null +++ b/ProjectBomber/ProjectBomber/DrawningBomberAdvanced.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ProjectBomber.Entities; + +namespace ProjectBomber.DrawningObjects +{ + /// + /// Класс, отвечающий за прорисовку и перемещение объекта-сущности + /// + public class DrawningBomberAdvanced : DrawningBomber + { + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия обвеса + /// Признак наличия антикрыла + /// Признак наличия гоночной полосы + /// Ширина картинки + /// Высота картинки + public DrawningBomberAdvanced(int speed, double weight, Color bodyColor, Color + additionalColor, bool bombs, bool fuelTanks, bool line, int width, int height) : + base(speed, weight, bodyColor, width, height, 60, 60) + { + if (EntityBomber != null) + { + EntityBomber = new EntityBomberAdvanced(speed, weight, bodyColor, + additionalColor, bombs, fuelTanks, line); + } + } + public override void DrawTransport(Graphics g) + { + if (EntityBomber is EntityBomberAdvanced bomber) + { + Pen pen = new Pen(Color.Black); + Brush additionalBrush = new SolidBrush(bomber.AdditionalColor); + // Бомбы + if (bomber.Bombs) + { + g.FillRectangle(additionalBrush, _startPosX + 15, _startPosY + 18, 18, 4); + g.FillRectangle(additionalBrush, _startPosX + 15, _startPosY + 48, 18, 4); + } + base.DrawTransport(g); + // баки с топливом + if (bomber.FuelTanks) + { + g.FillRectangle(additionalBrush, _startPosX + 40, _startPosY + 28, 10, 3); + g.FillRectangle(additionalBrush, _startPosX + 40, _startPosY + 40, 10, 3); + } + // линия + if (bomber.Line) + { + g.FillRectangle(additionalBrush, _startPosX + 10, _startPosY + 34, 50, 2); + } + } + + } + + } +} diff --git a/ProjectBomber/ProjectBomber/DrawningObjectBomber.cs b/ProjectBomber/ProjectBomber/DrawningObjectBomber.cs new file mode 100644 index 0000000..44ddbc7 --- /dev/null +++ b/ProjectBomber/ProjectBomber/DrawningObjectBomber.cs @@ -0,0 +1,38 @@ +using ProjectBomber.DrawningObjects; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectBomber.MovementStrategy +{ + /// + /// Реализация интерфейса IDrawningObject для работы с объектом DrawningCar (паттерн Adapter) + /// + public class DrawningObjectBomber : IMoveableObject + { + private readonly DrawningBomber _drawningBomber = null; + public DrawningObjectBomber(DrawningBomber drawningBomber) + { + _drawningBomber = drawningBomber; + } + public ObjectParameters GetObjectPosition + { + get + { + if (_drawningBomber == null || _drawningBomber.EntityBomber == null) + { + return null; + } + return new ObjectParameters(_drawningBomber.GetPosX, + _drawningBomber.GetPosY, _drawningBomber.GetWidth, _drawningBomber.GetHeight); + } + } + public int GetStep => (int)(_drawningBomber?.EntityBomber?.Step ?? 0); + public bool CheckCanMove(DirectionType direction) => + _drawningBomber?.CanMove(direction) ?? false; + public void MoveObject(DirectionType direction) => + _drawningBomber?.MoveTransport(direction); + } +} \ No newline at end of file diff --git a/ProjectBomber/ProjectBomber/EntityBomber.cs b/ProjectBomber/ProjectBomber/EntityBomber.cs index d9e2b8f..e796f42 100644 --- a/ProjectBomber/ProjectBomber/EntityBomber.cs +++ b/ProjectBomber/ProjectBomber/EntityBomber.cs @@ -5,9 +5,12 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace ProjectBomber +namespace ProjectBomber.Entities { - internal class EntityBomber + /// + /// Класс-сущность "Бомбардировщик" + /// + public class EntityBomber { /// /// Скорость @@ -22,45 +25,20 @@ namespace ProjectBomber /// public Color BodyColor { get; private set; } /// - /// Дополнительный цвет (для опциональных элементов) - /// - public Color AdditionalColor { get; private set; } - /// - /// Признак (опция) наличия бомб - /// - public bool Bombs { get; private set; } - /// - /// Признак (опция) наличия топливных баков - /// - public bool FuelTanks { get; private set; } - /// - /// Признак (опция) наличия воздушного пространства - /// - public bool Line { get; private set; } - /// /// Шаг перемещения автомобиля /// public double Step => (double)Speed * 100 / Weight; /// - /// Инициализация полей объекта-класса спортивного автомобиля + /// Конструктор с параметрами /// /// Скорость - /// Вес бомбардировщика + /// Вес самолета /// Основной цвет - /// Дополнительный цвет - /// Признак наличия бомб - /// Признак наличия топливных баков - /// Признак наличия линии - public void Init(int speed, double weight, Color bodyColor, Color - additionalColor, bool bombs, bool fuelTanks, bool line) + public EntityBomber(int speed, double weight, Color bodyColor) { Speed = speed; Weight = weight; BodyColor = bodyColor; - AdditionalColor = additionalColor; - Bombs = bombs; - FuelTanks = fuelTanks; - Line = line; } } } diff --git a/ProjectBomber/ProjectBomber/EntityBomberAdvanced.cs b/ProjectBomber/ProjectBomber/EntityBomberAdvanced.cs new file mode 100644 index 0000000..9bd4258 --- /dev/null +++ b/ProjectBomber/ProjectBomber/EntityBomberAdvanced.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ProjectBomber.Entities; + +namespace ProjectBomber.Entities +{ + /// + /// Класс-сущность "Бомбардировщик" + /// + public class EntityBomberAdvanced : EntityBomber + { + /// + /// Дополнительный цвет (для опциональных элементов) + /// + public Color AdditionalColor { get; private set; } + /// + /// Признак (опция) наличия бомб + /// + public bool Bombs { get; private set; } + /// + /// Признак (опция) наличия топливных баков + /// + public bool FuelTanks { get; private set; } + /// + /// Признак (опция) наличия полосы + /// + public bool Line { get; private set; } + /// + /// Инициализация полей объекта-класса спортивного автомобиля + /// + /// Скорость + /// Вес автомобиля + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия бомб + /// Признак наличия топливных баков + /// Признак наличия полосы + public EntityBomberAdvanced(int speed, double weight, Color bodyColor, Color additionalColor, bool bombs, bool fuelTanks, bool line): + base(speed, weight, bodyColor) + { + AdditionalColor = additionalColor; + Bombs = bombs; + FuelTanks = fuelTanks; + Line = line; + } + } +} diff --git a/ProjectBomber/ProjectBomber/Form1.Designer.cs b/ProjectBomber/ProjectBomber/Form1.Designer.cs index 5ec2e0f..7ac8ffd 100644 --- a/ProjectBomber/ProjectBomber/Form1.Designer.cs +++ b/ProjectBomber/ProjectBomber/Form1.Designer.cs @@ -30,11 +30,14 @@ { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormBomber)); this.pictureBoxBomber = new System.Windows.Forms.PictureBox(); - this.buttonCreate = new System.Windows.Forms.Button(); + this.ButtonCreateBomber = new System.Windows.Forms.Button(); this.buttonUp = new System.Windows.Forms.Button(); this.buttonLeft = new System.Windows.Forms.Button(); this.buttonDown = new System.Windows.Forms.Button(); this.buttonRight = new System.Windows.Forms.Button(); + this.comboBox1Strategy = new System.Windows.Forms.ComboBox(); + this.ButtonCreatePlane = new System.Windows.Forms.Button(); + this.ButtonStep = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)(this.pictureBoxBomber)).BeginInit(); this.SuspendLayout(); // @@ -48,16 +51,16 @@ this.pictureBoxBomber.TabIndex = 0; this.pictureBoxBomber.TabStop = false; // - // buttonCreate + // ButtonCreateBomber // - this.buttonCreate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonCreate.Location = new System.Drawing.Point(12, 422); - this.buttonCreate.Name = "buttonCreate"; - this.buttonCreate.Size = new System.Drawing.Size(87, 27); - this.buttonCreate.TabIndex = 2; - this.buttonCreate.Text = "Создать"; - this.buttonCreate.UseVisualStyleBackColor = true; - this.buttonCreate.Click += new System.EventHandler(this.buttonCreate_Click); + this.ButtonCreateBomber.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.ButtonCreateBomber.Location = new System.Drawing.Point(12, 421); + this.ButtonCreateBomber.Name = "ButtonCreateBomber"; + this.ButtonCreateBomber.Size = new System.Drawing.Size(150, 27); + this.ButtonCreateBomber.TabIndex = 2; + this.ButtonCreateBomber.Text = "Создать бомбардировщик"; + this.ButtonCreateBomber.UseVisualStyleBackColor = true; + this.ButtonCreateBomber.Click += new System.EventHandler(this.ButtonCreateBomber_Click); // // buttonUp // @@ -107,15 +110,50 @@ this.buttonRight.UseVisualStyleBackColor = true; this.buttonRight.Click += new System.EventHandler(this.ButtonMove_Click); // + // comboBox1Strategy + // + this.comboBox1Strategy.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox1Strategy.FormattingEnabled = true; + this.comboBox1Strategy.Items.AddRange(new object[] { + "_abstractStrategy", + "_MyabstractStrategy"}); + this.comboBox1Strategy.Location = new System.Drawing.Point(712, 12); + this.comboBox1Strategy.Name = "comboBox1Strategy"; + this.comboBox1Strategy.Size = new System.Drawing.Size(150, 21); + this.comboBox1Strategy.TabIndex = 8; + // + // ButtonCreatePlane + // + this.ButtonCreatePlane.Location = new System.Drawing.Point(168, 421); + this.ButtonCreatePlane.Name = "ButtonCreatePlane"; + this.ButtonCreatePlane.Size = new System.Drawing.Size(121, 27); + this.ButtonCreatePlane.TabIndex = 9; + this.ButtonCreatePlane.Text = "Создать самолет"; + this.ButtonCreatePlane.UseVisualStyleBackColor = true; + this.ButtonCreatePlane.Click += new System.EventHandler(this.ButtonCreatePlane_Click); + // + // ButtonStep + // + this.ButtonStep.Location = new System.Drawing.Point(712, 39); + this.ButtonStep.Name = "ButtonStep"; + this.ButtonStep.Size = new System.Drawing.Size(150, 22); + this.ButtonStep.TabIndex = 10; + this.ButtonStep.Text = "Шаг"; + this.ButtonStep.UseVisualStyleBackColor = true; + this.ButtonStep.Click += new System.EventHandler(this.ButtonStep_Click); + // // FormBomber // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; this.ClientSize = new System.Drawing.Size(884, 461); + this.Controls.Add(this.ButtonStep); + this.Controls.Add(this.ButtonCreatePlane); + this.Controls.Add(this.comboBox1Strategy); this.Controls.Add(this.buttonRight); this.Controls.Add(this.buttonDown); this.Controls.Add(this.buttonLeft); this.Controls.Add(this.buttonUp); - this.Controls.Add(this.buttonCreate); + this.Controls.Add(this.ButtonCreateBomber); this.Controls.Add(this.pictureBoxBomber); this.Name = "FormBomber"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; @@ -129,11 +167,14 @@ #endregion private System.Windows.Forms.PictureBox pictureBoxBomber; - private System.Windows.Forms.Button buttonCreate; + private System.Windows.Forms.Button ButtonCreateBomber; private System.Windows.Forms.Button buttonUp; private System.Windows.Forms.Button buttonLeft; private System.Windows.Forms.Button buttonDown; private System.Windows.Forms.Button buttonRight; + private System.Windows.Forms.ComboBox comboBox1Strategy; + private System.Windows.Forms.Button ButtonCreatePlane; + private System.Windows.Forms.Button ButtonStep; } } diff --git a/ProjectBomber/ProjectBomber/Form1.cs b/ProjectBomber/ProjectBomber/Form1.cs index c9aa022..fedb957 100644 --- a/ProjectBomber/ProjectBomber/Form1.cs +++ b/ProjectBomber/ProjectBomber/Form1.cs @@ -1,4 +1,6 @@ -using System; +using ProjectBomber.DrawningObjects; +using ProjectBomber.MovementStrategy; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; @@ -12,7 +14,14 @@ namespace ProjectBomber { public partial class FormBomber : Form { + /// + /// Поле-объект для прорисовки объекта + /// private DrawningBomber _drawningBomber; + /// + /// Стратегии перемещения + /// + private AbstractStrategy _abstractStrategy; public FormBomber() { InitializeComponent(); @@ -29,20 +38,32 @@ namespace ProjectBomber pictureBoxBomber.Image = bmp; } /// - /// Обработка нажатия кнопки "Создать" + /// Обработка нажатия кнопки "Создать бомбардировщик" /// /// /// - private void buttonCreate_Click(object sender, EventArgs e) + private void ButtonCreateBomber_Click(object sender, EventArgs e) { Random random = new Random(); - _drawningBomber = new DrawningBomber(); - _drawningBomber.Init(random.Next(100, 300), random.Next(1000, 3000), Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), + _drawningBomber = new DrawningBomberAdvanced(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)), - pictureBoxBomber.Width, pictureBoxBomber.Height, 60, 70); - _drawningBomber.SetPosition(random.Next(0, 50), - random.Next(0, 50)); + pictureBoxBomber.Width, pictureBoxBomber.Height); + _drawningBomber.SetPosition(random.Next(10, 100), random.Next(10, 100)); + Draw(); + } + /// + /// Обработка нажатия кнопки "Создать самолёт" + /// + /// + /// + private void ButtonCreatePlane_Click(object sender, EventArgs e) + { + Random random = new Random(); + _drawningBomber = new DrawningBomber(random.Next(100, 300), random.Next(1000, 3000), Color.FromArgb(random.Next(0, 256), random.Next(0, 256), + random.Next(0, 256)), pictureBoxBomber.Width, pictureBoxBomber.Height); + _drawningBomber.SetPosition(random.Next(10, 100), random.Next(10, 100)); Draw(); } /// @@ -74,5 +95,42 @@ namespace ProjectBomber } Draw(); } + private void ButtonStep_Click(object sender, EventArgs e) + { + if (_drawningBomber == null) + { + return; + } + if (comboBox1Strategy.Enabled) + { + int selectedIndex = comboBox1Strategy.SelectedIndex; + + if (selectedIndex == 0) + { + _abstractStrategy = new MoveToCenter(); + } + else if (selectedIndex == 1) + { + _abstractStrategy = new MoveToBottomRight(); + } + + if (_abstractStrategy != null) + { + _abstractStrategy.SetData(new DrawningObjectBomber(_drawningBomber), pictureBoxBomber.Width, pictureBoxBomber.Height); + comboBox1Strategy.Enabled = false; + } + } + if (_abstractStrategy == null) + { + return; + } + _abstractStrategy.MakeStep(); + Draw(); + if (_abstractStrategy.GetStatus() == Status.Finish) + { + comboBox1Strategy.Enabled = true; + _abstractStrategy = null; + } + } } } \ No newline at end of file diff --git a/ProjectBomber/ProjectBomber/IMoveableObject.cs b/ProjectBomber/ProjectBomber/IMoveableObject.cs new file mode 100644 index 0000000..58f24e9 --- /dev/null +++ b/ProjectBomber/ProjectBomber/IMoveableObject.cs @@ -0,0 +1,35 @@ +using ProjectBomber.MovementStrategy; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectBomber.MovementStrategy +{ + /// + /// Интерфейс для работы с перемещаемым объектом + /// + public interface IMoveableObject + { + /// + /// Получение координаты X объекта + /// + ObjectParameters GetObjectPosition { get; } + /// + /// Шаг объекта + /// + int GetStep { get; } + /// + /// Проверка, можно ли переместиться по нужному направлению + /// + /// + /// + bool CheckCanMove(DirectionType direction); + /// + /// Изменение направления пермещения объекта + /// + /// Направление + void MoveObject(DirectionType direction); + } +} diff --git a/ProjectBomber/ProjectBomber/MoveToBottomRight.cs b/ProjectBomber/ProjectBomber/MoveToBottomRight.cs new file mode 100644 index 0000000..75aa543 --- /dev/null +++ b/ProjectBomber/ProjectBomber/MoveToBottomRight.cs @@ -0,0 +1,43 @@ +using ProjectBomber.MovementStrategy; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectBomber +{ + public class MoveToBottomRight : AbstractStrategy + { + protected override bool IsTargetDestinaion() + { + var objParams = GetObjectParameters; + if (objParams == null) + { + return false; + } + return objParams.RightBorder <= FieldWidth && + objParams.RightBorder + GetStep() >= FieldWidth && + objParams.DownBorder <= FieldHeight && + objParams.DownBorder + GetStep() >= FieldHeight; + } + protected override void MoveToTarget() + { + var objParams = GetObjectParameters; + if (objParams == null) + { + return; + } + var diffX = FieldWidth - objParams.RightBorder; + if (Math.Abs(diffX) > GetStep()) + { + MoveRight(); + } + var diffY = FieldHeight - objParams.DownBorder; + if (Math.Abs(diffY) > GetStep()) + { + MoveDown(); + } + } + } +} diff --git a/ProjectBomber/ProjectBomber/MoveToCenter.cs b/ProjectBomber/ProjectBomber/MoveToCenter.cs new file mode 100644 index 0000000..324b09d --- /dev/null +++ b/ProjectBomber/ProjectBomber/MoveToCenter.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectBomber.MovementStrategy +{ + /// + /// Стратегия перемещения объекта в центр экрана + /// + public class MoveToCenter : AbstractStrategy + { + protected override bool IsTargetDestinaion() + { + var objParams = GetObjectParameters; + if (objParams == null) + { + return false; + } + return objParams.ObjectMiddleHorizontal <= FieldWidth / 2 && + objParams.ObjectMiddleHorizontal + GetStep() >= FieldWidth / 2 && + objParams.ObjectMiddleVertical <= FieldHeight / 2 && + objParams.ObjectMiddleVertical + GetStep() >= FieldHeight / 2; + } + protected override void MoveToTarget() + { + var objParams = GetObjectParameters; + if (objParams == null) + { + return; + } + var diffX = objParams.ObjectMiddleHorizontal - FieldWidth / 2; + if (Math.Abs(diffX) > GetStep()) + { + if (diffX > 0) + { + MoveLeft(); + } + else + { + MoveRight(); + } + } + var diffY = objParams.ObjectMiddleVertical - FieldHeight / 2; + if (Math.Abs(diffY) > GetStep()) + { + if (diffY > 0) + { + MoveUp(); + } + else + { + MoveDown(); + } + } + } + } +} diff --git a/ProjectBomber/ProjectBomber/ObjectParameters.cs b/ProjectBomber/ProjectBomber/ObjectParameters.cs new file mode 100644 index 0000000..000861d --- /dev/null +++ b/ProjectBomber/ProjectBomber/ObjectParameters.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectBomber.MovementStrategy +{ + /// + /// Параметры-координаты объекта + /// + public class ObjectParameters + { + private readonly int _x; + 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; + } + } +} diff --git a/ProjectBomber/ProjectBomber/ProjectBomber.csproj b/ProjectBomber/ProjectBomber/ProjectBomber.csproj index 2306e10..16b6ff0 100644 --- a/ProjectBomber/ProjectBomber/ProjectBomber.csproj +++ b/ProjectBomber/ProjectBomber/ProjectBomber.csproj @@ -46,17 +46,26 @@ + + + + Form Form1.cs + + + + + Form1.cs diff --git a/ProjectBomber/ProjectBomber/Status.cs b/ProjectBomber/ProjectBomber/Status.cs new file mode 100644 index 0000000..4f112ff --- /dev/null +++ b/ProjectBomber/ProjectBomber/Status.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectBomber.MovementStrategy +{ + public enum Status + { + /// + /// Вверх + /// + NotInit = 1, + /// + /// Вниз + /// + InProgress = 2, + /// + /// Влево + /// + Finish = 3 + } +}