diff --git a/Battleship/Battleship/DirectionType.cs b/Battleship/Battleship/Drawings/DirectionType.cs
similarity index 74%
rename from Battleship/Battleship/DirectionType.cs
rename to Battleship/Battleship/Drawings/DirectionType.cs
index 8b60694..dee01fc 100644
--- a/Battleship/Battleship/DirectionType.cs
+++ b/Battleship/Battleship/Drawings/DirectionType.cs
@@ -1,9 +1,14 @@
-namespace Battleship;
+namespace Battleship.Drawings;
///
/// класс, отвечающий за лево/право/верх/низ
///
public enum DirectionType
{
+ ///
+ /// Неизвестное направление
+ ///
+ Unknow = -1,
+
///
/// Вверх
///
diff --git a/Battleship/Battleship/Drawings/DrawingBattleship.cs b/Battleship/Battleship/Drawings/DrawingBattleship.cs
new file mode 100644
index 0000000..fdb8d10
--- /dev/null
+++ b/Battleship/Battleship/Drawings/DrawingBattleship.cs
@@ -0,0 +1,108 @@
+using Battleship.Entities;
+//using System.Drawings;
+
+namespace Battleship.Drawings;
+///
+/// Класс, отвечающий за отрисовку и перемещение объекта-сущности
+///
+public class DrawingBattleship : DrawingWarship
+{
+ ///
+ /// Конструктор
+ ///
+ /// Скорость
+ /// Вес
+ /// Основной цвет
+ /// Дополнительный цвет
+ /// Признак наличия палубы
+ /// Признак наличия отсека для ракет
+ /// Признак наличия башни
+ ///
+
+ public DrawingBattleship(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyDeck, bool compartment, bool tower) : base(129, 60)
+ {
+ EntityWarship = new EntityBattleship(speed, weight, bodyColor, compartment, tower, bodyDeck, additionalColor);
+ }
+
+ public override void DrawTransport(Graphics g)
+ {
+ if (EntityWarship == null || EntityWarship is not EntityBattleship battleship || !_startPosX.HasValue || !_startPosY.HasValue)
+ {
+ return;
+ }
+
+ Pen pen = new(Color.Black);
+ Brush additionalBrush = new SolidBrush(battleship.AdditionalColor);
+
+ //отсек для ракет
+ if (battleship.BodyDeck)
+ {
+ //заливка линкора
+ Brush br = new SolidBrush(EntityWarship.BodyColor);
+ g.FillRectangle(br, _startPosX.Value + 10, _startPosY.Value, 80, 40);
+ //границы линкора
+ g.DrawRectangle(pen, _startPosX.Value + 10, _startPosY.Value, 80, 40); //ширина высота (сама палуба)
+
+ //заливка двигателей (2 фигни сзади)
+ Brush brBlack = new SolidBrush(Color.Black);
+ g.FillRectangle(brBlack, _startPosX.Value + 5, _startPosY.Value + 7, 5, 10); //верхний
+ g.FillRectangle(brBlack, _startPosX.Value + 5, _startPosY.Value + 22, 5, 10); //нижний
+ //границы двигателей
+ g.DrawRectangle(pen, _startPosX.Value + 5, _startPosY.Value + 7, 5, 10); //двигатель верхний
+ g.DrawRectangle(pen, _startPosX.Value + 5, _startPosY.Value + 22, 5, 10); //двигатель нижний
+
+ //прямоугольник левый на палубе (горизонтальный)
+ Brush brLightSteelBlue = new SolidBrush(Color.LightSteelBlue);
+ g.FillRectangle(brLightSteelBlue, _startPosX.Value + 32, _startPosY.Value + 13, 21, 12);
+ g.DrawRectangle(pen, _startPosX.Value + 32, _startPosY.Value + 13, 21, 12);
+
+ //прямоугольник правый на палубе (вертикальный)
+ Brush brGray = new SolidBrush(Color.Gray);
+ g.FillRectangle(brGray, _startPosX.Value + 53, _startPosY.Value + 7, 16, 24);
+ g.DrawRectangle(pen, _startPosX.Value + 53, _startPosY.Value + 7, 16, 24);
+
+ //линии для треугольника
+ Point[] pointsNOS =
+ {
+ new Point(_startPosX.Value + 90, _startPosY.Value),
+ new Point(_startPosX.Value + 120, _startPosY.Value + 20),
+ new Point(_startPosX.Value + 90, _startPosY.Value + 40),
+
+ };
+ g.DrawPolygon(pen, pointsNOS);
+ g.FillPolygon(br, pointsNOS);
+
+ //заливка круга
+ Brush brLightSlateGray = new SolidBrush(Color.LightSlateGray);
+ g.FillEllipse(brLightSlateGray, _startPosX.Value + 78, _startPosY.Value + 12, 15, 15);
+ //круг на палубе
+ g.DrawEllipse(pen, _startPosX.Value + 78, _startPosY.Value + 12, 15, 15);
+ }
+
+ base.DrawTransport(g);
+
+ //башня
+ if (battleship.Tower)
+ {
+ //заливка башни
+ g.FillEllipse(additionalBrush, _startPosX.Value + 98, _startPosY.Value + 15, 10, 10);
+ g.FillRectangle(additionalBrush, _startPosX.Value + 107, _startPosY.Value + 17, 30, 5);
+
+ //границы башни
+ g.DrawEllipse(pen, _startPosX.Value + 98, _startPosY.Value + 15, 10, 10);
+ g.DrawRectangle(pen, _startPosX.Value + 107, _startPosY.Value + 17, 30, 5);
+ }
+
+ //отсек
+ if (battleship.Compartment)
+ {
+ g.FillRectangle(additionalBrush, _startPosX.Value + 15, _startPosY.Value + 5, 27, 5); //верхний отсек для ракет
+ g.FillRectangle(additionalBrush, _startPosX.Value + 15, _startPosY.Value + 28, 27, 5); //нижний отсек для ракет
+
+ //границы отсеков
+ g.DrawRectangle(pen, _startPosX.Value + 15, _startPosY.Value + 5, 27, 5); //верхний отсек
+ g.DrawRectangle(pen, _startPosX.Value + 15, _startPosY.Value + 28, 27, 5); //нижний отсек
+ }
+ }
+
+}
diff --git a/Battleship/Battleship/DrawingBattleship.cs b/Battleship/Battleship/Drawings/DrawingWarship.cs
similarity index 58%
rename from Battleship/Battleship/DrawingBattleship.cs
rename to Battleship/Battleship/Drawings/DrawingWarship.cs
index eee4543..7ce7114 100644
--- a/Battleship/Battleship/DrawingBattleship.cs
+++ b/Battleship/Battleship/Drawings/DrawingWarship.cs
@@ -1,13 +1,13 @@
-namespace Battleship;
-///
-/// Класс, отвечающий за отрисовку и перемещение объекта-сущности
-///
-public class DrawingBattleship
+using Battleship.Entities;
+
+namespace Battleship.Drawings;
+
+public class DrawingWarship
{
///
/// Класс-сущность
///
- public EntityBattleship? EntityBattleship { get; private set; }
+ public EntityWarship? EntityWarship { get; protected set; }
///
/// Ширина
@@ -20,45 +20,77 @@ public class DrawingBattleship
private int? _pictureHeight;
///
- /// Левая координата прорисовки линкора
+ /// Левая координата прорисовки военного корабля
///
- private int? _startPosX;
+ protected int? _startPosX;
///
- /// Верхняя координата прорисовки линкора
+ /// Верхняя координата прорисовки военного корабля
///
- private int? _startPosY;
+ protected int? _startPosY;
///
- /// Ширина прорисовки линкора
+ /// Ширина прорисовки военного корабля
///
- private readonly int _drawingBattleshipWidth = 129;
+ private readonly int _drawingWarshipWidth = 129;
///
- /// Высота прорисовки линкора
+ /// Высота прорисовки военного корабля
///
- private readonly int _drawingBattleshipHeight = 40;
+ private readonly int _drawingWarshipHeight = 40;
///
- /// Инициализация свойств
+ /// Координата Х объекта
///
- /// Скорость
- /// Вес
- /// Основной цвет
- /// Дополнительный цвет
- /// Признак наличия палубы
- /// Признак наличия отсека для ракет
- /// Признак наличия башни
- public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyDeck, bool compartment, bool tower)
+ public int? GetPosX => _startPosX;
+
+ ///
+ /// Координата Y объекта
+ ///
+ public int? GetPosY => _startPosY;
+
+ ///
+ /// Ширина объекта
+ ///
+ public int GetWidth => _drawingWarshipWidth;
+
+ ///
+ /// Высота объекта
+ ///
+ public int GetHeight => _drawingWarshipHeight;
+
+ ///
+ /// Пустой конструктор
+ ///
+ private DrawingWarship()
{
- EntityBattleship = new EntityBattleship();
- EntityBattleship.Init(speed, weight, bodyColor, additionalColor, bodyDeck, compartment, tower);
_pictureWidth = null;
_pictureHeight = null;
_startPosX = null;
_startPosY = null;
}
+ ///
+ /// Конструктор
+ ///
+ /// Скорость
+ /// Вес
+ /// Основной цвет
+ public DrawingWarship(int speed, double weight, Color bodyColor) : this()
+ {
+ EntityWarship = new EntityWarship(speed, weight, bodyColor);
+ }
+
+ ///
+ /// Конструктор для наследников
+ ///
+ /// Ширина прорисовки военного корабля
+ /// Высота прорисовки военного корабля
+ protected DrawingWarship(int drawingWarshipWidth, int drawingWarshipHeight) : this()
+ {
+ _drawingWarshipWidth = drawingWarshipWidth;
+ _drawingWarshipHeight = drawingWarshipHeight;
+ }
///
/// Установка границ поля
@@ -71,25 +103,25 @@ public class DrawingBattleship
{
//TODO проверка, что объект "влезает" в размеры поля
//если влезает, сохраняем границы и корректируем позицию объекта, если она уже была установлена
-
- if (_drawingBattleshipWidth > width || _drawingBattleshipHeight > height)
+
+ if (_drawingWarshipWidth > width || _drawingWarshipHeight > height)
{
return false;
}
_pictureWidth = width;
_pictureHeight = height;
-
+
if (_startPosX.HasValue || _startPosY.HasValue)
{
- if (_startPosX + _drawingBattleshipWidth > _pictureWidth)
+ if (_startPosX + _drawingWarshipWidth > _pictureWidth)
{
- _startPosX = _pictureWidth - _drawingBattleshipWidth;
+ _startPosX = _pictureWidth - _drawingWarshipWidth;
}
else if (_startPosX < 0) _startPosX = 0;
- if (_startPosY + _drawingBattleshipHeight > _pictureHeight)
+ if (_startPosY + _drawingWarshipHeight > _pictureHeight)
{
- _startPosY = _pictureHeight - _drawingBattleshipHeight;
+ _startPosY = _pictureHeight - _drawingWarshipHeight;
}
else if (_startPosY < 0) _startPosY = 0;
}
@@ -102,7 +134,7 @@ public class DrawingBattleship
///
/// Координата X
/// Координата Y
-
+
public void SetPosition(int x, int y, int width, int height)
{
if (!_pictureWidth.HasValue || !_pictureHeight.HasValue)
@@ -112,17 +144,17 @@ public class DrawingBattleship
// TODO если при установке объекта в эти координаты, он будет "выходить" за границы формы
// то надо изменить координаты, чтобы он оставался в этих границах
-
- if (x + _drawingBattleshipWidth > _pictureWidth)
+
+ if (x + _drawingWarshipWidth > _pictureWidth)
{
- _startPosX = _pictureWidth - _drawingBattleshipWidth;
+ _startPosX = _pictureWidth - _drawingWarshipWidth;
}
- else if (x < 0) _startPosX = 0;
+ else if (x < 0) _startPosX = 0;
else _startPosX = x;
- if (y + _drawingBattleshipHeight > _pictureHeight)
+ if (y + _drawingWarshipHeight > _pictureHeight)
{
- _startPosY = _pictureHeight - _drawingBattleshipHeight;
+ _startPosY = _pictureHeight - _drawingWarshipHeight;
}
else if (y < 0) _startPosY = 0;
else _startPosY = y;
@@ -137,49 +169,49 @@ public class DrawingBattleship
public bool MoveTransport(DirectionType direction)
{
- if (EntityBattleship == null || !_startPosX.HasValue || !_startPosY.HasValue)
+ if (EntityWarship == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return false;
}
- switch (direction)
+ switch (direction)
{
//влево
case DirectionType.Left:
- if (_startPosX.Value - EntityBattleship.Step > 0)
+ if (_startPosX.Value - EntityWarship.Step > 0)
{
- _startPosX -= (int)EntityBattleship.Step;
+ _startPosX -= (int)EntityWarship.Step;
}
return true;
//вправо
case DirectionType.Right:
- if (_startPosX.Value + EntityBattleship.Step + _drawingBattleshipWidth < _pictureWidth)
+ if (_startPosX.Value + EntityWarship.Step + _drawingWarshipWidth < _pictureWidth)
{
- _startPosX += (int)EntityBattleship.Step;
+ _startPosX += (int)EntityWarship.Step;
}
- return true;
-
+ return true;
+
//вверх
case DirectionType.Up:
- if (_startPosY.Value - EntityBattleship.Step > 0)
+ if (_startPosY.Value - EntityWarship.Step > 0)
{
- _startPosY -= (int)EntityBattleship.Step;
+ _startPosY -= (int)EntityWarship.Step;
}
return true;
//вниз
case DirectionType.Down:
- if (_startPosY.Value + EntityBattleship.Step + _drawingBattleshipHeight < _pictureHeight) //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ if (_startPosY.Value + EntityWarship.Step + _drawingWarshipHeight < _pictureHeight) //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
{
- _startPosY += (int)EntityBattleship.Step;
+ _startPosY += (int)EntityWarship.Step;
}
return true;
- default:
- return false;
+ default:
+ return false;
}
-
+
}
///
@@ -187,18 +219,17 @@ public class DrawingBattleship
///
///
- public void DrawTransport(Graphics g)
+ public virtual void DrawTransport(Graphics g)
{
- if (EntityBattleship == null || !_startPosX.HasValue || !_startPosY.HasValue)
+ if (EntityWarship == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
Pen pen = new(Color.Black);
- Brush additionalBrush = new SolidBrush(EntityBattleship.AdditionalColor);
-
+
//заливка линкора
- Brush br = new SolidBrush(EntityBattleship.BodyColor);
+ Brush br = new SolidBrush(EntityWarship.BodyColor);
g.FillRectangle(br, _startPosX.Value + 10, _startPosY.Value, 80, 40);
//границы линкора
g.DrawRectangle(pen, _startPosX.Value + 10, _startPosY.Value, 80, 40); //ширина высота (сама палуба)
@@ -227,7 +258,7 @@ public class DrawingBattleship
new Point(_startPosX.Value + 90, _startPosY.Value),
new Point(_startPosX.Value + 120, _startPosY.Value + 20),
new Point(_startPosX.Value + 90, _startPosY.Value + 40),
-
+
};
g.DrawPolygon(pen, pointsNOS);
g.FillPolygon(br, pointsNOS);
@@ -237,32 +268,5 @@ public class DrawingBattleship
g.FillEllipse(brLightSlateGray, _startPosX.Value + 78, _startPosY.Value + 12, 15, 15);
//круг на палубе
g.DrawEllipse(pen, _startPosX.Value + 78, _startPosY.Value + 12, 15, 15);
-
- //ПРОВЕРКА
-
- if (EntityBattleship.Compartment)
- {
- //отсеки для ракет
- //заливка отсеков
-
- g.FillRectangle(additionalBrush, _startPosX.Value + 15, _startPosY.Value + 5, 27, 5); //верхний отсек для ракет
- g.FillRectangle(additionalBrush, _startPosX.Value + 15, _startPosY.Value + 28, 27, 5); //нижний отсек для ракет
-
- //границы отсеков
- g.DrawRectangle(pen, _startPosX.Value + 15, _startPosY.Value + 5, 27, 5); //верхний отсек
- g.DrawRectangle(pen, _startPosX.Value + 15, _startPosY.Value + 28, 27, 5); //нижний отсек
-
- }
-
- if (EntityBattleship.Tower)
- {
- //заливка башни
- g.FillEllipse(additionalBrush, _startPosX.Value + 98, _startPosY.Value + 15, 10, 10);
- g.FillRectangle(additionalBrush, _startPosX.Value + 107, _startPosY.Value + 17, 30, 5);
-
- //границы башни
- g.DrawEllipse(pen, _startPosX.Value + 98, _startPosY.Value + 15, 10, 10);
- g.DrawRectangle(pen, _startPosX.Value + 107, _startPosY.Value + 17, 30, 5);
- }
}
}
\ No newline at end of file
diff --git a/Battleship/Battleship/EntityBattleship.cs b/Battleship/Battleship/Entities/EntityBattleship.cs
similarity index 71%
rename from Battleship/Battleship/EntityBattleship.cs
rename to Battleship/Battleship/Entities/EntityBattleship.cs
index 0d01e5c..2a84efe 100644
--- a/Battleship/Battleship/EntityBattleship.cs
+++ b/Battleship/Battleship/Entities/EntityBattleship.cs
@@ -1,14 +1,14 @@
-namespace Battleship;
+namespace Battleship.Entities;
///
/// Класс-сущность Линкор
///
-public class EntityBattleship
+public class EntityBattleship : EntityWarship
{
///
/// Скорость
///
- public int Speed { get; private set; }
+ public int Speed { get; private set; }
///
/// Вес
///
@@ -17,23 +17,23 @@ public class EntityBattleship
/// Основной цвет
///
public Color BodyColor { get; private set; }
+ /// ///
+ /// Признак (опция) отсека для ракет
+ ///
+ public bool Compartment { get; private set; }
+ ///
+ /// Признак (опция) наличия башни
+ ///
+ public bool Tower { get; private set; }
+ ///
+ /// Признак (опция) наличия палубы
+ ///
+ public bool BodyDeck { get; private set; }
///
/// Дополнительный цвет (для опциональных элементов)
///
public Color AdditionalColor { get; private set; }
///
- /// Признак (опция) наличия палубы
- ///
- public bool BodyDeck { get; private set; }
- ///
- /// Признак (опция) отсека для ракет
- ///
- public bool Compartment { get; private set; }
- ///
- /// Признак (опция) наличия башни
- ///
- public bool Tower { get; private set; }
- ///
/// Перемещение линкора
///
public double Step => Speed * 100 / Weight;
@@ -44,18 +44,14 @@ public class EntityBattleship
///
///
///
- ///
- ///
- ///
- ///
- public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyDeck, bool compartment, bool tower)
+ public EntityBattleship(int speed, double weight, Color bodyColor, bool compartment, bool tower, bool bodyDeck, Color additionalColor) : base(speed, weight, bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
- AdditionalColor = additionalColor;
- BodyDeck = bodyDeck;
Compartment = compartment;
Tower = tower;
+ BodyDeck = bodyDeck;
+ AdditionalColor = additionalColor;
}
}
\ No newline at end of file
diff --git a/Battleship/Battleship/Entities/EntityWarship.cs b/Battleship/Battleship/Entities/EntityWarship.cs
new file mode 100644
index 0000000..9b88f8e
--- /dev/null
+++ b/Battleship/Battleship/Entities/EntityWarship.cs
@@ -0,0 +1,36 @@
+namespace Battleship.Entities;
+///
+/// Класс-сущность Военный корабль
+///
+public class EntityWarship
+{
+ ///
+ /// Скорость
+ ///
+ 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 EntityWarship(int speed, double weight, Color bodyColor)
+ {
+ Speed = speed;
+ Weight = weight;
+ BodyColor = bodyColor;
+ }
+}
diff --git a/Battleship/Battleship/FormBattleship.Designer.cs b/Battleship/Battleship/FormBattleship.Designer.cs
index 87379f3..7b7abf3 100644
--- a/Battleship/Battleship/FormBattleship.Designer.cs
+++ b/Battleship/Battleship/FormBattleship.Designer.cs
@@ -34,6 +34,9 @@ partial class FormBattleship
buttonDown = new Button();
buttonRight = new Button();
buttonUp = new Button();
+ buttonCreateWarshit = new Button();
+ comboBoxStrategy = new ComboBox();
+ buttonStrategyStep = new Button();
((System.ComponentModel.ISupportInitialize)pictureBoxBattleship).BeginInit();
SuspendLayout();
//
@@ -50,9 +53,9 @@ partial class FormBattleship
buttonCreate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCreate.Location = new Point(12, 518);
buttonCreate.Name = "buttonCreate";
- buttonCreate.Size = new Size(94, 29);
+ buttonCreate.Size = new Size(267, 29);
buttonCreate.TabIndex = 0;
- buttonCreate.Text = "Создать";
+ buttonCreate.Text = "Создать линкор";
buttonCreate.UseVisualStyleBackColor = true;
buttonCreate.Click += buttonCreate_Click;
//
@@ -104,11 +107,47 @@ partial class FormBattleship
buttonUp.UseVisualStyleBackColor = true;
buttonUp.Click += buttonMove_Click;
//
+ // buttonCreateWarshit
+ //
+ buttonCreateWarshit.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
+ buttonCreateWarshit.Location = new Point(316, 518);
+ buttonCreateWarshit.Name = "buttonCreateWarshit";
+ buttonCreateWarshit.Size = new Size(267, 29);
+ buttonCreateWarshit.TabIndex = 5;
+ buttonCreateWarshit.Text = "Создать военный корабль";
+ buttonCreateWarshit.UseVisualStyleBackColor = true;
+ buttonCreateWarshit.Click += buttonCreateWarshit_Click;
+ //
+ // comboBoxStrategy
+ //
+ comboBoxStrategy.Anchor = AnchorStyles.Top | AnchorStyles.Right;
+ comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList;
+ comboBoxStrategy.FormattingEnabled = true;
+ comboBoxStrategy.Items.AddRange(new object[] { "К центру", "К краю" });
+ comboBoxStrategy.Location = new Point(795, 12);
+ comboBoxStrategy.Name = "comboBoxStrategy";
+ comboBoxStrategy.Size = new Size(151, 28);
+ comboBoxStrategy.TabIndex = 6;
+ //
+ // buttonStrategyStep
+ //
+ buttonStrategyStep.Anchor = AnchorStyles.Top | AnchorStyles.Right;
+ buttonStrategyStep.Location = new Point(851, 56);
+ buttonStrategyStep.Name = "buttonStrategyStep";
+ buttonStrategyStep.Size = new Size(94, 29);
+ buttonStrategyStep.TabIndex = 7;
+ buttonStrategyStep.Text = "Шаг";
+ buttonStrategyStep.UseVisualStyleBackColor = true;
+ buttonStrategyStep.Click += buttonStrategyStep_Click;
+ //
// FormBattleship
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(957, 559);
+ Controls.Add(buttonStrategyStep);
+ Controls.Add(comboBoxStrategy);
+ Controls.Add(buttonCreateWarshit);
Controls.Add(buttonUp);
Controls.Add(buttonRight);
Controls.Add(buttonDown);
@@ -129,4 +168,7 @@ partial class FormBattleship
private Button buttonRight;
private Button buttonUp;
private Button buttonLeft;
+ private Button buttonCreateWarshit;
+ private ComboBox comboBoxStrategy;
+ private Button buttonStrategyStep;
}
\ No newline at end of file
diff --git a/Battleship/Battleship/FormBattleship.cs b/Battleship/Battleship/FormBattleship.cs
index 6a8da1e..27ff7be 100644
--- a/Battleship/Battleship/FormBattleship.cs
+++ b/Battleship/Battleship/FormBattleship.cs
@@ -1,4 +1,7 @@
-namespace Battleship;
+using Battleship.Drawings;
+using Battleship.MovementStrategy;
+
+namespace Battleship;
///
/// Форма работы с объектом Линкор
///
@@ -7,11 +10,20 @@ public partial class FormBattleship : Form
///
/// Поле/объект для прорисовки объекта
///
- private DrawingBattleship? _drawingBattleship; //поля с нижнего подчеркивания
+ private DrawingWarship? _drawingWarship; //поля с нижнего подчеркивания
+ ///
+ /// Стратегия перемещения
+ ///
+ private AbstractStrategy? _strategy;
+
+ ///
+ /// Конструктор формы
+ ///
public FormBattleship()
{
InitializeComponent();
+ _strategy = null;
}
///
/// Метод прорисовки машины
@@ -19,17 +31,44 @@ public partial class FormBattleship : Form
//создаем отдельный метод
private void Draw()
{
- if (_drawingBattleship == null)
+ if (_drawingWarship == null)
{
return;
}
Bitmap bmp = new(pictureBoxBattleship.Width, pictureBoxBattleship.Height);
Graphics gr = Graphics.FromImage(bmp);
- _drawingBattleship.DrawTransport(gr);
+ _drawingWarship.DrawTransport(gr);
pictureBoxBattleship.Image = bmp;
}
+
+ private void CreateObject(string type)
+ {
+ Random random = new();
+ switch (type)
+ {
+ case nameof(DrawingWarship):
+ _drawingWarship = new DrawingWarship(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(DrawingBattleship):
+ _drawingWarship = new DrawingBattleship(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)));
+ break;
+ default:
+ return;
+ }
+
+ _drawingWarship.SetPictureSize(pictureBoxBattleship.Width, pictureBoxBattleship.Height);
+ _drawingWarship.SetPosition(random.Next(10, 100), random.Next(10, 100), pictureBoxBattleship.Width, pictureBoxBattleship.Height);
+ _strategy = null;
+ comboBoxStrategy.Enabled = true;
+ Draw();
+ }
+
///
/// обработка нажатия кнопки "создать линкор"
///
@@ -37,27 +76,29 @@ public partial class FormBattleship : Form
///
private void buttonCreate_Click(object sender, EventArgs e)
{
- Random random = new();
- _drawingBattleship = new DrawingBattleship();
- _drawingBattleship.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)));
- _drawingBattleship.SetPictureSize(pictureBoxBattleship.Width, pictureBoxBattleship.Height);
- _drawingBattleship.SetPosition(random.Next(10, 100), random.Next(10, 100), pictureBoxBattleship.Width, pictureBoxBattleship.Height);
-
- Draw();
+ CreateObject(nameof(DrawingBattleship));
}
///
- /// обработка нажатия кнопок "вверх/вниз/влево/вправо"
+ /// обработка нажатия кнопки "создать военный корабль"
+ ///
+ ///
+ ///
+ private void buttonCreateWarshit_Click(object sender, EventArgs e)
+ {
+ CreateObject(nameof(DrawingWarship));
+
+ }
+
+ ///
+ /// кнопки вверх/вниз/влево/вправо
///
///
///
private void buttonMove_Click(object sender, EventArgs e)
{
- if (_drawingBattleship == null)
+ if (_drawingWarship == null)
{
return;
}
@@ -67,16 +108,16 @@ public partial class FormBattleship : Form
switch (name)
{
case "buttonUp":
- result = _drawingBattleship.MoveTransport(DirectionType.Up);
+ result = _drawingWarship.MoveTransport(DirectionType.Up);
break;
case "buttonDown":
- result = _drawingBattleship.MoveTransport(DirectionType.Down);
+ result = _drawingWarship.MoveTransport(DirectionType.Down);
break;
case "buttonLeft":
- result = _drawingBattleship.MoveTransport(DirectionType.Left);
+ result = _drawingWarship.MoveTransport(DirectionType.Left);
break;
case "buttonRight":
- result = _drawingBattleship.MoveTransport(DirectionType.Right);
+ result = _drawingWarship.MoveTransport(DirectionType.Right);
break;
}
@@ -85,4 +126,44 @@ public partial class FormBattleship : Form
Draw();
}
}
+
+ private void buttonStrategyStep_Click(object sender, EventArgs e)
+ {
+ if (_drawingWarship == null)
+ {
+ return;
+ }
+
+ if (comboBoxStrategy.Enabled)
+ {
+ _strategy = comboBoxStrategy.SelectedIndex
+ switch
+ {
+ 0 => new MoveToCenter(),
+ 1 => new MoveToBorder(),
+ _ => null,
+ };
+
+ if (_strategy == null)
+ {
+ return;
+ }
+ _strategy.SetData(new MoveableWarship(_drawingWarship),
+ pictureBoxBattleship.Width, pictureBoxBattleship.Height);
+ }
+
+ if (_strategy == null)
+ {
+ return;
+ }
+ comboBoxStrategy.Enabled = false;
+ _strategy.MakeStep();
+ Draw();
+
+ if (_strategy.GetStatus() == StrategyStatus.Finish)
+ {
+ comboBoxStrategy.Enabled = true;
+ _strategy = null;
+ }
+ }
}
\ No newline at end of file
diff --git a/Battleship/Battleship/MovementStrategy/AbstractStrategy.cs b/Battleship/Battleship/MovementStrategy/AbstractStrategy.cs
new file mode 100644
index 0000000..ee4aaaf
--- /dev/null
+++ b/Battleship/Battleship/MovementStrategy/AbstractStrategy.cs
@@ -0,0 +1,137 @@
+namespace Battleship.MovementStrategy;
+
+public abstract class AbstractStrategy
+{
+ ///
+ /// Перемещаемый объект
+ ///
+ private IMoveableObjectcs? _moveableObjects;
+
+ ///
+ /// Статус перемещения
+ ///
+ private StrategyStatus _state = StrategyStatus.NotIInit;
+
+ ///
+ /// Ширина поля
+ ///
+ protected int FieldWidth { get; private set; }
+
+ ///
+ /// Высота поля
+ ///
+ protected int FieldHeight { get; private set;}
+
+ ///
+ /// Статус перемещения
+ ///
+ ///
+ public StrategyStatus GetStatus() { return _state; }
+
+ ///
+ /// Установка данных
+ ///
+ /// Перемещаемый объект
+ /// Ширина поля
+ /// Высота поля
+ public void SetData(IMoveableObjectcs moveableObjectcs, int width, int height)
+ {
+ if (moveableObjectcs == null)
+ {
+ _state = StrategyStatus.NotIInit;
+ return;
+ }
+
+ _state = StrategyStatus.InProgress;
+ _moveableObjects = moveableObjectcs;
+ FieldWidth = width;
+ FieldHeight = height;
+ }
+
+ ///
+ /// Шаг перемещения
+ ///
+ public void MakeStep()
+ {
+ if (_state != StrategyStatus.InProgress)
+ {
+ return;
+ }
+
+ if (IsTargetDestination())
+ {
+ _state = StrategyStatus.Finish;
+ return;
+ }
+
+ MoveToTarget();
+ }
+
+ ///
+ /// Перемещение влево
+ ///
+ ///
+ protected bool MoveLeft() => MoveTo(MovementDirection.Left);
+
+ ///
+ /// Перемещение вправо
+ ///
+ ///
+ protected bool MoveRight() => MoveTo(MovementDirection.Right);
+
+ ///
+ /// Перемещение вверх
+ ///
+ ///
+ protected bool MoveUp() => MoveTo(MovementDirection.Up);
+
+ ///
+ /// Перемещение вниз
+ ///
+ ///
+ protected bool MoveDown() => MoveTo(MovementDirection.Down);
+
+ ///
+ /// Параметры объекта
+ ///
+ protected ObjectParameters? GetObjectParameters => _moveableObjects?.GetObjectPosition;
+
+ ///
+ /// Шаг объекта
+ ///
+ ///
+ protected int? GetStep()
+ {
+ if (_state != StrategyStatus.InProgress)
+ {
+ return null;
+ }
+ return _moveableObjects?.GetStep;
+ }
+
+ ///
+ /// Перемещение к цели
+ ///
+ protected abstract void MoveToTarget();
+
+ ///
+ /// Достигнута ли цель
+ ///
+ ///
+ protected abstract bool IsTargetDestination();
+
+ ///
+ /// Попытка перемещения в требуемом направлении
+ ///
+ ///
+ ///
+ private bool MoveTo(MovementDirection movementDirection)
+ {
+ if (_state != StrategyStatus.InProgress)
+ {
+ return false;
+ }
+
+ return _moveableObjects?.TryMoveObject(movementDirection) ?? false;
+ }
+}
diff --git a/Battleship/Battleship/MovementStrategy/IMoveableObjectcs.cs b/Battleship/Battleship/MovementStrategy/IMoveableObjectcs.cs
new file mode 100644
index 0000000..913cef6
--- /dev/null
+++ b/Battleship/Battleship/MovementStrategy/IMoveableObjectcs.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Battleship.MovementStrategy;
+
+public interface IMoveableObjectcs
+{
+ ObjectParameters? GetObjectPosition { get; }
+
+ int GetStep { get; }
+
+ ///
+ /// Шаг объекта
+ ///
+ /// Направление
+ /// true - объект перемещен, false - перемещение невозможно
+ bool TryMoveObject(MovementDirection direction);
+}
diff --git a/Battleship/Battleship/MovementStrategy/MoveToBorder.cs b/Battleship/Battleship/MovementStrategy/MoveToBorder.cs
new file mode 100644
index 0000000..257dbbc
--- /dev/null
+++ b/Battleship/Battleship/MovementStrategy/MoveToBorder.cs
@@ -0,0 +1,52 @@
+using System;
+namespace Battleship.MovementStrategy;
+
+public class MoveToBorder : AbstractStrategy
+{
+ protected override bool IsTargetDestination()
+ {
+ ObjectParameters? objParams = GetObjectParameters;
+ if (objParams == null)
+ {
+ return false;
+ }
+
+ return objParams.RightBorder - GetStep() <= FieldWidth && objParams.RightBorder + GetStep() >= FieldWidth &&
+ objParams.DownBorder - GetStep() <= FieldHeight && objParams.DownBorder + GetStep() >= FieldHeight;
+ }
+
+ protected override void MoveToTarget()
+ {
+ ObjectParameters? objParams = GetObjectParameters;
+ if (objParams == null)
+ {
+ return;
+ }
+
+ int diffX = objParams.RightBorder - FieldWidth;
+ if (Math.Abs(diffX) > GetStep())
+ {
+ if (diffX > 0)
+ {
+ MoveLeft();
+ }
+ else
+ {
+ MoveRight();
+ }
+ }
+
+ int diffY = objParams.DownBorder - FieldHeight;
+ if (Math.Abs(diffY) > GetStep())
+ {
+ if (diffY > 0)
+ {
+ MoveUp();
+ }
+ else
+ {
+ MoveDown();
+ }
+ }
+ }
+}
diff --git a/Battleship/Battleship/MovementStrategy/MoveToCenter.cs b/Battleship/Battleship/MovementStrategy/MoveToCenter.cs
new file mode 100644
index 0000000..84274a2
--- /dev/null
+++ b/Battleship/Battleship/MovementStrategy/MoveToCenter.cs
@@ -0,0 +1,54 @@
+namespace Battleship.MovementStrategy;
+
+///
+/// Стратегия перемещения объекта в центр экрана
+///
+public class MoveToCenter : AbstractStrategy
+{
+ protected override bool IsTargetDestination()
+ {
+ ObjectParameters? objParams = GetObjectParameters;
+ if (objParams == null)
+ {
+ return false;
+ }
+
+ return objParams.ObjectMiddleHorizontall - GetStep() <= FieldWidth / 2 && objParams.ObjectMiddleHorizontall + 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.ObjectMiddleHorizontall - 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/Battleship/Battleship/MovementStrategy/MoveableWarship.cs b/Battleship/Battleship/MovementStrategy/MoveableWarship.cs
new file mode 100644
index 0000000..d373450
--- /dev/null
+++ b/Battleship/Battleship/MovementStrategy/MoveableWarship.cs
@@ -0,0 +1,64 @@
+using Battleship.Drawings;
+
+namespace Battleship.MovementStrategy;
+
+///
+/// Класс-реализация IMoveableObjectcs с использованием DrawingWarship
+///
+public class MoveableWarship : IMoveableObjectcs
+{
+ ///
+ /// Gле-объект класса DrawingWarship или его наследника
+ ///
+ private DrawingWarship? _warship = null;
+
+ ///
+ /// Конструктор
+ ///
+ ///
+ public MoveableWarship(DrawingWarship warship)
+ {
+ _warship = warship;
+ }
+
+ public ObjectParameters? GetObjectPosition
+ {
+ get
+ {
+ if (_warship == null || _warship.EntityWarship == null || !_warship.GetPosX.HasValue || !_warship.GetPosY.HasValue)
+ {
+ return null;
+ }
+ return new ObjectParameters(_warship.GetPosX.Value, _warship.GetPosY.Value, _warship.GetWidth, _warship.GetHeight);
+ }
+ }
+
+ public int GetStep => (int)(_warship?.EntityWarship?.Step ?? 0);
+
+ public bool TryMoveObject(MovementDirection direction)
+ {
+ if (_warship == null || _warship.EntityWarship == null)
+ {
+ return false;
+ }
+
+ return _warship.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/Battleship/Battleship/MovementStrategy/MovementDirection.cs b/Battleship/Battleship/MovementStrategy/MovementDirection.cs
new file mode 100644
index 0000000..8fc13f9
--- /dev/null
+++ b/Battleship/Battleship/MovementStrategy/MovementDirection.cs
@@ -0,0 +1,27 @@
+namespace Battleship.MovementStrategy;
+
+///
+/// Направление перемещения
+///
+public enum MovementDirection
+{
+ ///
+ /// Вверх
+ ///
+ Up = 1,
+
+ ///
+ /// Вниз
+ ///
+ Down = 2,
+
+ ///
+ /// Влево
+ ///
+ Left = 3,
+
+ ///
+ /// Вправо
+ ///
+ Right = 4
+}
\ No newline at end of file
diff --git a/Battleship/Battleship/MovementStrategy/ObjectParameters.cs b/Battleship/Battleship/MovementStrategy/ObjectParameters.cs
new file mode 100644
index 0000000..bd90d26
--- /dev/null
+++ b/Battleship/Battleship/MovementStrategy/ObjectParameters.cs
@@ -0,0 +1,72 @@
+namespace Battleship.MovementStrategy;
+
+///
+/// Параметры-координаты объекта
+///
+public class ObjectParameters
+{
+ ///
+ /// Координата Х
+ ///
+ 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 ObjectMiddleHorizontall => _x + _width / 2;
+
+ ///
+ /// Середина объекта
+ ///
+ public int ObjectMiddleVertical => _y + _height / 2;
+
+ ///
+ /// Конструктор
+ ///
+ /// Координата Х
+ /// Координата Y
+ /// Ширина объекта
+ /// Высота объекта
+ public ObjectParameters(int x, int y, int width, int height)
+ {
+ _x = x;
+ _y = y;
+ _width = width;
+ _height = height;
+ }
+}
diff --git a/Battleship/Battleship/MovementStrategy/StrategyStatus.cs b/Battleship/Battleship/MovementStrategy/StrategyStatus.cs
new file mode 100644
index 0000000..4c2824b
--- /dev/null
+++ b/Battleship/Battleship/MovementStrategy/StrategyStatus.cs
@@ -0,0 +1,22 @@
+namespace Battleship.MovementStrategy;
+
+///
+/// Статус выполнения операции перемещения
+///
+public enum StrategyStatus
+{
+ ///
+ /// Все готово к началу
+ ///
+ NotIInit,
+
+ ///
+ /// Выполняется
+ ///
+ InProgress,
+
+ ///
+ /// Завершено
+ ///
+ Finish
+}