diff --git a/WinF_Lab1_Cruiser - Ярлык.lnk b/WinF_Lab1_Cruiser - Ярлык.lnk new file mode 100644 index 0000000..10b6d7e Binary files /dev/null and b/WinF_Lab1_Cruiser - Ярлык.lnk differ 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 879783f..0000000 Binary files a/WinF_Lab1_Cruiser/CruiserMech/Resources/up_arrow.png and /dev/null differ