From c3a4937cd8b2e2333145511cc71a7c44b6544a53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=B8=D1=8F=20=D0=9A=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0?= Date: Thu, 9 May 2024 20:37:27 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=20=E2=84=962?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{ => Drawing}/DirectionType.cs | 0 .../Drawing/DrawingExcavator.cs | 102 ++++++++ .../Drawing/DrawingExcavatorEmpty.cs | 243 ++++++++++++++++++ .../ExcavatorDifficult/Drawing/DrawingRink.cs | 59 +++++ .../Drawing/DrawingRinkCircule.cs | 93 +++++++ .../Drawing/DrawingRinkSquare.cs | 97 +++++++ .../Drawing/DrawingRinkTriagle.cs | 154 +++++++++++ .../Drawing/InterDopRink.cs | 14 + .../ExcavatorDifficult/DrawingExcavator.cs | 243 ------------------ .../ExcavatorDifficult/DrawingRink.cs | 64 ----- .../{ => Entity}/EntityExcavator.cs | 47 ++-- .../Entity/EntityExcavatorEmpty.cs | 46 ++++ .../FormExcavator.Designer.cs | 49 +++- .../ExcavatorDifficult/FormExcavator.cs | 69 ++++- .../MovementStrategy/AbstractStrategy.cs | 142 ++++++++++ .../MovementStrategy/IMoveableObjectcs.cs | 22 ++ .../MovementStrategy/MoveToBorder.cs | 53 ++++ .../MovementStrategy/MoveToCenter.cs | 51 ++++ .../MovementStrategy/MoveableExcavator.cs | 37 +++ .../MovementStrategy/MovementDirection.cs | 24 ++ .../MovementStrategy/ObjectParameters.cs | 71 +++++ .../MovementStrategy/StrategyStatus.cs | 22 ++ 22 files changed, 1344 insertions(+), 358 deletions(-) rename ExcavatorDifficult/ExcavatorDifficult/{ => Drawing}/DirectionType.cs (100%) create mode 100644 ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingExcavator.cs create mode 100644 ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingExcavatorEmpty.cs create mode 100644 ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingRink.cs create mode 100644 ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingRinkCircule.cs create mode 100644 ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingRinkSquare.cs create mode 100644 ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingRinkTriagle.cs create mode 100644 ExcavatorDifficult/ExcavatorDifficult/Drawing/InterDopRink.cs delete mode 100644 ExcavatorDifficult/ExcavatorDifficult/DrawingExcavator.cs delete mode 100644 ExcavatorDifficult/ExcavatorDifficult/DrawingRink.cs rename ExcavatorDifficult/ExcavatorDifficult/{ => Entity}/EntityExcavator.cs (53%) create mode 100644 ExcavatorDifficult/ExcavatorDifficult/Entity/EntityExcavatorEmpty.cs create mode 100644 ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/AbstractStrategy.cs create mode 100644 ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/IMoveableObjectcs.cs create mode 100644 ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/MoveToBorder.cs create mode 100644 ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/MoveToCenter.cs create mode 100644 ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/MoveableExcavator.cs create mode 100644 ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/MovementDirection.cs create mode 100644 ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/ObjectParameters.cs create mode 100644 ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/StrategyStatus.cs diff --git a/ExcavatorDifficult/ExcavatorDifficult/DirectionType.cs b/ExcavatorDifficult/ExcavatorDifficult/Drawing/DirectionType.cs similarity index 100% rename from ExcavatorDifficult/ExcavatorDifficult/DirectionType.cs rename to ExcavatorDifficult/ExcavatorDifficult/Drawing/DirectionType.cs diff --git a/ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingExcavator.cs b/ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingExcavator.cs new file mode 100644 index 0000000..69006bd --- /dev/null +++ b/ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingExcavator.cs @@ -0,0 +1,102 @@ +using ExcavatorDifficult.Drawing; +using ExcavatorDifficult.Entity; + +namespace ExcavatorDifficult.Drawings; + +/// +/// Класс, отвечающий за прорисовку и передвижение объекта сущности +/// +public class DrawingExcavator : DrawingExcavatorEmpty +{ + private InterDopRink? DrawingKatki; + + + + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия обвеса + /// Признак наличия антикрыла + /// Признак наличия гоночной полосы + public DrawingExcavator(int speed, double weight, Color bodyColor, Color additionalColor, bool bucket, bool support, bool bulldozerDump, + bool katki, int width, int height, int numKatki, int numchoose) : base (speed, weight, bodyColor, width, height, numKatki, numchoose) + { + if (EntityExcavatorEmpty != null) + { + EntityExcavatorEmpty = new EntityExcavator(speed, weight, bodyColor, additionalColor, bucket, support, bulldozerDump, katki); + } + int choose = numchoose % 3; + switch (choose) + { + case 0: + DrawingKatki = new DrawingRinkSquare(); + break; + case 1: + DrawingKatki = new DrawingRinkTriagle(); + break; + case 2: + DrawingKatki = new DrawingRinkCircule(); + break; + } + DrawingKatki.Properties = numKatki; + } + public override void DrawTransport(Graphics g) + { + if (EntityExcavatorEmpty is not EntityExcavator entityExcavator) + { + return; + } + + Pen pen = new(Color.Black); + Brush additionalBrush = new SolidBrush(EntityExcavator.AdditionalColor); + Brush bodybrush = new SolidBrush(EntityExcavatorEmpty.BodyColor); + + base.DrawTransport(g); + + if (entityExcavator.Bucket) + { + Point point1 = new Point(_startPosX + 100, _startPosY); + Point point2 = new Point(_startPosX + 180, _startPosY); + Point point4 = new Point(_startPosX + 180, _startPosY + 40); + Point point5 = new Point(_startPosX + 170, _startPosY + 60); + Point point6 = new Point(_startPosX + 150, _startPosY + 60); + Point point7 = new Point(_startPosX + 140, _startPosY + 40); + Point point8 = new Point(_startPosX + 172, _startPosY + 40); + Point point9 = new Point(_startPosX + 172, _startPosY + 10); + Point point10 = new Point(_startPosX + 100, _startPosY + 10); + + Point[] Bucket = { point1, point2, point4, point5, point6, point7, point8, point9, point10 }; + g.FillPolygon(additionalBrush, Bucket); + } + + if (entityExcavator.Support) + { + Point point1 = new Point(_startPosX + 2, _startPosY + 50); + Point point2 = new Point(_startPosX + 12, _startPosY + 80); + Point point3 = new Point(_startPosX + 22, _startPosY + 80); + Point point4 = new Point(_startPosX + 12, _startPosY + 50); + Point[] Support = { point1, point2, point3, point4 }; + g.FillPolygon(additionalBrush, Support); + + } + + if (entityExcavator.BulldozerDump) + { + Point point11 = new Point(_startPosX + 100, _startPosY + 40); + Point point12 = new Point(_startPosX + 160, _startPosY + 80); + Point point13 = new Point(_startPosX + 130, _startPosY + 80); + Point point14 = new Point(_startPosX + 100, _startPosY + 50); + Point[] Dump = { point11, point12, point13, point14 }; + g.FillPolygon(additionalBrush, Dump); + } + + + + + } +} + diff --git a/ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingExcavatorEmpty.cs b/ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingExcavatorEmpty.cs new file mode 100644 index 0000000..0d0fe69 --- /dev/null +++ b/ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingExcavatorEmpty.cs @@ -0,0 +1,243 @@ + +using ExcavatorDifficult.Drawing; +using ExcavatorDifficult.Entity; + +namespace ExcavatorDifficult; + +public class DrawingExcavatorEmpty +{ + + private InterDopRink? DrawingKatki; + /// + /// Класс-сущность + /// + public EntityExcavatorEmpty? EntityExcavatorEmpty { get; protected set; } + + /// + /// Ширина окна + /// + private int _pictureWidth; + + /// + /// Высота окна + /// + private int _pictureHeight; + + /// + /// Левая координата прорисовки экскаватора + /// + protected int _startPosX; + + /// + /// Верхняя кооридната прорисовки экскаватора + /// + protected int _startPosY; + + /// + /// Ширина прорисовки экскаватора + /// + protected readonly int _drawningExcavatorWidth = 180; + + /// + /// Высота прорисовки экскаватора + /// + protected readonly int _drawningExcavatorHeight = 80; + + /// + /// Координата X объекта + /// + public int GetPosX => _startPosX; + /// + /// Координата Y объекта + /// + public int GetPosY => _startPosY; + /// + /// Ширина объекта + /// + public int GetWidth => _drawningExcavatorWidth; + /// + /// Высота объекта + /// + public int GetHeight => _drawningExcavatorHeight; + + + public DrawingExcavatorEmpty(int speed, double weight, Color bodyColor, int width, int height, int numKatki, int numchoose) + { + if (width > _drawningExcavatorWidth || height > _drawningExcavatorHeight) + { + _pictureWidth = width; + _pictureHeight = height; + EntityExcavatorEmpty = new EntityExcavatorEmpty(speed, weight, bodyColor); + int choose = numchoose % 3; + switch (choose) + { + case 0: + DrawingKatki = new DrawingRinkSquare(); + break; + case 1: + DrawingKatki = new DrawingRinkTriagle(); + break; + case 2: + DrawingKatki = new DrawingRinkCircule(); + break; + } + DrawingKatki.Properties = numKatki; + } + } + + + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + protected DrawingExcavatorEmpty(int speed, double weight, Color bodyColor, int width, int height, int exWidth, int exHeight, int numKatki) + { + if (width > _drawningExcavatorWidth || height > _drawningExcavatorHeight) + { + _pictureWidth = width; + _pictureHeight = height; + _drawningExcavatorWidth = exWidth; + _drawningExcavatorHeight = exHeight; + EntityExcavatorEmpty = new EntityExcavatorEmpty(speed, weight, bodyColor); + } + } + + + /// + /// Установка границ поля + /// + /// Ширина поля + /// Высота поля4ееее + /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах + + + /// + /// Установка позиции + /// + /// Координата X + /// Координата Y + public void SetPosition(int x, int y) + { + if (x < 0) + { + x = 0; + } + else if (x > _pictureWidth - _drawningExcavatorWidth) + { + x = _pictureWidth - _drawningExcavatorWidth; + + } + + if (y < 0) + { + y = 0; + } + else if (y > _pictureHeight - _drawningExcavatorHeight) + { + y = _pictureHeight - _drawningExcavatorHeight; + } + _startPosX = x; + _startPosY = y; + + } + + + public bool CanMove(DirectionType direction) + { + if (EntityExcavatorEmpty == null) + { + return false; + } + return direction switch + { + //влево + DirectionType.Left => _startPosX - EntityExcavatorEmpty.Step > 0, + //вверх + DirectionType.Up => _startPosY - EntityExcavatorEmpty.Step > 0, + // вправо + DirectionType.Right => _startPosX + _drawningExcavatorWidth + EntityExcavatorEmpty.Step <= _pictureWidth, + //влево + DirectionType.Down => _startPosY + _drawningExcavatorHeight + EntityExcavatorEmpty.Step <= _pictureHeight, + }; + } + + + /// + /// Изменение направления перемещения + /// + /// Направление + /// true - перемещение выполнено, false - перемещение невозможно + public void MoveTransport(DirectionType direction) + { + if (!CanMove(direction) || EntityExcavatorEmpty == null) + { + return; + } + + switch (direction) + { + //влево + case DirectionType.Left: + _startPosX -= (int)EntityExcavatorEmpty.Step; + break; + //вверх + case DirectionType.Up: + _startPosY -= (int)EntityExcavatorEmpty.Step; + break; + // вправо + case DirectionType.Right: + _startPosX += (int)EntityExcavatorEmpty.Step; + break; + //вниз + case DirectionType.Down: + _startPosY += (int)EntityExcavatorEmpty.Step; + break; + default: + break; + } + } + + /// + /// Прорисовка объекта + /// + /// + public virtual void DrawTransport(Graphics g) + { + if (EntityExcavatorEmpty == null) + { + return; + } + + Pen pen = new(Color.Black); + Brush bodybrush = new SolidBrush(EntityExcavatorEmpty.BodyColor); + + + //границы экскаватора + g.DrawRectangle(pen, _startPosX, _startPosY + 20, 100, 30); + g.DrawRectangle(pen, _startPosX + 30, _startPosY, 10, 20); + g.DrawRectangle(pen, _startPosX + 80, _startPosY, 20, 20); + g.DrawArc(pen, _startPosX, _startPosY + 45, 30, 40, 130, 100); + g.DrawArc(pen, _startPosX + 80, _startPosY + 50, 30, 40, 285, 110); + g.DrawLine(pen, _startPosX + 5, _startPosY + 80, _startPosX + 109, _startPosY + 80); + + + //заливка кабины и основного железа + Brush br = new SolidBrush(Color.Black); + g.FillRectangle(bodybrush, _startPosX, _startPosY + 20, 100, 30); + g.FillRectangle(bodybrush, _startPosX + 30, _startPosY, 10, 20); + g.FillRectangle(bodybrush, _startPosX + 80, _startPosY, 20, 20); + + + //катки орнамент(4,5,6) + DrawingKatki.Draw(_startPosX, _startPosY, EntityExcavatorEmpty.BodyColor, g); + + //фары + Brush brfara = new SolidBrush(Color.Blue); + g.DrawRectangle(pen, _startPosX, _startPosY + 27, 10, 10); + g.FillRectangle(brfara, _startPosX, _startPosY + 27, 10, 10); + //окно + g.FillRectangle(brfara, _startPosX + 85, _startPosY + 10, 10, 10); + } +} diff --git a/ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingRink.cs b/ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingRink.cs new file mode 100644 index 0000000..a81f9ba --- /dev/null +++ b/ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingRink.cs @@ -0,0 +1,59 @@ +namespace ExcavatorDifficult; + +public class DrawingRink +{ + + private NumberOfRink numberOfRink; + + public int KatNum + { + set + { + if (value <= 4 || value > 6) + { + numberOfRink = NumberOfRink.FourRink; + } + else if (value == 5) + { + numberOfRink = NumberOfRink.FiveRink; + } + else if (value == 6) + { + numberOfRink = NumberOfRink.SixRink; + } + } + } + + public void DrawRinks(Graphics g, int _startPosX, int _startPosY, Color rinkColor) + { + + Brush bodybrush = new SolidBrush(rinkColor); + + + switch (numberOfRink) + { + case NumberOfRink.FourRink: + g.FillEllipse(bodybrush, _startPosX + 10, _startPosY + 68, 15, 15); + g.FillEllipse(bodybrush, _startPosX + 35, _startPosY + 68, 15, 15); + g.FillEllipse(bodybrush, _startPosX + 60, _startPosY + 68, 15, 15); + g.FillEllipse(bodybrush, _startPosX + 85, _startPosY + 68, 15, 15); + break; + case NumberOfRink.FiveRink: + g.FillEllipse(bodybrush, _startPosX + 15, _startPosY + 68, 15, 15); + g.FillEllipse(bodybrush, _startPosX + 35, _startPosY + 68, 15, 15); + g.FillEllipse(bodybrush, _startPosX + 55, _startPosY + 68, 15, 15); + g.FillEllipse(bodybrush, _startPosX + 75, _startPosY + 68, 15, 15); + g.FillEllipse(bodybrush, _startPosX + 95, _startPosY + 68, 15, 15); + break; + case NumberOfRink.SixRink: + g.FillEllipse(bodybrush, _startPosX + 15, _startPosY + 80, 15, 15); + g.FillEllipse(bodybrush, _startPosX + 40, _startPosY + 80, 15, 15); + g.FillEllipse(bodybrush, _startPosX + 65, _startPosY + 80, 15, 15); + g.FillEllipse(bodybrush, _startPosX + 80, _startPosY + 80, 15, 15); + g.FillEllipse(bodybrush, _startPosX + 20, _startPosY + 58, 15, 15); + g.FillEllipse(bodybrush, _startPosX + 65, _startPosY + 58, 15, 15); + break; + } + + } +} diff --git a/ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingRinkCircule.cs b/ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingRinkCircule.cs new file mode 100644 index 0000000..6e3beb9 --- /dev/null +++ b/ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingRinkCircule.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ExcavatorDifficult.Drawing; + +public class DrawingRinkCircule : InterDopRink +{ + private NumberOfRink numberOfRink; + + public int Properties + { + get + { + return Properties; + + } + set + { + switch (value) + { + case 1: + numberOfRink = NumberOfRink.FourRink; + break; + case 2: + numberOfRink = NumberOfRink.FiveRink; + break; + case 3: + numberOfRink = NumberOfRink.SixRink; + break; + default: + numberOfRink = NumberOfRink.FourRink; + MessageBox.Show("Было введено некорректное количество катков, поэтому было отрисовано стандартное количество катков"); + break; + } + } + } + + public void Draw(int _startPosX, int _startPosY, Color rinkColor, Graphics g) + { + + Brush bodybrush = new SolidBrush(rinkColor); + Brush brBlack = new SolidBrush(Color.Black); + + + switch (numberOfRink) + { + case NumberOfRink.FourRink: + g.FillEllipse(brBlack, _startPosX + 10, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 35, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 60, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 85, _startPosY + 58, 15, 15); + + g.FillEllipse(bodybrush, _startPosX+13, _startPosY + 60, 10, 10); + g.FillEllipse(bodybrush, _startPosX + 38, _startPosY + 60, 10, 10); + g.FillEllipse(bodybrush, _startPosX + 63, _startPosY + 60, 10, 10); + g.FillEllipse(bodybrush, _startPosX + 88, _startPosY + 60, 10, 10); + break; + case NumberOfRink.FiveRink: + g.FillEllipse(brBlack, _startPosX + 10, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 30, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 50, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 70, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 90, _startPosY + 58, 15, 15); + + g.FillEllipse(bodybrush, _startPosX + 13, _startPosY + 58, 10, 10); + g.FillEllipse(bodybrush, _startPosX + 33, _startPosY + 58, 10, 10); + g.FillEllipse(bodybrush, _startPosX + 51, _startPosY + 58, 10, 10); + g.FillEllipse(bodybrush, _startPosX + 71, _startPosY + 58, 10, 10); + g.FillEllipse(bodybrush, _startPosX + 91, _startPosY + 58, 10, 10); + + break; + case NumberOfRink.SixRink: + g.FillEllipse(brBlack, _startPosX + 15, _startPosY + 65, 15, 15); + g.FillEllipse(brBlack, _startPosX + 40, _startPosY + 65, 15, 15); + g.FillEllipse(brBlack, _startPosX + 60, _startPosY + 65, 15, 15); + g.FillEllipse(brBlack, _startPosX + 80, _startPosY + 65, 15, 15); + g.FillEllipse(brBlack, _startPosX + 25, _startPosY + 50, 15, 15); + g.FillEllipse(brBlack, _startPosX + 70, _startPosY + 50, 15, 15); + + g.FillEllipse(bodybrush, _startPosX+17, _startPosY + 67, 10, 10); + g.FillEllipse(bodybrush, _startPosX + 42, _startPosY + 67, 10, 10); + g.FillEllipse(bodybrush, _startPosX + 62, _startPosY + 67, 10, 10); + g.FillEllipse(bodybrush, _startPosX + 82, _startPosY + 67, 10, 10); + g.FillEllipse(bodybrush, _startPosX + 27, _startPosY + 52, 10, 10); + g.FillEllipse(bodybrush, _startPosX + 72, _startPosY + 52, 10, 10); + break; + + } + } +} diff --git a/ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingRinkSquare.cs b/ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingRinkSquare.cs new file mode 100644 index 0000000..0604bbd --- /dev/null +++ b/ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingRinkSquare.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ExcavatorDifficult.Drawing; + +public class DrawingRinkSquare : InterDopRink +{ + + NumberOfRink numberOfRink; + + public int Properties + { + get + { + return Properties; + + } + set + { + switch (value) + { + case 1: + numberOfRink = NumberOfRink.FourRink; + break; + case 2: + numberOfRink = NumberOfRink.FiveRink; + break; + case 3: + numberOfRink = NumberOfRink.SixRink; + break; + default: + numberOfRink = NumberOfRink.FourRink; + MessageBox.Show("Было введено некорректное количество катков, поэтому было отрисовано стандартное количество катков"); + break; + } + } + } + + public void Draw(int _startPosX, int _startPosY, Color rinkColor, Graphics g) + { + + Brush bodybrush = new SolidBrush(rinkColor); + Brush brBlack = new SolidBrush(Color.Black); + int circleRadius = 4; + + switch (numberOfRink) + { + case NumberOfRink.FourRink: + g.FillEllipse(brBlack, _startPosX + 10, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 35, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 60, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 85, _startPosY + 58, 15, 15); + + int circleSize = 10; + int squareSize = 7; + + g.FillRectangle(bodybrush, _startPosX + 12, _startPosY + 60, circleSize, squareSize); + g.FillRectangle(bodybrush, _startPosX + 37, _startPosY + 60, circleSize, squareSize); + g.FillRectangle(bodybrush, _startPosX + 62, _startPosY + 60, circleSize, squareSize); + g.FillRectangle(bodybrush, _startPosX + 87, _startPosY + 60, circleSize, squareSize); + + break; + case NumberOfRink.FiveRink: + g.FillEllipse(brBlack, _startPosX + 5, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 25, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 45, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 65, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 85, _startPosY + 58, 15, 15); + + g.FillRectangle(bodybrush, _startPosX + 5 + circleRadius - 2, _startPosY + 58 + circleRadius - 2, circleRadius * 2, circleRadius * 2); + g.FillRectangle(bodybrush, _startPosX + 25 + circleRadius - 2, _startPosY + 58 + circleRadius - 2, circleRadius * 2, circleRadius * 2); + g.FillRectangle(bodybrush, _startPosX + 45 + circleRadius - 2, _startPosY + 58 + circleRadius - 2, circleRadius * 2, circleRadius * 2); + g.FillRectangle(bodybrush, _startPosX + 65 + circleRadius - 2, _startPosY + 58 + circleRadius - 2, circleRadius * 2, circleRadius * 2); + g.FillRectangle(bodybrush, _startPosX + 85 + circleRadius - 2, _startPosY + 58 + circleRadius - 2, circleRadius * 2, circleRadius * 2); + break; + case NumberOfRink.SixRink: + g.FillEllipse(brBlack, _startPosX, _startPosY + 65, 15, 15); + g.FillEllipse(brBlack, _startPosX + 25, _startPosY + 65, 15, 15); + g.FillEllipse(brBlack, _startPosX + 50, _startPosY + 65, 15, 15); + g.FillEllipse(brBlack, _startPosX + 75, _startPosY + 65, 15, 15); + g.FillEllipse(brBlack, _startPosX + 15, _startPosY + 50, 15, 15); + g.FillEllipse(brBlack, _startPosX + 60, _startPosY + 50, 15, 15); + + g.FillRectangle(bodybrush, _startPosX + circleRadius - 2, _startPosY + 65 + circleRadius - 2, circleRadius * 2, circleRadius * 2); + g.FillRectangle(bodybrush, _startPosX + 25 + circleRadius - 2, _startPosY + 65 + circleRadius - 2, circleRadius * 2, circleRadius * 2); + g.FillRectangle(bodybrush, _startPosX + 50 + circleRadius - 2, _startPosY + 65 + circleRadius - 2, circleRadius * 2, circleRadius * 2); + g.FillRectangle(bodybrush, _startPosX + 75 + circleRadius - 2, _startPosY + 65 + circleRadius - 2, circleRadius * 2, circleRadius * 2); + g.FillRectangle(bodybrush, _startPosX + 15 + circleRadius - 2, _startPosY + 50 + circleRadius - 2, circleRadius * 2, circleRadius * 2); + g.FillRectangle(bodybrush, _startPosX + 60 + circleRadius - 2, _startPosY + 50 + circleRadius - 2, circleRadius * 2, circleRadius * 2); + break; + + } + } +} diff --git a/ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingRinkTriagle.cs b/ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingRinkTriagle.cs new file mode 100644 index 0000000..6ad1272 --- /dev/null +++ b/ExcavatorDifficult/ExcavatorDifficult/Drawing/DrawingRinkTriagle.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ExcavatorDifficult.Drawing; + +public class DrawingRinkTriagle : InterDopRink +{ + NumberOfRink numberOfRink; + + public int Properties + { + get + { + return Properties; + + } + set + { + switch (value) + { + case 1: + numberOfRink = NumberOfRink.FourRink; + break; + case 2: + numberOfRink = NumberOfRink.FiveRink; + break; + case 3: + numberOfRink = NumberOfRink.SixRink; + break; + default: + numberOfRink = NumberOfRink.FourRink; + MessageBox.Show("Было введено некорректное количество катков, поэтому было отрисовано стандартное количество катков"); + break; + } + } + } + + public void Draw(int _startPosX, int _startPosY, Color rinkColor, Graphics g) + { + + Brush brBlack = new SolidBrush(Color.Black); + Brush KatkiColor = new SolidBrush(rinkColor); + + if (numberOfRink == NumberOfRink.FourRink) + { + g.FillEllipse(brBlack, _startPosX + 10, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 35, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 60, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 85, _startPosY + 58, 15, 15); + + Point point1 = new Point(_startPosX + 17, _startPosY + 60); + Point point2 = new Point(_startPosX + 24, _startPosY + 70); + Point point3 = new Point(_startPosX + 12, _startPosY + 70); + Point[] trianglePoints1 = { point1, point2, point3 }; + g.FillPolygon(KatkiColor, trianglePoints1); + + Point point4 = new Point(_startPosX + 43, _startPosY + 60); + Point point5 = new Point(_startPosX + 47, _startPosY + 70); + Point point6 = new Point(_startPosX + 37, _startPosY + 70); + Point[] trianglePoints2 = { point4, point5, point6 }; + g.FillPolygon(KatkiColor, trianglePoints2); + + Point point7 = new Point(_startPosX + 68, _startPosY + 60); + Point point8 = new Point(_startPosX + 73, _startPosY + 70); + Point point9 = new Point(_startPosX + 62, _startPosY + 70); + Point[] trianglePoints3 = { point7, point8, point9 }; + g.FillPolygon(KatkiColor, trianglePoints3); + + Point point10 = new Point(_startPosX + 92, _startPosY + 60); + Point point11 = new Point(_startPosX + 87, _startPosY + 70); + Point point12 = new Point(_startPosX + 98, _startPosY + 70); + Point[] trianglePoints4 = { point10, point11, point12 }; + g.FillPolygon(KatkiColor, trianglePoints4); + } + if (numberOfRink == NumberOfRink.FiveRink) + { + g.FillEllipse(brBlack, _startPosX + 5, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 25, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 45, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 65, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 85, _startPosY + 58, 15, 15); + + // Рисуем треугольники + Point point1 = new Point(_startPosX + 12, _startPosY + 60); + Point point2 = new Point(_startPosX + 17, _startPosY + 70); + Point point3 = new Point(_startPosX + 7, _startPosY + 70); + Point[] trianglePoints1 = { point1, point2, point3 }; + g.FillPolygon(KatkiColor, trianglePoints1); + Point point4 = new Point(_startPosX + 32, _startPosY + 60); + Point point5 = new Point(_startPosX + 37, _startPosY + 70); + Point point6 = new Point(_startPosX + 27, _startPosY + 70); + Point[] trianglePoints2 = { point4, point5, point6 }; + g.FillPolygon(KatkiColor, trianglePoints2); + Point point7 = new Point(_startPosX + 52, _startPosY + 60); + Point point8 = new Point(_startPosX + 57, _startPosY + 70); + Point point9 = new Point(_startPosX + 47, _startPosY + 70); + Point[] trianglePoints3 = { point7, point8, point9 }; + g.FillPolygon(KatkiColor, trianglePoints3); + Point point10 = new Point(_startPosX + 72, _startPosY + 60); + Point point11 = new Point(_startPosX + 77, _startPosY + 70); + Point point12 = new Point(_startPosX + 67, _startPosY + 70); + Point[] trianglePoints4 = { point10, point11, point12 }; + g.FillPolygon(KatkiColor, trianglePoints4); + Point point13 = new Point(_startPosX + 92, _startPosY + 60); + Point point14 = new Point(_startPosX + 97, _startPosY + 70); + Point point15 = new Point(_startPosX + 87, _startPosY + 70); + Point[] trianglePoints5 = { point13, point14, point15 }; + g.FillPolygon(KatkiColor, trianglePoints5); + } + if (numberOfRink == NumberOfRink.SixRink) + { + g.FillEllipse(brBlack, _startPosX + 5, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 20, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 35, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 50, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 65, _startPosY + 58, 15, 15); + g.FillEllipse(brBlack, _startPosX + 80, _startPosY + 58, 15, 15); + + Point point1 = new Point(_startPosX + 12, _startPosY + 60); + Point point2 = new Point(_startPosX + 17, _startPosY + 70); + Point point3 = new Point(_startPosX + 7, _startPosY + 70); + Point[] trianglePoints1 = { point1, point2, point3 }; + g.FillPolygon(KatkiColor, trianglePoints1); + Point point4 = new Point(_startPosX + 27, _startPosY + 60); + Point point5 = new Point(_startPosX + 32, _startPosY + 70); + Point point6 = new Point(_startPosX + 22, _startPosY + 70); + Point[] trianglePoints2 = { point4, point5, point6 }; + g.FillPolygon(KatkiColor, trianglePoints2); + Point point7 = new Point(_startPosX + 42, _startPosY + 60); + Point point8 = new Point(_startPosX + 47, _startPosY + 70); + Point point9 = new Point(_startPosX + 37, _startPosY + 70); + Point[] trianglePoints3 = { point7, point8, point9 }; + g.FillPolygon(KatkiColor, trianglePoints3); + Point point10 = new Point(_startPosX + 57, _startPosY + 60); + Point point11 = new Point(_startPosX + 62, _startPosY + 70); + Point point12 = new Point(_startPosX + 52, _startPosY + 70); + Point[] trianglePoints4 = { point10, point11, point12 }; + g.FillPolygon(KatkiColor, trianglePoints4); + Point point13 = new Point(_startPosX + 72, _startPosY + 60); + Point point14 = new Point(_startPosX + 77, _startPosY + 70); + Point point15 = new Point(_startPosX + 67, _startPosY + 70); + Point[] trianglePoints5 = { point13, point14, point15 }; + g.FillPolygon(KatkiColor, trianglePoints5); + Point point16 = new Point(_startPosX + 87, _startPosY + 60); + Point point17 = new Point(_startPosX + 92, _startPosY + 70); + Point point18 = new Point(_startPosX + 82, _startPosY + 70); + Point[] trianglePoints6 = { point16, point17, point18 }; + g.FillPolygon(KatkiColor, trianglePoints6); + } + } +} diff --git a/ExcavatorDifficult/ExcavatorDifficult/Drawing/InterDopRink.cs b/ExcavatorDifficult/ExcavatorDifficult/Drawing/InterDopRink.cs new file mode 100644 index 0000000..4b8ccd7 --- /dev/null +++ b/ExcavatorDifficult/ExcavatorDifficult/Drawing/InterDopRink.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ExcavatorDifficult.Drawing; + +public interface InterDopRink +{ + public int Properties { get; set; } + + public void Draw( int _startPosX, int _startPosY, Color rinkColor, Graphics g); +} diff --git a/ExcavatorDifficult/ExcavatorDifficult/DrawingExcavator.cs b/ExcavatorDifficult/ExcavatorDifficult/DrawingExcavator.cs deleted file mode 100644 index f124887..0000000 --- a/ExcavatorDifficult/ExcavatorDifficult/DrawingExcavator.cs +++ /dev/null @@ -1,243 +0,0 @@ -namespace ExcavatorDifficult; - -public class DrawingExcavator -{ - /// - /// Класс-сущность - /// - public EntityExcavator? EntityExcavator { get; private set; } - public DrawingRink Rink; - - /// - /// Ширина окна - /// - private int? _pictureWidth; - - /// - /// Высота окна - /// - private int? _pictureHeight; - - /// - /// Левая координата прорисовки экскаватора - /// - private int? _startPosX; - - /// - /// Верхняя кооридната прорисовки экскаватора - /// - private int? _startPosY; - - /// - /// Ширина прорисовки экскаватора - /// - private int _drawningExcavatorWidth; - - /// - /// Высота прорисовки экскаватора - /// - private int _drawningExcavatorHeight; - - - - /// - /// Инициализация свойств - /// - /// Скорость - /// Вес - /// Основной цвет - /// Дополнительный цвет - /// Признак наличия обвеса - /// Признак наличия антикрыла - /// Признак наличия гоночной полосы - public bool Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bucket, bool support, bool bulldozerDump, int width, int height) - { - - if (weight < _pictureWidth || height < _pictureHeight) - { - return false; - } - - _drawningExcavatorWidth = 174; - - - _drawningExcavatorHeight = 80; - - _pictureWidth = width; - _pictureHeight = height; - EntityExcavator = new EntityExcavator(); - EntityExcavator.Init(speed, weight, bodyColor, additionalColor, bucket, support, bulldozerDump); - Rink = new DrawingRink(); - return true; - - } - - /// - /// Установка границ поля - /// - /// Ширина поля - /// Высота поля - /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах - - - /// - /// Установка позиции - /// - /// Координата X - /// Координата Y - public void SetPosition(int x, int y) - { - if (x < 0) - { - x = 0; - } - else if (x > _pictureWidth.Value - _drawningExcavatorWidth) - { - x = (_pictureWidth.Value - _drawningExcavatorWidth); - - } - - if (y < 0) - { - y = 0; - } - else if (y > _pictureHeight.Value - _drawningExcavatorWidth) - { - y = _pictureHeight.Value - _drawningExcavatorHeight; - } - _startPosX = x; - _startPosY = y; - - } - - /// - /// Изменение направления перемещения - /// - /// Направление - /// true - перемещение выполнено, false - перемещение невозможно - public bool MoveTransport(DirectionType direction) - { - if (EntityExcavator == null || !_startPosX.HasValue || !_startPosY.HasValue) - { - return false; - } - - switch (direction) - { - //влево - case DirectionType.Left: - if (_startPosX.Value - EntityExcavator.Step > 0) - { - _startPosX -= (int)EntityExcavator.Step; - } - return true; - //вверх - case DirectionType.Up: - if (_startPosY.Value - EntityExcavator.Step > 0) - { - _startPosY -= (int)EntityExcavator.Step; - } - return true; - // вправо - case DirectionType.Right: - if (_startPosX.Value + _drawningExcavatorWidth + EntityExcavator.Step < _pictureWidth) - { - _startPosX += (int)EntityExcavator.Step; - } - return true; - //вниз - case DirectionType.Down: - if (_startPosY.Value + _drawningExcavatorHeight + EntityExcavator.Step < _pictureHeight) - { - _startPosY += (int)EntityExcavator.Step; - } - return true; - default: - return false; - } - } - - /// - /// Прорисовка объекта - /// - /// - public void DrawTransport(Graphics g) - { - if (EntityExcavator == null || !_startPosX.HasValue || !_startPosY.HasValue) - { - return; - } - - Pen pen = new(Color.Black); - Brush additionalBrush = new SolidBrush(EntityExcavator.AdditionalColor); - Brush bodybrush = new SolidBrush(EntityExcavator.BodyColor); - - - //границы экскаватора - g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 20, 100, 30); - g.DrawRectangle(pen, _startPosX.Value + 30, _startPosY.Value, 10, 20); - g.DrawRectangle(pen, _startPosX.Value + 80, _startPosY.Value, 20, 20); - g.DrawArc(pen, _startPosX.Value, _startPosY.Value + 45, 30, 40, 130, 100); - g.DrawArc(pen, _startPosX.Value + 80, _startPosY.Value + 50, 30, 40, 285, 110); - g.DrawLine(pen, _startPosX.Value + 5, _startPosY.Value + 80, _startPosX.Value + 109, _startPosY.Value + 80); - - - //заливка кабины и основного железа - Brush br = new SolidBrush(Color.Black); - g.FillRectangle(bodybrush, _startPosX.Value, _startPosY.Value + 20, 100, 30); - g.FillRectangle(bodybrush, _startPosX.Value + 30, _startPosY.Value, 10, 20); - g.FillRectangle(bodybrush, _startPosX.Value + 80, _startPosY.Value, 20, 20); - - - Rink.DrawRinks(g, _startPosX.Value + 5, _startPosY.Value + 10); - - //фары - Brush brfara = new SolidBrush(Color.Blue); - g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 27, 10, 10); - g.FillRectangle(brfara, _startPosX.Value, _startPosY.Value + 27, 10, 10); - //окно - g.FillRectangle(brfara, _startPosX.Value + 85, _startPosY.Value + 10, 10, 10); - - - if (EntityExcavator.Bucket) - { - Point point1 = new Point(_startPosX.Value + 100, _startPosY.Value); - Point point2 = new Point(_startPosX.Value + 180, _startPosY.Value); - Point point4 = new Point(_startPosX.Value + 180, _startPosY.Value + 40); - Point point5 = new Point(_startPosX.Value + 170, _startPosY.Value + 60); - Point point6 = new Point(_startPosX.Value + 150, _startPosY.Value + 60); - Point point7 = new Point(_startPosX.Value + 140, _startPosY.Value + 40); - Point point8 = new Point(_startPosX.Value + 172, _startPosY.Value + 40); - Point point9 = new Point(_startPosX.Value + 172, _startPosY.Value + 10); - Point point10 = new Point(_startPosX.Value + 100, _startPosY.Value + 10); - - Point[] Bucket = { point1, point2, point4, point5, point6, point7, point8, point9, point10 }; - g.FillPolygon(additionalBrush, Bucket); - } - - if (EntityExcavator.Support) - { - Point point1 = new Point(_startPosX.Value + 2, _startPosY.Value + 50); - Point point2 = new Point(_startPosX.Value + 12, _startPosY.Value + 80); - Point point3 = new Point(_startPosX.Value + 22, _startPosY.Value + 80); - Point point4 = new Point(_startPosX.Value + 12, _startPosY.Value + 50); - Point[] Support = { point1, point2, point3, point4 }; - g.FillPolygon(additionalBrush, Support); - - } - - if (EntityExcavator.BulldozerDump) - { - Point point11 = new Point(_startPosX.Value + 100, _startPosY.Value + 40); - Point point12 = new Point(_startPosX.Value + 160, _startPosY.Value + 80); - Point point13 = new Point(_startPosX.Value + 130, _startPosY.Value + 80); - Point point14 = new Point(_startPosX.Value + 100, _startPosY.Value + 50); - Point[] Dump = { point11, point12, point13, point14 }; - g.FillPolygon(additionalBrush, Dump); - } - - - - - } -} diff --git a/ExcavatorDifficult/ExcavatorDifficult/DrawingRink.cs b/ExcavatorDifficult/ExcavatorDifficult/DrawingRink.cs deleted file mode 100644 index 689b4aa..0000000 --- a/ExcavatorDifficult/ExcavatorDifficult/DrawingRink.cs +++ /dev/null @@ -1,64 +0,0 @@ -namespace ExcavatorDifficult; - -public class DrawingRink -{ - public EntityExcavator? EntityExcavator { get; private set; } - - private NumberOfRink numberOfRink; - - public int KatNum - { - set - { - if (value <= 4 || value > 6) - { - numberOfRink = NumberOfRink.FourRink; - } - else if (value == 5) - { - numberOfRink = NumberOfRink.FiveRink; - } - else if (value == 6) - { - numberOfRink = NumberOfRink.SixRink; - } - } - } - - - - - public void DrawRinks(Graphics g, int _startPosX, int _startPosY) - { - - Brush bodybrush = new SolidBrush(Color.Black); - - - switch (numberOfRink) - { - case NumberOfRink.FourRink: - g.FillEllipse(bodybrush, _startPosX, _startPosY + 48, 15, 15); - g.FillEllipse(bodybrush, _startPosX + 25, _startPosY + 48, 15, 15); - g.FillEllipse(bodybrush, _startPosX + 50, _startPosY + 48, 15, 15); - g.FillEllipse(bodybrush, _startPosX + 75, _startPosY + 48, 15, 15); - break; - case NumberOfRink.FiveRink: - g.FillEllipse(bodybrush, _startPosX + 5, _startPosY + 48, 15, 15); - g.FillEllipse(bodybrush, _startPosX + 25, _startPosY + 48, 15, 15); - g.FillEllipse(bodybrush, _startPosX + 45, _startPosY + 48, 15, 15); - g.FillEllipse(bodybrush, _startPosX + 65, _startPosY + 48, 15, 15); - g.FillEllipse(bodybrush, _startPosX + 85, _startPosY + 48, 15, 15); - break; - case NumberOfRink.SixRink: - g.FillEllipse(bodybrush, _startPosX, _startPosY + 52, 15, 15); - g.FillEllipse(bodybrush, _startPosX + 25, _startPosY + 52, 15, 15); - g.FillEllipse(bodybrush, _startPosX + 50, _startPosY + 52, 15, 15); - g.FillEllipse(bodybrush, _startPosX + 75, _startPosY + 52, 15, 15); - g.FillEllipse(bodybrush, _startPosX + 15, _startPosY + 40, 15, 15); - g.FillEllipse(bodybrush, _startPosX + 60, _startPosY + 40, 15, 15); - break; - - } - - } -} diff --git a/ExcavatorDifficult/ExcavatorDifficult/EntityExcavator.cs b/ExcavatorDifficult/ExcavatorDifficult/Entity/EntityExcavator.cs similarity index 53% rename from ExcavatorDifficult/ExcavatorDifficult/EntityExcavator.cs rename to ExcavatorDifficult/ExcavatorDifficult/Entity/EntityExcavator.cs index cd2b6c9..b8a1bf4 100644 --- a/ExcavatorDifficult/ExcavatorDifficult/EntityExcavator.cs +++ b/ExcavatorDifficult/ExcavatorDifficult/Entity/EntityExcavator.cs @@ -1,26 +1,13 @@ -namespace ExcavatorDifficult; +using ExcavatorDifficult.Entity; -public class EntityExcavator +namespace ExcavatorDifficult; + +public class EntityExcavator : EntityExcavatorEmpty { - /// - /// Скорость - /// - public int Speed { get; private set; } - - /// - /// Вес - /// - public double Weight { get; private set; } - - /// - /// Основной цвет - /// - public Color BodyColor { get; private set; } - /// /// Дополнительный цвет (для опциональных элементов) /// - public Color AdditionalColor { get; private set; } + public static Color AdditionalColor { get; private set; } /// /// Признак (опция) наличия ковша @@ -36,33 +23,31 @@ public class EntityExcavator /// Признак (опция) наличие бульдозерного отвала /// public bool BulldozerDump { get; private set; } + /// + /// Катки гусеничные + /// + public bool Katki { get; private set; } + + /// - /// Шаг перемещения автомобиля + /// Конструктор /// - public double Step => Speed * 100 / Weight; - - /// - /// Инициализация полей объекта-класса экскаватора - /// - /// Скорость - /// Вес автомобиля - /// Основной цвет /// Дополнительный цвет /// Признак наличия ковша /// Признак наличия опоры /// Признак наличия бульдозерного обвеса - public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bucket, bool support, bool bulldozerDump) + public EntityExcavator(int speed, double weight, Color bodyColor, Color additionalColor, bool bucket, bool support, bool bulldozerDump, + bool katki) : base(speed, weight, bodyColor) + { - Speed = speed; - Weight = weight; - BodyColor = bodyColor; AdditionalColor = additionalColor; Bucket = bucket; Support = support; BulldozerDump = bulldozerDump; + Katki = katki; } } diff --git a/ExcavatorDifficult/ExcavatorDifficult/Entity/EntityExcavatorEmpty.cs b/ExcavatorDifficult/ExcavatorDifficult/Entity/EntityExcavatorEmpty.cs new file mode 100644 index 0000000..11c5980 --- /dev/null +++ b/ExcavatorDifficult/ExcavatorDifficult/Entity/EntityExcavatorEmpty.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ExcavatorDifficult.Entity; + +public class EntityExcavatorEmpty +{ + public int numKatki; + /// + /// Скорость + /// + public int Speed { get; set; } + + /// + /// Вес + /// + public double Weight { get; set; } + + /// + /// Основной цвет + /// + public Color BodyColor { get; set; } + + /// + /// Шаг перемещения автомобиля + /// + public double Step => Speed * 100 / Weight; + + /// + /// конструктор сущности + /// + /// Скорость + /// Вес автомобиля + /// Основной цвет + + + public EntityExcavatorEmpty(int speed, double weight, Color bodyColor) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + } +} diff --git a/ExcavatorDifficult/ExcavatorDifficult/FormExcavator.Designer.cs b/ExcavatorDifficult/ExcavatorDifficult/FormExcavator.Designer.cs index 670c9e5..e268016 100644 --- a/ExcavatorDifficult/ExcavatorDifficult/FormExcavator.Designer.cs +++ b/ExcavatorDifficult/ExcavatorDifficult/FormExcavator.Designer.cs @@ -34,9 +34,10 @@ buttonRight = new Button(); buttonDown = new Button(); buttonLeft = new Button(); - numericUpDownrinkExcavator = new NumericUpDown(); + buttonCreateExKovsh = new Button(); + comboBoxStrategy = new ComboBox(); + buttonStep = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxExcavator).BeginInit(); - ((System.ComponentModel.ISupportInitialize)numericUpDownrinkExcavator).BeginInit(); SuspendLayout(); // // pictureBoxExcavator @@ -50,7 +51,7 @@ // // buttonCreate // - buttonCreate.Location = new Point(26, 409); + buttonCreate.Location = new Point(200, 409); buttonCreate.Name = "buttonCreate"; buttonCreate.Size = new Size(94, 29); buttonCreate.TabIndex = 1; @@ -102,20 +103,43 @@ buttonLeft.UseVisualStyleBackColor = true; buttonLeft.Click += ButtonMove_Click; // - // numericUpDownrinkExcavator + // buttonCreateExKovsh // - numericUpDownrinkExcavator.Location = new Point(126, 411); - numericUpDownrinkExcavator.Margin = new Padding(3, 4, 3, 4); - numericUpDownrinkExcavator.Name = "numericUpDownrinkExcavator"; - numericUpDownrinkExcavator.Size = new Size(150, 27); - numericUpDownrinkExcavator.TabIndex = 6; + buttonCreateExKovsh.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateExKovsh.Location = new Point(12, 409); + buttonCreateExKovsh.Name = "buttonCreateExKovsh"; + buttonCreateExKovsh.Size = new Size(182, 29); + buttonCreateExKovsh.TabIndex = 6; + buttonCreateExKovsh.Text = "Создать продвинутый"; + buttonCreateExKovsh.UseVisualStyleBackColor = true; + buttonCreateExKovsh.Click += ButtonCreateExKovsh_Click; + // + // comboBoxStrategy + // + comboBoxStrategy.FormattingEnabled = true; + comboBoxStrategy.Location = new Point(637, 12); + comboBoxStrategy.Name = "comboBoxStrategy"; + comboBoxStrategy.Size = new Size(151, 28); + comboBoxStrategy.TabIndex = 7; + // + // buttonStep + // + buttonStep.Location = new Point(694, 46); + buttonStep.Name = "buttonStep"; + buttonStep.Size = new Size(94, 29); + buttonStep.TabIndex = 8; + buttonStep.Text = "Шаг"; + buttonStep.UseVisualStyleBackColor = true; + buttonStep.Click += buttonStep_Click; // // FormExcavator // AutoScaleDimensions = new SizeF(8F, 20F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(800, 450); - Controls.Add(numericUpDownrinkExcavator); + Controls.Add(buttonStep); + Controls.Add(comboBoxStrategy); + Controls.Add(buttonCreateExKovsh); Controls.Add(buttonLeft); Controls.Add(buttonDown); Controls.Add(buttonRight); @@ -125,7 +149,6 @@ Name = "FormExcavator"; Text = "FormExcavator"; ((System.ComponentModel.ISupportInitialize)pictureBoxExcavator).EndInit(); - ((System.ComponentModel.ISupportInitialize)numericUpDownrinkExcavator).EndInit(); ResumeLayout(false); } @@ -137,6 +160,8 @@ private Button buttonRight; private Button buttonDown; private Button buttonLeft; - private NumericUpDown numericUpDownrinkExcavator; + private Button buttonCreateExKovsh; + private ComboBox comboBoxStrategy; + private Button buttonStep; } } \ No newline at end of file diff --git a/ExcavatorDifficult/ExcavatorDifficult/FormExcavator.cs b/ExcavatorDifficult/ExcavatorDifficult/FormExcavator.cs index 4fe02db..5ccba83 100644 --- a/ExcavatorDifficult/ExcavatorDifficult/FormExcavator.cs +++ b/ExcavatorDifficult/ExcavatorDifficult/FormExcavator.cs @@ -1,4 +1,7 @@ -namespace ExcavatorDifficult +using ExcavatorDifficult.Drawings; +using ExcavatorDifficult.MovementStrategy; + +namespace ExcavatorDifficult { public partial class FormExcavator : Form { @@ -6,11 +9,14 @@ /// /// поле объект для прорисовки объекта /// - private DrawingExcavator? _drawingExcavator; + private DrawingExcavatorEmpty? _drawingExcavator; + private AbstractStrategy? _abstractStrategy; public FormExcavator() { InitializeComponent(); + comboBoxStrategy.Items.Add("К центру"); + comboBoxStrategy.Items.Add("К краю"); } /// @@ -38,15 +44,25 @@ private void ButtonCreat_Click(object sender, EventArgs e) { Random random = new(); - _drawingExcavator = new DrawingExcavator(); - _drawingExcavator.Init(random.Next(100, 300), random.Next(1000, 3000), + _drawingExcavator = new DrawingExcavatorEmpty(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)), - pictureBoxExcavator.Width, pictureBoxExcavator.Height); + pictureBoxExcavator.Width, pictureBoxExcavator.Height, random.Next(1, 4), random.Next(1, 4)); _drawingExcavator.SetPosition(random.Next(10, 100), random.Next(10, 100)); - _drawingExcavator.Rink.KatNum=(int)numericUpDownrinkExcavator.Value; + Draw(); + } + private void ButtonCreateExKovsh_Click(object sender, EventArgs e) + { + Random random = new(); + _drawingExcavator = new DrawingExcavator(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)), + Convert.ToBoolean(random.Next(0, 2)), + pictureBoxExcavator.Width, pictureBoxExcavator.Height, random.Next(1, 4), random.Next(1, 4)); + _drawingExcavator.SetPosition(random.Next(10, 100), random.Next(10, 100)); Draw(); } @@ -82,6 +98,43 @@ Draw(); } + + private void buttonStep_Click(object sender, EventArgs e) + { + if (_drawingExcavator == null) + { + return; + } + if (comboBoxStrategy.Enabled) + { + _abstractStrategy = comboBoxStrategy.SelectedIndex + switch + { + 0 => new MoveToCenter(), + 1 => new MoveToBorder(), + _ => null, + }; + if (_abstractStrategy == null) + { + return; + } + _abstractStrategy.SetData(new MoveableExcavator(_drawingExcavator), pictureBoxExcavator.Width, pictureBoxExcavator.Height); + comboBoxStrategy.Enabled = false; + } + if (_abstractStrategy == null) + { + return; + } + _abstractStrategy.MakeStep(); + Draw(); + if (_abstractStrategy.GetStatus() == StrategyStatus.Finish) + { + comboBoxStrategy.Enabled = true; + _abstractStrategy = null; + } + } } + } + diff --git a/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/AbstractStrategy.cs b/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/AbstractStrategy.cs new file mode 100644 index 0000000..2bc3f57 --- /dev/null +++ b/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/AbstractStrategy.cs @@ -0,0 +1,142 @@ +namespace ExcavatorDifficult.MovementStrategy; + +public abstract class AbstractStrategy +{ + /// + /// Перемещаемый объект + /// + private IMoveableObjectcs? _moveableObject; + + /// + /// Статус перемещения + /// + private StrategyStatus _state = StrategyStatus.NotInit; + + /// + /// Ширина поля + /// + protected int FieldWidth { get; private set; } + + /// + /// Высота поля + /// + protected int FieldHeight { get; private set; } + + /// + /// Статус перемещения + /// + public StrategyStatus GetStatus() { return _state; } + + /// + /// Установка данных + /// + /// Перемещаемый объект + /// Ширина поля + /// Высота поля + public void SetData(IMoveableObjectcs moveableObject, int width, int height) + { + if (moveableObject == null) + { + _state = StrategyStatus.NotInit; + return; + } + + _state = StrategyStatus.InProgress; + _moveableObject = moveableObject; + FieldWidth = width; + FieldHeight = height; + } + + /// + /// Шаг перемещения + /// + public void MakeStep() + { + if (_state != StrategyStatus.InProgress) + { + return; + } + + if (IsTargetDestinaion()) + { + _state = StrategyStatus.Finish; + return; + } + + MoveToTarget(); + } + + /// + /// Перемещение влево + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveLeft() => MoveTo(DirectionType.Left); + + /// + /// Перемещение вправо + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveRight() => MoveTo(DirectionType.Right); + + /// + /// Перемещение вверх + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveUp() => MoveTo(DirectionType.Up); + + /// + /// Перемещение вниз + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveDown() => MoveTo(DirectionType.Down); + + /// + /// Параметры объекта + /// + protected ObjectParameters? GetObjectParameters => _moveableObject?.GetObjectPosition; + + /// + /// Шаг объекта + /// + /// + protected int? GetStep() + { + if (_state != StrategyStatus.InProgress) + { + return null; + } + return _moveableObject?.GetStep; + } + + /// + /// Перемещение к цели + /// + protected abstract void MoveToTarget(); + + /// + /// Достигнута ли цель + /// + /// + protected abstract bool IsTargetDestinaion(); + + /// + /// Попытка перемещения в требуемом направлении + /// + /// Направление + /// Результат попытки (true - удалось переместиться, false - неудача) + private bool MoveTo(DirectionType directionType) + { + if (_state != StrategyStatus.InProgress) + { + return false; + } + + if (_moveableObject?.CheckCanMove(directionType) ?? false) + { + _moveableObject.MoveObject(directionType); + return true; + } + return false; + } + +} diff --git a/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/IMoveableObjectcs.cs b/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/IMoveableObjectcs.cs new file mode 100644 index 0000000..6be5ce0 --- /dev/null +++ b/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/IMoveableObjectcs.cs @@ -0,0 +1,22 @@ +namespace ExcavatorDifficult.MovementStrategy; + +public interface IMoveableObjectcs +{ + /// + /// Получение координаты объекта + /// + ObjectParameters? GetObjectPosition { get; } + + /// + /// Шаг объекта + /// + int GetStep { get; } + + /// + /// Попытка переместить объект в указанном направлении + /// + /// Направление + /// true - объект перемещен, false - перемещение невозможно + bool CheckCanMove(DirectionType direction); + void MoveObject(DirectionType direction); +} diff --git a/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/MoveToBorder.cs b/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/MoveToBorder.cs new file mode 100644 index 0000000..7529b30 --- /dev/null +++ b/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/MoveToBorder.cs @@ -0,0 +1,53 @@ +namespace ExcavatorDifficult.MovementStrategy +{ + internal class MoveToBorder : AbstractStrategy + { + protected override bool IsTargetDestinaion() + { + var objParams = GetObjectParameters; + if (objParams == null) + { + return false; + } + return objParams.ObjectBorderRight <= FieldWidth && + objParams.ObjectBorderRight + GetStep() >= FieldWidth && + objParams.ObjectBorderDown <= FieldHeight && + objParams.ObjectBorderDown + GetStep() >= FieldHeight; + } + + protected override void MoveToTarget() + { + + var objParams = GetObjectParameters; + if (objParams == null) + { + return; + } + var diffX = objParams.ObjectBorderRight - FieldWidth; + if (Math.Abs(diffX) > GetStep()) + { + if (diffX > 0) + { + MoveLeft(); + } + else + { + MoveRight(); + } + + } + var diffY = objParams.ObjectBorderDown - FieldHeight; + if (Math.Abs(diffY) > GetStep()) + { + if (diffY > 0) + { + MoveUp(); + } + else + { + MoveDown(); + } + } + } + } +} diff --git a/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/MoveToCenter.cs b/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/MoveToCenter.cs new file mode 100644 index 0000000..659cae9 --- /dev/null +++ b/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/MoveToCenter.cs @@ -0,0 +1,51 @@ +namespace ExcavatorDifficult.MovementStrategy; + +public class MoveToCenter : AbstractStrategy +{ + protected override bool IsTargetDestinaion() + { + ObjectParameters? 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() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) + { + return; + } + int diffX = objParams.ObjectMiddleHorizontal - 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(); + } + } + } +} + diff --git a/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/MoveableExcavator.cs b/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/MoveableExcavator.cs new file mode 100644 index 0000000..c3212cc --- /dev/null +++ b/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/MoveableExcavator.cs @@ -0,0 +1,37 @@ +namespace ExcavatorDifficult.MovementStrategy; +/// +/// Класс-реализация IMoveableObject с использованием DrawningExcavator +/// +public class MoveableExcavator : IMoveableObjectcs +{ + /// + /// Поле-объект класса DrawningCar или его наследника + /// + private readonly DrawingExcavatorEmpty? _excavator = null; + + /// + /// Конструктор + /// + /// Объект класса DrawningCar + public MoveableExcavator(DrawingExcavatorEmpty excavator) + { + _excavator = excavator; + } + + public ObjectParameters? GetObjectPosition + { + get + { + if (_excavator == null || _excavator.EntityExcavatorEmpty == null) + { + return null; + } + return new ObjectParameters(_excavator.GetPosX, _excavator.GetPosY, _excavator.GetWidth, _excavator.GetHeight); + } + } + + public int GetStep => (int)(_excavator?.EntityExcavatorEmpty?.Step ?? 0); + public bool CheckCanMove(DirectionType direction) => _excavator?.CanMove(direction) ?? false; + public void MoveObject(DirectionType direction) => _excavator?.MoveTransport(direction); + +} diff --git a/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/MovementDirection.cs b/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/MovementDirection.cs new file mode 100644 index 0000000..0f77c79 --- /dev/null +++ b/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/MovementDirection.cs @@ -0,0 +1,24 @@ +namespace ExcavatorDifficult.MovementStrategy; +/// +/// направление перемещения +/// +public enum MovementDirection +{ + /// + /// Вверх + /// + Up = 1, + /// + /// Вниз + /// + Down = 2, + /// + /// Влево + /// + Left = 3, + /// + /// Вправо + /// + Right = 4 + +} diff --git a/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/ObjectParameters.cs b/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/ObjectParameters.cs new file mode 100644 index 0000000..2558b87 --- /dev/null +++ b/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/ObjectParameters.cs @@ -0,0 +1,71 @@ +namespace ExcavatorDifficult.MovementStrategy; + +public class ObjectParameters +{ + /// + /// Координата X + /// + 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 ObjectMiddleHorizontal => _x + _width / 2; + + /// + /// Середина объекта + /// + public int ObjectMiddleVertical => _y + _height / 2; + public int ObjectBorderRight => _x + _width; + public int ObjectBorderDown => _y + _height; + + /// + /// Конструктор + /// + /// Координата X + /// Координата Y + /// Ширина объекта + /// Высота объекта + public ObjectParameters(int x, int y, int width, int height) + { + _x = x; + _y = y; + _width = width; + _height = height; + } +} diff --git a/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/StrategyStatus.cs b/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/StrategyStatus.cs new file mode 100644 index 0000000..b361562 --- /dev/null +++ b/ExcavatorDifficult/ExcavatorDifficult/MovementStrategy/StrategyStatus.cs @@ -0,0 +1,22 @@ + +namespace ExcavatorDifficult.MovementStrategy; +/// +///статус выполнения операции перемещения +/// +public enum StrategyStatus +{ + /// + /// все готово к началу + /// + NotInit, + + /// + /// выполняется + /// + InProgress, + + /// + /// завершено + /// + Finish +}