From 3e17af22181217730711ae82c16fcb4e63e17f9a Mon Sep 17 00:00:00 2001 From: DelphyAlmond Date: Tue, 16 Apr 2024 08:45:59 +0400 Subject: [PATCH] Directions(Centre&Boarder) --- WinF_Lab1_Cruiser - Ярлык.lnk | Bin 0 -> 1521 bytes .../CruiserMech/CruiserMech.csproj | 1 + .../CruiserMech/DrawingCanvas.Designer.cs | 107 ++++++-- .../CruiserMech/DrawingCanvas.cs | 84 +++++-- .../CruiserMech/DrawingCruiser.cs | 237 ------------------ .../Drawing_tools/DirectionType.cs | 17 ++ .../CruiserMech/Drawing_tools/DrawingBase.cs | 191 ++++++++++++++ .../Drawing_tools/DrawingCruiser.cs | 68 +++++ .../Entity_Folder/Base_Class_Cruiser.cs | 26 ++ .../Class_CruiserEntity.cs | 27 +- .../Move_Strategy/AbstractStrategy.cs | 111 ++++++++ .../CruiserMech/Move_Strategy/Boarder.cs | 56 +++++ .../CruiserMech/Move_Strategy/Center.cs | 51 ++++ .../CruiserMech/Move_Strategy/IMO.cs | 19 ++ .../Move_Strategy/MovableCruiser.cs | 56 +++++ .../Moves.cs} | 5 +- .../CruiserMech/Move_Strategy/ObjectParam.cs | 39 +++ .../CruiserMech/Move_Strategy/Status.cs | 15 ++ .../CruiserMech/Resources/up_arrow.png | Bin 25081 -> 0 bytes 19 files changed, 808 insertions(+), 302 deletions(-) create mode 100644 WinF_Lab1_Cruiser - Ярлык.lnk delete mode 100644 WinF_Lab1_Cruiser/CruiserMech/DrawingCruiser.cs create mode 100644 WinF_Lab1_Cruiser/CruiserMech/Drawing_tools/DirectionType.cs create mode 100644 WinF_Lab1_Cruiser/CruiserMech/Drawing_tools/DrawingBase.cs create mode 100644 WinF_Lab1_Cruiser/CruiserMech/Drawing_tools/DrawingCruiser.cs create mode 100644 WinF_Lab1_Cruiser/CruiserMech/Entity_Folder/Base_Class_Cruiser.cs rename WinF_Lab1_Cruiser/CruiserMech/{ => Entity_Folder}/Class_CruiserEntity.cs (51%) create mode 100644 WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/AbstractStrategy.cs create mode 100644 WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/Boarder.cs create mode 100644 WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/Center.cs create mode 100644 WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/IMO.cs create mode 100644 WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/MovableCruiser.cs rename WinF_Lab1_Cruiser/CruiserMech/{DirectionType.cs => Move_Strategy/Moves.cs} (72%) create mode 100644 WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/ObjectParam.cs create mode 100644 WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/Status.cs delete mode 100644 WinF_Lab1_Cruiser/CruiserMech/Resources/up_arrow.png diff --git a/WinF_Lab1_Cruiser - Ярлык.lnk b/WinF_Lab1_Cruiser - Ярлык.lnk new file mode 100644 index 0000000000000000000000000000000000000000..10b6d7e7fae39396f63438cafd46c0ebb9035c2b GIT binary patch literal 1521 zcma)6ZD>X;z z&pqe7=bU>(0Bj`%T!C?Gh5sO)hMn@Xqb~f{8+l{)BrgXM-@Ikk0`U4E045~luUk=ZczMtB0Bbw2E*jvGON^dD#pOV)X z(AdLuFwut;48$SM8?h}Pb&uBJv%~1@?=w;Tn8&Q;v2aE_3Kr7JbEEXtiGF%Dc~F8_ z-d|kH_Sm7WiG&&&-{-|z@;?3AF=s~0`AmDIMz1b(NcnQpd8k-}2ttU`pNVq%H_(N( zJY9jFe1sNlw%U%i;1+)*BoSWAM`+Rhsh*2aa7{8^_OA%R?kTh(fh7F%QQVYNMoCd` z@%R|t91EO?TzTNEJ-pXn zcy7OMV!G%+&mXg86Sh77cRtD*ETR8T=+GVB7QW;9Zc;_MdF1bl#YfGZt5ej!CBYnG zKs>4Qt2hNJd@O)Nsa0N4Ldr(+O2wr#DplNj72WD+k~5<}Hs$()36%-TQJPE=nmVBQ z&xE|{xA%)befdc5g#2UJkYSs}DFV7OFC+2@^l)oe-*JEAr z@|wY)icVj~_|{)nT-;CnO2W$3N1p3cYyL|z*%A5L{<}B&6MMgyp_k}j@pB2DT;AJs q{7`>jBv4;*wC3&1i`4HHg8*@_=JScJ*oXB)dg7h!?e=}5pQA_MctofG literal 0 HcmV?d00001 diff --git a/WinF_Lab1_Cruiser/CruiserMech/CruiserMech.csproj b/WinF_Lab1_Cruiser/CruiserMech/CruiserMech.csproj index d34a701..f0eacb9 100644 --- a/WinF_Lab1_Cruiser/CruiserMech/CruiserMech.csproj +++ b/WinF_Lab1_Cruiser/CruiserMech/CruiserMech.csproj @@ -6,6 +6,7 @@ enable true enable + true diff --git a/WinF_Lab1_Cruiser/CruiserMech/DrawingCanvas.Designer.cs b/WinF_Lab1_Cruiser/CruiserMech/DrawingCanvas.Designer.cs index 5e3e6d0..8698918 100644 --- a/WinF_Lab1_Cruiser/CruiserMech/DrawingCanvas.Designer.cs +++ b/WinF_Lab1_Cruiser/CruiserMech/DrawingCanvas.Designer.cs @@ -1,4 +1,9 @@ -namespace CruiserMech +using System.Drawing.Printing; +using System.Windows.Forms; +using static System.Net.Mime.MediaTypeNames; +using System.Xml.Linq; + +namespace CruiserMech { partial class DrawingCanvas { @@ -30,10 +35,14 @@ { pictureBox1 = new PictureBox(); CreateButton = new Button(); + CreateButton2 = new Button(); buttonUp = new Button(); buttonLeft = new Button(); buttonDown = new Button(); buttonRight = new Button(); + ButtonActivate = new Button(); + comboBox = new ComboBox(); + Activate = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit(); SuspendLayout(); // @@ -41,31 +50,45 @@ // pictureBox1.Dock = DockStyle.Fill; pictureBox1.Location = new Point(0, 0); + pictureBox1.Margin = new Padding(6); pictureBox1.Name = "pictureBox1"; - pictureBox1.Size = new Size(548, 283); + pictureBox1.Size = new Size(1018, 604); pictureBox1.TabIndex = 0; pictureBox1.TabStop = false; // // CreateButton // CreateButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; - CreateButton.Location = new Point(12, 218); + CreateButton.Location = new Point(22, 465); + CreateButton.Margin = new Padding(6); CreateButton.Name = "CreateButton"; - CreateButton.Size = new Size(75, 53); + CreateButton.Size = new Size(139, 113); CreateButton.TabIndex = 1; CreateButton.Text = "Create object"; CreateButton.UseVisualStyleBackColor = true; CreateButton.Click += buttonCr_Click; // + // CreateButton2 + // + CreateButton2.Location = new Point(22, 26); + CreateButton2.Margin = new Padding(6); + CreateButton2.Name = "CreateButton2"; + CreateButton2.Size = new Size(139, 113); + CreateButton2.TabIndex = 2; + CreateButton2.Text = "Cr Updated Object"; + CreateButton2.UseVisualStyleBackColor = true; + CreateButton2.Click += buttonCr2_Click; + // // buttonUp // buttonUp.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonUp.BackgroundImage = Properties.Resources.up_arrow_res; buttonUp.BackgroundImageLayout = ImageLayout.Stretch; - buttonUp.Location = new Point(440, 174); + buttonUp.Location = new Point(817, 371); + buttonUp.Margin = new Padding(6); buttonUp.Name = "buttonUp"; - buttonUp.Size = new Size(45, 45); - buttonUp.TabIndex = 2; + buttonUp.Size = new Size(84, 96); + buttonUp.TabIndex = 3; buttonUp.UseVisualStyleBackColor = true; buttonUp.Click += ButtonMove_Click; // @@ -74,10 +97,11 @@ buttonLeft.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonLeft.BackgroundImage = Properties.Resources.left_arrow_res; buttonLeft.BackgroundImageLayout = ImageLayout.Stretch; - buttonLeft.Location = new Point(389, 225); + buttonLeft.Location = new Point(722, 480); + buttonLeft.Margin = new Padding(6); buttonLeft.Name = "buttonLeft"; - buttonLeft.Size = new Size(45, 45); - buttonLeft.TabIndex = 3; + buttonLeft.Size = new Size(84, 96); + buttonLeft.TabIndex = 4; buttonLeft.UseVisualStyleBackColor = true; buttonLeft.Click += ButtonMove_Click; // @@ -86,10 +110,11 @@ buttonDown.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonDown.BackgroundImage = Properties.Resources.down_arrow_res; buttonDown.BackgroundImageLayout = ImageLayout.Stretch; - buttonDown.Location = new Point(440, 225); + buttonDown.Location = new Point(817, 480); + buttonDown.Margin = new Padding(6); buttonDown.Name = "buttonDown"; - buttonDown.Size = new Size(45, 45); - buttonDown.TabIndex = 4; + buttonDown.Size = new Size(84, 96); + buttonDown.TabIndex = 5; buttonDown.UseVisualStyleBackColor = true; buttonDown.Click += ButtonMove_Click; // @@ -98,41 +123,81 @@ buttonRight.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonRight.BackgroundImage = Properties.Resources.right_arrow_res; buttonRight.BackgroundImageLayout = ImageLayout.Stretch; - buttonRight.Location = new Point(491, 225); + buttonRight.Location = new Point(912, 480); + buttonRight.Margin = new Padding(6); buttonRight.Name = "buttonRight"; - buttonRight.Size = new Size(45, 45); - buttonRight.TabIndex = 5; + buttonRight.Size = new Size(84, 96); + buttonRight.TabIndex = 6; buttonRight.UseVisualStyleBackColor = true; buttonRight.Click += ButtonMove_Click; // + // ListComboBox + // + // + // ButtonActivate + // + ButtonActivate.Anchor = AnchorStyles.Right; + ButtonActivate.Location = new Point(22, 149); + ButtonActivate.Margin = new Padding(6); + ButtonActivate.Name = "ButtonActivate"; + ButtonActivate.Size = new Size(84, 96); + ButtonActivate.TabIndex = 8; + ButtonActivate.UseVisualStyleBackColor = true; + ButtonActivate.Click += comboBox_Activate; + // + // comboBox1 + // + comboBox.FormattingEnabled = true; + comboBox.Items.AddRange(new object[] { "Center", "Boarder" }); + comboBox.Location = new Point(188, 26); + comboBox.Name = "Directions"; + comboBox.Size = new Size(203, 40); + comboBox.TabIndex = 9; + // + // Activate + // + Activate.Location = new Point(188, 93); + Activate.Name = "Activate"; + Activate.Size = new Size(203, 46); + Activate.TabIndex = 10; + Activate.Text = "ActivateStep"; + Activate.UseVisualStyleBackColor = true; + Activate.Click += comboBox_Activate; + // // DrawingCanvas // - AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleDimensions = new SizeF(13F, 32F); AutoScaleMode = AutoScaleMode.Font; AutoValidate = AutoValidate.EnableAllowFocusChange; BackColor = Color.CornflowerBlue; - ClientSize = new Size(548, 283); + ClientSize = new Size(1018, 604); + Controls.Add(Activate); + Controls.Add(comboBox); Controls.Add(buttonRight); Controls.Add(buttonDown); Controls.Add(buttonLeft); Controls.Add(buttonUp); Controls.Add(CreateButton); + Controls.Add(CreateButton2); Controls.Add(pictureBox1); - Margin = new Padding(2, 1, 2, 1); + Controls.Add(ButtonActivate); + Margin = new Padding(4, 2, 4, 2); Name = "DrawingCanvas"; StartPosition = FormStartPosition.Manual; Text = "DrawingCanvas"; ((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit(); ResumeLayout(false); } - #endregion - private PictureBox pictureBox1; private Button CreateButton; + private Button CreateButton2; private Button buttonUp; private Button buttonLeft; private Button buttonDown; private Button buttonRight; + private Button ButtonActivate; + private ComboBox comboBox; + private Button Activate; } } \ No newline at end of file diff --git a/WinF_Lab1_Cruiser/CruiserMech/DrawingCanvas.cs b/WinF_Lab1_Cruiser/CruiserMech/DrawingCanvas.cs index e9adfd8..980dd8e 100644 --- a/WinF_Lab1_Cruiser/CruiserMech/DrawingCanvas.cs +++ b/WinF_Lab1_Cruiser/CruiserMech/DrawingCanvas.cs @@ -1,27 +1,25 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; +using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; - +using CruiserMech.Drawing_tools; +using CruiserMech.Entity_Folder; +using CruiserMech.Move_Strategy; namespace CruiserMech { public partial class DrawingCanvas : Form { - - private DrawingCruiser? _DrCruiser; - + private DrawingBase? _DrCruiser; + private AbstractStrategy _strategy; public DrawingCanvas() { InitializeComponent(); + _strategy = null; } - //private DrawingCanvas_Load(object sender, EventArgs e); - private void Draw() { if (_DrCruiser == null) @@ -29,32 +27,64 @@ namespace CruiserMech return; } Bitmap bmp = new(pictureBox1.Width, pictureBox1.Height); - Graphics gr = Graphics.FromImage(bmp); - _DrCruiser.DrawTransport(gr); + Graphics gr = Graphics.FromImage(bmp); _DrCruiser.DrawTransport(gr); pictureBox1.Image = bmp; - } - private void buttonCr_Click(object sender, EventArgs e) + private void CreateObj(string type) { - Random rn = new(); - - Class_CruiserEntity CruiserEntity = new Class_CruiserEntity(); - CruiserEntity.Init(rn.Next(100, 300), rn.Next(1000, 3000), - Color.FromArgb(rn.Next(0, 256), rn.Next(0, 256), rn.Next(0, 256)), - Color.FromArgb(rn.Next(0, 256), rn.Next(0, 256), rn.Next(0, 256)), - Convert.ToBoolean(rn.Next(0, 2)), Convert.ToBoolean(rn.Next(0, 2)), - Convert.ToBoolean(rn.Next(0, 2)), rn.Next(1, 4), rn.Next(5, 10), rn.Next(1, 3)); - - _DrCruiser = new DrawingCruiser(); - _DrCruiser.Init(CruiserEntity); - // 32, 44 + Random rn = new Random(); + switch (type) + { + case nameof(DrawingBase): + _DrCruiser = new DrawingBase(rn.Next(100, 300), rn.Next(1000, 3000), Color.FromArgb(rn.Next(0, 256), rn.Next(0, 256), rn.Next(0, 256))); + break; + case nameof(DrawingCruiser): + Class_CruiserEntity Obj = new Class_CruiserEntity(rn.Next(100, 300), rn.Next(1000, 3000), + Color.FromArgb(rn.Next(0, 256), rn.Next(0, 256), rn.Next(0, 256)), Color.FromArgb(rn.Next(0, 256), rn.Next(0, 256), rn.Next(0, 256)), + Convert.ToBoolean(rn.Next(0, 2)), Convert.ToBoolean(rn.Next(0, 2)), rn.Next(1, 4), rn.Next(5, 10), rn.Next(1, 3)); + _DrCruiser = new DrawingCruiser(Obj); + break; + default: + return; + } _DrCruiser.SetPicSize(pictureBox1.Width, pictureBox1.Height); - _DrCruiser.SetPos(rn.Next(pictureBox1.Width - 600, pictureBox1.Width - _DrCruiser._CruiserMaxW), rn.Next(0, 100)); - + _DrCruiser.SetPos(rn.Next(pictureBox1.Width - 600, pictureBox1.Width - _DrCruiser._CruiserMaxW), rn.Next(0, 100)); _strategy = null; + comboBox.Enabled = true; Draw(); } + private void comboBox_Activate(object sender, EventArgs e) + { + if (_DrCruiser == null) return; + + if (comboBox.Enabled) + { + _strategy = comboBox.SelectedIndex switch + { + 0 => new Center(), + 1 => new Boarder() + }; + + if (_strategy == null) return; + _strategy.SetData(new MovableCruiser(_DrCruiser), pictureBox1.Width, pictureBox1.Height); + } + + if (_strategy == null) return; + comboBox.Enabled = false; + + _strategy.MakeStep(); + Draw(); + + if (_strategy.GetStatus() == Status.Finish) + { + comboBox.Enabled = true; + _strategy = null; + } + } + + private void buttonCr2_Click(object sender, EventArgs e) => CreateObj(nameof(DrawingCruiser)); + private void buttonCr_Click(object sender, EventArgs e) => CreateObj(nameof(DrawingBase)); private void ButtonMove_Click(object sender, EventArgs e) { if (_DrCruiser == null) diff --git a/WinF_Lab1_Cruiser/CruiserMech/DrawingCruiser.cs b/WinF_Lab1_Cruiser/CruiserMech/DrawingCruiser.cs deleted file mode 100644 index 291fe5a..0000000 --- a/WinF_Lab1_Cruiser/CruiserMech/DrawingCruiser.cs +++ /dev/null @@ -1,237 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing.Drawing2D; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CruiserMech -{ - internal class DrawingCruiser - { - /// Инициализация свойств (все параметры класса (сущности)) - public Class_CruiserEntity? CruiserEntity { get; private set; } - - - /// Передача размеров поля для прорисовки (размеры поля - 2 параметра) - private int? _pictureWidth; - private int? _pictureHeight; - - - public readonly int _CruiserMaxW = 302; // 262 - public readonly int _CruiserMaxH = 72; // 92 - - - /// Установка начальной позиции (координаты - 2 параметра: - /// левая верхняя точка, от которой рисуется объект) - private int? _startPosX; - private int? _startPosY; - - - public void Init(Class_CruiserEntity CruiserEntity) - { - CruiserEntity = new Class_CruiserEntity(); - } - - - public bool SetPicSize(int w, int h) - { - if (w > _pictureWidth || h > _pictureHeight) - { - return false; - } - - _pictureWidth = w; - _pictureHeight = h; - - if (_startPosX != null || _startPosY != null) - { - SetPos(_startPosX.Value, _startPosY.Value); - } - - return true; - } - - public void SetPos(int x, int y) - { - if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) - { - return; - } - - if (x > _pictureWidth - _CruiserMaxW) _startPosX = _pictureWidth - _CruiserMaxW; - else if (x < 0) _startPosX = 0; - else _startPosX = x; - - if (y > _pictureHeight - _CruiserMaxH) _startPosY = _pictureHeight.Value - _CruiserMaxH; - else if (y < 0) _startPosY = 0; - else _startPosY = y; - } - - public bool MoveTransport(DirectionType direction) - { - if (CruiserEntity == null || !_startPosX.HasValue || - !_startPosY.HasValue) - { - return false; - } - switch (direction) - { - //влево - case DirectionType.Left: - if (_startPosX.Value - CruiserEntity.Step > 0) - { - _startPosX -= (int)CruiserEntity.Step; - } - return true; - //вверх - case DirectionType.Up: - if (_startPosY.Value - CruiserEntity.Step > 0) - { - _startPosY -= (int)CruiserEntity.Step; - } - return true; - // вправо - case DirectionType.Right: - if (_startPosX.Value + _CruiserMaxW + CruiserEntity.Step < _pictureWidth.Value) - { - _startPosX += (int)CruiserEntity.Step; - } - return true; - //вниз - case DirectionType.Down: - if (_startPosY.Value + _CruiserMaxH + CruiserEntity.Step < _pictureHeight.Value) - { - _startPosY += (int)CruiserEntity.Step; - } - return true; - - default: - return false; - } - } - - /// Перемещение объекта (удалось перемещение - true \ false) - - public void DrawTransport(Graphics g) - { - if (CruiserEntity == null || !_startPosX.HasValue || - !_startPosY.HasValue) - { - return; - } - - Pen pen = new(Color.Black, 2); - Brush PadBrush = new HatchBrush(HatchStyle.DottedDiamond, Color.LightGray, Color.Black); - Brush additionalBrush = new SolidBrush(CruiserEntity.AdditionalC); - Brush mainBrush = new SolidBrush(CruiserEntity.MainC); - - Random random = new(); - - //границы cruiser - - //Point point0 = new Point(_startPosX.Value + 2, _startPosY.Value + 22); - //Point point1 = new Point(_startPosX.Value + 5, _startPosY.Value + 66); - //Point point2 = new Point(_startPosX.Value + 184, _startPosY.Value + 90); // max y : 92 - //Point point3 = new Point(_startPosX.Value + 184, _startPosY.Value + 70); // max x : 262 - //Point point4 = new Point(_startPosX.Value + 260, _startPosY.Value + 62); - //Point point5 = new Point(_startPosX.Value + 260, _startPosY.Value + 32); - //Point point6 = new Point(_startPosX.Value + 172, _startPosY.Value + 18); - //Point point7 = new Point(_startPosX.Value + 160, _startPosY.Value + 2); - //Point point8 = new Point(_startPosX.Value + 2, _startPosY.Value + 22); - - Point point0 = new Point(_startPosX.Value + 2, _startPosY.Value + 7); - Point point1 = new Point(_startPosX.Value + 2, _startPosY.Value + 30); - Point point2 = new Point(_startPosX.Value + 184, _startPosY.Value + 42); - Point point3 = new Point(_startPosX.Value + 260, _startPosY.Value + 34); - Point point4 = new Point(_startPosX.Value + 300, _startPosY.Value + 22); - Point point5 = new Point(_startPosX.Value + 260, _startPosY.Value + 10); - Point point6 = new Point(_startPosX.Value + 184, _startPosY.Value + 2); - //Point point7 = new Point(_startPosX.Value + 2, _startPosY.Value + 36); - - Point[] boarders = { - point0, - point1, - point2, - point3, - point4, - point5, - point6, - //point7, - //point8 - }; - - g.DrawPolygon(pen, boarders); - g.FillPolygon(mainBrush, boarders); - - // вертолетная площадка (3) - //if (CruiserEntity.HelicopterPads) - //{ - // random number of pads : from 1 to 3 - // int n = CruiserEntity.values[0]; - // int w = 15; - // int h = 41; - - // for (int i = 1; i <= n; i++) - // { - // g.DrawEllipse(pen, _startPosX.Value + w, _startPosY.Value + h, 20, 20); - // g.FillEllipse(PadBrush, _startPosX.Value + w, _startPosY.Value + h, 20, 20); - // w += 28; - // h += 3; - // } - //} - - - if (CruiserEntity.HelicopterPads) - { - g.DrawEllipse(pen, _startPosX.Value + 170, _startPosY.Value + 11, 20, 20); - g.FillEllipse(PadBrush, _startPosX.Value + 170, _startPosY.Value + 11, 20, 20); - } - - - // салон на верхней палубе - if (CruiserEntity.Deckhouse) - { - // random location - int y_h = CruiserEntity.values[1]; - g.DrawRectangle(pen, _startPosX.Value + 100, _startPosY.Value + y_h, 38, 24); // 40, 26 - - g.DrawRectangle(pen, _startPosX.Value + 110, _startPosY.Value + y_h + 6, 20, 12); - g.FillRectangle(additionalBrush, _startPosX.Value + 110, _startPosY.Value + y_h + 6, 20, 12); - g.DrawRectangle(pen, _startPosX.Value + 117, _startPosY.Value + y_h + 18, 6, 20); - g.FillRectangle(additionalBrush, _startPosX.Value + 117, _startPosY.Value + y_h + 18, 6, 20); - } - - // ангар (2) - //if (CruiserEntity.Hangar) - //{ - // int n = CruiserEntity.values[2]; - - // if (n == 1) - // { - // g.FillRectangle(additionalBrush, _startPosX.Value + 105, _startPosY.Value + 18, 14, 7); - // } - // else - // { - // g.FillRectangle(additionalBrush, _startPosX.Value + 146, _startPosY.Value + 52, 10, 26); - // g.FillRectangle(additionalBrush, _startPosX.Value + 160, _startPosY.Value + 58, 8, 12); - // } - //} - - if (CruiserEntity.Hangar) - { - int n = CruiserEntity.values[2]; - if (n == 1) g.FillRectangle(additionalBrush, _startPosX.Value + 250, _startPosY.Value + 20, 14, 7); - - else - { - g.FillRectangle(additionalBrush, _startPosX.Value + 80, _startPosY.Value + 10, 10, 20); - g.FillRectangle(additionalBrush, _startPosX.Value + 70, _startPosY.Value + 12, 8, 12); - } - } - - } - } -} - - diff --git a/WinF_Lab1_Cruiser/CruiserMech/Drawing_tools/DirectionType.cs b/WinF_Lab1_Cruiser/CruiserMech/Drawing_tools/DirectionType.cs new file mode 100644 index 0000000..76e3569 --- /dev/null +++ b/WinF_Lab1_Cruiser/CruiserMech/Drawing_tools/DirectionType.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CruiserMech.Drawing_tools +{ + public enum DirectionType + { + Unknown = -1, + Up = 1, + Down = 2, + Left = 3, + Right = 4 + } +} diff --git a/WinF_Lab1_Cruiser/CruiserMech/Drawing_tools/DrawingBase.cs b/WinF_Lab1_Cruiser/CruiserMech/Drawing_tools/DrawingBase.cs new file mode 100644 index 0000000..1d7fc57 --- /dev/null +++ b/WinF_Lab1_Cruiser/CruiserMech/Drawing_tools/DrawingBase.cs @@ -0,0 +1,191 @@ +using System; +using System.Collections.Generic; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CruiserMech.Entity_Folder; + +namespace CruiserMech.Drawing_tools +{ + public class DrawingBase + { + /// Инициализация свойств (все параметры класса (сущности)) + public Base_Class_Cruiser? BaseEntity { get; protected set; } + + /// Передача размеров поля & объекта + private int? _pictureWidth; + private int? _pictureHeight; + + public readonly int _CruiserMaxW = 302; + public readonly int _CruiserMaxH = 72; + + /// Установка позиции + protected int? _startPosX; + protected int? _startPosY; + + // for relationship with Moves* + + public int? GetPosX => _startPosX; + public int? GetPosY => _startPosY; + public int GetWidth => _CruiserMaxW; + public int GetHeight => _CruiserMaxH; + + private DrawingBase() + { + _pictureHeight = null; + _pictureWidth = null; + _startPosX = null; + _startPosY = null; + } + + public DrawingBase(int speed, double weight, Color mainc) : this() + { + BaseEntity = new Base_Class_Cruiser(speed, weight, mainc); + } + + protected DrawingBase(int MaxW, int MaxH) : this() + { + _CruiserMaxW = MaxW; + _CruiserMaxH = MaxH; + } + + + public bool SetPicSize(int w, int h) + { + if (w > _pictureWidth || h > _pictureHeight) + { + return false; + } + + _pictureWidth = w; + _pictureHeight = h; + + if (_startPosX != null || _startPosY != null) + { + SetPos(_startPosX.Value, _startPosY.Value); + } + + return true; + } + + public void SetPos(int x, int y) + { + if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) + { + return; + } + + if (x > _pictureWidth - _CruiserMaxW) _startPosX = _pictureWidth - _CruiserMaxW; + else if (x < 0) _startPosX = 0; + else _startPosX = x; + + if (y > _pictureHeight - _CruiserMaxH) _startPosY = _pictureHeight.Value - _CruiserMaxH; + else if (y < 0) _startPosY = 0; + else _startPosY = y; + } + + public bool MoveTransport(DirectionType direction) // public Direction (?) + { + if (BaseEntity == null || !_startPosX.HasValue || + !_startPosY.HasValue) + { + return false; + } + switch (direction) + { + //влево + case DirectionType.Left: + if (_startPosX.Value - BaseEntity.Step > 0) + { + _startPosX -= (int)BaseEntity.Step; + } + return true; + //вверх + case DirectionType.Up: + if (_startPosY.Value - BaseEntity.Step > 0) + { + _startPosY -= (int)BaseEntity.Step; + } + return true; + // вправо + case DirectionType.Right: + if (_startPosX.Value + _CruiserMaxW + BaseEntity.Step < _pictureWidth.Value) + { + _startPosX += (int)BaseEntity.Step; + } + return true; + //вниз + case DirectionType.Down: + if (_startPosY.Value + _CruiserMaxH + BaseEntity.Step < _pictureHeight.Value) + { + _startPosY += (int)BaseEntity.Step; + } + return true; + + default: + return false; + } + } + + public virtual void DrawTransport(Graphics g) + { + if (BaseEntity == null || !_startPosX.HasValue || + !_startPosY.HasValue) + { + return; + } + + Pen pen = new(Color.Black, 2); + Brush PadBrush = new HatchBrush(HatchStyle.DottedDiamond, Color.LightGray, Color.Black); + // Brush additionalBrush = new SolidBrush(BaseEntity.AdditionalC); + Brush mainBrush = new SolidBrush(BaseEntity.MainC); + + Random random = new(); + + // границы cruiser + + Point point0 = new Point(_startPosX.Value + 2, _startPosY.Value + 7); + Point point1 = new Point(_startPosX.Value + 2, _startPosY.Value + 30); + Point point2 = new Point(_startPosX.Value + 184, _startPosY.Value + 42); + Point point3 = new Point(_startPosX.Value + 260, _startPosY.Value + 34); + Point point4 = new Point(_startPosX.Value + 300, _startPosY.Value + 22); + Point point5 = new Point(_startPosX.Value + 260, _startPosY.Value + 10); + Point point6 = new Point(_startPosX.Value + 184, _startPosY.Value + 2); + + Point[] boarders = { + point0, + point1, + point2, + point3, + point4, + point5, + point6, + }; + + g.DrawPolygon(pen, boarders); + g.FillPolygon(mainBrush, boarders); + + g.DrawRectangle(pen, _startPosX.Value + 100, _startPosY.Value + 7, 38, 24); + g.DrawRectangle(pen, _startPosX.Value + 110, _startPosY.Value + 7, 20, 12); + g.FillRectangle(mainBrush, _startPosX.Value + 110, _startPosY.Value + 7, 20, 12); + g.DrawRectangle(pen, _startPosX.Value + 117, _startPosY.Value + 18, 6, 20); + g.FillRectangle(mainBrush, _startPosX.Value + 117, _startPosY.Value + 18, 6, 20); + + // салон на верхней палубе + //if (BaseEntity.Deckhouse) + //{ + // // random location + // int y_h = BaseEntity.values[1]; + // g.DrawRectangle(pen, _startPosX.Value + 100, _startPosY.Value + y_h, 38, 24); // 40, 26 + // + // g.DrawRectangle(pen, _startPosX.Value + 110, _startPosY.Value + y_h + 6, 20, 12); + // g.FillRectangle(additionalBrush, _startPosX.Value + 110, _startPosY.Value + y_h + 6, 20, 12); + // g.DrawRectangle(pen, _startPosX.Value + 117, _startPosY.Value + y_h + 18, 6, 20); + // g.FillRectangle(additionalBrush, _startPosX.Value + 117, _startPosY.Value + y_h + 18, 6, 20); + //} + } + + } + +} diff --git a/WinF_Lab1_Cruiser/CruiserMech/Drawing_tools/DrawingCruiser.cs b/WinF_Lab1_Cruiser/CruiserMech/Drawing_tools/DrawingCruiser.cs new file mode 100644 index 0000000..3065d1f --- /dev/null +++ b/WinF_Lab1_Cruiser/CruiserMech/Drawing_tools/DrawingCruiser.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CruiserMech.Entity_Folder; + +namespace CruiserMech.Drawing_tools +{ + internal class DrawingCruiser : DrawingBase + { + /// Инициализация свойств (все параметры класса (сущности)) + // public Class_CruiserEntity? CE { get; private set; } + // CE = new Class_CruiserEntity( <...> ); + + // public DrawingCruiser(int speed, double weight, + // Color mainc, Color addtc, bool pad, + // bool hangar, int p, int d_coordinates, int h) : base(302, 72) // <...> + //{ + // BaseEntity = new Class_CruiserEntity(speed, weight, mainc, addtc, pad, hangar, p, d_coordinates, h); + //} + + public DrawingCruiser(Class_CruiserEntity Obj) : base(302, 72) + { + BaseEntity = Obj; + } + + public override void DrawTransport(Graphics g) + { + if (BaseEntity is not Class_CruiserEntity cruiser || !_startPosX.HasValue || + !_startPosY.HasValue) + { + return; + } + + base.DrawTransport(g); + + Pen pen = new(Color.Black, 2); + Brush PadBrush = new HatchBrush(HatchStyle.DottedDiamond, Color.LightGray, Color.Black); + Brush additionalBrush = new SolidBrush(cruiser.AdditionalC); + Random random = new(); + + //границы cruiser <...> + + if (cruiser.HelicopterPads) + { + g.DrawEllipse(pen, _startPosX.Value + 170, _startPosY.Value + 11, 20, 20); + g.FillEllipse(PadBrush, _startPosX.Value + 170, _startPosY.Value + 11, 20, 20); + } + + // салон на верхней палубе - Deckhouse <...> + if (cruiser.Hangar) + { + int n = cruiser.values[2]; + if (n == 1) g.FillRectangle(additionalBrush, _startPosX.Value + 250, _startPosY.Value + 20, 14, 7); + + else + { + g.FillRectangle(additionalBrush, _startPosX.Value + 80, _startPosY.Value + 10, 10, 20); + g.FillRectangle(additionalBrush, _startPosX.Value + 70, _startPosY.Value + 12, 8, 12); + } + } + } + } +} + + diff --git a/WinF_Lab1_Cruiser/CruiserMech/Entity_Folder/Base_Class_Cruiser.cs b/WinF_Lab1_Cruiser/CruiserMech/Entity_Folder/Base_Class_Cruiser.cs new file mode 100644 index 0000000..adef8b5 --- /dev/null +++ b/WinF_Lab1_Cruiser/CruiserMech/Entity_Folder/Base_Class_Cruiser.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CruiserMech.Entity_Folder +{ + public class Base_Class_Cruiser + { + /// MAIN свойства + public int Speed { get; private set; } + public double Weight { get; private set; } + public Color MainC { get; private set; } + public double Step => Speed * 100 / Weight; + + /// Конструктор + public Base_Class_Cruiser(int speed, double weight, + Color mainc) + { + Speed = speed; + Weight = weight; + MainC = mainc; + } + } +} diff --git a/WinF_Lab1_Cruiser/CruiserMech/Class_CruiserEntity.cs b/WinF_Lab1_Cruiser/CruiserMech/Entity_Folder/Class_CruiserEntity.cs similarity index 51% rename from WinF_Lab1_Cruiser/CruiserMech/Class_CruiserEntity.cs rename to WinF_Lab1_Cruiser/CruiserMech/Entity_Folder/Class_CruiserEntity.cs index 43f5627..5fd0a2d 100644 --- a/WinF_Lab1_Cruiser/CruiserMech/Class_CruiserEntity.cs +++ b/WinF_Lab1_Cruiser/CruiserMech/Entity_Folder/Class_CruiserEntity.cs @@ -5,35 +5,32 @@ using System.Text; using System.Threading.Tasks; -namespace CruiserMech +namespace CruiserMech.Entity_Folder { - internal class Class_CruiserEntity + internal class Class_CruiserEntity : Base_Class_Cruiser { - /// свойства - public int Speed { get; private set; } - public double Weight { get; private set; } - public Color MainC { get; private set; } + /// ADDITIONAL свойства public Color AdditionalC { get; private set; } /// признаки (наличия) public bool HelicopterPads { get; private set; } /// вертолетная площадка - public bool Hangar { get; private set; } /// ангар + public bool Hangar { get; private set; } /// ангар public bool Deckhouse { get; private set; } /// салон на верхней палубе - public double Step => Speed * 100 / Weight; public int[] values = { 0, 0, 0 }; - public void Init(int speed, double weight, - Color mainc, Color addtc, bool pad, - bool hangar, bool deckhouse, int p, int d_coordinates, int h) + public Class_CruiserEntity(int speed, double weight, + Color mainc, Color addtc, bool pad, + bool hangar, int p, int d_coordinates, int h) : base(speed, weight, mainc) { - Speed = speed; - Weight = weight; - MainC = mainc; + // NOT PUBLIC, so: -> impossible + //base.Speed = speed; + //base.Weight = weight; + //base.MainC = mainc; + AdditionalC = addtc; HelicopterPads = pad; Hangar = hangar; - Deckhouse = deckhouse; values[0] = p; values[1] = d_coordinates; values[2] = h; diff --git a/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/AbstractStrategy.cs b/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/AbstractStrategy.cs new file mode 100644 index 0000000..55e4d4b --- /dev/null +++ b/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/AbstractStrategy.cs @@ -0,0 +1,111 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CruiserMech.Move_Strategy +{ + public abstract class AbstractStrategy + { + private IMO? _movableObj; + + private Status _state = Status.NotInit; + + protected int FieldHeight { get; private set; } + protected int FieldWidth { get; private set; } + + public Status GetStatus() { return _state; } // => _state; + + public void SetData(IMO movableObj, int width, int height) + { + if (movableObj == null) + { + _state = Status.NotInit; + return; + } + + _state = Status.InProgress; + _movableObj = movableObj; + FieldWidth = width; + FieldHeight = height; + } + + public void MakeStep() + { + if (_state != Status.InProgress) + { + return; + } + + if (IsTargetDes()) + { + _state = Status.Finish; + return; + } + + MoveToTarget(); + } + + protected bool MoveLeft() => MoveTo(Moves.Left); + protected bool MoveRight() => MoveTo(Moves.Right); + protected bool MoveUp() => MoveTo(Moves.Up); + protected bool MoveDown() => MoveTo(Moves.Down); + + protected ObjectParam? GetObjParam => _movableObj?.GetPos; + + protected int? GetStep() + { + if (_state != Status.InProgress) + { + return null; + } + + return _movableObj?.GetStep; + } + + protected virtual void MoveToTarget() + { + ObjectParam? objParams = GetObjParam; + + if (objParams == null) { return; } + + int diffx = objParams.MiddleHorizontal - FieldWidth / 2; + + if (Math.Abs(diffx) > GetStep()) + { + if (diffx > 0) MoveLeft(); + else MoveRight(); + } + + int diffy = objParams.MiddleVertical - FieldHeight / 2; + + if (Math.Abs(diffy) > GetStep()) + { + if (diffy > 0) MoveUp(); + else MoveDown(); + } + } + + protected virtual bool IsTargetDes() + { + ObjectParam? objParams = GetObjParam; + if (objParams == null) { return false; } + + return objParams.MiddleHorizontal - GetStep() <= FieldWidth / 2 && + objParams.MiddleHorizontal + GetStep() >= FieldWidth / 2 && + objParams.MiddleVertical - GetStep() <= FieldHeight / 2 && + objParams.MiddleVertical + GetStep() >= FieldHeight / 2; + } + + private bool MoveTo(Moves moves) + { + if (_state != Status.InProgress) + { + return false; + } + + return _movableObj?.TryMoveObj(moves) ?? false; + } + } +} diff --git a/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/Boarder.cs b/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/Boarder.cs new file mode 100644 index 0000000..7ffaa47 --- /dev/null +++ b/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/Boarder.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CruiserMech.Move_Strategy; + +public class Boarder : AbstractStrategy +{ + protected override bool IsTargetDes() + { + ObjectParam? objP = GetObjParam; + if (objP == null) + { + return false; + } + + return FieldWidth - GetStep() < objP.SecondCoordX + && FieldHeight - GetStep() < objP.SecondCoordY; + } + + protected override void MoveToTarget() + { + ObjectParam? objP = GetObjParam; + if (objP == null) + { + return; + } + + int s = (int)GetStep(); + + int diffx = objP.SecondCoordX - (FieldWidth - s); + if (Math.Abs(diffx) > GetStep()) + { + if (diffx > 0) + { + MoveLeft(); + + // MoveRight(); + } + else { MoveRight(); } + } + + int diffy = objP.SecondCoordY - (FieldHeight - s); + if (Math.Abs(diffy) > GetStep()) + { + if (diffy > 0) + { + MoveUp(); + // MoveDown(); + } + else { MoveDown(); } + } + } +} diff --git a/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/Center.cs b/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/Center.cs new file mode 100644 index 0000000..a8dfb5a --- /dev/null +++ b/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/Center.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CruiserMech.Move_Strategy; + +public class Center : AbstractStrategy +{ + protected override bool IsTargetDes() + { + ObjectParam? objP = GetObjParam; + if (objP == null) + { + return false; + } + + return objP.MiddleHorizontal - GetStep() <= FieldWidth / 2 && objP.MiddleHorizontal + GetStep() >= FieldWidth / 2 + && objP.MiddleVertical - GetStep() <= FieldHeight / 2 && objP.MiddleVertical + GetStep() >= FieldHeight / 2; + } + + protected override void MoveToTarget() + { + ObjectParam? objP = GetObjParam; + if (objP == null) + { + return; + } + + int diffx = objP.MiddleHorizontal - FieldWidth / 2; + if (Math.Abs(diffx) > GetStep()) + { + if (diffx > 0) + { + MoveLeft(); + } + else { MoveRight(); } + } + + int diffy = objP.MiddleVertical - FieldHeight / 2; + if (Math.Abs(diffy) > GetStep()) + { + if (diffy > 0) + { + MoveUp(); + } + else { MoveDown(); } + } + } +} diff --git a/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/IMO.cs b/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/IMO.cs new file mode 100644 index 0000000..c76a11f --- /dev/null +++ b/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/IMO.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CruiserMech.Move_Strategy +{ + public interface IMO + { + // methods ! only + + ObjectParam? GetPos { get; } + + int GetStep { get; } + + bool TryMoveObj(Moves direction); + } +} diff --git a/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/MovableCruiser.cs b/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/MovableCruiser.cs new file mode 100644 index 0000000..fbb2f60 --- /dev/null +++ b/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/MovableCruiser.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CruiserMech.Drawing_tools; + +namespace CruiserMech.Move_Strategy +{ + public class MovableCruiser : IMO + { + private readonly DrawingBase? _DrBase = null; + + public MovableCruiser(DrawingBase drBase) + { + _DrBase = drBase; + } + + public ObjectParam? GetPos + { + get + { + if (_DrBase == null || _DrBase.BaseEntity == null || !_DrBase.GetPosX.HasValue || !_DrBase.GetPosY.HasValue) + { + return null; + } + + return new ObjectParam(_DrBase.GetPosX.Value, _DrBase.GetPosY.Value, _DrBase.GetWidth, _DrBase.GetHeight); + } + } + + public int GetStep => (int)(_DrBase?.BaseEntity?.Step ?? 0); + + public bool TryMoveObj(Moves direction) + { + if (_DrBase == null || _DrBase.BaseEntity == null) + { + return false; + } + + return _DrBase.MoveTransport(GetDirectionType(direction)); + } + + private static DirectionType GetDirectionType(Moves direction) + { + return direction switch + { + Moves.Left => DirectionType.Left, + Moves.Right => DirectionType.Right, + Moves.Up => DirectionType.Up, + Moves.Down => DirectionType.Down, + _ => DirectionType.Unknown + }; + } + } +} diff --git a/WinF_Lab1_Cruiser/CruiserMech/DirectionType.cs b/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/Moves.cs similarity index 72% rename from WinF_Lab1_Cruiser/CruiserMech/DirectionType.cs rename to WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/Moves.cs index 41295b5..4ac4dac 100644 --- a/WinF_Lab1_Cruiser/CruiserMech/DirectionType.cs +++ b/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/Moves.cs @@ -4,10 +4,11 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace CruiserMech +namespace CruiserMech.Move_Strategy { - internal enum DirectionType + public enum Moves { + Unknown = -1, Up = 1, Down = 2, Left = 3, diff --git a/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/ObjectParam.cs b/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/ObjectParam.cs new file mode 100644 index 0000000..3dfb21d --- /dev/null +++ b/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/ObjectParam.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CruiserMech.Move_Strategy +{ + public class ObjectParam + { + private readonly int _x; + private readonly int _y; + + private readonly int _width; + private readonly int _height; + + public int LeftBorder => _x; + public int RightBorder => _x + _width; + + public int TopBorder => _y; + public int BottomBorder => _y + _height; + + + public int MiddleHorizontal => _x + _width / 2; + public int MiddleVertical => _y + _height / 2; + + + public int SecondCoordY => _y + _height; + public int SecondCoordX => _x + _width; + + public ObjectParam(int x, int y, int width, int height) + { + _x = x; + _y = y; + _width = width; + _height = height; + } + } +} diff --git a/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/Status.cs b/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/Status.cs new file mode 100644 index 0000000..f7b8452 --- /dev/null +++ b/WinF_Lab1_Cruiser/CruiserMech/Move_Strategy/Status.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CruiserMech.Move_Strategy +{ + public enum Status + { + NotInit, + InProgress, + Finish + } +} diff --git a/WinF_Lab1_Cruiser/CruiserMech/Resources/up_arrow.png b/WinF_Lab1_Cruiser/CruiserMech/Resources/up_arrow.png deleted file mode 100644 index 879783fa482237bd2bcb066a620578d106abe5ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25081 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 Jx9>Ue{{dnyra%Ay