PIbd22_Kamcharova_K.A._lab2

This commit is contained in:
MayDayR 2023-11-14 13:11:54 +03:00
parent e8db2c1ab2
commit 51a21db2aa
18 changed files with 698 additions and 201 deletions

View File

@ -0,0 +1,75 @@
using DoubleDeckerbus.MovementStrategy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using DoubleDeckerbus.DrawingObjects;
namespace DoubleDeckerbus.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;
}
}
}

View File

@ -4,9 +4,9 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DoubleDeckerBus
namespace DoubleDeckerbus
{
internal enum Direction
public enum DirectionType
{
Up = 1,
Down = 2,

View File

@ -1,29 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DoubleDeckerBus
{
public class EntityDoubleDeckerBus
{
public int Speed { get; private set; }
public double Weight { get; private set; }
public Color BodyColor { get; private set; }
public Color AdditionalColor { get; private set; }
public bool Stairs { get; private set; }
public bool SecondFloor { get; private set; }
public double Step => (double)Speed * 100 / Weight;
public void Init(int speed, double weight, Color bodyColor, Color
additionalColor, bool secondFloor, bool stairs)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
AdditionalColor = additionalColor;
Stairs = secondFloor;
SecondFloor = stairs;
}
}
}

View File

@ -4,138 +4,127 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DoubleDeckerBus
using DoubleDeckerbus.Entities;
namespace DoubleDeckerbus.DrawingObjects
{
internal class DrawingBus
public class DrawingBus
{
public EntityDoubleDeckerBus? EntityDoubleDeckerBus { get; private set; }
private int _pictureWidth;
private int _pictureHeight;
private int _startPosX;
private int _startPosY;
private readonly int _busWidth = 180;
private readonly int _busHeight = 120;
public bool Init(EntityDoubleDeckerBus bus, int width, int height)
public EntityBus? EntityBus { get; protected set; }
public int _pictureWidth;
public int _pictureHeight;
protected int _startPosX;
protected int _startPosY;
protected readonly int _busWidth = 175;
protected readonly int _busHeight = 115;
public int GetPosX => _startPosX;
public int GetPosY => _startPosY;
public int GetWidth => _busWidth;
public int GetHeight => _busHeight;
public DrawingBus(int speed, double weight, Color bodyColor, int width, int height)
{
if (width < _busWidth || height < _busHeight)
{
return;
}
_pictureWidth = width;
_pictureHeight = height;
EntityDoubleDeckerBus = bus;
if (_pictureWidth < _busWidth || _pictureHeight < _busHeight)
EntityBus = new EntityBus(speed, weight, bodyColor);
}
protected DrawingBus(int speed, double weight, Color bodyColor, int width, int height, int busWidth, int busHeight)
{
if (width < _busWidth || height < _busHeight)
{
return false;
return;
}
return true;
_pictureWidth = width;
_pictureHeight = height;
_busWidth = busWidth;
_busHeight = busHeight;
EntityBus = new EntityBus(speed, weight, bodyColor);
}
public void SetPosition(int x, int y)
{
if (x > _pictureWidth || y > _pictureHeight)
{
return;
}
_startPosX = x;
_startPosY = y;
if (_startPosX + _busWidth > _pictureWidth) {
_startPosX = _pictureWidth - _busWidth;
}
if (_startPosX < 0)
{
_startPosX = 0;
}
if (_startPosY + _busHeight > _pictureHeight)
{
_startPosY = _pictureHeight - _busHeight;
}
if (_startPosY < 0)
{
_startPosY = 0;
}
}
public void MoveTransport(Direction direction)
{
if (EntityDoubleDeckerBus == null)
public void MoveTransport(DirectionType direction)
{
if (!CanMove(direction) || EntityBus == null)
{
return;
}
switch (direction)
{
case Direction.Left:
if (_startPosX - EntityDoubleDeckerBus.Step > 0)
case DirectionType.Left:
if (_startPosX - EntityBus.Step > 0)
{
_startPosX -= (int)EntityDoubleDeckerBus.Step;
_startPosX -= (int)EntityBus.Step;
}
break;
case Direction.Up:
if (_startPosY - EntityDoubleDeckerBus.Step > 0)
case DirectionType.Up:
if (_startPosY - EntityBus.Step > 0)
{
_startPosY -= (int)EntityDoubleDeckerBus.Step;
_startPosY -= (int)EntityBus.Step;
}
break;
case Direction.Right:
if (_startPosX + EntityDoubleDeckerBus.Step + _busWidth < _pictureWidth)
case DirectionType.Right:
if (_startPosX + _busWidth + EntityBus.Step < _pictureWidth)
{
_startPosX += (int)EntityDoubleDeckerBus.Step;
_startPosX += (int)EntityBus.Step;
}
break;
case Direction.Down:
if (_startPosY + EntityDoubleDeckerBus.Step + _busHeight < _pictureHeight)
case DirectionType.Down:
if (_startPosY + _busHeight + EntityBus.Step < _pictureHeight)
{
_startPosY += (int)EntityDoubleDeckerBus.Step;
_startPosY += (int)EntityBus.Step;
}
break;
}
}
public void DrawTransport(Graphics g)
public virtual void DrawTransport(Graphics g)
{
if (EntityDoubleDeckerBus == null)
{
return;
}
Pen pen = new(Color.Black);
Brush bodyColor = new
SolidBrush(EntityDoubleDeckerBus.BodyColor);
g.FillRectangle(bodyColor, _startPosX + 147, _startPosY + 52, 21, 20);
g.FillRectangle(bodyColor, _startPosX + 147, _startPosY + 71, 30, 27);
g.FillRectangle(bodyColor, _startPosX + 10, _startPosY + 52, 137, 46);
Brush additionalBrush = new
SolidBrush(EntityBus.BodyColor);
g.FillRectangle(additionalBrush, _startPosX + 147, _startPosY + 52, 21, 20); //маленький
g.FillRectangle(additionalBrush, _startPosX + 147, _startPosY + 71, 30, 27); //2
g.FillRectangle(additionalBrush, _startPosX + 10, _startPosY + 52, 137, 46); //большой прямоугольник 2
Brush brBlue = new SolidBrush(Color.LightBlue);
g.FillRectangle(brBlue, _startPosX + 150, _startPosY + 55, 15, 15);
g.FillRectangle(brBlue, _startPosX + 42, _startPosY + 55, 15, 15);
g.FillRectangle(brBlue, _startPosX + 69, _startPosY + 55, 15, 15);
g.FillRectangle(brBlue, _startPosX + 96, _startPosY + 55, 15, 15);
g.FillRectangle(brBlue, _startPosX + 123, _startPosY + 55, 15, 15);
g.DrawLine(pen, _startPosX + 30, _startPosY + 52, _startPosX + 30, _startPosY + 98);
g.DrawLine(pen, _startPosX + 35, _startPosY + 52, _startPosX + 35, _startPosY + 98);
//ВТОРОЙ ЭТАЖ
if (EntityDoubleDeckerBus.SecondFloor)
{
Brush additionalColor = new
SolidBrush(EntityDoubleDeckerBus.AdditionalColor);
g.FillRectangle(additionalColor, _startPosX + 7, _startPosY + 12, 172, 40);
g.DrawLine(pen, _startPosX + 7, _startPosY + 36, _startPosX + 178, _startPosY + 36);
g.FillRectangle(brBlue, _startPosX + 15, _startPosY + 15, 15, 15);
g.FillRectangle(brBlue, _startPosX + 42, _startPosY + 15, 15, 15);
g.FillRectangle(brBlue, _startPosX + 69, _startPosY + 15, 15, 15);
g.FillRectangle(brBlue, _startPosX + 96, _startPosY + 15, 15, 15);
g.FillRectangle(brBlue, _startPosX + 123, _startPosY + 15, 15, 15);
g.FillRectangle(brBlue, _startPosX + 150, _startPosY + 15, 15, 15);
}
//ЛЕСТНИЦА
if (EntityDoubleDeckerBus.Stairs)
{
g.DrawLine(pen, _startPosX + 10, _startPosY + 55, _startPosX + 34, _startPosY + 55);
g.DrawLine(pen, _startPosX + 10, _startPosY + 58, _startPosX + 34, _startPosY + 58);
g.DrawLine(pen, _startPosX + 10, _startPosY + 64, _startPosX + 34, _startPosY + 64);
g.DrawLine(pen, _startPosX + 10, _startPosY + 72, _startPosX + 34, _startPosY + 72);
g.DrawLine(pen, _startPosX + 10, _startPosY + 80, _startPosX + 34, _startPosY + 80);
g.DrawLine(pen, _startPosX + 10, _startPosY + 88, _startPosX + 34, _startPosY + 88);
g.DrawLine(pen, _startPosX + 10, _startPosY + 94, _startPosX + 34, _startPosY + 94);
}
// колёса
Brush gr = new SolidBrush(Color.Gray);
g.FillEllipse(bodyColor, _startPosX + 23, _startPosY + 88, 25, 25);
g.FillEllipse(bodyColor, _startPosX + 123, _startPosY + 88, 25, 25);
g.FillEllipse(additionalBrush, _startPosX + 23, _startPosY + 88, 25, 25);
g.FillEllipse(additionalBrush, _startPosX + 123, _startPosY + 88, 25, 25);
g.FillEllipse(gr, _startPosX + 25, _startPosY + 90, 21, 21);
g.FillEllipse(gr, _startPosX + 125, _startPosY + 90, 21, 21);
}
public bool CanMove(DirectionType direction)
{
if (EntityBus == null)
{
return false;
}
return direction switch
{
DirectionType.Left => _startPosX - EntityBus.Step > 0,
DirectionType.Up => _startPosY - EntityBus.Step > 0,
DirectionType.Right => _startPosX + _busWidth + EntityBus.Step < _pictureWidth,
DirectionType.Down => _startPosY + _busHeight + EntityBus.Step < _pictureHeight,
_ => false,
};
}
}
}

View File

@ -0,0 +1,61 @@
using DoubleDeckerbus.DrawingObjects;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DoubleDeckerbus.Entities;
namespace DoubleDeckerbus
{
public class DrawingDoubleDeckerbus : DrawingBus
{
public DrawingDoubleDeckerbus(int speed, double weight, Color bodyColor, Color additionalColor, bool secondfloor, bool stairs, int width, int height) : base(speed, weight, bodyColor, width, height, 180, 110)
{
if (EntityBus != null)
{
EntityBus = new EntityDoubleDeckerBus(speed, weight, bodyColor, additionalColor, secondfloor, stairs);
}
}
public override void DrawTransport(Graphics g)
{
if (EntityBus is not EntityDoubleDeckerBus doubleDeckerBus)
{
return;
}
Pen pen = new(Color.Black);
Pen additionalPen = new(doubleDeckerBus.AdditionalColor);
Brush additionalBrush = new SolidBrush(doubleDeckerBus.AdditionalColor);
base.DrawTransport(g);
if (doubleDeckerBus.Secondfloor)
{
Brush additionalBrush2 = new SolidBrush(doubleDeckerBus.AdditionalColor);
Brush brBlue = new SolidBrush(Color.LightBlue);
g.FillRectangle(additionalBrush2, _startPosX + 7, _startPosY + 12, 172, 40);
g.DrawLine(pen, _startPosX + 7, _startPosY + 36, _startPosX + 178, _startPosY + 36);
g.FillRectangle(brBlue, _startPosX + 15, _startPosY + 15, 15, 15);
g.FillRectangle(brBlue, _startPosX + 42, _startPosY + 15, 15, 15);
g.FillRectangle(brBlue, _startPosX + 69, _startPosY + 15, 15, 15);
g.FillRectangle(brBlue, _startPosX + 96, _startPosY + 15, 15, 15);
g.FillRectangle(brBlue, _startPosX + 123, _startPosY + 15, 15, 15);
g.FillRectangle(brBlue, _startPosX + 150, _startPosY + 15, 15, 15);
}
if (doubleDeckerBus.Stairs)
{
g.DrawLine(pen, _startPosX + 10, _startPosY + 55, _startPosX + 34, _startPosY + 55);
g.DrawLine(pen, _startPosX + 10, _startPosY + 58, _startPosX + 34, _startPosY + 58);
g.DrawLine(pen, _startPosX + 10, _startPosY + 64, _startPosX + 34, _startPosY + 64);
g.DrawLine(pen, _startPosX + 10, _startPosY + 72, _startPosX + 34, _startPosY + 72);
g.DrawLine(pen, _startPosX + 10, _startPosY + 80, _startPosX + 34, _startPosY + 80);
g.DrawLine(pen, _startPosX + 10, _startPosY + 88, _startPosX + 34, _startPosY + 88);
g.DrawLine(pen, _startPosX + 10, _startPosY + 94, _startPosX + 34, _startPosY + 94);
}
}
}
}

View File

@ -0,0 +1,35 @@
using DoubleDeckerbus.MovementStrategy;
using DoubleDeckerbus;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading.Tasks;
using DoubleDeckerbus.DrawingObjects;
namespace DoubleDeckerbus.MovementStrategy
{
public class DrawingObjectBus : IMoveableObject
{
private readonly DrawingBus? _drawingBus = null;
public DrawingObjectBus(DrawingBus drawingBus)
{
_drawingBus = drawingBus;
}
public ObjectParameters? GetObjectPosition
{
get
{
if (_drawingBus == null || _drawingBus.EntityBus == null)
{
return null;
}
return new ObjectParameters(_drawingBus.GetPosX,_drawingBus.GetPosY, _drawingBus.GetWidth, _drawingBus.GetHeight);
}
}
public int GetStep => (int)(_drawingBus?.EntityBus?.Step ?? 0);
public bool CheckCanMove(DirectionType direction) => _drawingBus?.CanMove(direction) ?? false;
public void MoveObject(DirectionType direction) => _drawingBus?.MoveTransport(direction);
}
}

View File

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DoubleDeckerbus.Entities
{
public class EntityBus
{
public int Speed { get; private set; }
public double Weight { get; private set; }
public Color BodyColor { get; private set; }
public double Step => (double)Speed * 100 / Weight;
public EntityBus(int speed, double weight, Color bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
}
}
}

View File

@ -0,0 +1,22 @@
using DoubleDeckerbus.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DoubleDeckerbus.Entities
{
public class EntityDoubleDeckerBus : EntityBus
{
public Color AdditionalColor { get; private set; }
public bool Secondfloor { get; private set; }
public bool Stairs { get; private set; }
public EntityDoubleDeckerBus(int speed, double weight, Color bodyColor, Color additionalColor, bool secondfloor, bool stairs) : base(speed, weight, bodyColor)
{
AdditionalColor = additionalColor;
Secondfloor = secondfloor;
Stairs = stairs;
}
}
}

View File

@ -1,4 +1,4 @@
namespace DoubleDeckerBus
namespace DoubleDeckerbus
{
partial class FormDoubleDeckerBus
{
@ -28,111 +28,153 @@
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormDoubleDeckerBus));
this.pictureBoxBus = new System.Windows.Forms.PictureBox();
this.buttonCreate = new System.Windows.Forms.Button();
this.pictureBoxDoubleDeckerbus = new System.Windows.Forms.PictureBox();
this.DoubleDeckerbus = new System.Windows.Forms.Button();
this.buttonUp = new System.Windows.Forms.Button();
this.buttonDown = new System.Windows.Forms.Button();
this.buttonLeft = new System.Windows.Forms.Button();
this.buttonDown = new System.Windows.Forms.Button();
this.buttonRight = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxBus)).BeginInit();
this.comboBoxStrategy = new System.Windows.Forms.ComboBox();
this.buttonStep = new System.Windows.Forms.Button();
this.buttonCreateBus = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxDoubleDeckerbus)).BeginInit();
this.SuspendLayout();
//
// pictureBoxBus
// pictureBoxDoubleDeckerbus
//
this.pictureBoxBus.Dock = System.Windows.Forms.DockStyle.Fill;
this.pictureBoxBus.Location = new System.Drawing.Point(0, 0);
this.pictureBoxBus.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.pictureBoxBus.Name = "pictureBoxBus";
this.pictureBoxBus.Size = new System.Drawing.Size(1010, 615);
this.pictureBoxBus.TabIndex = 1;
this.pictureBoxBus.TabStop = false;
this.pictureBoxDoubleDeckerbus.Dock = System.Windows.Forms.DockStyle.Fill;
this.pictureBoxDoubleDeckerbus.Location = new System.Drawing.Point(0, 0);
this.pictureBoxDoubleDeckerbus.Name = "pictureBoxDoubleDeckerbus";
this.pictureBoxDoubleDeckerbus.Size = new System.Drawing.Size(882, 453);
this.pictureBoxDoubleDeckerbus.TabIndex = 5;
this.pictureBoxDoubleDeckerbus.TabStop = false;
//
// buttonCreate
// DoubleDeckerbus
//
this.buttonCreate.Location = new System.Drawing.Point(14, 541);
this.buttonCreate.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.buttonCreate.Name = "buttonCreate";
this.buttonCreate.Size = new System.Drawing.Size(95, 57);
this.buttonCreate.TabIndex = 2;
this.buttonCreate.Text = "Создать";
this.buttonCreate.UseVisualStyleBackColor = true;
this.buttonCreate.Click += new System.EventHandler(this.buttonCreate_Click);
this.DoubleDeckerbus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.DoubleDeckerbus.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.DoubleDeckerbus.Location = new System.Drawing.Point(11, 365);
this.DoubleDeckerbus.Name = "DoubleDeckerbus";
this.DoubleDeckerbus.Size = new System.Drawing.Size(120, 73);
this.DoubleDeckerbus.TabIndex = 6;
this.DoubleDeckerbus.Text = "Создать Двухэтажный автобус";
this.DoubleDeckerbus.UseVisualStyleBackColor = true;
this.DoubleDeckerbus.Click += new System.EventHandler(this.buttonCreateDoubleDeckerbus_Click);
//
// buttonUp
//
this.buttonUp.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("buttonUp.BackgroundImage")));
this.buttonUp.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.buttonUp.BackgroundImage = global::DoubleDeckerBus.Properties.Resources.ArrowUp;
this.buttonUp.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.buttonUp.Location = new System.Drawing.Point(896, 487);
this.buttonUp.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.buttonUp.Location = new System.Drawing.Point(811, 377);
this.buttonUp.Name = "buttonUp";
this.buttonUp.Size = new System.Drawing.Size(46, 53);
this.buttonUp.TabIndex = 3;
this.buttonUp.Size = new System.Drawing.Size(30, 29);
this.buttonUp.TabIndex = 7;
this.buttonUp.UseVisualStyleBackColor = true;
this.buttonUp.Click += new System.EventHandler(this.ButtonMove_Click);
//
// buttonDown
//
this.buttonDown.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("buttonDown.BackgroundImage")));
this.buttonDown.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.buttonDown.Location = new System.Drawing.Point(896, 548);
this.buttonDown.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.buttonDown.Name = "buttonDown";
this.buttonDown.Size = new System.Drawing.Size(46, 53);
this.buttonDown.TabIndex = 4;
this.buttonDown.UseVisualStyleBackColor = true;
this.buttonDown.Click += new System.EventHandler(this.ButtonMove_Click);
this.buttonUp.Click += new System.EventHandler(this.buttonMove_Click);
//
// buttonLeft
//
this.buttonLeft.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("buttonLeft.BackgroundImage")));
this.buttonLeft.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.buttonLeft.BackgroundImage = global::DoubleDeckerBus.Properties.Resources.ArrowLeft;
this.buttonLeft.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.buttonLeft.Location = new System.Drawing.Point(843, 547);
this.buttonLeft.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.buttonLeft.Location = new System.Drawing.Point(776, 413);
this.buttonLeft.Name = "buttonLeft";
this.buttonLeft.Size = new System.Drawing.Size(46, 53);
this.buttonLeft.TabIndex = 5;
this.buttonLeft.Size = new System.Drawing.Size(30, 29);
this.buttonLeft.TabIndex = 8;
this.buttonLeft.UseVisualStyleBackColor = true;
this.buttonLeft.Click += new System.EventHandler(this.ButtonMove_Click);
this.buttonLeft.Click += new System.EventHandler(this.buttonMove_Click);
//
// buttonDown
//
this.buttonDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.buttonDown.BackgroundImage = global::DoubleDeckerBus.Properties.Resources.ArrowDown;
this.buttonDown.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.buttonDown.Location = new System.Drawing.Point(811, 413);
this.buttonDown.Name = "buttonDown";
this.buttonDown.Size = new System.Drawing.Size(30, 29);
this.buttonDown.TabIndex = 9;
this.buttonDown.UseVisualStyleBackColor = true;
this.buttonDown.Click += new System.EventHandler(this.buttonMove_Click);
//
// buttonRight
//
this.buttonRight.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("buttonRight.BackgroundImage")));
this.buttonRight.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.buttonRight.BackgroundImage = global::DoubleDeckerBus.Properties.Resources.ArrowRight;
this.buttonRight.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.buttonRight.Location = new System.Drawing.Point(949, 547);
this.buttonRight.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.buttonRight.Location = new System.Drawing.Point(848, 413);
this.buttonRight.Name = "buttonRight";
this.buttonRight.Size = new System.Drawing.Size(46, 53);
this.buttonRight.TabIndex = 6;
this.buttonRight.Size = new System.Drawing.Size(30, 29);
this.buttonRight.TabIndex = 10;
this.buttonRight.UseVisualStyleBackColor = true;
this.buttonRight.Click += new System.EventHandler(this.ButtonMove_Click);
this.buttonRight.Click += new System.EventHandler(this.buttonMove_Click);
//
// DDBus
// comboBoxStrategy
//
this.comboBoxStrategy.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.comboBoxStrategy.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboBoxStrategy.FormattingEnabled = true;
this.comboBoxStrategy.Items.AddRange(new object[] {
"В центр",
"В правый нижний угол"});
this.comboBoxStrategy.Location = new System.Drawing.Point(719, 12);
this.comboBoxStrategy.Name = "comboBoxStrategy";
this.comboBoxStrategy.Size = new System.Drawing.Size(151, 28);
this.comboBoxStrategy.TabIndex = 11;
//
// buttonStep
//
this.buttonStep.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.buttonStep.Location = new System.Drawing.Point(747, 45);
this.buttonStep.Name = "buttonStep";
this.buttonStep.Size = new System.Drawing.Size(94, 29);
this.buttonStep.TabIndex = 12;
this.buttonStep.Text = "Шаг";
this.buttonStep.UseVisualStyleBackColor = true;
this.buttonStep.Click += new System.EventHandler(this.buttonStep_Click);
//
// buttonCreateBus
//
this.buttonCreateBus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.buttonCreateBus.Location = new System.Drawing.Point(138, 388);
this.buttonCreateBus.Name = "buttonCreateBus";
this.buttonCreateBus.Size = new System.Drawing.Size(120, 51);
this.buttonCreateBus.TabIndex = 13;
this.buttonCreateBus.Text = "Создать автобус";
this.buttonCreateBus.UseVisualStyleBackColor = true;
this.buttonCreateBus.Click += new System.EventHandler(this.buttonCreateBus_Click);
//
// FormDoubleDeckerbus
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1010, 615);
this.ClientSize = new System.Drawing.Size(882, 453);
this.Controls.Add(this.buttonCreateBus);
this.Controls.Add(this.buttonStep);
this.Controls.Add(this.comboBoxStrategy);
this.Controls.Add(this.buttonRight);
this.Controls.Add(this.buttonLeft);
this.Controls.Add(this.buttonDown);
this.Controls.Add(this.buttonLeft);
this.Controls.Add(this.buttonUp);
this.Controls.Add(this.buttonCreate);
this.Controls.Add(this.pictureBoxBus);
this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.Name = "DDBus";
this.Text = "Bus";
((System.ComponentModel.ISupportInitialize)(this.pictureBoxBus)).EndInit();
this.Controls.Add(this.DoubleDeckerbus);
this.Controls.Add(this.pictureBoxDoubleDeckerbus);
this.Name = "FormDoubleDeckerbus";
this.Text = "DoubleDeckerbus";
((System.ComponentModel.ISupportInitialize)(this.pictureBoxDoubleDeckerbus)).EndInit();
this.ResumeLayout(false);
}
#endregion
private PictureBox pictureBoxBus;
private Button buttonCreate;
private PictureBox pictureBoxDoubleDeckerbus;
private Button DoubleDeckerbus;
private Button buttonUp;
private Button buttonDown;
private Button buttonLeft;
private Button buttonDown;
private Button buttonRight;
private ComboBox comboBoxStrategy;
private Button buttonStep;
private Button buttonCreateBus;
}
}

View File

@ -1,8 +1,12 @@
namespace DoubleDeckerBus
using DoubleDeckerbus.DrawingObjects;
using DoubleDeckerbus.MovementStrategy;
namespace DoubleDeckerbus
{
public partial class FormDoubleDeckerBus : Form
{
private DrawingBus? _drawingBus;
private AbstractStrategy? _abstractStrategy;
public FormDoubleDeckerBus()
{
InitializeComponent();
@ -13,29 +17,38 @@ namespace DoubleDeckerBus
{
return;
}
Bitmap bmp = new(pictureBoxBus.Width, pictureBoxBus.Height);
Bitmap bmp = new(pictureBoxDoubleDeckerbus.Width, pictureBoxDoubleDeckerbus.Height);
Graphics gr = Graphics.FromImage(bmp);
_drawingBus.DrawTransport(gr);
pictureBoxBus.Image = bmp;
pictureBoxDoubleDeckerbus.Image = bmp;
}
private void buttonCreate_Click(object sender, EventArgs e)
private void buttonCreateDoubleDeckerbus_Click(object sender, EventArgs e)
{
Random random = new();
_drawingBus = new DrawingBus();
EntityDoubleDeckerBus bus = new EntityDoubleDeckerBus();
bus.Init(random.Next(100, 300),
_drawingBus = new DrawingDoubleDeckerbus(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)));
_drawingBus.Init(bus, pictureBoxBus.Width, pictureBoxBus.Height);
_drawingBus.SetPosition(random.Next(10, 100),
random.Next(10, 100));
true,
Convert.ToBoolean(random.Next(0, 2)),
pictureBoxDoubleDeckerbus.Width, pictureBoxDoubleDeckerbus.Height);
_drawingBus.SetPosition(random.Next(10, 100), random.Next(10, 100));
Draw();
}
private void ButtonMove_Click(object sender, EventArgs e)
private void buttonCreateBus_Click(object sender, EventArgs e)
{
Random random = new();
_drawingBus = new DrawingBus(random.Next(100, 300),
random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256),
random.Next(0, 256)),
pictureBoxDoubleDeckerbus.Width, pictureBoxDoubleDeckerbus.Height);
_drawingBus.SetPosition(random.Next(10, 100), random.Next(10, 100));
Draw();
}
private void buttonMove_Click(object sender, EventArgs e)
{
if (_drawingBus == null)
{
@ -45,19 +58,53 @@ namespace DoubleDeckerBus
switch (name)
{
case "buttonUp":
_drawingBus.MoveTransport(Direction.Up);
_drawingBus.MoveTransport(DirectionType.Up);
break;
case "buttonDown":
_drawingBus.MoveTransport(Direction.Down);
_drawingBus.MoveTransport(DirectionType.Down);
break;
case "buttonLeft":
_drawingBus.MoveTransport(Direction.Left);
_drawingBus.MoveTransport(DirectionType.Left);
break;
case "buttonRight":
_drawingBus.MoveTransport(Direction.Right);
_drawingBus.MoveTransport(DirectionType.Right);
break;
}
Draw();
}
private void buttonStep_Click(object sender, EventArgs e)
{
if (_drawingBus == null)
{
return;
}
if (comboBoxStrategy.Enabled)
{
_abstractStrategy = comboBoxStrategy.SelectedIndex
switch
{
0 => new MoveToCenter(),
1 => new MoveToBorder(),
_ => null,
};
if (_abstractStrategy == null)
{
return;
}
_abstractStrategy.SetData(new DrawingObjectBus(_drawingBus), pictureBoxDoubleDeckerbus.Width, pictureBoxDoubleDeckerbus.Height);
comboBoxStrategy.Enabled = false;
}
if (_abstractStrategy == null)
{
return;
}
_abstractStrategy.MakeStep();
Draw();
if (_abstractStrategy.GetStatus() == Status.Finish)
{
comboBoxStrategy.Enabled = true;
_abstractStrategy = null;
}
}
}
}

View File

@ -1,4 +1,64 @@
<root>
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">

View File

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DoubleDeckerbus.DrawingObjects;
namespace DoubleDeckerbus.MovementStrategy
{
public interface IMoveableObject
{
ObjectParameters? GetObjectPosition { get; }
int GetStep { get; }
bool CheckCanMove(DirectionType direction);
void MoveObject(DirectionType direction);
}
}

View File

@ -0,0 +1,56 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DoubleDeckerbus.MovementStrategy
{
internal class MoveToBorder : AbstractStrategy
{
protected override bool IsTargetDestinaion()
{
var objParams = GetObjectParameters;
if (objParams == null)
{
return false;
}
return objParams.RightBorder <= FieldWidth &&
objParams.RightBorder + GetStep() >= FieldWidth &&
objParams.DownBorder <= FieldHeight &&
objParams.DownBorder + GetStep() >= FieldHeight;
}
protected override void MoveToTarget()
{
var objParams = GetObjectParameters;
if (objParams == null)
{
return;
}
var diffX = objParams.ObjectMiddleHorizontal - FieldWidth;
if (Math.Abs(diffX) > GetStep())
{
if (diffX > 0)
{
MoveLeft();
}
else
{
MoveRight();
}
}
var diffY = objParams.ObjectMiddleVertical - FieldHeight;
if (Math.Abs(diffY) > GetStep())
{
if (diffY > 0)
{
MoveUp();
}
else
{
MoveDown();
}
}
}
}
}

View File

@ -0,0 +1,56 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DoubleDeckerbus.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();
}
}
}
}
}

View File

@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DoubleDeckerbus.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;
}
}
}

View File

@ -1,6 +1,6 @@
using System.Drawing;
namespace DoubleDeckerBus
namespace DoubleDeckerbus
{
internal static class Program
{

15
DoubleDeckerBus/Status.cs Normal file
View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DoubleDeckerbus.MovementStrategy
{
public enum Status
{
NotInit,
InProgress,
Finish
}
}

View File

@ -1 +0,0 @@