лаб2 простая. Лёвушкина А.А. пибд-21

This commit is contained in:
AnnaLioness 2023-10-06 16:47:13 +04:00
parent 7846b78a34
commit 4b6aa63101
14 changed files with 882 additions and 184 deletions

View File

@ -0,0 +1,139 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Lab1ContainersShip.DrawingObjects;
namespace Lab1ContainersShip.MovementStrategy
{
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(Direction.Left);
/// <summary>
/// Перемещение вправо
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться,
//false - неудача)</returns>
protected bool MoveRight() => MoveTo(Direction.Right);
/// <summary>
/// Перемещение вверх
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться,
//false - неудача)</returns>
protected bool MoveUp() => MoveTo(Direction.Up);
/// <summary>
/// Перемещение вниз
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться,
//false - неудача)</returns>
protected bool MoveDown() => MoveTo(Direction.Down);
/// <summary>
/// Параметры объекта
/// </summary>
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(Direction direction)
{
if (_state != Status.InProgress)
{
return false;
}
if (_moveableObject?.CheckCanMove(direction) ?? false)
{
_moveableObject.MoveObject(direction);
return true;
}
return false;
}
}
}

View File

@ -2,151 +2,41 @@
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading.Tasks;
using Lab1ContainersShip.Entities;
namespace Lab1ContainersShip
namespace Lab1ContainersShip.DrawingObjects
{
public class DrawingContainerShip
internal class DrawingContainerShip : DrawingShip
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityContainerShip EntityContainerShip { 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 _shipWidth = 110;
/// <summary>
/// Высота прорисовки автомобиля
/// </summary>
private readonly int _shipHeight = 65;
public bool Init(int speed, double weight, Color bodyColor, Color
additionalColor, bool crane, bool container, int width, int height)
{
// TODO: Продумать проверки
_pictureWidth = width;
_pictureHeight = height;
if (_pictureWidth < _shipWidth || _pictureHeight < _shipHeight)
public DrawingContainerShip(int speed, double weight, Color bodyColor, Color
additionalColor, bool crane, bool containers, int width, int height) :
base(speed, weight, bodyColor,width, height, 110, 65) {
if (EntityShip != null)
{
return false;
EntityShip = new EntityContainerShip(speed, weight, bodyColor,
additionalColor, crane, containers);
}
EntityContainerShip = new EntityContainerShip();
EntityContainerShip.Init(speed, weight, bodyColor, additionalColor,
crane, container);
return true;
}
/*public bool Init(EntityContainerShip entcon, int wid, int hei)
public override void DrawShip(Graphics g)
{
_pictureWidth = wid;
_pictureHeight = hei;
if (_pictureWidth < _shipWidth || _pictureHeight < _shipHeight)
/*if (EntityShip is not EntityContainerShip containerShip)
{
return false;
}
EntityContainerShip = entcon;
return true;
}*/
public void SetPosition(int x, int y)
{
// TODO: Изменение x, y
_startPosX = Math.Min(x, _pictureWidth - _shipWidth);
_startPosY = Math.Min(y, _pictureHeight - _shipHeight);
}
public void MoveTransport(Direction direction)
{
if (EntityContainerShip == null)
return;
}*/
if(EntityShip == null)
{
return;
}
switch (direction)
{
//влево
case Direction.Left:
if (_startPosX - EntityContainerShip.Step > 0)
{
_startPosX -= (int)EntityContainerShip.Step;
}
break;
//вверх
case Direction.Up:
if (_startPosY - EntityContainerShip.Step > 0)
{
_startPosY -= (int)EntityContainerShip.Step;
}
break;
// вправо
case Direction.Right:
// TODO: Продумать логику
if (_startPosX + EntityContainerShip.Step + _shipWidth < _pictureWidth)
{
_startPosX += (int)EntityContainerShip.Step;
}
break;
//вниз
case Direction.Down:
// TODO: Продумать логику
if (_startPosY + EntityContainerShip.Step + _shipHeight< _pictureHeight)
{
_startPosY += (int)EntityContainerShip.Step;
}
break;
}
}
public void DrawShip(Graphics g)
{
if (EntityContainerShip == null)
{
if(!(EntityShip is EntityContainerShip)) {
return;
}
Pen pen = new Pen(Color.Black);
Brush adbrush = new SolidBrush(EntityContainerShip.AdditionalColor);
Brush brBlue = new SolidBrush(Color.Blue);
// заполнение борта
g.FillPolygon(brBlue, new PointF[]
{
new PointF(_startPosX, _startPosY+45),
new PointF(_startPosX+20, _startPosY+65),
new PointF(_startPosX+90, _startPosY+65),
new PointF(_startPosX+110, _startPosY+45),
new PointF(_startPosX, _startPosY+45)
});
//борт корабля контур
g.DrawLines(pen, new Point[] {
new Point(_startPosX, _startPosY+45),
new Point(_startPosX+20, _startPosY+65),
new Point(_startPosX+90, _startPosY+65),
new Point(_startPosX+110, _startPosY+45),
new Point(_startPosX, _startPosY+45)});
//рисунок на борту
g.DrawLine(pen, _startPosX + 23, _startPosY + 60, _startPosX + 27, _startPosY + 60);
g.DrawLine(pen, _startPosX + 25, _startPosY + 50, _startPosX + 25, _startPosY + 60);
g.DrawLine(pen, _startPosX + 20, _startPosY + 55, _startPosX + 30, _startPosY + 55);
//контейнеры
if (EntityContainerShip.Conteiners)
Brush adbrush = new SolidBrush((EntityShip as EntityContainerShip).AdditionalColor);
base.DrawShip(g);
if ((EntityShip as EntityContainerShip).Conteiners)
{
g.FillRectangle(adbrush, _startPosX + 30, _startPosY + 35, 35, 10);
g.FillRectangle(adbrush, _startPosX + 65, _startPosY + 35, 20, 10);
@ -163,7 +53,7 @@ additionalColor, bool crane, bool container, int width, int height)
g.DrawRectangle(pen, _startPosX + 45, _startPosY + 30, 40, 5);
}
//кран
if (EntityContainerShip.Crane)
if ((EntityShip as EntityContainerShip).Crane)
{
g.FillRectangle(adbrush, _startPosX + 23, _startPosY, 5, 45);
g.FillRectangle(adbrush, _startPosX + 27, _startPosY + 10, 20, 3);

View File

@ -0,0 +1,233 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Lab1ContainersShip.Entities;
namespace Lab1ContainersShip.DrawingObjects
{
public class DrawingShip
{
/// <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>
private readonly int _shipWidth = 110;
/// <summary>
/// Высота прорисовки автомобиля
/// </summary>
private readonly int _shipHeight = 65;
/// <summary>
/// Координата X объекта
/// </summary>
public int GetPosX => _startPosX;
/// <summary>
/// Координата Y объекта
/// </summary>
public int GetPosY => _startPosY;
/// <summary>
/// Ширина объекта
/// </summary>
public int GetWidth => _shipWidth;
/// <summary>
/// Высота объекта
/// </summary>
public int GetHeight => _shipHeight;
public bool CanMove(Direction direction)
{
if(EntityShip == null) return false;
switch(direction)
{
case Direction.Left:
return _startPosX - EntityShip.Step > 0;
case Direction.Right:
return _startPosX + _shipWidth + EntityShip.Step < _pictureWidth;
case Direction.Up:
return _startPosY - EntityShip.Step > 0;
case Direction.Down:
return _startPosY + _shipHeight+ EntityShip.Step < _pictureHeight;
default:
return false;
}
}
/*public bool Init(int speed, double weight, Color bodyColor, Color
additionalColor, bool crane, bool container, int width, int height)
{
// TODO: Продумать проверки
_pictureWidth = width;
_pictureHeight = height;
if (_pictureWidth < _shipWidth || _pictureHeight < _shipHeight)
{
return false;
}
EntityShip = new EntityShip();
EntityShip.Init(speed, weight, bodyColor, additionalColor,
crane, container);
return true;
}*/
public DrawingShip(int speed, double weight, Color bodyColor, int width, int height)
{
if(width < _shipWidth || height < _shipHeight)
{
return;
}
_pictureWidth = width;
_pictureHeight = height;
EntityShip = new EntityShip(speed, weight, bodyColor);
}
protected DrawingShip(int speed, double weight, Color bodyColor, int width, int height, int shipWidth, int shipHeight)
{
if (width < _shipWidth || height < _shipHeight)
{
return;
}
_pictureWidth = width;
_pictureHeight = height;
_shipHeight = shipHeight;
_shipWidth = shipWidth;
EntityShip = new EntityShip(speed, weight, bodyColor);
}
/*public bool Init(EntityContainerShip entcon, int wid, int hei)
{
_pictureWidth = wid;
_pictureHeight = hei;
if (_pictureWidth < _shipWidth || _pictureHeight < _shipHeight)
{
return false;
}
EntityContainerShip = entcon;
return true;
}*/
public void SetPosition(int x, int y)
{
// TODO: Изменение x, y
_startPosX = Math.Min(x, _pictureWidth - _shipWidth);
_startPosY = Math.Min(y, _pictureHeight - _shipHeight);
}
public void MoveTransport(Direction direction)
{
if (!CanMove(direction) || EntityShip == null)
{
return;
}
switch (direction)
{
//влево
case Direction.Left:
if (_startPosX - EntityShip.Step > 0)
{
_startPosX -= (int)EntityShip.Step;
}
break;
//вверх
case Direction.Up:
if (_startPosY - EntityShip.Step > 0)
{
_startPosY -= (int)EntityShip.Step;
}
break;
// вправо
case Direction.Right:
// TODO: Продумать логику
if (_startPosX + EntityShip.Step + _shipWidth < _pictureWidth)
{
_startPosX += (int)EntityShip.Step;
}
break;
//вниз
case Direction.Down:
// TODO: Продумать логику
if (_startPosY + EntityShip.Step + _shipHeight< _pictureHeight)
{
_startPosY += (int)EntityShip.Step;
}
break;
}
}
public virtual void DrawShip(Graphics g)
{
if (EntityShip == null)
{
return;
}
Pen pen = new Pen(Color.Black);
//Brush adbrush = new SolidBrush(EntityShip.AdditionalColor);
Brush brBlue = new SolidBrush(Color.Blue);
// заполнение борта
g.FillPolygon(brBlue, new PointF[]
{
new PointF(_startPosX, _startPosY+45),
new PointF(_startPosX+20, _startPosY+65),
new PointF(_startPosX+90, _startPosY+65),
new PointF(_startPosX+110, _startPosY+45),
new PointF(_startPosX, _startPosY+45)
});
//борт корабля контур
g.DrawLines(pen, new Point[] {
new Point(_startPosX, _startPosY+45),
new Point(_startPosX+20, _startPosY+65),
new Point(_startPosX+90, _startPosY+65),
new Point(_startPosX+110, _startPosY+45),
new Point(_startPosX, _startPosY+45)});
//рисунок на борту
g.DrawLine(pen, _startPosX + 23, _startPosY + 60, _startPosX + 27, _startPosY + 60);
g.DrawLine(pen, _startPosX + 25, _startPosY + 50, _startPosX + 25, _startPosY + 60);
g.DrawLine(pen, _startPosX + 20, _startPosY + 55, _startPosX + 30, _startPosY + 55);
//контейнеры
/*if (EntityShip.Conteiners)
{
g.FillRectangle(adbrush, _startPosX + 30, _startPosY + 35, 35, 10);
g.FillRectangle(adbrush, _startPosX + 65, _startPosY + 35, 20, 10);
g.FillRectangle(adbrush, _startPosX + 85, _startPosY + 30, 15, 15);
g.FillRectangle(adbrush, _startPosX + 30, _startPosY + 25, 15, 10);
g.FillRectangle(adbrush, _startPosX + 45, _startPosY + 25, 55, 5);
g.FillRectangle(adbrush, _startPosX + 45, _startPosY + 30, 40, 5);
g.DrawRectangle(pen, _startPosX + 30, _startPosY + 35, 35, 10);
g.DrawRectangle(pen, _startPosX + 65, _startPosY + 35, 20, 10);
g.DrawRectangle(pen, _startPosX + 85, _startPosY + 30, 15, 15);
g.DrawRectangle(pen, _startPosX + 30, _startPosY + 25, 15, 10);
g.DrawRectangle(pen, _startPosX + 45, _startPosY + 25, 55, 5);
g.DrawRectangle(pen, _startPosX + 45, _startPosY + 30, 40, 5);
}
//кран
if (EntityShip.Crane)
{
g.FillRectangle(adbrush, _startPosX + 23, _startPosY, 5, 45);
g.FillRectangle(adbrush, _startPosX + 27, _startPosY + 10, 20, 3);
g.DrawRectangle(pen, _startPosX + 23, _startPosY, 5, 45);
g.DrawRectangle(pen, _startPosX + 27, _startPosY + 10, 20, 3);
g.DrawLine(pen, _startPosX + 27, _startPosY, _startPosX + 47, _startPosY + 10);
g.DrawLine(pen, _startPosX + 47, _startPosY + 13, _startPosX + 47, _startPosY + 25);
}*/
}
}
}

View File

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Lab1ContainersShip.DrawingObjects;
namespace Lab1ContainersShip.MovementStrategy
{
public class DrawningObjectShip : IMoveableObject
{
private readonly DrawingShip _drawingShip = null;
public DrawningObjectShip(DrawingShip drawingShip)
{
_drawingShip = drawingShip;
}
public ObjectParameters GetObjectPosition
{
get
{
if (_drawingShip == null || _drawingShip.EntityShip ==
null)
{
return null;
}
return new ObjectParameters(_drawingShip.GetPosX,
_drawingShip.GetPosY, _drawingShip.GetWidth, _drawingShip.GetHeight);
}
}
public int GetStep => (int)(_drawingShip?.EntityShip.Step ?? 0);
public bool CheckCanMove(Direction direction) =>
_drawingShip?.CanMove(direction) ?? false;
public void MoveObject(Direction direction) =>
_drawingShip?.MoveTransport(direction);
}
}

View File

@ -5,28 +5,11 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Lab1ContainersShip
namespace Lab1ContainersShip.Entities
{
public class EntityContainerShip
internal class EntityContainerShip : 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>
/// Признак (опция) наличия крана
/// </summary>
@ -35,13 +18,9 @@ namespace Lab1ContainersShip
/// Признак (опция) наличия контейнеров
/// </summary>
public bool Conteiners { get; private set; }
public double Step => (double)Speed * 100 / Weight;
public void Init(int speed, double weight, Color bodyColor, Color
additionalColor, bool crane, bool containers)
public EntityContainerShip(int speed, double weight, Color bodyColor, Color additionalColor,
bool crane, bool containers ) : base (speed, weight, bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
AdditionalColor = additionalColor;
Crane = crane;
Conteiners = containers;

View File

@ -0,0 +1,49 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Lab1ContainersShip.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 Color AdditionalColor { get; private set; }
/// <summary>
/// Признак (опция) наличия крана
/// </summary>
//public bool Crane { get; private set; }
/// <summary>
/// Признак (опция) наличия контейнеров
/// </summary>
//public bool Conteiners { get; private set; }
public double Step => (double)Speed * 100 / Weight;
public EntityShip(int speed, double weight, Color bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
//AdditionalColor = additionalColor;
//Crane = crane;
//Conteiners = containers;
}
}
}

View File

@ -28,26 +28,18 @@
/// </summary>
private void InitializeComponent()
{
this.buttonCreate = new System.Windows.Forms.Button();
this.buttonUp = new System.Windows.Forms.Button();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.buttonRight = new System.Windows.Forms.Button();
this.buttonLeft = new System.Windows.Forms.Button();
this.buttonDown = new System.Windows.Forms.Button();
this.comboBoxStrategy = new System.Windows.Forms.ComboBox();
this.buttonStep = new System.Windows.Forms.Button();
this.buttonCreateContainerShip = new System.Windows.Forms.Button();
this.buttonCreateShip = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// buttonCreate
//
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, 426);
this.buttonCreate.Name = "buttonCreate";
this.buttonCreate.Size = new System.Drawing.Size(75, 23);
this.buttonCreate.TabIndex = 1;
this.buttonCreate.Text = "создать";
this.buttonCreate.UseVisualStyleBackColor = true;
this.buttonCreate.Click += new System.EventHandler(this.buttonCreate_Click);
//
// buttonUp
//
this.buttonUp.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
@ -69,7 +61,6 @@
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
this.pictureBox1.TabIndex = 0;
this.pictureBox1.TabStop = false;
this.pictureBox1.Click += new System.EventHandler(this.buttonMove_Click);
//
// buttonRight
//
@ -107,16 +98,61 @@
this.buttonDown.UseVisualStyleBackColor = true;
this.buttonDown.Click += new System.EventHandler(this.buttonMove_Click);
//
// comboBoxStrategy
//
this.comboBoxStrategy.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboBoxStrategy.FormattingEnabled = true;
this.comboBoxStrategy.Items.AddRange(new object[] {
"MoveToCenter",
"MoveToRight-Down"});
this.comboBoxStrategy.Location = new System.Drawing.Point(751, 12);
this.comboBoxStrategy.Name = "comboBoxStrategy";
this.comboBoxStrategy.Size = new System.Drawing.Size(121, 21);
this.comboBoxStrategy.TabIndex = 6;
//
// buttonStep
//
this.buttonStep.Location = new System.Drawing.Point(797, 39);
this.buttonStep.Name = "buttonStep";
this.buttonStep.Size = new System.Drawing.Size(75, 23);
this.buttonStep.TabIndex = 7;
this.buttonStep.Text = "шаг";
this.buttonStep.UseVisualStyleBackColor = true;
this.buttonStep.Click += new System.EventHandler(this.buttonStep_Click);
//
// buttonCreateContainerShip
//
this.buttonCreateContainerShip.Location = new System.Drawing.Point(12, 411);
this.buttonCreateContainerShip.Name = "buttonCreateContainerShip";
this.buttonCreateContainerShip.Size = new System.Drawing.Size(97, 38);
this.buttonCreateContainerShip.TabIndex = 8;
this.buttonCreateContainerShip.Text = "создать контейнеровоз";
this.buttonCreateContainerShip.UseVisualStyleBackColor = true;
this.buttonCreateContainerShip.Click += new System.EventHandler(this.buttonCreateContainerShip_Click);
//
// buttonCreateShip
//
this.buttonCreateShip.Location = new System.Drawing.Point(115, 411);
this.buttonCreateShip.Name = "buttonCreateShip";
this.buttonCreateShip.Size = new System.Drawing.Size(94, 38);
this.buttonCreateShip.TabIndex = 9;
this.buttonCreateShip.Text = "создать кораблик";
this.buttonCreateShip.UseVisualStyleBackColor = true;
this.buttonCreateShip.Click += new System.EventHandler(this.buttonCreateShip_Click);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(884, 461);
this.Controls.Add(this.buttonCreateShip);
this.Controls.Add(this.buttonCreateContainerShip);
this.Controls.Add(this.buttonStep);
this.Controls.Add(this.comboBoxStrategy);
this.Controls.Add(this.buttonDown);
this.Controls.Add(this.buttonLeft);
this.Controls.Add(this.buttonRight);
this.Controls.Add(this.buttonUp);
this.Controls.Add(this.buttonCreate);
this.Controls.Add(this.pictureBox1);
this.Name = "Form1";
this.Text = "контейнеровоз";
@ -129,11 +165,14 @@
#endregion
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.Button buttonCreate;
private System.Windows.Forms.Button buttonUp;
private System.Windows.Forms.Button buttonRight;
private System.Windows.Forms.Button buttonLeft;
private System.Windows.Forms.Button buttonDown;
private System.Windows.Forms.ComboBox comboBoxStrategy;
private System.Windows.Forms.Button buttonStep;
private System.Windows.Forms.Button buttonCreateContainerShip;
private System.Windows.Forms.Button buttonCreateShip;
}
}

View File

@ -7,13 +7,21 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Lab1ContainersShip.DrawingObjects;
using Lab1ContainersShip.MovementStrategy;
namespace Lab1ContainersShip
{
public partial class Form1 : Form
{
private DrawingContainerShip _drawningShip;
private DrawingShip _drawingShip;
/// <summary>
/// Стратегия перемещения
/// </summary>
private AbstractStrategy _abstractStrategy;
public Form1()
{
InitializeComponent();
@ -31,23 +39,31 @@ namespace Lab1ContainersShip
/// </summary>
private void Draw()
{
if (_drawningShip == null)
if (_drawingShip == null)
{
return;
}
Bitmap bmp = new Bitmap (pictureBox1.Width,
pictureBox1.Height);
Graphics gr = Graphics.FromImage(bmp);
_drawningShip.DrawShip(gr);
if(_drawingShip is DrawingShip)
{
(_drawingShip as DrawingShip).DrawShip(gr);
}
else
{
_drawingShip.DrawShip(gr);
}
pictureBox1.Image = bmp;
}
private void buttonCreate_Click(object sender, EventArgs e)
/*private void buttonCreate_Click(object sender, EventArgs e)
{
Random random = new Random();
_drawningShip = new DrawingContainerShip();
EntityContainerShip _entitycont = new EntityContainerShip();
_drawningShip = new DrawingShip();
EntityShip _entitycont = new EntityShip();*/
/*_entitycont.Init(random.Next(100, 300),
random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256),
@ -56,7 +72,7 @@ namespace Lab1ContainersShip
random.Next(0, 256)),
Convert.ToBoolean(random.Next(0, 2)),
Convert.ToBoolean(random.Next(0, 2)));*/
_drawningShip.Init(random.Next(100, 300),
/*_drawningShip.Init(random.Next(100, 300),
random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256),
random.Next(0, 256)),
@ -69,10 +85,10 @@ namespace Lab1ContainersShip
_drawningShip.SetPosition(random.Next(10, 100),
random.Next(10, 100));
Draw();
}
}*/
private void buttonMove_Click(object sender, EventArgs e)
{
if (_drawningShip == null)
if (_drawingShip == null)
{
return;
}
@ -80,19 +96,100 @@ namespace Lab1ContainersShip
switch (name)
{
case "buttonUp":
_drawningShip.MoveTransport(Direction.Up);
_drawingShip.MoveTransport(Direction.Up);
break;
case "buttonDown":
_drawningShip.MoveTransport(Direction.Down);
_drawingShip.MoveTransport(Direction.Down);
break;
case "buttonLeft":
_drawningShip.MoveTransport(Direction.Left);
_drawingShip.MoveTransport(Direction.Left);
break;
case "buttonRight":
_drawningShip.MoveTransport(Direction.Right);
_drawingShip.MoveTransport(Direction.Right);
break;
}
Draw();
}
private void buttonStep_Click(object sender, EventArgs e)
{
if (_drawingShip == null)
{
return;
}
if (comboBoxStrategy.Enabled)
{
/*_abstractStrategy = comboBoxStrategy.SelectedIndex
switch
{
0 => new MoveToCenter(),
1 => new MoveToBorder(),
_ => null,
};*/
switch (comboBoxStrategy.SelectedIndex)
{
case 0:
_abstractStrategy = new MoveToCenter();
break;
case 1:
_abstractStrategy = new MoveToBorder();
break;
default:
_abstractStrategy = null;
break;
}
if (_abstractStrategy == null)
{
return;
}
_abstractStrategy.SetData(new
DrawningObjectShip(_drawingShip), pictureBox1.Width,
pictureBox1.Height);
comboBoxStrategy.Enabled = false;
}
if (_abstractStrategy == null)
{
return;
}
_abstractStrategy.MakeStep();
Draw();
if (_abstractStrategy.GetStatus() == Status.Finish)
{
comboBoxStrategy.Enabled = true;
_abstractStrategy = null;
}
}
private void buttonCreateContainerShip_Click(object sender, EventArgs e)
{
Random random = new Random();
_drawingShip = new DrawingContainerShip(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)),
pictureBox1.Width, pictureBox1.Height);
_drawingShip.SetPosition(random.Next(10, 100), random.Next(10,
100));
Draw();
}
private void buttonCreateShip_Click(object sender, EventArgs e)
{
Random random = new Random();
_drawingShip = new DrawingShip(random.Next(100, 300),
random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256),
random.Next(0, 256)),
pictureBox1.Width, pictureBox1.Height);
_drawingShip.SetPosition(random.Next(10, 100), random.Next(10,
100));
Draw();
}
}
}

View File

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Lab1ContainersShip.DrawingObjects;
namespace Lab1ContainersShip.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(Direction direction);
/// <summary>
/// Изменение направления пермещения объекта
/// </summary>
/// <param name="direction">Направление</param>
void MoveObject(Direction direction);
}
}

View File

@ -46,17 +46,26 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="AbstractStrategy.cs" />
<Compile Include="Direction.cs" />
<Compile Include="DrawingContainerShip.cs" />
<Compile Include="DrawingShip.cs" />
<Compile Include="DrawningObjectShip.cs" />
<Compile Include="EntityContainerShip.cs" />
<Compile Include="EntityShip.cs" />
<Compile Include="Form1.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Form1.Designer.cs">
<DependentUpon>Form1.cs</DependentUpon>
</Compile>
<Compile Include="IMoveableObject.cs" />
<Compile Include="MoveToBorder.cs" />
<Compile Include="MoveToCenter.cs" />
<Compile Include="ObjectParameters.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Status.cs" />
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource>

View File

@ -0,0 +1,56 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Lab1ContainersShip.MovementStrategy
{
internal class MoveToBorder : 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 = objParams.RightBorder - FieldWidth;
if (Math.Abs(diffX) > GetStep())
{
if (diffX > 0)
{
MoveLeft();
}
else
{
MoveRight();
}
}
var diffY = objParams.DownBorder - FieldHeight;
if (Math.Abs(diffY) > GetStep())
{
if (diffY > 0)
{
MoveUp();
}
else
{
MoveDown();
}
}
}
}
}

View File

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