создала дополнительные классы и методы

This commit is contained in:
Казначеева Елизавета 2023-10-10 15:58:57 +04:00
parent 0aaea573da
commit bccd917047
13 changed files with 761 additions and 198 deletions

View File

@ -0,0 +1,138 @@
using Battleship.MovementStrategy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Battleship.MovementStrategy
{
/// <summary>
/// Класс-стратегия перемещения объекта
/// </summary>
public abstract class AbstractStrategy
{
/// <summary>
/// Перемещаемый объект
/// </summary>
private IMoveableObject? _moveableObject;
/// <summary>
/// Статус перемещения
/// </summary>
private Status _state = Status.NotInit;
/// <summary>
/// Ширина поля
/// </summary>
protected int FieldWidth { get; private set; }
/// <summary>
/// Высота поля
/// </summary>
protected int FieldHeight { get; private set; }
/// <summary>
/// Статус перемещения
/// </summary>
public Status GetStatus() { return _state; }
/// <summary>
/// Установка данных
/// </summary>
/// <param name="moveableObject">Перемещаемый объект</param>
/// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param>
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;
}
/// <summary>
/// Шаг перемещения
/// </summary>
public void MakeStep()
{
if (_state != Status.InProgress)
{
return;
}
if (IsTargetDestinaion())
{
_state = Status.Finish;
return;
}
MoveToTarget();
}
/// <summary>
/// Перемещение влево
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveLeft() => MoveTo(DirectionType.Left);
/// <summary>
/// Перемещение вправо
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveRight() => MoveTo(DirectionType.Right);
/// <summary>
/// Перемещение вверх
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveUp() => MoveTo(DirectionType.Up);
/// <summary>
/// Перемещение вниз
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveDown() => MoveTo(DirectionType.Down);
/// <summary>
/// Параметры объекта
/// </summary>
// protected ObjectParameters? GetObjectParameters => _moveableObject?.GetObjectParametrs;
protected ObjectParameters? GetObjectParameters => _moveableObject?.GetObjectPosition;
/// <summary>
/// Шаг объекта
/// </summary>
/// <returns></returns>
protected int? GetStep()
{
if (_state != Status.InProgress)
{
return null;
}
return _moveableObject?.GetStep;
}
/// <summary>
/// Перемещение к цели
/// </summary>
protected abstract void MoveToTarget();
/// <summary>
/// Достигнута ли цель
/// </summary>
/// <returns></returns>
protected abstract bool IsTargetDestinaion();
/// <summary>
/// Попытка перемещения в требуемом направлении
/// </summary>
/// <param name="directionType">Направление</param>
/// <returns>Результат попытки (true - удалось переместиться, false - неудача)</returns>
private bool MoveTo(DirectionType directionType)
{
if (_state != Status.InProgress)
{
return false;
}
if (_moveableObject?.CheckCanMove(directionType) ?? false)
{
_moveableObject.MoveObject(directionType);
return true;
}
return false;
}
}
}

View File

@ -34,6 +34,9 @@
this.buttonLeft = new System.Windows.Forms.Button();
this.buttonDown = new System.Windows.Forms.Button();
this.buttonRight = new System.Windows.Forms.Button();
this.buttonCreateAdd = new System.Windows.Forms.Button();
this.buttonStep = new System.Windows.Forms.Button();
this.comboBoxStrategy = new System.Windows.Forms.ComboBox();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxBattleship)).BeginInit();
this.SuspendLayout();
//
@ -51,9 +54,9 @@
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, 415);
this.buttonCreate.Name = "buttonCreate";
this.buttonCreate.Size = new System.Drawing.Size(75, 23);
this.buttonCreate.Size = new System.Drawing.Size(114, 23);
this.buttonCreate.TabIndex = 6;
this.buttonCreate.Text = "Создать";
this.buttonCreate.Text = "Создать корабль";
this.buttonCreate.UseVisualStyleBackColor = true;
this.buttonCreate.Click += new System.EventHandler(this.buttonCreate_Click);
//
@ -105,11 +108,48 @@
this.buttonRight.UseVisualStyleBackColor = true;
this.buttonRight.Click += new System.EventHandler(this.buttonMove_Click);
//
// buttonCreateAdd
//
this.buttonCreateAdd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.buttonCreateAdd.Location = new System.Drawing.Point(132, 415);
this.buttonCreateAdd.Name = "buttonCreateAdd";
this.buttonCreateAdd.Size = new System.Drawing.Size(159, 23);
this.buttonCreateAdd.TabIndex = 11;
this.buttonCreateAdd.Text = "Создать военный корабль";
this.buttonCreateAdd.UseVisualStyleBackColor = true;
this.buttonCreateAdd.Click += new System.EventHandler(this.buttonCreateAdd_Click);
//
// buttonStep
//
this.buttonStep.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.buttonStep.Location = new System.Drawing.Point(713, 48);
this.buttonStep.Name = "buttonStep";
this.buttonStep.Size = new System.Drawing.Size(75, 23);
this.buttonStep.TabIndex = 12;
this.buttonStep.Text = "Шаг";
this.buttonStep.UseVisualStyleBackColor = true;
this.buttonStep.Click += new System.EventHandler(this.buttonStep_Click);
//
// comboBoxStrategy
//
this.comboBoxStrategy.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboBoxStrategy.FormattingEnabled = true;
this.comboBoxStrategy.Items.AddRange(new object[] {
"В центр",
"К границе"});
this.comboBoxStrategy.Location = new System.Drawing.Point(667, 12);
this.comboBoxStrategy.Name = "comboBoxStrategy";
this.comboBoxStrategy.Size = new System.Drawing.Size(121, 23);
this.comboBoxStrategy.TabIndex = 13;
//
// Battleship
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Controls.Add(this.comboBoxStrategy);
this.Controls.Add(this.buttonStep);
this.Controls.Add(this.buttonCreateAdd);
this.Controls.Add(this.buttonRight);
this.Controls.Add(this.buttonDown);
this.Controls.Add(this.buttonLeft);
@ -130,5 +170,8 @@
private Button buttonLeft;
private Button buttonDown;
private Button buttonRight;
private Button buttonCreateAdd;
private Button buttonStep;
private ComboBox comboBoxStrategy;
}
}

View File

@ -1,3 +1,6 @@
using Battleship.DrawningObjects;
using Battleship.MovementStrategy;
namespace Battleship
{
public partial class Battleship : Form
@ -5,10 +8,11 @@ namespace Battleship
/// <summary>
/// Ïîëå-îáúåêò äëÿ ïðîðèñîâêè îáúåêòà
/// </summary>
private DrawningBattleship? _drawningBattleship;
private DrawningShip? _drawningShip;
/// <summary>
/// Èíèöèàëèçàöèÿ ôîðìû
/// </summary>
private AbstractStrategy? _abstractStrategy;
public Battleship()
{
InitializeComponent();
@ -17,35 +21,47 @@ namespace Battleship
/// </summary>
private void Draw()
{
if (_drawningBattleship == null)
if (_drawningShip == null)
{
return;
}
Bitmap bmp = new(pictureBoxBattleship.Width,
pictureBoxBattleship.Height);
Graphics gr = Graphics.FromImage(bmp);
_drawningBattleship.DrawTransport(gr);
_drawningShip.DrawTransport(gr);
pictureBoxBattleship.Image = bmp;
}
private void buttonCreate_Click(object sender, EventArgs e)
{
Random random = new();
_drawningBattleship = new DrawningBattleship();
_drawningBattleship.Init(random.Next(100, 300),
_drawningShip = new DrawningShip(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)),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256),
random.Next(0, 256)),
pictureBoxBattleship.Width, pictureBoxBattleship.Height);
_drawningBattleship.SetPosition(random.Next(10, 100),
random.Next(10, 100));
_drawningShip.SetPosition(random.Next(10, 100), random.Next(10, 100));
Draw();
}
private void buttonCreateAdd_Click(object sender, EventArgs e)
{
Random random = new();
_drawningShip = new DrawningBattleship(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)),
pictureBoxBattleship.Width, pictureBoxBattleship.Height);
_drawningShip.SetPosition(random.Next(10, 100), random.Next(10,100));
Draw();
}
private void buttonMove_Click(object sender, EventArgs e)
{
if (_drawningBattleship == null)
if (_drawningShip == null)
{
return;
}
@ -53,20 +69,56 @@ namespace Battleship
switch (name)
{
case "buttonUp":
_drawningBattleship.MoveTransport(DirectionType.Up);
_drawningShip.MoveTransport(DirectionType.Up);
break;
case "buttonDown":
_drawningBattleship.MoveTransport(DirectionType.Down);
_drawningShip.MoveTransport(DirectionType.Down);
break;
case "buttonLeft":
_drawningBattleship.MoveTransport(DirectionType.Left);
_drawningShip.MoveTransport(DirectionType.Left);
break;
case "buttonRight":
_drawningBattleship.MoveTransport(DirectionType.Right);
_drawningShip.MoveTransport(DirectionType.Right);
break;
}
Draw();
}
private void buttonStep_Click(object sender, EventArgs e)
{
if (_drawningShip == null)
{
return;
}
if (comboBoxStrategy.Enabled)
{
_abstractStrategy = comboBoxStrategy.SelectedIndex
switch
{
0 => new MoveToCenter(),
1 => new MoveToBorder(),
_ => null,
};
if (_abstractStrategy == null)
{
return;
}
_abstractStrategy.SetData(new
DrawningObjectShip(_drawningShip), pictureBoxBattleship.Width,
pictureBoxBattleship.Height);
comboBoxStrategy.Enabled = false;
}
if (_abstractStrategy == null)
{
return;
}
_abstractStrategy.MakeStep();
Draw();
if (_abstractStrategy.GetStatus() == Status.Finish)
{
comboBoxStrategy.Enabled = true;
_abstractStrategy = null;
}
}
}
}

View File

@ -1,176 +1,37 @@
using System;
using Battleship;
using Battleship.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Battleship
namespace Battleship.DrawningObjects
{
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawningBattleship
public class DrawningBattleship : DrawningShip
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityBattleship? EntityBattleship { get; private set; }
/// <summary>
/// Ширина окна
/// </summary>
private int _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int _pictureHeight;
/// <summary>
/// Левая координата прорисовки
/// </summary>
private int _startPosX;
/// <summary>
/// Верхняя кооридната прорисовки
/// </summary>
private int _startPosY;
/// <summary>
/// Ширина прорисовки
/// </summary>
private readonly int _buttleshipWidth = 175;
/// <summary>
/// Высота прорисовки
/// </summary>
private readonly int _buttleshipHeight = 80;
/// <summary>
/// Инициализация свойств
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Цвет основы</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="tower">Признак наличия орудийной башни</param>
/// <param name="section">Признак наличия отсека под ракеты</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
/// <returns>true - объект создан, false - проверка не пройдена,
///нельзя создать объект в этих размерах</retu rns>
public bool Init(int speed, double weight, Color bodyColor, Color additionalColor, bool tower, bool section, int width, int height)
public DrawningBattleship(int speed, double weight, Color bodyColor, Color
additionalColor, bool tower, bool section, int width, int height)
: base(speed, weight, bodyColor, width, height, 175, 80)
{
if (width < _buttleshipWidth || height < _buttleshipHeight)
if(EntityShip != null)
{
return false;
}
_pictureWidth = width;
_pictureHeight = height;
EntityBattleship = new EntityBattleship();
EntityBattleship.Init(speed, weight, bodyColor, additionalColor,
tower, section);
return true;
}
/// <summary>
/// Установка позиции
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
public void SetPosition(int x, int y)
{
if (x >= 0 && x + _buttleshipWidth <= _pictureWidth && y >= 0 && y + _buttleshipHeight <= _pictureHeight)
{
_startPosX = x;
_startPosY = y;
EntityShip = new EntityBattleship(speed, weight, bodyColor, additionalColor, tower, section);
}
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
public void MoveTransport(DirectionType direction)
public override void DrawTransport(Graphics g)
{
if (EntityBattleship == null)
{
return;
}
switch (direction)
{
//влево
case DirectionType.Left:
if (_startPosX - EntityBattleship.Step > 0)
{
_startPosX -= (int)EntityBattleship.Step;
}
break;
//вверх
case DirectionType.Up:
if (_startPosY - EntityBattleship.Step > 0)
{
_startPosY -= (int)EntityBattleship.Step;
}
break;
// вправо
case DirectionType.Right:
if (_startPosX + _buttleshipWidth + EntityBattleship.Step < _pictureWidth)
{
_startPosX += (int)EntityBattleship.Step;
}
break;
//вниз
case DirectionType.Down:
if (_startPosY + _buttleshipHeight + EntityBattleship.Step < _pictureHeight)
{
_startPosY += (int)EntityBattleship.Step;
}
break;
}
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public void DrawTransport(Graphics g)
{
if (EntityBattleship == null)
if (EntityShip is not EntityBattleship battleShip)
{
return;
}
Pen pen = new(Color.Black, 2);
Brush additionalBrush = new
SolidBrush(EntityBattleship.AdditionalColor);
//основа
Brush mainBrush = new SolidBrush(EntityBattleship.BodyColor);
Point[] hull = new Point[]
{
new Point(_startPosX + 5, _startPosY + 0),
new Point(_startPosX + 120, _startPosY + 0),
new Point(_startPosX + 160, _startPosY + 35),
new Point(_startPosX + 120, _startPosY + 70),
new Point(_startPosX + 5, _startPosY + 70),
};
g.FillPolygon(mainBrush, hull);
g.DrawPolygon(pen, hull);
//блоки
Brush blockBrush = new
SolidBrush(Color.DimGray);
g.FillRectangle(blockBrush, _startPosX + 70, _startPosY + 15, 20, 40);
g.DrawRectangle(pen, _startPosX + 70, _startPosY + 15, 20, 40);
g.FillRectangle(additionalBrush, _startPosX + 40, _startPosY + 25, 30, 20);
g.DrawRectangle(pen, _startPosX + 40, _startPosY + 25, 30, 20);
g.FillEllipse(additionalBrush, _startPosX + 100, _startPosY + 20, 30, 30);
g.DrawEllipse(pen, _startPosX + 100, _startPosY + 20, 30, 30);
//для ускорения
Brush speedBrush = new
SolidBrush(Color.Gold);
g.FillRectangle(speedBrush, _startPosX + 0, _startPosY + 10, 5, 20);
g.DrawRectangle(pen, _startPosX + 0, _startPosY + 10, 5, 20);
g.FillRectangle(speedBrush, _startPosX + 0, _startPosY + 40, 5, 20);
g.DrawRectangle(pen, _startPosX + 0, _startPosY + 40, 5, 20);
SolidBrush(battleShip.AdditionalColor);
base.DrawTransport(g);
//орудийная башня
if (EntityBattleship.Tower)
if (battleShip.Tower)
{
Brush baseBrush = new SolidBrush(Color.White);
g.FillRectangle(baseBrush, _startPosX + 108, _startPosY + 28, 15, 15);
@ -180,7 +41,7 @@ namespace Battleship
g.DrawRectangle(pen, _startPosX + 123, _startPosY + 32, 55, 6);
}
//отсеки под ракеты
if (EntityBattleship.Section)
if (battleShip.Section)
{
Brush sectionBrush = new
SolidBrush(Color.Gray);
@ -192,4 +53,3 @@ namespace Battleship
}
}
}

View File

@ -0,0 +1,41 @@
using Battleship.DrawningObjects;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Battleship;
namespace Battleship.MovementStrategy
{
/// <summary>
/// Реализация интерфейса IDrawningObject для работы с объектом DrawningCar (паттерн Adapter)
/// </summary>
public class DrawningObjectShip : IMoveableObject
{
private readonly DrawningShip? _drawningShip = null;
public DrawningObjectShip(DrawningShip drawningShip)
{
_drawningShip = drawningShip;
}
public ObjectParameters? GetObjectPosition
{
get
{
if (_drawningShip == null || _drawningShip.EntityShip == null)
{
return null;
}
return new ObjectParameters(_drawningShip.GetPosX,
_drawningShip.GetPosY, _drawningShip.GetWidth, _drawningShip.GetHeight);
}
}
public int GetStep => (int)(_drawningShip?.EntityShip?.Step ?? 0);
public bool CheckCanMove(DirectionType direction) =>
_drawningShip?.CanMove(direction) ?? false;
public void MoveObject(DirectionType direction) =>
_drawningShip?.MoveTransport(direction);
}
}

View File

@ -0,0 +1,222 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Battleship.Entities;
namespace Battleship.DrawningObjects
{
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawningShip
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityShip? EntityShip { get; protected set; }
/// <summary>
/// Ширина окна
/// </summary>
private int _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int _pictureHeight;
/// <summary>
/// Левая координата прорисовки
/// </summary>
protected int _startPosX;
/// <summary>
/// Верхняя кооридната прорисовки
/// </summary>
protected int _startPosY;
/// <summary>
/// Ширина прорисовки
/// </summary>
protected readonly int _buttleshipWidth = 175;
/// <summary>
/// Высота прорисовки
/// </summary>
protected readonly int _buttleshipHeight = 80;
/// <summary>
/// Инициализация свойств
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Цвет основы</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
/// <returns>true - объект создан, false - проверка не пройдена,
///нельзя создать объект в этих размерах</retu rns>
public DrawningShip(int speed, double weight, Color bodyColor, int width, int height)
{
if (width < _buttleshipWidth || height < _buttleshipHeight)
{
return;
}
_pictureWidth = width;
_pictureHeight = height;
EntityShip = new EntityShip(speed, weight, bodyColor);
}
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
/// <param name="buttleshipWidth">Ширина прорисовки автомобиля</param>
/// <param name="buttleshipHeight">Высота прорисовки автомобиля</param>
protected DrawningShip(int speed, double weight, Color bodyColor, int
width, int height, int buttleshipWidth, int buttleshipHeight)
{
// TODO: Продумать проверки
_pictureWidth = width;
_pictureHeight = height;
_buttleshipWidth = buttleshipWidth;
_buttleshipHeight = buttleshipHeight;
EntityShip = new EntityShip(speed, weight, bodyColor);
}
/// <summary>
/// Установка позиции
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
public void SetPosition(int x, int y)
{
if (x >= 0 && x + _buttleshipWidth <= _pictureWidth && y >= 0 && y + _buttleshipHeight <= _pictureHeight)
{
_startPosX = x;
_startPosY = y;
}
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public virtual void DrawTransport(Graphics g)
{
if (EntityShip == null)
{
return;
}
Pen pen = new(Color.Black, 2);
//основа
Brush mainBrush = new SolidBrush(EntityShip.BodyColor);
Point[] hull = new Point[]
{
new Point(_startPosX + 5, _startPosY + 0),
new Point(_startPosX + 120, _startPosY + 0),
new Point(_startPosX + 160, _startPosY + 35),
new Point(_startPosX + 120, _startPosY + 70),
new Point(_startPosX + 5, _startPosY + 70),
};
g.FillPolygon(mainBrush, hull);
g.DrawPolygon(pen, hull);
//блоки
Brush blockBrush = new
SolidBrush(Color.DimGray);
g.FillRectangle(blockBrush, _startPosX + 70, _startPosY + 15, 20, 40);
g.DrawRectangle(pen, _startPosX + 70, _startPosY + 15, 20, 40);
g.FillRectangle(blockBrush, _startPosX + 40, _startPosY + 25, 30, 20);
g.DrawRectangle(pen, _startPosX + 40, _startPosY + 25, 30, 20);
g.FillEllipse(blockBrush, _startPosX + 100, _startPosY + 20, 30, 30);
g.DrawEllipse(pen, _startPosX + 100, _startPosY + 20, 30, 30);
//для ускорения
Brush speedBrush = new
SolidBrush(Color.Gold);
g.FillRectangle(speedBrush, _startPosX + 0, _startPosY + 10, 5, 20);
g.DrawRectangle(pen, _startPosX + 0, _startPosY + 10, 5, 20);
g.FillRectangle(speedBrush, _startPosX + 0, _startPosY + 40, 5, 20);
g.DrawRectangle(pen, _startPosX + 0, _startPosY + 40, 5, 20);
}
/// <summary>
/// Координата X объекта
/// </summary>
public int GetPosX => _startPosX;
/// <summary>
/// Координата Y объекта
/// /// </summary>
public int GetPosY => _startPosY;
/// <summary>
/// Ширина объекта
/// </summary>
public int GetWidth => _buttleshipWidth;
/// <summary>
/// Высота объекта
/// </summary>
public int GetHeight => _buttleshipHeight;
/// <summary>
/// Проверка, что объект может переместится по указанному направлению
/// </summary>
/// <param name="direction">Направление</param>
/// <returns>true - можно переместится по указанному направлению</returns>
public bool CanMove(DirectionType direction)
{
if (EntityShip == null)
{
return false;
}
return direction switch
{
//влево
DirectionType.Left => _startPosX - EntityShip.Step > 0,
//вверх
DirectionType.Up => _startPosY - EntityShip.Step > 0,
//вправо
DirectionType.Right => _startPosX + EntityShip.Step + _buttleshipWidth < _pictureWidth,
//вниз
DirectionType.Down => _startPosY + EntityShip.Step + _buttleshipHeight < _pictureHeight,
_ => false,
};
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
public void MoveTransport(DirectionType direction)
{
if (!CanMove(direction) || EntityShip == null)
{
return;
}
switch (direction)
{
//влево
case DirectionType.Left:
_startPosX -= (int)EntityShip.Step;
break;
//вверх
case DirectionType.Up:
_startPosY -= (int)EntityShip.Step;
break;
// вправо
case DirectionType.Right:
_startPosX += (int)EntityShip.Step;
break;
//вниз
case DirectionType.Down:
_startPosY += (int)EntityShip.Step;
break;
}
}
}
}

View File

@ -1,28 +1,15 @@
using System;
using Battleship.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Battleship
namespace Battleship.Entities
{
public class EntityBattleship
internal class EntityBattleship: EntityShip
{
/// <summary>
/// Скорость
/// </summary>
public int Speed { get; private set; }
/// <summary>
/// Вес
/// </summary>
public double Weight { get; private set; }
/// <summary>
/// Основной цвет
/// </summary>
public Color BodyColor { get; private set; }
/// <summary>
/// Дополнительный цвет (для опциональных элементов)
/// </summary>
public Color AdditionalColor { get; private set; }
/// <summary>
/// Признак (опция) наличия башни
@ -35,7 +22,7 @@ namespace Battleship
/// <summary>
/// Шаг перемещения
/// </summary>
public double Step => (double)Speed * 100 / Weight;
/// <summary>
/// Инициализация полей объекта-класса спортивного автомобиля
/// </summary>
@ -45,13 +32,10 @@ namespace Battleship
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="tower">Признак наличия орудийной башни</param>
/// <param name="section">Признак наличия отсека под ракеты</param>
public void Init(int speed, double weight, Color bodyColor, Color
additionalColor, bool tower, bool section)
public EntityBattleship(int speed, double weight, Color bodyColor, Color
additionalColor, bool tower, bool section) : base(speed, weight, bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
AdditionalColor = additionalColor;
AdditionalColor = additionalColor;
Tower = tower;
Section = section;
}

View File

@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Battleship.Entities
{
public class EntityShip
{
/// <summary>
/// Скорость
/// </summary>
public int Speed { get; private set; }
/// <summary>
/// Вес
/// </summary>
public double Weight { get; private set; }
/// <summary>
/// Основной цвет
/// </summary>
public Color BodyColor { get; private set; }
/// <summary>
/// Дополнительный цвет (для опциональных элементов)
/// </summary>
public double Step => (double)Speed * 100 / Weight;
/// <summary>
/// Инициализация полей объекта-класса спортивного автомобиля
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес автомобиля</param>
/// <param name="bodyColor">Основной цвет</param>
public EntityShip(int speed, double weight, Color bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
}
}
}

View File

@ -0,0 +1,36 @@
using Battleship.MovementStrategy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Battleship;
namespace Battleship.MovementStrategy
{
/// <summary>
/// Интерфейс для работы с перемещаемым объектом
/// </summary>
public interface IMoveableObject
{
/// <summary>
/// Получение координаты X объекта
/// </summary>
ObjectParameters? GetObjectPosition { get; }
/// <summary>
/// Шаг объекта
/// </summary>
int GetStep { get; }
/// <summary>
/// Проверка, можно ли переместиться по нужному направлению
/// </summary>
/// <param name="direction"></param>
/// <returns></returns>
bool CheckCanMove(DirectionType direction);
/// <summary>
/// Изменение направления пермещения объекта
/// </summary>
/// <param name="direction">Направление</param>
void MoveObject(DirectionType direction);
}
}

View File

@ -0,0 +1,14 @@
using Battleship.MovementStrategy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Battleship.MovementStrategy
{
public class MoveToBorder : AbstractStrategy
{
}
}

View File

@ -0,0 +1,57 @@
using Battleship.MovementStrategy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Battleship.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();
}
}
}
}
}

View File

@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Battleship.MovementStrategy
{
/// <summary>
/// Параметры-координаты объекта
/// </summary>
public class ObjectParameters
{
private readonly int _x;
private readonly int _y;
private readonly int _width;
private readonly int _height;
/// <summary>
/// Левая граница
/// </summary>
public int LeftBorder => _x;
/// <summary>
/// Верхняя граница
/// </summary>
public int TopBorder => _y;
/// <summary>
/// Правая граница
/// </summary>
public int RightBorder => _x + _width;
/// <summary>
/// Нижняя граница
/// </summary>
public int DownBorder => _y + _height;
/// <summary>
/// Середина объекта
/// </summary>
public int ObjectMiddleHorizontal => _x + _width / 2;
/// <summary>
/// Середина объекта
/// </summary>
public int ObjectMiddleVertical => _y + _height / 2;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
/// <param name="width">Ширина</param>
/// <param name="height">Высота</param>
public ObjectParameters(int x, int y, int width, int height)
{
_x = x;
_y = y;
_width = width;
_height = height;
}
}
}

View File

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Battleship.MovementStrategy
{
/// <summary>
/// Статус выполнения операции перемещения
/// </summary>
public enum Status
{
NotInit,
InProgress,
Finish
}
}