From 87de7c65b3ea84188a4dbfcd01e9f84db0cbcd69 Mon Sep 17 00:00:00 2001 From: AparyanLuiza Date: Thu, 23 Nov 2023 01:37:55 +0400 Subject: [PATCH] =?UTF-8?q?=D0=92=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B2=D1=81=D0=B5=D1=85=20=D1=82=D1=80?= =?UTF-8?q?=D0=B5=D0=B1=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B9=20=D0=BF=D0=BE?= =?UTF-8?q?=20=D0=B2=D1=82=D0=BE=D1=80=D0=BE=D0=B9=20=D0=BB=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=BD=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ProjectBulldozer/Direction.cs | 21 -- ProjectBulldozer/DirectionType.cs | 12 + ProjectBulldozer/Drawings/DrawingTractor.cs | 169 ++++++++++++++ .../Drawings/DrawningBulldozer.cs | 75 +++++++ ProjectBulldozer/DrawningBulldozer.cs | 209 ------------------ ProjectBulldozer/FormBulldozer.Designer.cs | 124 ++++++++--- ProjectBulldozer/FormBulldozer.cs | 108 ++++++--- .../MovementStrategy/AbstractStrategy.cs | 79 +++++++ .../MovementStrategy/DrawingObjectTractor.cs | 30 +++ .../MovementStrategy/IMoveableObject.cs | 13 ++ .../MovementStrategy/MoveToCenter.cs | 47 ++++ .../MovementStrategy/MoveToRightCorner.cs | 25 +++ .../MovementStrategy/ObjectsParameters.cs | 38 ++++ ProjectBulldozer/Program.cs | 4 +- .../Properties/Resources.Designer.cs | 40 ++++ ProjectBulldozer/Properties/Resources.resx | 13 ++ ProjectBulldozer/Resources/Down.png | Bin 10025 -> 0 bytes ProjectBulldozer/Resources/Left.png | Bin 9407 -> 0 bytes ProjectBulldozer/Resources/Right.png | Bin 9317 -> 0 bytes ProjectBulldozer/Resources/Up.png | Bin 10055 -> 0 bytes ProjectBulldozer/Resources/down1.png | Bin 0 -> 5136 bytes ProjectBulldozer/Resources/left1.png | Bin 0 -> 4073 bytes ProjectBulldozer/Resources/right1.png | Bin 0 -> 4271 bytes ProjectBulldozer/Resources/up1.png | Bin 0 -> 5154 bytes ProjectBulldozer/Status.cs | 10 + 25 files changed, 721 insertions(+), 296 deletions(-) delete mode 100644 ProjectBulldozer/Direction.cs create mode 100644 ProjectBulldozer/DirectionType.cs create mode 100644 ProjectBulldozer/Drawings/DrawingTractor.cs create mode 100644 ProjectBulldozer/Drawings/DrawningBulldozer.cs delete mode 100644 ProjectBulldozer/DrawningBulldozer.cs create mode 100644 ProjectBulldozer/MovementStrategy/AbstractStrategy.cs create mode 100644 ProjectBulldozer/MovementStrategy/DrawingObjectTractor.cs create mode 100644 ProjectBulldozer/MovementStrategy/IMoveableObject.cs create mode 100644 ProjectBulldozer/MovementStrategy/MoveToCenter.cs create mode 100644 ProjectBulldozer/MovementStrategy/MoveToRightCorner.cs create mode 100644 ProjectBulldozer/MovementStrategy/ObjectsParameters.cs delete mode 100644 ProjectBulldozer/Resources/Down.png delete mode 100644 ProjectBulldozer/Resources/Left.png delete mode 100644 ProjectBulldozer/Resources/Right.png delete mode 100644 ProjectBulldozer/Resources/Up.png create mode 100644 ProjectBulldozer/Resources/down1.png create mode 100644 ProjectBulldozer/Resources/left1.png create mode 100644 ProjectBulldozer/Resources/right1.png create mode 100644 ProjectBulldozer/Resources/up1.png create mode 100644 ProjectBulldozer/Status.cs diff --git a/ProjectBulldozer/Direction.cs b/ProjectBulldozer/Direction.cs deleted file mode 100644 index 2f756d8..0000000 --- a/ProjectBulldozer/Direction.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ProjectBulldozer -{ - internal enum Direction - { - - Up = 1, - - Down = 2, - - Left = 3, - - Right = 4 - - } -} diff --git a/ProjectBulldozer/DirectionType.cs b/ProjectBulldozer/DirectionType.cs new file mode 100644 index 0000000..e37c505 --- /dev/null +++ b/ProjectBulldozer/DirectionType.cs @@ -0,0 +1,12 @@ + + +namespace ProjectBulldozer +{ + public enum DirectionType + { + Up = 1, + Down = 2, + Left = 3, + Right = 4, + } +} diff --git a/ProjectBulldozer/Drawings/DrawingTractor.cs b/ProjectBulldozer/Drawings/DrawingTractor.cs new file mode 100644 index 0000000..4c7366d --- /dev/null +++ b/ProjectBulldozer/Drawings/DrawingTractor.cs @@ -0,0 +1,169 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Bulldozer; +using ProjectBulldozer.Entities; +using ProjectBulldozer.Properties; + +namespace ProjectBulldozer.Drawings +{ + public class DrawingTractor + { + public EntityTractor? EntityTractor { get; protected set; } + + protected int _pictureWidth; + + protected int _pictureHeight; + + protected int _startPosX; + + protected int _startPosY; + + private int tractWidth; + protected readonly int _tractWidth = 140; + + protected readonly int _tractHeight = 123; + public int GetPosX => _startPosX; + public int GetPosY => _startPosY; + public int GetWidth => _tractWidth; + public int GetHeight => _tractHeight; + + public DrawingTractor(int speed, double weight, Color bodyColor, int width, int heigth) + { + if (width < _tractWidth || heigth < _tractHeight) + { + return; + } + _pictureWidth = width; + _pictureHeight = heigth; + EntityTractor = new EntityTractor(speed, weight, bodyColor); + } + + protected DrawingTractor(int speed, double weight, Color bodyColor, int width, + int height, int tractWidth, int tractHeight) + { + if (width < _tractWidth || height < _tractHeight) + { + return; + } + _pictureWidth = width; + _pictureHeight = height; + _tractWidth = tractWidth; + _tractHeight = tractHeight; + EntityTractor = new EntityTractor(speed, weight, bodyColor); + } + + //Установка позиции + public void SetPosition(int x, int y) + { + if (x < 0 || x + _tractWidth > _pictureWidth) + { + x = _pictureWidth - tractWidth; + } + if (y < 0 || y + _tractHeight > _pictureHeight) + { + y = _pictureHeight - _tractHeight; + } + _startPosX = x; + _startPosY = y; + } + + public void MoveTransport(DirectionType direction) + { + if (EntityTractor == null) + { + return; + } + switch (direction) + { + case DirectionType.Left: + if (_startPosX - EntityTractor.Step > 0) + { + _startPosX -= (int)EntityTractor.Step; + } + break; + case DirectionType.Up: + if (_startPosY - EntityTractor.Step > 0) + { + _startPosY -= (int)EntityTractor.Step; + } + break; + case DirectionType.Right: + if (_startPosX + EntityTractor.Step + _tractWidth < _pictureWidth) + { + _startPosX += (int)EntityTractor.Step; + } + break; + case DirectionType.Down: + if (_startPosY + EntityTractor.Step + _tractHeight < _pictureHeight) + { + _startPosY += (int)EntityTractor.Step; + } + break; + } + } + + public virtual void DrawTransport(Graphics g) + { + { + if (EntityTractor == null) return; + } + + Pen pen = new(Color.Black); + Brush brownBrush = new SolidBrush(Color.Brown); + Brush windows = new SolidBrush(Color.LightYellow); + Brush bodyColor = new SolidBrush(EntityTractor.BodyColor); + + Brush grayBrush = new SolidBrush(Color.Gray); + + //основное тело + g.FillRectangle(bodyColor, _startPosX + 20, _startPosY + 40, 100, 60); + g.DrawRectangle(pen, _startPosX + 20, _startPosY + 40, 100, 60); + + + + //кабина водителя + g.FillRectangle(windows, _startPosX + 20, _startPosY, 40, 40); + g.DrawRectangle(pen, _startPosX + 20, _startPosY, 40, 40); + + + + //колеса + + g.FillEllipse(grayBrush, _startPosX + 20, _startPosY + 74, 47, 47); + g.DrawEllipse(pen, _startPosX + 20, _startPosY + 74, 47, 47); + + + g.FillEllipse(grayBrush, _startPosX + 80, _startPosY + 85, 35, 35); + g.DrawEllipse(pen, _startPosX + 80, _startPosY + 85, 35, 35); + + + //выхлопная труба + g.FillRectangle(brownBrush, _startPosX + 90, _startPosY, 15, 40); + g.DrawRectangle(pen, _startPosX + 90, _startPosY, 15, 40); + + + } + + public bool CanMove(DirectionType direction) + { + if (EntityTractor == null) + { + return false; + } + return direction switch + { + //влево + DirectionType.Left => _startPosX - EntityTractor.Step > 0, + //вверх + DirectionType.Up => _startPosY - EntityTractor.Step > 0, + // вправо + DirectionType.Right => _startPosX + EntityTractor.Step < _pictureWidth, + //вниз + DirectionType.Down => _startPosY + EntityTractor.Step < _pictureHeight, + }; + } + } +} diff --git a/ProjectBulldozer/Drawings/DrawningBulldozer.cs b/ProjectBulldozer/Drawings/DrawningBulldozer.cs new file mode 100644 index 0000000..6edc944 --- /dev/null +++ b/ProjectBulldozer/Drawings/DrawningBulldozer.cs @@ -0,0 +1,75 @@ +using ProjectBulldozer.Entities; + +namespace ProjectBulldozer.Drawings +{ + public class DrawingBulldozer : DrawingTractor + { + public DrawingBulldozer(int speed, double weight, Color bodyColor, Color additionalColor, + bool otval, bool seifBatteries, int width, int height) : base(speed, weight, bodyColor, width, height, 129, 120) + { + if (EntityTractor != null) + { + EntityTractor = new EntityBulldozer(speed, width, bodyColor, additionalColor, otval, seifBatteries); + } + } + public override void DrawTransport(Graphics g) + { + if (EntityTractor is not EntityBulldozer Bulldozer) + { + return; + } + + Pen pen = new(Color.Black); + Brush blackBrush = new SolidBrush(Color.Black); + Brush windows = new SolidBrush(Color.LightBlue); + Brush bodyColor = new SolidBrush(Bulldozer.BodyColor); + Brush additionalBrush = new SolidBrush(Bulldozer.AdditionalColor); + Brush grayBrush = new SolidBrush(Color.Gray); + if (Bulldozer.Otval) + { + //otval + Point[] Otval = + { + new Point(_startPosX + 122, _startPosY + 55), + new Point(_startPosX + 142, _startPosY + 115), + new Point(_startPosX+ 122, _startPosY + 115), + + + }; + + g.FillPolygon(blackBrush, Otval); + g.DrawPolygon(pen, Otval); + } + + + //гусеницы + Brush gg = new SolidBrush(Color.LightGray); + g.FillEllipse(gg, _startPosX + 19, _startPosY + 62, 100, 65); + g.DrawEllipse(pen, _startPosX + 19, _startPosY + 62, 100, 65); + + + + g.FillEllipse(grayBrush, _startPosX + 65, _startPosY + 100, 15, 15); + g.DrawEllipse(pen, _startPosX + 65, _startPosY + 100, 15, 15); + + + + + Point[] Ttt = + { + new Point(_startPosX + 18 , _startPosY + 80), + new Point(_startPosX + 18, _startPosY + 110), + new Point(_startPosX, _startPosY + 50), + + }; + g.FillPolygon(blackBrush, Ttt); + g.DrawPolygon(pen, Ttt); + + if (Bulldozer.SeifBatteries) + { + g.FillRectangle(blackBrush, _startPosX + 78, _startPosY + 30, 10, 10); + } + base.DrawTransport(g); + } + } +} diff --git a/ProjectBulldozer/DrawningBulldozer.cs b/ProjectBulldozer/DrawningBulldozer.cs deleted file mode 100644 index 7bb92b0..0000000 --- a/ProjectBulldozer/DrawningBulldozer.cs +++ /dev/null @@ -1,209 +0,0 @@ - - -using ProjectBulldozer.Entities; - -namespace ProjectBulldozer -{ - internal class DrawningBulldozer - { - - public EntityBulldozer? EntityBulldozer { get; private set; } - - private int _pictureWidth; - - private int _pictureHeight; - - private int _startPosX; - - private int _startPosY; - - private readonly int _BulldozerWidth = 180; - - private readonly int _BulldozerHeight = 140; - - public bool Init(int speed, double weight, Color bodyColor, Color - additionalColor, bool additionalEngine, bool additionalCompartment, int width, int height) - { - if (_pictureWidth < _BulldozerWidth | _pictureHeight < _BulldozerHeight) - { - _pictureWidth = width; - _pictureHeight = height; - EntityBulldozer = new EntityBulldozer(); - EntityBulldozer.Init(speed, weight, bodyColor, additionalColor, - additionalEngine, additionalCompartment); - return true; - } - else return false; - } - - public void SetPosition(int x, int y) - { - if (_startPosY + _BulldozerHeight < _pictureHeight) - _startPosY = y; - else - _startPosY = _pictureHeight - _BulldozerHeight; - if (_startPosX + _BulldozerWidth < _pictureWidth) - _startPosX = x; - else - _startPosX = _pictureWidth - _BulldozerWidth; - } - - public void MoveTransport(Direction direction) - { - if (EntityBulldozer == null) - { - return; - } - switch (direction) - { - //влево - case Direction.Left: - if (_startPosX - EntityBulldozer.Step > 0) - { - _startPosX -= (int)EntityBulldozer.Step; - } - else _startPosX = 0; - break; - //вверх - case Direction.Up: - if (_startPosY - EntityBulldozer.Step > 0) - { - _startPosY -= (int)EntityBulldozer.Step; - } - else _startPosY = 0; - break; - // вправо - case Direction.Right: - if (_startPosX + _BulldozerWidth + EntityBulldozer.Step < _pictureWidth) - { - _startPosX += (int)EntityBulldozer.Step; - } - else _startPosX = _pictureWidth - _BulldozerWidth; - break; - //вниз - case Direction.Down: - if (_startPosY + _BulldozerHeight + EntityBulldozer.Step < _pictureHeight) - { - _startPosY += (int)EntityBulldozer.Step; - } - else _startPosY = _pictureHeight - _BulldozerHeight; - break; - } - } - - public void DrawTransport(Graphics g) - { - if (EntityBulldozer == null) - { - return; - } - Pen pen = new(Color.Black); - Brush brush = new SolidBrush(Color.Black); - Brush bl = new SolidBrush(EntityBulldozer.AdditionalColor); - Brush bodyBrush = new SolidBrush(EntityBulldozer.BodyColor); - Brush bodyBrush2 = new SolidBrush(EntityBulldozer.AdditionalColor); - - - - - //основное тело - g.FillRectangle(bodyBrush, _startPosX + 20, _startPosY + 40, 120, 60); - - g.DrawRectangle(pen, _startPosX + 20, _startPosY + 40, 120, 60); - - - - //Гусеницы - Brush gg = new SolidBrush(Color.LightGray); - g.FillEllipse(gg, _startPosX + 23, _startPosY + 101, 118, 35); - g.DrawEllipse(pen, _startPosX + 23, _startPosY + 101, 118, 35); - - - - - g.DrawEllipse(pen, _startPosX + 26, _startPosY + 103, 110, 30); - - //катки в гусеницах - Brush gr = new SolidBrush(Color.Gray); - g.FillEllipse(gr, _startPosX + 40, _startPosY + 108, 20, 20); - g.DrawEllipse(pen, _startPosX + 40, _startPosY + 108, 20, 20); - - - g.FillEllipse(gr, _startPosX + 65, _startPosY + 110, 20, 20); - g.DrawEllipse(pen, _startPosX + 65, _startPosY + 110, 20, 20); - - g.FillEllipse(gr, _startPosX + 115, _startPosY + 110, 15, 15); - g.DrawEllipse(pen, _startPosX + 115, _startPosY + 110, 15, 15); - - g.FillEllipse(gr, _startPosX + 90, _startPosY + 110, 20, 20); - g.DrawEllipse(pen, _startPosX + 90, _startPosY + 110, 20, 20); - - - - - //кабина водителя - g.FillRectangle(bodyBrush2, _startPosX + 20, _startPosY, 40, 40); - g.DrawRectangle(pen, _startPosX + 20, _startPosY, 40, 40); - - - //выхлопная труба - Brush brBr = new SolidBrush(Color.Brown); - - g.FillRectangle(brBr, _startPosX + 110, _startPosY, 15, 40); - g.DrawRectangle(pen, _startPosX + 110, _startPosY, 15, 40); - - - - //Brush bl = new SolidBrush(Color.LightYellow); - /////////отвал - /// - Point[] Otval = - { - new Point(_startPosX + 142, _startPosY + 70), - new Point(_startPosX + 172, _startPosY + 130), - new Point(_startPosX+ 142, _startPosY + 130), - - - }; - - g.FillPolygon(bl, Otval); - g.DrawPolygon(pen, Otval); - - - - Brush black = new SolidBrush(Color.Black); - Point[] Rihl = - { - new Point(_startPosX + 18 , _startPosY + 60), - new Point(_startPosX + 18, _startPosY + 80), - new Point(_startPosX, _startPosY + 120), - - }; - - g.FillPolygon(black, Rihl); - g.DrawPolygon(pen, Rihl); - - - - Point[] Ttt = - { - new Point(_startPosX + 18 , _startPosY + 80), - new Point(_startPosX + 18, _startPosY + 120), - new Point(_startPosX, _startPosY + 50), - - }; - g.FillPolygon(black, Ttt); - g.DrawPolygon(pen, Ttt); - - - - - - - - - - - } - } -} diff --git a/ProjectBulldozer/FormBulldozer.Designer.cs b/ProjectBulldozer/FormBulldozer.Designer.cs index 8f9dbab..d69ea4c 100644 --- a/ProjectBulldozer/FormBulldozer.Designer.cs +++ b/ProjectBulldozer/FormBulldozer.Designer.cs @@ -1,6 +1,6 @@ -namespace ProjectBulldozer +namespace Bulldozer { - partial class FormBulldozer + partial class Bulldozer { /// /// Required designer variable. @@ -28,13 +28,15 @@ /// private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormBulldozer)); pictureBoxBulldozer = new PictureBox(); - buttonCreate = new Button(); + buttonCreateBulldozer = new Button(); buttonLeft = new Button(); buttonUp = new Button(); buttonRight = new Button(); buttonDown = new Button(); + comboBoxStrategy = new ComboBox(); + buttonCreateTractor = new Button(); + buttonStep = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxBulldozer).BeginInit(); SuspendLayout(); // @@ -42,31 +44,35 @@ // pictureBoxBulldozer.Dock = DockStyle.Fill; pictureBoxBulldozer.Location = new Point(0, 0); + pictureBoxBulldozer.Margin = new Padding(2); pictureBoxBulldozer.Name = "pictureBoxBulldozer"; - pictureBoxBulldozer.Size = new Size(884, 461); + pictureBoxBulldozer.Size = new Size(869, 307); pictureBoxBulldozer.SizeMode = PictureBoxSizeMode.AutoSize; pictureBoxBulldozer.TabIndex = 0; pictureBoxBulldozer.TabStop = false; // - // buttonCreate + // buttonCreateBulldozer // - buttonCreate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; - buttonCreate.Location = new Point(12, 426); - buttonCreate.Name = "buttonCreate"; - buttonCreate.Size = new Size(75, 23); - buttonCreate.TabIndex = 1; - buttonCreate.Text = "Создать"; - buttonCreate.UseVisualStyleBackColor = true; - buttonCreate.Click += buttonCreate_Click; + buttonCreateBulldozer.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateBulldozer.Font = new Font("Times New Roman", 11.25F, FontStyle.Regular, GraphicsUnit.Point); + buttonCreateBulldozer.Location = new Point(131, 249); + buttonCreateBulldozer.Margin = new Padding(2); + buttonCreateBulldozer.Name = "buttonCreateBulldozer"; + buttonCreateBulldozer.Size = new Size(100, 47); + buttonCreateBulldozer.TabIndex = 1; + buttonCreateBulldozer.Text = "Создать булльдозер"; + buttonCreateBulldozer.UseVisualStyleBackColor = true; + buttonCreateBulldozer.Click += buttonCreateBulldozer_Click; // // buttonLeft // buttonLeft.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; - buttonLeft.BackgroundImage = (Image)resources.GetObject("buttonLeft.BackgroundImage"); + buttonLeft.BackgroundImage = ProjectBulldozer.Properties.Resources.left1; buttonLeft.BackgroundImageLayout = ImageLayout.Zoom; - buttonLeft.Location = new Point(769, 419); + buttonLeft.Location = new Point(764, 271); + buttonLeft.Margin = new Padding(2); buttonLeft.Name = "buttonLeft"; - buttonLeft.Size = new Size(30, 30); + buttonLeft.Size = new Size(26, 25); buttonLeft.TabIndex = 2; buttonLeft.UseVisualStyleBackColor = true; buttonLeft.Click += buttonMove_Click; @@ -74,24 +80,25 @@ // buttonUp // buttonUp.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; - buttonUp.BackgroundImage = (Image)resources.GetObject("buttonUp.BackgroundImage"); + buttonUp.BackgroundImage = ProjectBulldozer.Properties.Resources.up1; buttonUp.BackgroundImageLayout = ImageLayout.Zoom; - buttonUp.Location = new Point(805, 383); + buttonUp.Location = new Point(792, 240); + buttonUp.Margin = new Padding(2); buttonUp.Name = "buttonUp"; - buttonUp.Size = new Size(30, 30); + buttonUp.Size = new Size(30, 27); buttonUp.TabIndex = 3; - buttonUp.TextAlign = ContentAlignment.BottomRight; buttonUp.UseVisualStyleBackColor = true; buttonUp.Click += buttonMove_Click; // // buttonRight // buttonRight.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; - buttonRight.BackgroundImage = (Image)resources.GetObject("buttonRight.BackgroundImage"); + buttonRight.BackgroundImage = ProjectBulldozer.Properties.Resources.right1; buttonRight.BackgroundImageLayout = ImageLayout.Zoom; - buttonRight.Location = new Point(841, 419); + buttonRight.Location = new Point(826, 271); + buttonRight.Margin = new Padding(2); buttonRight.Name = "buttonRight"; - buttonRight.Size = new Size(30, 30); + buttonRight.Size = new Size(27, 25); buttonRight.TabIndex = 4; buttonRight.UseVisualStyleBackColor = true; buttonRight.Click += buttonMove_Click; @@ -99,28 +106,74 @@ // buttonDown // buttonDown.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; - buttonDown.BackgroundImage = (Image)resources.GetObject("buttonDown.BackgroundImage"); + buttonDown.BackgroundImage = ProjectBulldozer.Properties.Resources.down1; buttonDown.BackgroundImageLayout = ImageLayout.Zoom; - buttonDown.Location = new Point(805, 419); + buttonDown.Location = new Point(794, 271); + buttonDown.Margin = new Padding(2); buttonDown.Name = "buttonDown"; - buttonDown.Size = new Size(30, 30); + buttonDown.Size = new Size(30, 25); buttonDown.TabIndex = 5; buttonDown.UseVisualStyleBackColor = true; buttonDown.Click += buttonMove_Click; // - // FormBulldozer + // comboBoxStrategy + // + comboBoxStrategy.Anchor = AnchorStyles.Top | AnchorStyles.Right; + comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxStrategy.Font = new Font("Times New Roman", 11.25F, FontStyle.Regular, GraphicsUnit.Point); + comboBoxStrategy.FormattingEnabled = true; + comboBoxStrategy.Items.AddRange(new object[] { "К центру", "В угол" }); + comboBoxStrategy.Location = new Point(693, 10); + comboBoxStrategy.Margin = new Padding(2); + comboBoxStrategy.Name = "comboBoxStrategy"; + comboBoxStrategy.Size = new Size(150, 25); + comboBoxStrategy.TabIndex = 6; + comboBoxStrategy.SelectedIndexChanged += comboBoxStrategy_SelectedIndexChanged; + // + // buttonCreateTractor + // + buttonCreateTractor.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateTractor.Font = new Font("Times New Roman", 11.25F, FontStyle.Regular, GraphicsUnit.Point); + buttonCreateTractor.Location = new Point(11, 249); + buttonCreateTractor.Margin = new Padding(2); + buttonCreateTractor.Name = "buttonCreateTractor"; + buttonCreateTractor.Size = new Size(106, 47); + buttonCreateTractor.TabIndex = 7; + buttonCreateTractor.Text = "Создать трактор"; + buttonCreateTractor.UseVisualStyleBackColor = true; + buttonCreateTractor.Click += buttonCreateTractor_Click; + // + // buttonStep + // + buttonStep.Anchor = AnchorStyles.Top | AnchorStyles.Right; + buttonStep.Font = new Font("Times New Roman", 11.25F, FontStyle.Regular, GraphicsUnit.Point); + buttonStep.Location = new Point(755, 39); + buttonStep.Margin = new Padding(2); + buttonStep.Name = "buttonStep"; + buttonStep.Size = new Size(88, 34); + buttonStep.TabIndex = 8; + buttonStep.Text = "Шаг"; + buttonStep.UseVisualStyleBackColor = true; + buttonStep.Click += buttonStep_Click; + // + // Bulldozer // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(884, 461); + ClientSize = new Size(869, 307); + Controls.Add(buttonStep); + Controls.Add(buttonCreateTractor); + Controls.Add(comboBoxStrategy); Controls.Add(buttonDown); Controls.Add(buttonRight); Controls.Add(buttonUp); Controls.Add(buttonLeft); - Controls.Add(buttonCreate); + Controls.Add(buttonCreateBulldozer); Controls.Add(pictureBoxBulldozer); - Name = "FormBulldozer"; - Text = "FormBulldozer"; + Margin = new Padding(2); + Name = "Bulldozer"; + StartPosition = FormStartPosition.CenterScreen; + Text = "Bulldozer"; ((System.ComponentModel.ISupportInitialize)pictureBoxBulldozer).EndInit(); ResumeLayout(false); PerformLayout(); @@ -129,10 +182,13 @@ #endregion private PictureBox pictureBoxBulldozer; - private Button buttonCreate; + private Button buttonCreateBulldozer; private Button buttonLeft; private Button buttonUp; private Button buttonRight; private Button buttonDown; + private ComboBox comboBoxStrategy; + private Button buttonCreateTractor; + private Button buttonStep; } -} +} \ No newline at end of file diff --git a/ProjectBulldozer/FormBulldozer.cs b/ProjectBulldozer/FormBulldozer.cs index 398b38a..ff082ce 100644 --- a/ProjectBulldozer/FormBulldozer.cs +++ b/ProjectBulldozer/FormBulldozer.cs @@ -1,51 +1,59 @@ -namespace ProjectBulldozer +using ProjectBulldozer; +using ProjectBulldozer.Drawings; +using ProjectBulldozer.MovementStrategy; +using System; + +namespace Bulldozer { - public partial class FormBulldozer : Form + public partial class Bulldozer : Form { - private DrawningBulldozer? _drawningBulldozer; + private DrawingTractor? _drawingTractor; - public FormBulldozer() + private AbstractStrategy? _abstractStrategy; + + public Bulldozer() { InitializeComponent(); } private void Draw() { - if (_drawningBulldozer == null) + if (_drawingTractor == null) { return; } - Bitmap bmp = new(pictureBoxBulldozer.Width, - pictureBoxBulldozer.Height); + Bitmap bmp = new(pictureBoxBulldozer.Width, pictureBoxBulldozer.Height); Graphics gr = Graphics.FromImage(bmp); - _drawningBulldozer.DrawTransport(gr); + _drawingTractor.DrawTransport(gr); pictureBoxBulldozer.Image = bmp; } - - - private void buttonCreate_Click(object sender, EventArgs e) + private void buttonCreateBulldozer_Click(object sender, EventArgs e) { - Random random = new(); - _drawningBulldozer = new DrawningBulldozer(); - _drawningBulldozer.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)), + Random random = new Random(); + _drawingTractor = new DrawingBulldozer(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)), pictureBoxBulldozer.Width, pictureBoxBulldozer.Height); - _drawningBulldozer.SetPosition(random.Next(10, 100), - random.Next(10, 100)); + _drawingTractor.SetPosition(random.Next(10, 100), random.Next(10, 100)); + Draw(); + } + + private void buttonCreateTractor_Click(object sender, EventArgs e) + { + Random rnd = new Random(); + _drawingTractor = new DrawingTractor(rnd.Next(100, 300), rnd.Next(1000, 3000), + Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)), + pictureBoxBulldozer.Width, pictureBoxBulldozer.Height); + _drawingTractor.SetPosition(rnd.Next(10, 100), rnd.Next(10, 100)); Draw(); } private void buttonMove_Click(object sender, EventArgs e) { - if (_drawningBulldozer == null) + if (_drawingTractor == null) { return; } @@ -53,20 +61,60 @@ namespace ProjectBulldozer switch (name) { case "buttonUp": - _drawningBulldozer.MoveTransport(Direction.Up); + _drawingTractor.MoveTransport(DirectionType.Up); break; case "buttonDown": - _drawningBulldozer.MoveTransport(Direction.Down); + _drawingTractor.MoveTransport(DirectionType.Down); break; case "buttonLeft": - _drawningBulldozer.MoveTransport(Direction.Left); + _drawingTractor.MoveTransport(DirectionType.Left); break; case "buttonRight": - _drawningBulldozer.MoveTransport(Direction.Right); + _drawingTractor.MoveTransport(DirectionType.Right); break; } Draw(); } - } -} + private void buttonStep_Click(object sender, EventArgs e) + { + if (_drawingTractor == null) + { + return; + } + if (comboBoxStrategy.Enabled) + { + _abstractStrategy = comboBoxStrategy.SelectedIndex switch + { + 0 => new MoveToCenter(), + 1 => new MoveToRightCorner(), + _ => null, + }; + if (_abstractStrategy == null) + { + return; + } + _abstractStrategy.SetData(new + DrawingObjectTractor(_drawingTractor), pictureBoxBulldozer.Width, + pictureBoxBulldozer.Height); + comboBoxStrategy.Enabled = false; + } + if (_abstractStrategy == null) + { + return; + } + _abstractStrategy.MakeStep(); + Draw(); + if (_abstractStrategy.GetStatus() == Status.Finish) + { + comboBoxStrategy.Enabled = true; + _abstractStrategy = null; + } + } + + private void comboBoxStrategy_SelectedIndexChanged(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/ProjectBulldozer/MovementStrategy/AbstractStrategy.cs b/ProjectBulldozer/MovementStrategy/AbstractStrategy.cs new file mode 100644 index 0000000..6d0644d --- /dev/null +++ b/ProjectBulldozer/MovementStrategy/AbstractStrategy.cs @@ -0,0 +1,79 @@ +namespace ProjectBulldozer.MovementStrategy +{ + /// + /// Абстрактный класс стратегии + /// + public abstract class AbstractStrategy + { + private IMoveableObject? _moveableObject; + + private Status _state = Status.NotInit; + protected int FieldWidth { get; private set; } + protected int FieldHeight { get; private set; } + public Status GetStatus() { return _state; } + + public void SetData(IMoveableObject moveableObject, int width, int height) + { + if (moveableObject == null) + { + _state = Status.NotInit; + return; + } + _state = Status.InProgress; + _moveableObject = moveableObject; + FieldWidth = width; + FieldHeight = height; + } + + public void MakeStep() + { + if (_state != Status.InProgress) + { + return; + } + if (IsTargetDestinaion()) + { + _state = Status.Finish; + return; + } + MoveToTarget(); + } + + protected bool MoveLeft() => MoveTo(DirectionType.Left); + + protected bool MoveRight() => MoveTo(DirectionType.Right); + + protected bool MoveUp() => MoveTo(DirectionType.Up); + + protected bool MoveDown() => MoveTo(DirectionType.Down); + + /// Параметры объекта + protected ObjectParameters? GetObjectParameters => _moveableObject?.GetObjectPosition; + + protected int? GetStep() + { + if (_state != Status.InProgress) + { + return null; + } + return _moveableObject?.GetStep; + } + protected abstract void MoveToTarget(); + + protected abstract bool IsTargetDestinaion(); + + private bool MoveTo(DirectionType directionType) + { + if (_state != Status.InProgress) + { + return false; + } + if (_moveableObject?.CheckCanMove(directionType) ?? false) + { + _moveableObject.MoveObject(directionType); + return true; + } + return false; + } + } +} diff --git a/ProjectBulldozer/MovementStrategy/DrawingObjectTractor.cs b/ProjectBulldozer/MovementStrategy/DrawingObjectTractor.cs new file mode 100644 index 0000000..8df4ffe --- /dev/null +++ b/ProjectBulldozer/MovementStrategy/DrawingObjectTractor.cs @@ -0,0 +1,30 @@ + +using ProjectBulldozer.Drawings; + +namespace ProjectBulldozer.MovementStrategy +{ + public class DrawingObjectTractor : IMoveableObject + { + private readonly DrawingTractor? _drawningTractor = null; + + public DrawingObjectTractor(DrawingTractor drawningTractor) + { + _drawningTractor = drawningTractor; + } + public ObjectParameters? GetObjectPosition + { + get + { + if (_drawningTractor == null || _drawningTractor.EntityTractor == null) + { + return null; + } + return new ObjectParameters(_drawningTractor.GetPosX, + _drawningTractor.GetPosY, _drawningTractor.GetWidth, _drawningTractor.GetHeight); + } + } + public int GetStep => (int)(_drawningTractor?.EntityTractor?.Step ?? 0); + public bool CheckCanMove(DirectionType direction) => _drawningTractor?.CanMove(direction) ?? false; + public void MoveObject(DirectionType direction) => _drawningTractor?.MoveTransport(direction); + } +} diff --git a/ProjectBulldozer/MovementStrategy/IMoveableObject.cs b/ProjectBulldozer/MovementStrategy/IMoveableObject.cs new file mode 100644 index 0000000..4a1315e --- /dev/null +++ b/ProjectBulldozer/MovementStrategy/IMoveableObject.cs @@ -0,0 +1,13 @@ + +namespace ProjectBulldozer.MovementStrategy +{ + public interface IMoveableObject + { + ObjectParameters? GetObjectPosition { get; } + + int GetStep { get; } + + bool CheckCanMove(DirectionType direction); + void MoveObject(DirectionType direction); + } +} diff --git a/ProjectBulldozer/MovementStrategy/MoveToCenter.cs b/ProjectBulldozer/MovementStrategy/MoveToCenter.cs new file mode 100644 index 0000000..d16d4a7 --- /dev/null +++ b/ProjectBulldozer/MovementStrategy/MoveToCenter.cs @@ -0,0 +1,47 @@ + + +namespace ProjectBulldozer.MovementStrategy +{ + public class MoveToCenter : AbstractStrategy + { + protected override bool IsTargetDestinaion() + { + var objParams = GetObjectParameters; + if (objParams == null) return false; + + return objParams.ObjectMiddleHorizontal <= FieldWidth / 2 && objParams.ObjectMiddleHorizontal + + GetStep() >= FieldWidth / 2 && objParams.ObjectMiddleVertical <= FieldHeight / 2 && + objParams.ObjectMiddleVertical + GetStep() >= FieldHeight / 2; + } + + protected override void MoveToTarget() + { + var objParams = GetObjectParameters; + if (objParams == null) return; + var diffX = objParams.ObjectMiddleHorizontal - FieldWidth / 2; + if (Math.Abs(diffX) > GetStep()) + { + if (diffX > 0) + { + MoveLeft(); + } + else + { + MoveRight(); + } + } + var diffY = objParams.ObjectMiddleVertical - FieldHeight / 2; + if (Math.Abs(diffY) > GetStep()) + { + if (diffY > 0) + { + MoveUp(); + } + else + { + MoveDown(); + } + } + } + } +} diff --git a/ProjectBulldozer/MovementStrategy/MoveToRightCorner.cs b/ProjectBulldozer/MovementStrategy/MoveToRightCorner.cs new file mode 100644 index 0000000..37ac745 --- /dev/null +++ b/ProjectBulldozer/MovementStrategy/MoveToRightCorner.cs @@ -0,0 +1,25 @@ + + +namespace ProjectBulldozer.MovementStrategy +{ + public class MoveToRightCorner : AbstractStrategy + { + protected override bool IsTargetDestinaion() + { + var objParams = GetObjectParameters; + if (objParams == null) return false; + + return objParams.RightBorder >= FieldWidth - GetStep() && objParams.DownBorder >= FieldHeight - GetStep(); + } + + protected override void MoveToTarget() + { + var objParams = GetObjectParameters; + if (objParams == null) return; + + if (objParams.RightBorder < FieldWidth - GetStep()) MoveRight(); + if (objParams.DownBorder < FieldHeight - GetStep()) MoveDown(); + + } + } +} diff --git a/ProjectBulldozer/MovementStrategy/ObjectsParameters.cs b/ProjectBulldozer/MovementStrategy/ObjectsParameters.cs new file mode 100644 index 0000000..d0ce8f9 --- /dev/null +++ b/ProjectBulldozer/MovementStrategy/ObjectsParameters.cs @@ -0,0 +1,38 @@ + + +namespace ProjectBulldozer.MovementStrategy +{ + public class ObjectParameters + { + private readonly int _x; + 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 ObjectParameters(int x, int y, int width, int height) + { + _x = x; + _y = y; + _width = width; + _height = height; + } + } +} diff --git a/ProjectBulldozer/Program.cs b/ProjectBulldozer/Program.cs index ce4d1f0..b800f23 100644 --- a/ProjectBulldozer/Program.cs +++ b/ProjectBulldozer/Program.cs @@ -1,4 +1,4 @@ -namespace ProjectBulldozer +namespace Bulldozer { internal static class Program { @@ -11,7 +11,7 @@ namespace ProjectBulldozer // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new FormBulldozer()); + Application.Run(new Bulldozer()); } } } \ No newline at end of file diff --git a/ProjectBulldozer/Properties/Resources.Designer.cs b/ProjectBulldozer/Properties/Resources.Designer.cs index 273f98f..32374d8 100644 --- a/ProjectBulldozer/Properties/Resources.Designer.cs +++ b/ProjectBulldozer/Properties/Resources.Designer.cs @@ -59,5 +59,45 @@ namespace ProjectBulldozer.Properties { resourceCulture = value; } } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap down1 { + get { + object obj = ResourceManager.GetObject("down1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap left1 { + get { + object obj = ResourceManager.GetObject("left1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap right1 { + get { + object obj = ResourceManager.GetObject("right1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap up1 { + get { + object obj = ResourceManager.GetObject("up1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } } } diff --git a/ProjectBulldozer/Properties/Resources.resx b/ProjectBulldozer/Properties/Resources.resx index 1af7de1..bf99cff 100644 --- a/ProjectBulldozer/Properties/Resources.resx +++ b/ProjectBulldozer/Properties/Resources.resx @@ -117,4 +117,17 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\down1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\left1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\right1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\up1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/ProjectBulldozer/Resources/Down.png b/ProjectBulldozer/Resources/Down.png deleted file mode 100644 index ff3555accfb9136158fdcc6d0e4951b50ec51413..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10025 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 literal 0 HcmV?d00001 diff --git a/ProjectBulldozer/Resources/left1.png b/ProjectBulldozer/Resources/left1.png new file mode 100644 index 0000000000000000000000000000000000000000..cdbe6c7c57075d9d6d9ff3de9290f7854156a89a GIT binary patch literal 4073 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 literal 0 HcmV?d00001 diff --git a/ProjectBulldozer/Resources/up1.png b/ProjectBulldozer/Resources/up1.png new file mode 100644 index 0000000000000000000000000000000000000000..d29315dc2d1c440c41f82f27c0a4d140e36564d3 GIT binary patch literal 5154 zcmeHL{Z|ub77j6r!7AGk?T1#k$28MG1Ogs4b`)f7ZA_Z!nXuBdVx{76?1#{>)(MJ~ z3R;h~sSc!xgt+aVY&Nxpwy6bCY8omyFoG4VqM}4XDOex^X%qtNWzzj4_8flTaP!Rb zKKHrzzPZWC;g{7L=SDmk!Q=7fDqh?`@Ob=LJYLwyY(5~&ppJrnVY$S{6kbL1;$CdLHi^!<=BoOn5EKc~P6o4H@`};VSOsKwf{!#vCJI{1(%N| zZ<*r?&zXT=_RUzJam};11eqUhJM`BX*E9az+|TQ~)1b_lY4T4(A6wW!XP4Et4D1jU}&(sKtc7u|0S4KV3TUSpMXA;32`yUQ9#SJG;ZhAf6fAwr-PvrVXasHxO zOup7FE!|`ltQ_@vM`k-yM}gkc$%Ty+a=rV(|H4$)({q$4`1?0`RHq5bRZSo{Q$#LsF|i{RI_*J&Mkc zYC>=nz*%*imnAK<>&)+FF6RL~vijINoOQhj=VyJB%bkquQgljx30aY0LW_Hds|b4^ zE$j*PCEO?SWs2<$W}7bCDzGx%k<%=3CI;u@+jVQU8ym+dgqlaUR>5G^m=HU}^ezHw zBv4)65iwBZINw0(@?uEGEel$BC_!Gk+?l$oiFS3FEVmD6qgO#q>s9K(25ISQ_eH+h zVtarzHogS10=hLEWcxAUt#YQf4qEYoRWQ)x9XZAl`eitOPo{2^A|2<7(ZanldHzCY zYCTYknciHpEddJqL#1wUNlU|UepQw(4*{kTEnEa;EpVo8y+FH`n=RI(+UQCc6A4sC zTG|EY4>G-Gr~qcVC|V44rGW_nkWjwTR< zD1~&C>5&I;7G`s8NaV{9+sn+hif%>c43%1@>|kium`eSS*7l`X1rr8FGMQ95UHF@?>@>BF?wVrMEzX!i%j0VnI*<36Nt0iH60*2MlO^#?KGr&+qjVw25k zK|MEA>N5+SZLl-8m>5Y~rZJDS7M+4TH7tQQ(K!mSeM`BvPp(HQ8oVX*NC)awR4<`5 zZ^H4TsOJrpTC&}k7i}$yk;!caZ68cDw$57ulkf2;s%O!f8new>gnIZYb-PRIe*_a| zL2{Tp?1k0O(VERNWqvH~c9<>SexmK0uSc4p1?4Pp@*i0yBa#!;!YC^11k)7fVC zi7X#8k{~1X-^YYKZ|EXm_@mpbMY%G0alm9-cO3O>P^mo!SYl~CowHDE_sK{HEQZxH zX$@u8_HCySYl}DP<9KC04|mgMi~C*D5%^U>iQ)NjXWQ8!5k@nTM@+Wc2Gp}trOsfb ze%J*q8M=t<3}YS&mBh=7tDv9Zxcgsl{wttD7e9lna1XMZXy0nFJtvZMz%HN`)0*n} z&NkQu*oTbdR;jiRcEOS#y-@>~q<%3b+>@n?Fk~1<-?J8tCCH06CMffl;qIqEw##h$ zp&0dS1z9aiG+@F26pLpX*K{eW=YUtZ4q>>vADB;=Z1X5&7we5`u9NytW5TLTT}0M) z<0y=z4BC>Lpj_Kb=PUwOBU!(YqGeXG1>M*+rENK(JYa~&^|Fx zmy?dTVG#@Z3&4qsjt9|eJB*_;YmpF&g7lF?B9+OK66S0x7#5v7!ARPmsnE3DD)ncF zwS9XrVdXYmL_SMQGIUM}Bl#{tIerB7{Ds#11|vmrw;jZ1k&ZzMS$D}BWsFz)MX(bj zUw*sK*r$M1AbHz46~QXdT;Dk?y-H85g0I_eXum)`unG#xovFARRzYFXa*HhwxedJx z?zlO{D*!O?G{SR!KtT)z(7_{)t&uK zEtjvZ;GSvrjrCVOe4^&Wg2`Go{F!s{#~=UsLV946Geac%{K(mXQnK#FH#R)Brz7Ul z!DByt7&}mtc4F?b!;hxl+FiL~(F@43n(BL7cdq