начало лаб2

This commit is contained in:
tyxz0 2024-03-01 00:11:52 +04:00
parent 21a467a473
commit 7bab8142b6
7 changed files with 263 additions and 24 deletions

View File

@ -23,4 +23,8 @@
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Folder Include="MovementStrategy\" />
</ItemGroup>
</Project>

View File

@ -1,5 +1,4 @@

namespace DoubleDeckerBus;
namespace DoubleDeckerBus.Drawnings;
public enum DirectionType
{ /// <summary>

View File

@ -0,0 +1,203 @@
using DoubleDeckerBus.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DoubleDeckerBus.Drawnings;
public class DrawingBus
{
public EntityBus? EntityBus { get; private set; }
private int? _pictureWidth;
private int? _pictureHeight;
private int? _startPosX;
private int? _startPosY;
private readonly int _DrawingBusWidth = 120;
private readonly int _DrawingBusHight = 60;
public void Init(int speed, double weight, Color bodyColor)
{
EntityBus = new EntityBus(speed, weight, bodyColor);
EntityBus.Init(speed, weight, bodyColor);
_pictureWidth = null;
_pictureHeight = null;
_startPosX = null;
_startPosY = null;
}
/// <summary>
/// размер окна
/// </summary>
/// <param name="width"></param>
/// <param name="hight"></param>
/// <returns></returns>
public bool SetPictureSize(int width, int hight)
{
if (_DrawingBusWidth > width || _DrawingBusHight > hight)
{
return false;
}
_pictureWidth = width;
_pictureHeight = hight;
if (_startPosX.HasValue && _startPosX.Value + _DrawingBusWidth > _pictureWidth)
{
_startPosX = _pictureWidth - _DrawingBusWidth;
}
if (_startPosY.HasValue && _startPosY + _DrawingBusHight > _pictureHeight)
{
_startPosY = _pictureHeight - _DrawingBusHight;
}
return true;
}
/// <summary>
/// установить начальную позицию
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
public void SetPosition(int x, int y)
{
if (!_pictureHeight.HasValue || !_pictureWidth.HasValue)
{
return;
}
if (x < 0)
{
x = -x;
}
if (y < 0)
{
y = -y;
}
if (x + _DrawingBusWidth > _pictureWidth)
{
_startPosX = _pictureWidth - _DrawingBusWidth;
}
else
{
_startPosX = x;
}
if (y + _DrawingBusHight > _pictureHeight)
{
_startPosY = _pictureHeight - _DrawingBusHight;
}
else
{
_startPosY = y;
}
}
public bool MoveTransport(DirectionType direction)
{
if (EntityBus == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return false;
}
switch (direction)
{
case DirectionType.Left:
if (_startPosX.Value - EntityBus.Step > 0)
{
_startPosX -= (int)EntityBus.Step;
}
return true;
case DirectionType.Up:
if (_startPosY.Value - EntityBus.Step > 0)
{
_startPosY -= (int)EntityBus.Step;
}
return true;
case DirectionType.Right:
if (_startPosX.Value + _DrawingBusWidth + EntityBus.Step < _pictureWidth)
{
_startPosX += (int)EntityBus.Step;
}
return true;
case DirectionType.Down:
if (_startPosY.Value + _DrawingBusHight + EntityBus.Step < _pictureHeight)
{
_startPosY += (int)EntityBus.Step;
}
return true;
default:
return false;
}
}
public void DrawTrasnport(Graphics g)
{
if (EntityBus == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
Pen pen = new(Color.Black);
Brush mainBrush = new SolidBrush(EntityBus.BodyColor);
Brush blueBr = new SolidBrush(Color.LightBlue);
//кузов 1го этажа
PointF[] bus = { new PointF((float)_startPosX + 5, (float)_startPosY + 20),
new PointF((float)_startPosX, (float)_startPosY + 45),
new PointF((float)_startPosX + 100, (float)_startPosY + 45),
new PointF((float)_startPosX + 100, (float)_startPosY + 25),
new PointF((float)_startPosX + 97, (float)_startPosY + 20) };
g.FillPolygon(mainBrush, bus);
g.DrawPolygon(pen, bus);
//окна 1ый этаж
g.FillRectangle(blueBr, _startPosX.Value + 2, _startPosY.Value + 25, 12, 10);
g.FillRectangle(blueBr, _startPosX.Value + 16, _startPosY.Value + 25, 12, 10);
g.FillRectangle(blueBr, _startPosX.Value + 42, _startPosY.Value + 25, 6, 10);
g.FillRectangle(blueBr, _startPosX.Value + 50, _startPosY.Value + 25, 13, 10);
g.FillRectangle(blueBr, _startPosX.Value + 66, _startPosY.Value + 25, 14, 10);
g.DrawRectangle(pen, _startPosX.Value + 2, _startPosY.Value + 25, 12, 10);
g.DrawRectangle(pen, _startPosX.Value + 16, _startPosY.Value + 25, 12, 10);
g.DrawRectangle(pen, _startPosX.Value + 42, _startPosY.Value + 25, 6, 10);
g.DrawRectangle(pen, _startPosX.Value + 50, _startPosY.Value + 25, 13, 10);
g.DrawRectangle(pen, _startPosX.Value + 66, _startPosY.Value + 25, 14, 10);
//переднее окно первый этаж
PointF[] window2 = { new PointF((float)_startPosX + 85, (float)_startPosY + 25),
new PointF((float)_startPosX + 100, (float)_startPosY + 25),
new PointF((float)_startPosX + 100, (float)_startPosY + 40),
new PointF((float)_startPosX + 85, (float)_startPosY + 35) };
g.FillPolygon(blueBr, window2);
g.DrawPolygon(pen, window2);
//дверь
Brush brownBr = new SolidBrush(Color.Brown);
g.FillRectangle(blueBr, _startPosX.Value + 30, _startPosY.Value + 25, 10, 15);
g.FillRectangle(brownBr, _startPosX.Value + 30, _startPosY.Value + 40, 10, 5);
g.DrawRectangle(pen, _startPosX.Value + 30, _startPosY.Value + 25, 10, 15);
g.DrawRectangle(pen, _startPosX.Value + 30, _startPosY.Value + 40, 10, 5);
//колёса
g.FillEllipse(brownBr, _startPosX.Value + 6, _startPosY.Value + 37, 16, 16);
g.FillEllipse(brownBr, _startPosX.Value + 78, _startPosY.Value + 37, 16, 16);
g.DrawEllipse(pen, _startPosX.Value + 6, _startPosY.Value + 37, 16, 16);
g.DrawEllipse(pen, _startPosX.Value + 78, _startPosY.Value + 37, 16, 16);
}
}

View File

@ -1,4 +1,6 @@
namespace DoubleDeckerBus;
using DoubleDeckerBus.Entities;
namespace DoubleDeckerBus.Drawnings;
/// <summary>
///
/// </summary>
@ -18,7 +20,7 @@ public class DrawingDoubleDeckerBus
private readonly int _DrawingBusHight = 60;
public void Init(int speed, double weight, Color bodyColor, Color additionalColor,bool secondFloor, bool stripes)
public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool secondFloor, bool stripes)
{
EntityDoubleDeckerBus = new EntityDoubleDeckerBus();
EntityDoubleDeckerBus.Init(speed, weight, bodyColor, additionalColor, secondFloor, stripes);
@ -44,12 +46,12 @@ public class DrawingDoubleDeckerBus
_pictureWidth = width;
_pictureHeight = hight;
if (_startPosX.HasValue && (_startPosX.Value + _DrawingBusWidth > _pictureWidth))
if (_startPosX.HasValue && _startPosX.Value + _DrawingBusWidth > _pictureWidth)
{
_startPosX = _pictureWidth - _DrawingBusWidth;
}
if (_startPosY.HasValue && (_startPosY + _DrawingBusHight > _pictureHeight))
if (_startPosY.HasValue && _startPosY + _DrawingBusHight > _pictureHeight)
{
_startPosY = _pictureHeight - _DrawingBusHight;
}
@ -149,7 +151,7 @@ public class DrawingDoubleDeckerBus
Brush mainBrush = new SolidBrush(EntityDoubleDeckerBus.BodyColor);
Brush blueBr = new SolidBrush(Color.LightBlue);
//кузов 1го этажа
PointF[] bus = { new PointF((float)_startPosX + 5, (float)_startPosY + 20),
new PointF((float)_startPosX + 5, (float)_startPosY + 45),
@ -167,7 +169,7 @@ public class DrawingDoubleDeckerBus
g.FillPolygon(additionalBrush, stripe);
}
//окна 1ый этаж
g.FillRectangle(blueBr, _startPosX.Value + 7, _startPosY.Value + 25, 12, 10);
g.FillRectangle(blueBr, _startPosX.Value + 21, _startPosY.Value + 25, 12, 10);

View File

@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DoubleDeckerBus.Entities;
/// <summary>
/// Класс сущность автобус
/// </summary>
public class EntityBus
{
/// <summary>
/// Скорость
/// </summary>
public int Speed { get; private set; }
/// <summary>
/// Вес
/// </summary>
public double Weight { get; private set; }
/// <summary>
/// Основной цвет
/// </summary>
public Color BodyColor { get; private set; }
/// <summary>
/// Расстояние перемещения за раз
/// </summary>
public double Step => Speed * 100 / Weight;
/// <summary>
/// Конструктор базовой сущности
/// </summary>
/// <param name="speed"></param>
/// <param name="weight"></param>
/// <param name="bodyColor"></param>
public EntityBus(int speed, double weight, Color bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
}
}

View File

@ -1,16 +1,7 @@
namespace DoubleDeckerBus;
public class EntityDoubleDeckerBus
namespace DoubleDeckerBus.Entities;
public class EntityDoubleDeckerBus
{
public int Speed { get; private set; }
public double Weight { get; private set; }
/// <summary>
/// Основной цвет
/// </summary>
public Color BodyColor { get; private set; }
/// <summary>
/// Дополнительный цвет (для опциональных элементов)
/// </summary>
public Color AdditionalColor { get; private set; }
/// <summary>
/// Признак (опция) наличия второго этажа
@ -20,10 +11,7 @@
/// Признак (опция) наличия полосок на автобусе
/// </summary>
public bool Stripes { get; private set; }
/// <summary>
/// Шаг перемещения автобуса
/// </summary>
public double Step => Speed * 100 / Weight;
/// <summary>
///
/// </summary>

View File

@ -7,6 +7,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DoubleDeckerBus.Drawnings;
namespace DoubleDeckerBus
{