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
+ }
+}