diff --git a/ProjectByldozerHard/ProjectByldozerHard/DirectionType.cs b/ProjectByldozerHard/ProjectByldozerHard/Drawing/DirectionType.cs similarity index 90% rename from ProjectByldozerHard/ProjectByldozerHard/DirectionType.cs rename to ProjectByldozerHard/ProjectByldozerHard/Drawing/DirectionType.cs index bf029cf..899061c 100644 --- a/ProjectByldozerHard/ProjectByldozerHard/DirectionType.cs +++ b/ProjectByldozerHard/ProjectByldozerHard/Drawing/DirectionType.cs @@ -1,6 +1,4 @@ - - -namespace ProjectByldozerHard; +namespace ProjectByldozerHard.Drawing; /// /// Направление перемещения diff --git a/ProjectByldozerHard/ProjectByldozerHard/DrawingRink.cs b/ProjectByldozerHard/ProjectByldozerHard/Drawing/DrawingRink.cs similarity index 84% rename from ProjectByldozerHard/ProjectByldozerHard/DrawingRink.cs rename to ProjectByldozerHard/ProjectByldozerHard/Drawing/DrawingRink.cs index cf83b83..735c6ab 100644 --- a/ProjectByldozerHard/ProjectByldozerHard/DrawingRink.cs +++ b/ProjectByldozerHard/ProjectByldozerHard/Drawing/DrawingRink.cs @@ -1,20 +1,17 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; + +using ProjectByldozerHard.Entities; -namespace ProjectByldozerHard; +namespace ProjectByldozerHard.Drawing; public class DrawingRink { public EntityByldozer? EntityByldozer { get; private set; } - public NumberOfRink numberOfRink; + public NumberOfRink numberOfRink; public int KatNum { - set + set { if (value <= 4 || value > 6) { @@ -39,7 +36,7 @@ public class DrawingRink switch (numberOfRink) { case NumberOfRink.FourRink: - g.FillEllipse(bodybrush, _startPosX+30, _startPosY + 48, 15, 15); + g.FillEllipse(bodybrush, _startPosX + 30, _startPosY + 48, 15, 15); g.FillEllipse(bodybrush, _startPosX + 55, _startPosY + 48, 15, 15); g.FillEllipse(bodybrush, _startPosX + 85, _startPosY + 48, 15, 15); g.FillEllipse(bodybrush, _startPosX + 105, _startPosY + 48, 15, 15); @@ -52,7 +49,7 @@ public class DrawingRink g.FillEllipse(bodybrush, _startPosX + 108, _startPosY + 48, 15, 15); break; case NumberOfRink.SixRink: - g.FillEllipse(bodybrush, _startPosX+30, _startPosY + 52, 15, 15); + g.FillEllipse(bodybrush, _startPosX + 30, _startPosY + 52, 15, 15); g.FillEllipse(bodybrush, _startPosX + 55, _startPosY + 52, 15, 15); g.FillEllipse(bodybrush, _startPosX + 80, _startPosY + 52, 15, 15); g.FillEllipse(bodybrush, _startPosX + 105, _startPosY + 52, 15, 15); diff --git a/ProjectByldozerHard/ProjectByldozerHard/Drawing/DrawingRinkCircule.cs b/ProjectByldozerHard/ProjectByldozerHard/Drawing/DrawingRinkCircule.cs new file mode 100644 index 0000000..9164063 --- /dev/null +++ b/ProjectByldozerHard/ProjectByldozerHard/Drawing/DrawingRinkCircule.cs @@ -0,0 +1,89 @@ + + +namespace ProjectByldozerHard.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 + 6, _startPosY + 54, 15, 15); + g.FillEllipse(brBlack, _startPosX + 26, _startPosY + 54, 15, 15); + g.FillEllipse(brBlack, _startPosX + 46, _startPosY + 54, 15, 15); + g.FillEllipse(brBlack, _startPosX + 66, _startPosY + 54, 15, 15); + g.FillEllipse(brBlack, _startPosX + 86, _startPosY + 54, 15, 15); + + g.FillEllipse(bodybrush, _startPosX + 9, _startPosY + 54, 10, 10); + g.FillEllipse(bodybrush, _startPosX + 29, _startPosY + 54, 10, 10); + g.FillEllipse(bodybrush, _startPosX + 47, _startPosY + 54, 10, 10); + g.FillEllipse(bodybrush, _startPosX + 67, _startPosY + 54, 10, 10); + g.FillEllipse(bodybrush, _startPosX + 87, _startPosY + 54, 10, 10); + + break; + case NumberOfRink.SixRink: + g.FillEllipse(brBlack, _startPosX + 10, _startPosY + 60, 15, 15); + g.FillEllipse(brBlack, _startPosX + 35, _startPosY + 60, 15, 15); + g.FillEllipse(brBlack, _startPosX + 55, _startPosY + 60, 15, 15); + g.FillEllipse(brBlack, _startPosX + 75, _startPosY + 60, 15, 15); + g.FillEllipse(brBlack, _startPosX + 20, _startPosY + 45, 15, 15); + g.FillEllipse(brBlack, _startPosX + 65, _startPosY + 45, 15, 15); + + g.FillEllipse(bodybrush, _startPosX + 12, _startPosY + 62, 10, 10); + g.FillEllipse(bodybrush, _startPosX + 38, _startPosY + 62, 10, 10); + g.FillEllipse(bodybrush, _startPosX + 57, _startPosY + 62, 10, 10); + g.FillEllipse(bodybrush, _startPosX + 77, _startPosY + 62, 10, 10); + g.FillEllipse(bodybrush, _startPosX + 22, _startPosY + 47, 10, 10); + g.FillEllipse(bodybrush, _startPosX + 67, _startPosY + 47, 10, 10); + break; + + } + } +} \ No newline at end of file diff --git a/ProjectByldozerHard/ProjectByldozerHard/Drawing/DrawingRinkSquare.cs b/ProjectByldozerHard/ProjectByldozerHard/Drawing/DrawingRinkSquare.cs new file mode 100644 index 0000000..8b889d8 --- /dev/null +++ b/ProjectByldozerHard/ProjectByldozerHard/Drawing/DrawingRinkSquare.cs @@ -0,0 +1,93 @@ + + +namespace ProjectByldozerHard.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+3, _startPosY + 61, 15, 15); + g.FillEllipse(brBlack, _startPosX + 28, _startPosY + 61, 15, 15); + g.FillEllipse(brBlack, _startPosX + 53, _startPosY + 61, 15, 15); + g.FillEllipse(brBlack, _startPosX + 78, _startPosY + 61, 15, 15); + g.FillEllipse(brBlack, _startPosX + 18, _startPosY + 46, 15, 15); + g.FillEllipse(brBlack, _startPosX + 63, _startPosY + 46, 15, 15); + + g.FillRectangle(bodybrush, _startPosX +3 + circleRadius - 2, _startPosY + 61 + circleRadius - 2, circleRadius * 2, circleRadius * 2); + g.FillRectangle(bodybrush, _startPosX + 28 + circleRadius - 2, _startPosY + 61 + circleRadius - 2, circleRadius * 2, circleRadius * 2); + g.FillRectangle(bodybrush, _startPosX + 53 + circleRadius - 2, _startPosY + 61 + circleRadius - 2, circleRadius * 2, circleRadius * 2); + g.FillRectangle(bodybrush, _startPosX + 78 + circleRadius - 2, _startPosY + 61 + circleRadius - 2, circleRadius * 2, circleRadius * 2); + g.FillRectangle(bodybrush, _startPosX + 18 + circleRadius - 2, _startPosY + 46 + circleRadius - 2, circleRadius * 2, circleRadius * 2); + g.FillRectangle(bodybrush, _startPosX + 63 + circleRadius - 2, _startPosY + 46 + circleRadius - 2, circleRadius * 2, circleRadius * 2); + break; + + } + } +} diff --git a/ProjectByldozerHard/ProjectByldozerHard/Drawing/DrawingRinkTriagle.cs b/ProjectByldozerHard/ProjectByldozerHard/Drawing/DrawingRinkTriagle.cs new file mode 100644 index 0000000..9b9bf2c --- /dev/null +++ b/ProjectByldozerHard/ProjectByldozerHard/Drawing/DrawingRinkTriagle.cs @@ -0,0 +1,155 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectByldozerHard.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/ProjectByldozerHard/ProjectByldozerHard/Drawing/DrawningByldozer.cs b/ProjectByldozerHard/ProjectByldozerHard/Drawing/DrawningByldozer.cs new file mode 100644 index 0000000..598e62a --- /dev/null +++ b/ProjectByldozerHard/ProjectByldozerHard/Drawing/DrawningByldozer.cs @@ -0,0 +1,105 @@ + +using ProjectByldozerHard.Entities; + +namespace ProjectByldozerHard.Drawing; + +public class DrawningByldozer : DrawningTrackedCar +{ + private InterDopRink? DrawingKatki; + + /// + /// конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия отвала + /// Признак наличия разрыхлитель + /// Признак наличия трубы + public DrawningByldozer(int speed, double weight, Color bodyColor, Color additionalColor, bool dump, bool bakingpowder, bool pipe, + bool katki, int width, int height, int numKatki, int numchoose) : base(speed, weight, bodyColor, width, height, numKatki, numchoose) + { + if (EntityTrackedCar != null) + { + EntityTrackedCar = new EntityByldozer(speed, weight, bodyColor, additionalColor, dump, bakingpowder, pipe, 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 (EntityTrackedCar is not EntityByldozer entityByldozer) + { + return; + } + + Pen pen = new(Color.Black); + Brush additionalBrush = new SolidBrush(EntityByldozer.AdditionalColor); + Brush bodybrush = new SolidBrush(EntityTrackedCar.BodyColor); + + base.DrawTransport(g); + ///труба + if (entityByldozer.Pipe) + { + g.DrawRectangle(pen, _startPosX + 60, _startPosY, 5, 15); + g.FillRectangle(bodybrush, _startPosX + 60, _startPosY, 5, 15); + } + _startPosX -= 30; + _startPosY -= 5; + // отвал + if (entityByldozer.Dump) + + { + Point point1 = new Point(_startPosX + 30, _startPosY + 35); + Point point2 = new Point(_startPosX + 25, _startPosY + 35); + Point point4 = new Point(_startPosX + 25, _startPosY + 23); + Point point5 = new Point(_startPosX + 20, _startPosY + 23); + Point point6 = new Point(_startPosX + 15, _startPosY + 60); + Point point7 = new Point(_startPosX + 2, _startPosY + 80); + Point point8 = new Point(_startPosX + 25, _startPosY + 80); + Point point9 = new Point(_startPosX + 25, _startPosY + 46); + Point point10 = new Point(_startPosX + 30, _startPosY + 46); + + Point[] Dump = { point1, point2, point4, point5, point6, point7, point8, point9, point10 }; + g.FillPolygon(additionalBrush, Dump); + } + + if (entityByldozer.Bakingpowder) + + { + Point point1 = new Point(_startPosX + 131, _startPosY + 25); + Point point2 = new Point(_startPosX + 150, _startPosY + 25); + Point point4 = new Point(_startPosX + 150, _startPosY + 35); + Point point5 = new Point(_startPosX + 147, _startPosY + 35); + Point point6 = new Point(_startPosX + 147, _startPosY + 60); + Point point7 = new Point(_startPosX + 144, _startPosY + 60); + Point point8 = new Point(_startPosX + 145, _startPosY + 80); + Point point9 = new Point(_startPosX + 137, _startPosY + 60); + Point point10 = new Point(_startPosX + 134, _startPosY + 60); + Point point11 = new Point(_startPosX + 134, _startPosY + 35); + + Point point12 = new Point(_startPosX + 131, _startPosY + 35); + + + Point[] Bakingpowder = { point1, point2, point4, point5, point6, point7, point8, point9, point10, point11, point12 }; + g.FillPolygon(additionalBrush, Bakingpowder); + + } + } +} diff --git a/ProjectByldozerHard/ProjectByldozerHard/Drawing/DrawningTrackedCar.cs b/ProjectByldozerHard/ProjectByldozerHard/Drawing/DrawningTrackedCar.cs new file mode 100644 index 0000000..2a80699 --- /dev/null +++ b/ProjectByldozerHard/ProjectByldozerHard/Drawing/DrawningTrackedCar.cs @@ -0,0 +1,234 @@ +using ProjectByldozerHard.Entities; + +namespace ProjectByldozerHard.Drawing; + +public class DrawningTrackedCar +{ + private InterDopRink? DrawingKatki; + /// + /// Класс-сущность + /// + public EntityTrackedCar? EntityTrackedCar { get; protected set; } + + /// + /// Ширина окна + /// + private int _pictureWidth; + + /// + /// Высота окна + /// + private int _pictureHeight; + + /// + /// Левая координата прорисовки бульдозера + /// + protected int _startPosX; + + /// + /// Верхняя кооридната прорисовки бульдозера + /// + protected int _startPosY; + + /// + /// Ширина прорисовки бульдозера + /// + private readonly int _drawningByldozerWidth = 150; + + /// + /// Высота прорисовки бульдозера + /// + private readonly int _drawningByldozerHeight = 80; + + /// + /// Координата X объекта + /// + public int GetPosX => _startPosX; + + /// + /// Координата Y объекта + /// + public int GetPosY => _startPosY; + + /// + /// Ширина объекта + /// + public int GetWidth => _drawningByldozerWidth; + + /// + /// Высота объекта + /// + public int GetHeight => _drawningByldozerHeight; + + public DrawningTrackedCar(int speed, double weight, Color bodyColor, int width, int height, int numKatki, int numchoose) + { + if (width > _drawningByldozerWidth || height > _drawningByldozerHeight) + { + _pictureWidth = width; + _pictureHeight = height; + EntityTrackedCar = new EntityTrackedCar(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 DrawningTrackedCar(int speed, double weight, Color bodyColor, int width, int height, int exWidth, int exHeight, int numKatki) + { + if (width > _drawningByldozerWidth || height > _drawningByldozerHeight) + { + _pictureWidth = width; + _pictureHeight = height; + _drawningByldozerWidth = exWidth; + _drawningByldozerHeight = exHeight; + EntityTrackedCar = new EntityTrackedCar(speed, weight, bodyColor); + } + } + + + /// + /// Установка границ поля + /// + /// Ширина поля + /// Высота поля4ееее + /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах + + + /// + /// Установка позиции + /// + /// Координата X + /// Координата Y + public void SetPosition(int x, int y) + { + if (x < 0) + { + x = 0; + } + else if (x > _pictureWidth - _drawningByldozerWidth) + { + x = _pictureWidth - _drawningByldozerWidth; + + } + + if (y < 0) + { + y = 0; + } + else if (y > _pictureHeight - _drawningByldozerHeight) + { + y = _pictureHeight - _drawningByldozerHeight; + } + _startPosX = x; + _startPosY = y; + + } + + + public bool CanMove(DirectionType direction) + { + if (EntityTrackedCar == null) + { + return false; + } + return direction switch + { + //влево + DirectionType.Left => _startPosX - EntityTrackedCar.Step > 0, + //вверх + DirectionType.Up => _startPosY - EntityTrackedCar.Step > 0, + // вправо + DirectionType.Right => _startPosX + _drawningByldozerWidth + EntityTrackedCar.Step <= _pictureWidth, + //влево + DirectionType.Down => _startPosY + _drawningByldozerHeight + EntityTrackedCar.Step <= _pictureHeight, + }; + } + + + /// + /// Изменение направления перемещения + /// + /// Направление + /// true - перемещение выполнено, false - перемещение невозможно + public void MoveTransport(DirectionType direction) + { + if (!CanMove(direction) || EntityTrackedCar == null) + { + return; + } + + switch (direction) + { + //влево + case DirectionType.Left: + _startPosX -= (int)EntityTrackedCar.Step; + break; + //вверх + case DirectionType.Up: + _startPosY -= (int)EntityTrackedCar.Step; + break; + // вправо + case DirectionType.Right: + _startPosX += (int)EntityTrackedCar.Step; + break; + //вниз + case DirectionType.Down: + _startPosY += (int)EntityTrackedCar.Step; + break; + default: + break; + } + } + + /// + /// Прорисовка объекта + /// + /// + public virtual void DrawTransport(Graphics g) + { + if (EntityTrackedCar == null) + { + return; + } + Pen pen = new(Color.Black); + Brush bodybrush = new SolidBrush(EntityTrackedCar.BodyColor); + + //границы бульдозера + g.DrawRectangle(pen, _startPosX, _startPosY + 15, 100, 30); + g.DrawRectangle(pen, _startPosX + 70, _startPosY, 30, 20); + + g.DrawArc(pen, _startPosX, _startPosY + 40, 30, 40, 130, 100); + g.DrawArc(pen, _startPosX + 73, _startPosY + 45, 30, 40, 258, 140); + + g.DrawLine(pen, _startPosX + 5, _startPosY + 75, _startPosX + 100, _startPosY + 75); + + + DrawingKatki.Draw(_startPosX, _startPosY, EntityTrackedCar.BodyColor, g); + //заливка кабины и гусениц + Brush br = new SolidBrush(Color.Pink); + g.FillRectangle(br, _startPosX, _startPosY + 15, 100, 30); + g.FillRectangle(br, _startPosX + 70, _startPosY, 30, 20); + + + } + + +} diff --git a/ProjectByldozerHard/ProjectByldozerHard/Drawing/InterDopRink.cs b/ProjectByldozerHard/ProjectByldozerHard/Drawing/InterDopRink.cs new file mode 100644 index 0000000..bad1146 --- /dev/null +++ b/ProjectByldozerHard/ProjectByldozerHard/Drawing/InterDopRink.cs @@ -0,0 +1,8 @@ +namespace ProjectByldozerHard.Drawing; +public interface InterDopRink +{ + public int Properties { get; set; } + + public void Draw(int _startPosX, int _startPosY, Color rinkColor, Graphics g); +} + diff --git a/ProjectByldozerHard/ProjectByldozerHard/DrawningByldozer.cs b/ProjectByldozerHard/ProjectByldozerHard/DrawningByldozer.cs deleted file mode 100644 index 7036ff2..0000000 --- a/ProjectByldozerHard/ProjectByldozerHard/DrawningByldozer.cs +++ /dev/null @@ -1,266 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; - -namespace ProjectByldozerHard; - -public class DrawningByldozer -{ - - /// - /// Класс-сущность - /// - public EntityByldozer? EntityByldozer { get; private set; } - public DrawingRink? Rink; - - /// - /// Ширина окна - /// - private int? _pictureWidth; - - /// - /// Высота окна - /// - private int? _pictureHeight; - - /// - /// Левая координата прорисовки экскаватора - /// - private int? _startPosX; - - /// - /// Верхняя кооридната прорисовки экскаватора - /// - private int? _startPosY; - - /// - /// Ширина прорисовки экскаватора - /// - private int _drawningByldozerWidth; - - /// - /// Высота прорисовки экскаватора - /// - private int _drawningByldozerHeight; - - - /// - /// инициализация свойств - /// - /// - /// - /// - /// - /// - /// - /// - public bool Init(int speed, double weight, Color bodyColor, Color additionalColor, bool dump, bool bakingpowder, bool pipe, int numberOfRink, int width, int height) - { - - if (weight < _pictureWidth || height < _pictureHeight) - { - return false; - } - - _drawningByldozerWidth = 150; - - - _drawningByldozerHeight = 80; - - _pictureWidth = width; - _pictureHeight = height; - - EntityByldozer = new EntityByldozer(); - EntityByldozer.Init(speed, weight, bodyColor, additionalColor, dump, bakingpowder, pipe); - 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 - _drawningByldozerWidth) - { - x = (_pictureWidth.Value - _drawningByldozerWidth); - - } - - if (y < 0) - { - y = 0; - } - else if (y > _pictureHeight.Value - _drawningByldozerWidth) - { - y = _pictureHeight.Value - _drawningByldozerHeight; - } - _startPosX = x; - _startPosY = y; - - } - - /// - /// Изменение направления перемещения - /// - /// Направление - /// true - перемещение выполнено, false - перемещение невозможно - public bool MoveTransport(DirectionType direction) - { - if (EntityByldozer == null || !_startPosX.HasValue || !_startPosY.HasValue) - { - return false; - } - - switch (direction) - { - //влево - case DirectionType.Left: - if (_startPosX.Value - EntityByldozer.Step > 0) - { - _startPosX -= (int)EntityByldozer.Step; - } - return true; - //вверх - case DirectionType.Up: - if (_startPosY.Value - EntityByldozer.Step > 0) - { - _startPosY -= (int)EntityByldozer.Step; - } - return true; - // вправо - case DirectionType.Right: - if (_startPosX.Value + _drawningByldozerWidth + EntityByldozer.Step < _pictureWidth) - { - _startPosX += (int)EntityByldozer.Step; - } - return true; - //вниз - case DirectionType.Down: - if (_startPosY.Value + _drawningByldozerHeight + EntityByldozer.Step < _pictureHeight) - { - _startPosY += (int)EntityByldozer.Step; - } - return true; - default: - return false; - } - } - - /// - /// Прорисовка объекта - /// - /// - public void DrawTransport(Graphics g) - { - if (EntityByldozer == null || !_startPosX.HasValue || !_startPosY.HasValue) - { - return; - } - - - - Pen pen = new(Color.Black); - Brush additionalBrush = new SolidBrush(EntityByldozer.AdditionalColor); - Brush bodybrush = new SolidBrush(EntityByldozer.BodyColor); - - //границы бульдозера и колес - g.DrawRectangle(pen, _startPosX.Value + 30, _startPosY.Value + 20, 100, 30); - g.DrawRectangle(pen, _startPosX.Value + 100, _startPosY.Value, 30, 20); - - g.DrawArc(pen, _startPosX.Value + 30, _startPosY.Value + 45, 30, 40, 130, 100); - g.DrawArc(pen, _startPosX.Value + 103, _startPosY.Value + 50, 30, 40, 258, 140); - - g.DrawLine(pen, _startPosX.Value + 35, _startPosY.Value + 80, _startPosX.Value + 130, _startPosY.Value + 80); - - //g.DrawEllipse(pen, _startPosX.Value + 60, _startPosY.Value + 67, 10, 10); - //g.DrawEllipse(pen, _startPosX.Value + 78, _startPosY.Value + 67, 10, 10); - //g.DrawEllipse(pen, _startPosX.Value + 95, _startPosY.Value + 67, 10, 10); - //g.DrawEllipse(pen, _startPosX.Value + 70, _startPosY.Value + 53, 7, 7); - //g.DrawEllipse(pen, _startPosX.Value + 90, _startPosY.Value + 53, 7, 7); - //g.DrawEllipse(pen, _startPosX.Value + 35, _startPosY.Value + 55, 20, 20); - //g.DrawEllipse(pen, _startPosX.Value + 110, _startPosY.Value + 55, 20, 20); - - //заливка кабины и гусениц - Brush br = new SolidBrush(Color.Black); - g.FillRectangle(bodybrush, _startPosX.Value + 30, _startPosY.Value + 20, 100, 30); - g.FillRectangle(bodybrush, _startPosX.Value + 100, _startPosY.Value, 30, 20); - //g.FillEllipse(br, _startPosX.Value + 35, _startPosY.Value + 55, 20, 20); - //g.FillEllipse(br, _startPosX.Value + 110, _startPosY.Value + 55, 20, 20); - //g.FillEllipse(br, _startPosX.Value + 60, _startPosY.Value + 67, 10, 10); - //g.FillEllipse(br, _startPosX.Value + 78, _startPosY.Value + 67, 10, 10); - //g.FillEllipse(br, _startPosX.Value + 95, _startPosY.Value + 67, 10, 10); - //g.FillEllipse(br, _startPosX.Value + 70, _startPosY.Value + 53, 7, 7); - //g.FillEllipse(br, _startPosX.Value + 90, _startPosY.Value + 53, 7, 7); - Rink.DrawRinks(g, _startPosX.Value + 5, _startPosY.Value + 10); - //окно - Brush blfara = new SolidBrush(Color.Blue); - g.FillRectangle(blfara, _startPosX.Value + 110, _startPosY.Value + 5, 10, 25); - - ///труба - if (EntityByldozer.Pipe) - { - g.DrawRectangle(pen, _startPosX.Value + 60, _startPosY.Value, 5, 20); - g.FillRectangle(bodybrush, _startPosX.Value + 60, _startPosY.Value, 5, 20); - } - // отвал - if (EntityByldozer.Dump) - - { - Point point1 = new Point(_startPosX.Value + 30, _startPosY.Value + 35); - Point point2 = new Point(_startPosX.Value + 25, _startPosY.Value + 35); - Point point4 = new Point(_startPosX.Value + 25, _startPosY.Value + 23); - Point point5 = new Point(_startPosX.Value + 20, _startPosY.Value + 23); - Point point6 = new Point(_startPosX.Value + 15, _startPosY.Value + 60); - Point point7 = new Point(_startPosX.Value + 2, _startPosY.Value + 80); - Point point8 = new Point(_startPosX.Value + 25, _startPosY.Value + 80); - Point point9 = new Point(_startPosX.Value + 25, _startPosY.Value + 46); - Point point10 = new Point(_startPosX.Value + 30, _startPosY.Value + 46); - - Point[] Dump = { point1, point2, point4, point5, point6, point7, point8, point9, point10 }; - g.FillPolygon(additionalBrush, Dump); - } - - if (EntityByldozer.Bakingpowder) - - { - Point point1 = new Point(_startPosX.Value + 131, _startPosY.Value + 25); - Point point2 = new Point(_startPosX.Value + 150, _startPosY.Value + 25); - Point point4 = new Point(_startPosX.Value + 150, _startPosY.Value + 35); - Point point5 = new Point(_startPosX.Value + 147, _startPosY.Value + 35); - Point point6 = new Point(_startPosX.Value + 147, _startPosY.Value + 60); - Point point7 = new Point(_startPosX.Value + 144, _startPosY.Value + 60); - Point point8 = new Point(_startPosX.Value + 145, _startPosY.Value + 80); - Point point9 = new Point(_startPosX.Value + 137, _startPosY.Value + 60); - Point point10 = new Point(_startPosX.Value + 134, _startPosY.Value + 60); - Point point11 = new Point(_startPosX.Value + 134, _startPosY.Value + 35); - - Point point12 = new Point(_startPosX.Value + 131, _startPosY.Value + 35); - - - Point[] Bakingpowder = { point1, point2, point4, point5, point6, point7, point8, point9, point10, point11, point12 }; - g.FillPolygon(additionalBrush, Bakingpowder); - - } - } -} diff --git a/ProjectByldozerHard/ProjectByldozerHard/EntityByldozer.cs b/ProjectByldozerHard/ProjectByldozerHard/Entities/EntityByldozer.cs similarity index 73% rename from ProjectByldozerHard/ProjectByldozerHard/EntityByldozer.cs rename to ProjectByldozerHard/ProjectByldozerHard/Entities/EntityByldozer.cs index cf6af8d..cf523e3 100644 --- a/ProjectByldozerHard/ProjectByldozerHard/EntityByldozer.cs +++ b/ProjectByldozerHard/ProjectByldozerHard/Entities/EntityByldozer.cs @@ -1,30 +1,14 @@ - - -namespace ProjectByldozerHard; +namespace ProjectByldozerHard.Entities; /// /// Класс-сущность "бульдозер" /// -public class EntityByldozer +public class EntityByldozer : EntityTrackedCar { - /// - /// Скорость - /// - 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; } /// /// Признак (опция) наличия отвала @@ -40,6 +24,10 @@ public class EntityByldozer /// Признак (опция) наличия трубы /// public bool Pipe { get; private set; } + /// + /// Катки + /// + public bool Katki { get; private set; } /// /// Шаг перемещения автомобиля @@ -56,14 +44,14 @@ public class EntityByldozer /// Признак наличия обвеса /// Признак наличия антикрыла /// Признак наличия трубы - public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool dump, bool bakingpowder, bool pipe) + public EntityByldozer(int speed, double weight, Color bodyColor, Color additionalColor, bool dump, bool bakingpowder, + bool pipe, bool katki) : base(speed, weight, bodyColor) { - Speed = speed; - Weight = weight; - BodyColor = bodyColor; + AdditionalColor = additionalColor; Dump = dump; Bakingpowder = bakingpowder; Pipe = pipe; + Katki = katki; } } diff --git a/ProjectByldozerHard/ProjectByldozerHard/Entities/EntityTrackedCar.cs b/ProjectByldozerHard/ProjectByldozerHard/Entities/EntityTrackedCar.cs new file mode 100644 index 0000000..2a3314a --- /dev/null +++ b/ProjectByldozerHard/ProjectByldozerHard/Entities/EntityTrackedCar.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectByldozerHard.Entities; +/// +/// Класс-сущность "Бульдозер" +/// +public class EntityTrackedCar +{ + public int numKatki; + /// + /// Скорость + /// + public int Speed { get; private set; } + + /// + /// Вес + /// + public double Weight { get; private set; } + + /// + /// Основной цвет + /// + public Color BodyColor { get; private set; } + + + /// + ///// Шаг перемещения автомобиля + ///// + public double Step => Speed * 100 / Weight; + + /// + /// Конструктор сущности + /// + /// Скорость + /// Вес автомобиля + /// Основной цвет + + public EntityTrackedCar(int speed, double weight, Color bodyColor) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + + } +} + diff --git a/ProjectByldozerHard/ProjectByldozerHard/FormByldozer.Designer.cs b/ProjectByldozerHard/ProjectByldozerHard/FormByldozer.Designer.cs index 795d3ce..78a55a8 100644 --- a/ProjectByldozerHard/ProjectByldozerHard/FormByldozer.Designer.cs +++ b/ProjectByldozerHard/ProjectByldozerHard/FormByldozer.Designer.cs @@ -34,9 +34,10 @@ buttonDown = new Button(); buttonUp = new Button(); buttonRight = new Button(); - numericUpDownrinkByldozer = new NumericUpDown(); + comboBoxStrategy = new ComboBox(); + buttonStep = new Button(); + buttonCreateExKovsh = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxByldozer).BeginInit(); - ((System.ComponentModel.ISupportInitialize)numericUpDownrinkByldozer).BeginInit(); SuspendLayout(); // // pictureBoxByldozer @@ -107,20 +108,44 @@ buttonRight.UseVisualStyleBackColor = true; buttonRight.Click += ButtonMove_Click; // - // numericUpDownrinkByldozer + // comboBoxStrategy // - numericUpDownrinkByldozer.Location = new Point(93, 364); - numericUpDownrinkByldozer.Margin = new Padding(3, 4, 3, 4); - numericUpDownrinkByldozer.Name = "numericUpDownrinkByldozer"; - numericUpDownrinkByldozer.Size = new Size(120, 23); - numericUpDownrinkByldozer.TabIndex = 6; + comboBoxStrategy.FormattingEnabled = true; + comboBoxStrategy.Location = new Point(599, 12); + comboBoxStrategy.Name = "comboBoxStrategy"; + comboBoxStrategy.Size = new Size(121, 23); + comboBoxStrategy.TabIndex = 6; + // + // buttonStep + // + buttonStep.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonStep.Location = new Point(629, 41); + buttonStep.Name = "buttonStep"; + buttonStep.Size = new Size(75, 23); + buttonStep.TabIndex = 7; + buttonStep.Text = "шаг"; + buttonStep.UseVisualStyleBackColor = true; + buttonStep.Click += ButtonStep_Click; + // + // buttonCreateExKovsh + // + buttonCreateExKovsh.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateExKovsh.Location = new Point(115, 362); + buttonCreateExKovsh.Name = "buttonCreateExKovsh"; + buttonCreateExKovsh.Size = new Size(189, 23); + buttonCreateExKovsh.TabIndex = 8; + buttonCreateExKovsh.Text = "Создать продвинутый"; + buttonCreateExKovsh.UseVisualStyleBackColor = true; + buttonCreateExKovsh.Click += ButtonCreateExKovsh_Click; // // FormByldozer // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(737, 397); - Controls.Add(numericUpDownrinkByldozer); + Controls.Add(buttonCreateExKovsh); + Controls.Add(buttonStep); + Controls.Add(comboBoxStrategy); Controls.Add(buttonRight); Controls.Add(buttonUp); Controls.Add(buttonDown); @@ -130,7 +155,6 @@ Name = "FormByldozer"; Text = "Бульдозер"; ((System.ComponentModel.ISupportInitialize)pictureBoxByldozer).EndInit(); - ((System.ComponentModel.ISupportInitialize)numericUpDownrinkByldozer).EndInit(); ResumeLayout(false); } @@ -142,6 +166,8 @@ private Button buttonDown; private Button buttonUp; private Button buttonRight; - private NumericUpDown numericUpDownrinkByldozer; + private ComboBox comboBoxStrategy; + private Button buttonStep; + private Button buttonCreateExKovsh; } } \ No newline at end of file diff --git a/ProjectByldozerHard/ProjectByldozerHard/FormByldozer.cs b/ProjectByldozerHard/ProjectByldozerHard/FormByldozer.cs index 3b3856c..a2dc51f 100644 --- a/ProjectByldozerHard/ProjectByldozerHard/FormByldozer.cs +++ b/ProjectByldozerHard/ProjectByldozerHard/FormByldozer.cs @@ -1,12 +1,6 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; + +using ProjectByldozerHard.Drawing; +using ProjectByldozerHard.MovementStrategy; namespace ProjectByldozerHard; @@ -17,11 +11,14 @@ public partial class FormByldozer : Form /// /// поле объект для прорисовки объекта /// - private DrawningByldozer? _drawingByldozer; + private DrawningTrackedCar? _drawingByldozer; + private AbstractStrategy? _abstractStrategy; public FormByldozer() { InitializeComponent(); + comboBoxStrategy.Items.Add("К центру"); + comboBoxStrategy.Items.Add("К краю"); } private void Draw() { @@ -44,15 +41,10 @@ public partial class FormByldozer : Form private void ButtonCreat_Click(object sender, EventArgs e) { Random random = new(); - _drawingByldozer = new DrawningByldozer(); - _drawingByldozer.Init(random.Next(100, 300), random.Next(1000, 3000), - Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), - Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), - Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)) , random.Next(1, 4) * 2, - pictureBoxByldozer.Width, pictureBoxByldozer.Height); - + _drawingByldozer = new DrawningTrackedCar(random.Next(100, 300), random.Next(1000, 3000), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), + pictureBoxByldozer.Width, pictureBoxByldozer.Height, random.Next(1, 4), random.Next(1, 4)); _drawingByldozer.SetPosition(random.Next(10, 100), random.Next(10, 100)); - _drawingByldozer.Rink.KatNum = (int)numericUpDownrinkByldozer.Value; Draw(); } @@ -63,6 +55,7 @@ public partial class FormByldozer : Form /// private void ButtonMove_Click(object sender, EventArgs e) { + if (_drawingByldozer == null) { return; @@ -89,7 +82,55 @@ public partial class FormByldozer : Form Draw(); } + private void ButtonStep_Click(object sender, EventArgs e) + { + if (_drawingByldozer == null) + { + return; + } + if (comboBoxStrategy.Enabled) + { + _abstractStrategy = comboBoxStrategy.SelectedIndex + switch + { + 0 => new MoveToCenter(), + 1 => new MoveToBorder(), + _ => null, + }; + if (_abstractStrategy == null) + { + return; + } + _abstractStrategy.SetData(new MoveableByldozer(_drawingByldozer), pictureBoxByldozer.Width, pictureBoxByldozer.Height); + comboBoxStrategy.Enabled = false; + } + if (_abstractStrategy == null) + { + return; + } + _abstractStrategy.MakeStep(); + Draw(); + if (_abstractStrategy.GetStatus() == StrategyStatus.Finish) + { + comboBoxStrategy.Enabled = true; + _abstractStrategy = null; + } + } + private void ButtonCreateExKovsh_Click(object sender, EventArgs e) + { + Random random = new(); + _drawingByldozer = new DrawningByldozer(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)), + pictureBoxByldozer.Width, pictureBoxByldozer.Height, random.Next(1, 4), random.Next(1, 4)); + _drawingByldozer.SetPosition(random.Next(10, 100), random.Next(10, 100)); + Draw(); + } } diff --git a/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/AbstractStrategy.cs b/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/AbstractStrategy.cs new file mode 100644 index 0000000..fbe8e8b --- /dev/null +++ b/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/AbstractStrategy.cs @@ -0,0 +1,148 @@ +using ProjectByldozerHard.Drawing; + +namespace ProjectByldozerHard.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/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/IMoveableObjectcs.cs b/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/IMoveableObjectcs.cs new file mode 100644 index 0000000..8bf396e --- /dev/null +++ b/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/IMoveableObjectcs.cs @@ -0,0 +1,26 @@ + + +using ProjectByldozerHard.Drawing; + +namespace ProjectByldozerHard.MovementStrategy; + +public interface IMoveableObjectcs +{ + /// + /// Получение координаты объекта + /// + ObjectParameters? GetObjectPosition { get; } + + /// + /// Шаг объекта + /// + int GetStep { get; } + + /// + /// Попытка переместить объект в указанном направлении + /// + /// Направление + /// true - объект перемещен, false - перемещение невозможно + bool CheckCanMove(DirectionType direction); + void MoveObject(DirectionType direction); +} diff --git a/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/MoveToBorder.cs b/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/MoveToBorder.cs new file mode 100644 index 0000000..c7fe732 --- /dev/null +++ b/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/MoveToBorder.cs @@ -0,0 +1,53 @@ + + +namespace ProjectByldozerHard.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/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/MoveToCenter.cs b/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/MoveToCenter.cs new file mode 100644 index 0000000..c8e83b3 --- /dev/null +++ b/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/MoveToCenter.cs @@ -0,0 +1,52 @@ + +namespace ProjectByldozerHard.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/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/MoveableByldozer.cs b/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/MoveableByldozer.cs new file mode 100644 index 0000000..69994e6 --- /dev/null +++ b/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/MoveableByldozer.cs @@ -0,0 +1,44 @@ +using ProjectByldozerHard.Drawing; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectByldozerHard.MovementStrategy; +/// +/// Класс-реализация IMoveableObject +/// +public class MoveableByldozer : IMoveableObjectcs +{ + /// + /// Поле-объект класса DrawningCar или его наследника + /// + private readonly DrawningTrackedCar? _trackedcar = null; + + /// + /// Конструктор + /// + + public MoveableByldozer(DrawningTrackedCar trackedcar) + { + _trackedcar = trackedcar; + } + + public ObjectParameters? GetObjectPosition + { + get + { + if (_trackedcar == null || _trackedcar.EntityTrackedCar == null) + { + return null; + } + return new ObjectParameters(_trackedcar.GetPosX, _trackedcar.GetPosY, _trackedcar.GetWidth, _trackedcar.GetHeight); + } + } + + public int GetStep => (int)(_trackedcar?.EntityTrackedCar?.Step ?? 0); + public bool CheckCanMove(DirectionType direction) => _trackedcar?.CanMove(direction) ?? false; + public void MoveObject(DirectionType direction) => _trackedcar?.MoveTransport(direction); + +} \ No newline at end of file diff --git a/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/MovementDirection.cs b/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/MovementDirection.cs new file mode 100644 index 0000000..c874114 --- /dev/null +++ b/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/MovementDirection.cs @@ -0,0 +1,26 @@ + +namespace ProjectByldozerHard.MovementStrategy; + +// +/// направление перемещения +/// +public enum MovementDirection +{ + /// + /// Вверх + /// + Up = 1, + /// + /// Вниз + /// + Down = 2, + /// + /// Влево + /// + Left = 3, + /// + /// Вправо + /// + Right = 4 + +} \ No newline at end of file diff --git a/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/ObjectParameters.cs b/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/ObjectParameters.cs new file mode 100644 index 0000000..ae7ab06 --- /dev/null +++ b/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/ObjectParameters.cs @@ -0,0 +1,71 @@ +namespace ProjectByldozerHard.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/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/StrategyStatus.cs b/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/StrategyStatus.cs new file mode 100644 index 0000000..074174e --- /dev/null +++ b/ProjectByldozerHard/ProjectByldozerHard/MovementStrategy/StrategyStatus.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectByldozerHard.MovementStrategy; + +/// +///статус выполнения операции перемещения +/// +public enum StrategyStatus +{ + /// + /// все готово к началу + /// + NotInit, + + /// + /// выполняется + /// + InProgress, + + /// + /// завершено + /// + Finish +}