Compare commits

...

2 Commits

Author SHA1 Message Date
ILYAkuznetsov73
a69215962d добавление стратегии 2024-03-12 13:48:28 +04:00
ILYAkuznetsov73
125be39c5f доб родителей и ввод конструкторов 2024-03-04 20:17:03 +04:00
25 changed files with 1386 additions and 273 deletions

31
Lab1_OAP/Lab1_OAP.sln Normal file
View File

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.8.34525.116
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Lab1_OAP", "Lab1_OAP\Lab1_OAP.vcxproj", "{39E703FF-4168-4ACA-84CA-CDD94BFE3FD3}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{39E703FF-4168-4ACA-84CA-CDD94BFE3FD3}.Debug|x64.ActiveCfg = Debug|x64
{39E703FF-4168-4ACA-84CA-CDD94BFE3FD3}.Debug|x64.Build.0 = Debug|x64
{39E703FF-4168-4ACA-84CA-CDD94BFE3FD3}.Debug|x86.ActiveCfg = Debug|Win32
{39E703FF-4168-4ACA-84CA-CDD94BFE3FD3}.Debug|x86.Build.0 = Debug|Win32
{39E703FF-4168-4ACA-84CA-CDD94BFE3FD3}.Release|x64.ActiveCfg = Release|x64
{39E703FF-4168-4ACA-84CA-CDD94BFE3FD3}.Release|x64.Build.0 = Release|x64
{39E703FF-4168-4ACA-84CA-CDD94BFE3FD3}.Release|x86.ActiveCfg = Release|Win32
{39E703FF-4168-4ACA-84CA-CDD94BFE3FD3}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {AD8890FA-E7D7-4EB8-996C-597872ABE83B}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1 @@


View File

@ -0,0 +1,135 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{39e703ff-4168-4aca-84ca-cdd94bfe3fd3}</ProjectGuid>
<RootNamespace>Lab1OAP</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="Lab1_OAP.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Исходные файлы">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Файлы заголовков">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Файлы ресурсов">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="Lab1_OAP.cpp">
<Filter>Исходные файлы</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@ -1,186 +0,0 @@
namespace ProjectGasolineTanker;
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawingGasolineTanker
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityGasolineTanker? EntityGasolineTanker { get; private set; }
/// <summary>
/// Ширина окна
/// </summary>
private int? _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int? _pictureHeight;
/// <summary>
/// Левая координата прорисовки газовоза
/// </summary>
private int? _startPosX;
/// <summary>
/// Верхняя кооридната прорисовки газовоза
/// </summary>
private int? _startPosY;
/// <summary>
/// Ширина прорисовки газовоза
/// </summary>
private readonly int _drawingTankerWidth = 160;
/// <summary>
/// Высота прорисовки газовоза
/// </summary>
private readonly int _drawingTankerHeight = 55;
/// <summary>
/// Инициализация свойств
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="bodyKit">Признак наличия обвеса</param>
/// <param name="ornamentWheels">Признак наличия украшения на колесах</param>
public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyKit, bool ornamentWheels)
{
EntityGasolineTanker = new EntityGasolineTanker();
EntityGasolineTanker.Init(speed, weight, bodyColor, additionalColor, bodyKit, ornamentWheels);
_pictureWidth = null;
_pictureHeight = null;
_startPosX = null;
_startPosY = null;
}
/// <summary>
/// Установка границ поля
/// </summary>
/// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param>
/// <returns>true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах</returns>
public bool SetPictureSize(int width, int height)
{
// TODO проверка, что объект "влезает" в размеры поля
// если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена
_pictureWidth = width;
_pictureHeight = height;
return true;
}
/// <summary>
/// Установка позиции
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
public void SetPosition(int x, int y)
{
if (!_pictureHeight.HasValue || !_pictureWidth.HasValue)
{
return;
}
// TODO если при установке объекта в эти координаты, он будет "выходить" за границы формы
// то надо изменить координаты, чтобы он оставался в этих границах
_startPosX = x;
_startPosY = y;
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
/// <returns>true - перемещение выполнено, false - перемещение невозможно</returns>
public bool MoveTransport(DirectionType direction)
{
if (EntityGasolineTanker == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return false;
}
switch (direction)
{
//влево
case DirectionType.Left:
if (_startPosX.Value - (int)EntityGasolineTanker.Step > 0)
{
_startPosX -= (int)EntityGasolineTanker.Step;
}
return true;
//вверх
case DirectionType.Up:
if (_startPosY.Value - (int)EntityGasolineTanker.Step > 0)
{
_startPosY -= (int)EntityGasolineTanker.Step;
}
return true;
//вправо
case DirectionType.Right:
if (_startPosX.Value + _drawingTankerWidth + (int)EntityGasolineTanker.Step < _pictureWidth)
{
_startPosX += (int)EntityGasolineTanker.Step;
}
return true;
//вниз
case DirectionType.Down:
if (_startPosY.Value + _drawingTankerHeight + (int)EntityGasolineTanker.Step < _pictureHeight)
{
_startPosY += (int)EntityGasolineTanker.Step;
}
return true;
default:
return false;
}
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public void DrawTransport(Graphics g)
{
if (EntityGasolineTanker == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
//бак бензовоза
Pen pen = new Pen(Color.Black);
Brush dopBrush = new SolidBrush(EntityGasolineTanker.AdditionalColor);
if (EntityGasolineTanker.BodyKit)
{
g.FillRectangle(dopBrush, _startPosX.Value + 25, _startPosY.Value + 5, 100, 35);
g.FillRectangle(dopBrush, _startPosX.Value + 80, _startPosY.Value, 10, 5);
}
//колеса
Brush brBlack = new SolidBrush(Color.Black);
g.FillEllipse(brBlack, _startPosX.Value + 130, _startPosY.Value + 35, 20, 20);
g.FillEllipse(brBlack, _startPosX.Value + 10, _startPosY.Value + 35, 20, 20);
g.FillEllipse(brBlack, _startPosX.Value + 30, _startPosY.Value + 35, 20, 20);
//корпус
Brush br = new SolidBrush(EntityGasolineTanker?.BodyColor ?? Color.Black);
g.FillRectangle(br, _startPosX.Value + 115, _startPosY.Value + 5, 40, 40);
g.FillRectangle(br, _startPosX.Value + 10, _startPosY.Value + 35, 140, 10);
//окно
Brush brBlue = new SolidBrush(Color.LightBlue);
g.FillRectangle(brBlue, _startPosX.Value + 120, _startPosY.Value + 10, 25, 25);
//окантовка
g.DrawRectangle(pen, _startPosX.Value + 120, _startPosY.Value + 10, 25, 25);
g.DrawRectangle(pen, _startPosX.Value + 115, _startPosY.Value + 5, 40, 40);
g.DrawRectangle(pen, _startPosX.Value + 10, _startPosY.Value + 35, 105, 10);
//крыло колеса
if (EntityGasolineTanker != null && EntityGasolineTanker.OrnamentWheels)
{
Pen penGray = new Pen(Color.Gray);
g.DrawEllipse(penGray, _startPosX.Value + 130, _startPosY.Value + 35, 20, 20);
g.DrawEllipse(penGray, _startPosX.Value + 10, _startPosY.Value + 35, 20, 20);
g.DrawEllipse(penGray, _startPosX.Value + 30, _startPosY.Value + 35, 20, 20);
}
}
}

View File

@ -1,10 +1,11 @@
namespace ProjectGasolineTanker; namespace ProjectGasolineTanker.Drawings;
/// <summary> /// <summary>
/// Направление перемещения /// Направление перемещения
/// </summary> /// </summary>
public enum DirectionType public enum DirectionType
{ {
Unknow = -1,
/// <summary> /// <summary>
/// Вверх /// Вверх
/// </summary> /// </summary>
@ -23,5 +24,5 @@ public enum DirectionType
/// <summary> /// <summary>
/// Вправо /// Вправо
/// </summary> /// </summary>
Right = 4 Right = 4,
} }

View File

@ -0,0 +1,56 @@
using ProjectGasolineTanker.Entities;
namespace ProjectGasolineTanker.Drawings;
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawingGasolineTanker : DrawingTanker
{
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="tank">Признак наличия обвеса</param>
/// <param name="ornamentWheels">Признак наличия украшения на колесах</param>
public DrawingGasolineTanker(int speed, double weight, Color bodyColor, Color additionalColor, bool tank, bool ornamentWheels) : base(160,55)
{
EntityTanker = new EntityGasolineTanker(speed, weight, bodyColor, additionalColor, tank, ornamentWheels);
}
public override void DrawTransport(Graphics g)
{
if (EntityTanker == null || EntityTanker is not EntityGasolineTanker tanker || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
Pen pen = new Pen(Color.Black);
Brush dopBrush = new SolidBrush(tanker.AdditionalColor);
_startPosX += 10;
_startPosY += 10;
base.DrawTransport(g);
_startPosX -= 10;
_startPosY -= 10;
//бак бензовоза
if (tanker != null && tanker.Tank)
{
g.FillRectangle(dopBrush, _startPosX.Value + 15, _startPosY.Value + 3, 100, 35);
g.FillRectangle(dopBrush, _startPosX.Value + 70, _startPosY.Value, 5, 5);
}
//крыло колеса
if (tanker != null && tanker.OrnamentWheels)
{
Pen penGray = new Pen(Color.Gray);
g.DrawEllipse(penGray, _startPosX.Value + 130, _startPosY.Value + 35, 20, 20);
g.DrawEllipse(penGray, _startPosX.Value + 10, _startPosY.Value + 35, 20, 20);
g.DrawEllipse(penGray, _startPosX.Value + 30, _startPosY.Value + 35, 20, 20);
}
}
}

View File

@ -0,0 +1,225 @@
using ProjectGasolineTanker.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectGasolineTanker.Drawings;
public class DrawingTanker
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityTanker? EntityTanker { get; protected set; }
/// <summary>
/// Ширина окна
/// </summary>
private int? _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int? _pictureHeight;
/// <summary>
/// Левая координата прорисовки газовоза
/// </summary>
protected int? _startPosX;
/// <summary>
/// Верхняя кооридната прорисовки газовоза
/// </summary>
protected int? _startPosY;
/// <summary>
/// Ширина прорисовки газовоза
/// </summary>
private readonly int _drawingTankerWidth = 130;
/// <summary>
/// Высота прорисовки газовоза
/// </summary>
private readonly int _drawingTankerHeight = 50;
/// <summary>
/// Координата X объекта
/// </summary>
public int? GetPosX => _startPosX;
/// <summary>
/// Координата Y объекта
/// </summary>
public int? GetPosY => _startPosY;
/// <summary>
/// Ширина объекта
/// </summary>
public int GetWidth => _drawingTankerWidth;
/// <summary>
/// Высота объекта
/// </summary>
public int GetHeight => _drawingTankerHeight;
/// <summary>
/// Пустой конструктор
/// </summary>
private DrawingTanker()
{
_pictureWidth = null;
_pictureHeight = null;
_startPosX = null;
_startPosY = null;
}
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
public DrawingTanker(int speed, double weight, Color bodyColor) : this()
{
EntityTanker = new EntityTanker(speed, weight, bodyColor);
}
/// <summary>
/// Конструктор для наследников
/// </summary>
/// <param name="_drawingTankerWidt">Ширина прорисовки газовоза</param>
/// <param name="_drawingTankerHeight">Высота прорисовки газовоза</param>
protected DrawingTanker(int _drawingTankerWidth, int _drawingTankerHeight) : this()
{
this._drawingTankerWidth = _drawingTankerWidth;
this._drawingTankerHeight = _drawingTankerHeight;
}
/// <summary>
/// Установка границ поля
/// </summary>
/// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param>
/// <returns>true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах</returns>
public Boolean SetPictureSize(int width, int height)
{
if (width <= _drawingTankerWidth || height <= _drawingTankerHeight) return false;
_pictureWidth = width;
_pictureHeight = height;
if (_startPosX.HasValue && _startPosY.HasValue)
{
if (_startPosX + _drawingTankerWidth > _pictureWidth)
{
_startPosX = _pictureWidth.Value - _drawingTankerWidth;
}
if (_startPosY + _drawingTankerHeight > _pictureHeight)
{
_startPosY = _pictureHeight.Value - _drawingTankerHeight;
}
}
return true;
}
/// <summary>
/// Установка позиции
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
public void SetPosition(int x, int y)
{
if (!_pictureHeight.HasValue || !_pictureWidth.HasValue)
{
return;
}
_startPosX = x;
_startPosY = y;
if (_drawingTankerHeight + y > _pictureHeight || y < 0)
{
_startPosY = 0;
}
if (_drawingTankerWidth + x > _pictureWidth || x < 0)
{
_startPosX = 0;
}
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
/// <returns>true - перемещение выполнено, false - перемещение невозможно</returns>
public bool MoveTransport(DirectionType direction)
{
if (EntityTanker == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return false;
}
switch (direction)
{
//влево
case DirectionType.Left:
if (_startPosX.Value - (int)EntityTanker.Step > 0)
{
_startPosX -= (int)EntityTanker.Step;
}
return true;
//вверх
case DirectionType.Up:
if (_startPosY.Value - (int)EntityTanker.Step > 0)
{
_startPosY -= (int)EntityTanker.Step;
}
return true;
//вправо
case DirectionType.Right:
if (_startPosX.Value + _drawingTankerWidth + (int)EntityTanker.Step < _pictureWidth)
{
_startPosX += (int)EntityTanker.Step;
}
return true;
//вниз
case DirectionType.Down:
if (_startPosY.Value + _drawingTankerHeight + (int)EntityTanker.Step < _pictureHeight)
{
_startPosY += (int)EntityTanker.Step;
}
return true;
default:
return false;
}
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public virtual void DrawTransport(Graphics g)
{
if (EntityTanker == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
Pen pen = new Pen(Color.Black);
//колеса
Brush brBlack = new SolidBrush(Color.Black);
g.FillEllipse(brBlack, _startPosX.Value + 120, _startPosY.Value + 25, 20, 20);
g.FillEllipse(brBlack, _startPosX.Value, _startPosY.Value + 25, 20, 20);
g.FillEllipse(brBlack, _startPosX.Value + 20, _startPosY.Value + 25, 20, 20);
//корпус
Brush br = new SolidBrush(EntityTanker?.BodyColor ?? Color.Black);
g.FillRectangle(br, _startPosX.Value + 105, _startPosY.Value, 40, 40);
g.FillRectangle(br, _startPosX.Value, _startPosY.Value + 25, 140, 10);
//окно
Brush brBlue = new SolidBrush(Color.LightBlue);
g.FillRectangle(brBlue, _startPosX.Value + 110, _startPosY.Value, 25, 25);
//окантовка
g.DrawRectangle(pen, _startPosX.Value + 110, _startPosY.Value, 25, 25);
g.DrawRectangle(pen, _startPosX.Value + 105, _startPosY.Value, 40, 40);
g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 25, 105, 10);
}
}

View File

@ -0,0 +1,45 @@
using System.Drawing;
namespace ProjectGasolineTanker.Entities
{
/// <summary>
/// Класс-сущность "Газовоз"
/// </summary>
public class EntityGasolineTanker : EntityTanker
{
public EntityGasolineTanker(int speed, double weight, Color bodyColor, Color additionalColor, bool tank, bool ornamentWheels) : base(speed, weight, bodyColor)
{
AdditionalColor = additionalColor;
Tank = tank;
OrnamentWheels = ornamentWheels;
}
public Color AdditionalColor { get; private set; }
/// <summary>
/// Признак наличия цистерны
/// </summary>
public bool Tank { get; private set; }
/// <summary>
/// Признак наличия украшенных колес
/// </summary>
public bool OrnamentWheels { get; private set; }
/// <summary>
/// Инициализация полей объекта-класса газовоза
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес газовоза</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="tank">Признак наличия цистерны</param>
/// <param name="ornamentWheels">Признак наличия украшенных колес</param>
public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool tank, bool ornamentWheels)
{
AdditionalColor = additionalColor;
Tank = tank;
OrnamentWheels = ornamentWheels;
}
}
}

View File

@ -0,0 +1,48 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectGasolineTanker.Entities;
/// <summary>
/// Класс-сущность "Танкер"
/// </summary>
public class EntityTanker
{
/// <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 EntityTanker(int speed, double weight, Color bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
}
}

View File

@ -1,61 +0,0 @@
namespace ProjectGasolineTanker;
/// <summary>
/// Класс-сущность "Газовоз"
/// </summary>
public class EntityGasolineTanker
{
/// <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 Color AdditionalColor { get; private set; }
/// <summary>
/// Признак наличия обвеса
/// </summary>
public bool BodyKit { get; private set; }
/// <summary>
/// Признак наличия украшенных колес
/// </summary>
public bool OrnamentWheels { 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>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="bodyKit">Признак наличия обвеса</param>
/// <param name="ornamentWheels">Признак наличия украшенных колес</param>
public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyKit, bool ornamentWheels)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
AdditionalColor = additionalColor;
BodyKit = bodyKit;
OrnamentWheels = ornamentWheels;
}
}

View File

@ -34,6 +34,9 @@
buttonDown = new Button(); buttonDown = new Button();
buttonRight = new Button(); buttonRight = new Button();
buttonUp = new Button(); buttonUp = new Button();
buttonCreateTanker = new Button();
comboBoxStrategy = new ComboBox();
buttonStrategyStep = new Button();
((System.ComponentModel.ISupportInitialize)pictureBoxGasolineTanker).BeginInit(); ((System.ComponentModel.ISupportInitialize)pictureBoxGasolineTanker).BeginInit();
SuspendLayout(); SuspendLayout();
// //
@ -51,9 +54,9 @@
buttonCreateGasolineTanker.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; buttonCreateGasolineTanker.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCreateGasolineTanker.Location = new Point(12, 682); buttonCreateGasolineTanker.Location = new Point(12, 682);
buttonCreateGasolineTanker.Name = "buttonCreateGasolineTanker"; buttonCreateGasolineTanker.Name = "buttonCreateGasolineTanker";
buttonCreateGasolineTanker.Size = new Size(112, 34); buttonCreateGasolineTanker.Size = new Size(230, 34);
buttonCreateGasolineTanker.TabIndex = 1; buttonCreateGasolineTanker.TabIndex = 1;
buttonCreateGasolineTanker.Text = "Создать"; buttonCreateGasolineTanker.Text = "Создать Бензовоз";
buttonCreateGasolineTanker.UseVisualStyleBackColor = true; buttonCreateGasolineTanker.UseVisualStyleBackColor = true;
buttonCreateGasolineTanker.Click += buttonCreateGasolineTanker_Click; buttonCreateGasolineTanker.Click += buttonCreateGasolineTanker_Click;
// //
@ -105,11 +108,45 @@
buttonUp.UseVisualStyleBackColor = true; buttonUp.UseVisualStyleBackColor = true;
buttonUp.Click += ButtonMove_Click; buttonUp.Click += ButtonMove_Click;
// //
// buttonCreateTanker
//
buttonCreateTanker.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCreateTanker.Location = new Point(248, 682);
buttonCreateTanker.Name = "buttonCreateTanker";
buttonCreateTanker.Size = new Size(230, 34);
buttonCreateTanker.TabIndex = 6;
buttonCreateTanker.Text = "Создать Грузовик";
buttonCreateTanker.UseVisualStyleBackColor = true;
buttonCreateTanker.Click += buttonCreateTanker_Click;
//
// comboBoxStrategy
//
comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxStrategy.FormattingEnabled = true;
comboBoxStrategy.Items.AddRange(new object[] { "К центру", "К краю" });
comboBoxStrategy.Location = new Point(1118, 12);
comboBoxStrategy.Name = "comboBoxStrategy";
comboBoxStrategy.Size = new Size(182, 33);
comboBoxStrategy.TabIndex = 7;
//
// buttonStrategyStep
//
buttonStrategyStep.Location = new Point(1188, 51);
buttonStrategyStep.Name = "buttonStrategyStep";
buttonStrategyStep.Size = new Size(112, 34);
buttonStrategyStep.TabIndex = 8;
buttonStrategyStep.Text = "Шаг";
buttonStrategyStep.UseVisualStyleBackColor = true;
buttonStrategyStep.Click += buttonStrategyStep_Click;
//
// FormGasolineTanker // FormGasolineTanker
// //
AutoScaleDimensions = new SizeF(10F, 25F); AutoScaleDimensions = new SizeF(10F, 25F);
AutoScaleMode = AutoScaleMode.Font; AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1312, 749); ClientSize = new Size(1312, 749);
Controls.Add(buttonStrategyStep);
Controls.Add(comboBoxStrategy);
Controls.Add(buttonCreateTanker);
Controls.Add(buttonUp); Controls.Add(buttonUp);
Controls.Add(buttonRight); Controls.Add(buttonRight);
Controls.Add(buttonDown); Controls.Add(buttonDown);
@ -130,5 +167,8 @@
private Button buttonDown; private Button buttonDown;
private Button buttonRight; private Button buttonRight;
private Button buttonUp; private Button buttonUp;
private Button buttonCreateTanker;
private ComboBox comboBoxStrategy;
private Button buttonStrategyStep;
} }
} }

View File

@ -1,4 +1,6 @@
using System; using ProjectGasolineTanker.Drawings;
using ProjectGasolineTanker.MovementStrategy;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Data; using System.Data;
@ -15,29 +17,63 @@ namespace ProjectGasolineTanker
/// <summary> /// <summary>
/// Поле-объект для прорисовки объекта /// Поле-объект для прорисовки объекта
/// </summary> /// </summary>
private DrawingGasolineTanker? _drawingGasolineTanker; private DrawingTanker? _drawingTanker;
/// <summary> /// <summary>
/// Инициализация формы /// Стратегия перемещения
/// </summary>
private AbstractStrategy? _strategy;
/// <summary>
/// Конструктор формы
/// </summary> /// </summary>
public FormGasolineTanker() public FormGasolineTanker()
{ {
InitializeComponent(); InitializeComponent();
_strategy = null;
} }
/// <summary>
/// Метод прорисовки бензовоза
/// </summary>
private void Draw() private void Draw()
{ {
if (_drawingGasolineTanker == null) if (_drawingTanker == null)
{ {
return; return;
} }
Bitmap bmp = new(pictureBoxGasolineTanker.Width, pictureBoxGasolineTanker.Height); Bitmap bmp = new(pictureBoxGasolineTanker.Width, pictureBoxGasolineTanker.Height);
Graphics gr = Graphics.FromImage(bmp); Graphics gr = Graphics.FromImage(bmp);
_drawingGasolineTanker.DrawTransport(gr); _drawingTanker.DrawTransport(gr);
pictureBoxGasolineTanker.Image = bmp; pictureBoxGasolineTanker.Image = bmp;
} }
private void CreateObject(string type)
{
Random random = new();
switch (type)
{
case nameof(DrawingTanker):
_drawingTanker = new DrawingTanker(random.Next(100, 300), random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)));
break;
case nameof(DrawingGasolineTanker):
_drawingTanker = new DrawingGasolineTanker(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)));
break;
default:
return;
}
_drawingTanker.SetPictureSize(pictureBoxGasolineTanker.Width, pictureBoxGasolineTanker.Height);
_drawingTanker.SetPosition(random.Next(10, 100), random.Next(10, 100));
_strategy = null;
comboBoxStrategy.Enabled = true;
Draw();
}
/// <summary> /// <summary>
/// Обработка нажатия кнопки создать /// Обработка нажатия кнопки создать
/// </summary> /// </summary>
@ -45,16 +81,14 @@ namespace ProjectGasolineTanker
/// <param name="e"></param> /// <param name="e"></param>
private void buttonCreateGasolineTanker_Click(object sender, EventArgs e) private void buttonCreateGasolineTanker_Click(object sender, EventArgs e)
{ {
Random random = new(); CreateObject(nameof(DrawingGasolineTanker));
_drawingGasolineTanker = new DrawingGasolineTanker();
_drawingGasolineTanker.Init(random.Next(100, 300), random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)),
Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)));
_drawingGasolineTanker.SetPictureSize(pictureBoxGasolineTanker.Width, pictureBoxGasolineTanker.Height);
_drawingGasolineTanker.SetPosition(random.Next(10, 100), random.Next(10, 100));
Draw();
} }
private void buttonCreateTanker_Click(object sender, EventArgs e)
{
CreateObject(nameof(DrawingTanker));
}
/// <summary> /// <summary>
/// Перемещение объекта по форме (нажатие кнопок навигации) /// Перемещение объекта по форме (нажатие кнопок навигации)
/// </summary> /// </summary>
@ -62,7 +96,7 @@ namespace ProjectGasolineTanker
/// <param name="e"></param> /// <param name="e"></param>
private void ButtonMove_Click(object sender, EventArgs e) private void ButtonMove_Click(object sender, EventArgs e)
{ {
if (_drawingGasolineTanker == null) if (_drawingTanker == null)
{ {
return; return;
} }
@ -72,16 +106,16 @@ namespace ProjectGasolineTanker
switch (name) switch (name)
{ {
case "buttonUp": case "buttonUp":
result = _drawingGasolineTanker.MoveTransport(DirectionType.Up); result = _drawingTanker.MoveTransport(DirectionType.Up);
break; break;
case "buttonDown": case "buttonDown":
result = _drawingGasolineTanker.MoveTransport(DirectionType.Down); result = _drawingTanker.MoveTransport(DirectionType.Down);
break; break;
case "buttonLeft": case "buttonLeft":
result = _drawingGasolineTanker.MoveTransport(DirectionType.Left); result = _drawingTanker.MoveTransport(DirectionType.Left);
break; break;
case "buttonRight": case "buttonRight":
result = _drawingGasolineTanker.MoveTransport(DirectionType.Right); result = _drawingTanker.MoveTransport(DirectionType.Right);
break; break;
} }
@ -90,5 +124,31 @@ namespace ProjectGasolineTanker
Draw(); Draw();
} }
} }
private void buttonStrategyStep_Click(object sender, EventArgs e)
{
if (_drawingTanker == null) return;
if (comboBoxStrategy.Enabled)
{
_strategy = comboBoxStrategy.SelectedIndex switch
{
0 => new MoveToCenter(),
1 => new MoveToBorder(),
_ => null,
};
if (_strategy == null) return;
_strategy.SetData(new MoveableTanker(_drawingTanker), pictureBoxGasolineTanker.Width, pictureBoxGasolineTanker.Height);
}
if (_strategy == null) return;
comboBoxStrategy.Enabled = false;
_strategy.MakeStep();
Draw();
if (_strategy.GetStatus() == StrategyStatus.Finish)
{
comboBoxStrategy.Enabled = true;
_strategy = null;
}
}
} }
} }

View File

@ -0,0 +1,78 @@
using System;
namespace ProjectGasolineTanker.MovementStrategy
{
public abstract class AbstractStrategy
{
private IMoveableObject? _moveableObject;
private StrategyStatus _state = StrategyStatus.NotInit;
protected int FieldWidth { get; private set; }
protected int FieldHeight { get; private set; }
public StrategyStatus GetStatus() { return _state; }
public void SetData(IMoveableObject moveableObject, int width, int height)
{
if (moveableObject == null)
{
_state = StrategyStatus.NotInit;
return;
}
_state = StrategyStatus.InProgress;
_moveableObject = moveableObject;
FieldWidth = width;
FieldHeight = height;
}
public void MakeStep()
{
if (_state != StrategyStatus.InProgress)
{
return;
}
if (IsTargetDestinaion())
{
_state = StrategyStatus.Finish;
return;
}
MoveToTarget();
}
protected bool MoveLeft() => MoveTo(MovementDirection.Left);
protected bool MoveRight() => MoveTo(MovementDirection.Right);
protected bool MoveUp() => MoveTo(MovementDirection.Up);
protected bool MoveDown() => MoveTo(MovementDirection.Down);
protected ObjectParameters? GetObjectParameters => _moveableObject?.GetObjectPosition;
protected int? GetStep()
{
if (_state != StrategyStatus.InProgress)
{
return null;
}
return _moveableObject?.GetStep;
}
protected abstract void MoveToTarget();
protected abstract bool IsTargetDestinaion();
private bool MoveTo(MovementDirection movementDirection)
{
if (_state != StrategyStatus.InProgress)
{
return false;
}
return _moveableObject?.TryMoveObject(movementDirection) ?? false;
}
}
}

View File

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectGasolineTanker.MovementStrategy;
public interface IMoveableObject
{
/// <summary>
/// Получение координаты объекта
/// </summary>
ObjectParameters? GetObjectPosition { get; }
/// <summary>
/// Шаг объекта
/// </summary>
int GetStep { get; }
/// <summary>
/// Попытка переместить объект в указанном направлении
/// </summary>
/// <param name="direction">Направление</param>
/// <returns>true - объект перемещен, false - перемещение невозможно</returns>
bool TryMoveObject(MovementDirection direction);
}

View File

@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectGasolineTanker.MovementStrategy;
public class MoveToBorder : AbstractStrategy
{
protected override bool IsTargetDestinaion()
{
ObjectParameters? objParams = GetObjectParameters;
if (objParams == null)
{
return false;
}
return objParams.RightBorder + GetStep() >= FieldWidth && objParams.DownBorder + GetStep() >= FieldHeight;
}
protected override void MoveToTarget()
{
ObjectParameters? objParams = GetObjectParameters;
if (objParams == null)
{
return;
}
int diffX = objParams.RightBorder - FieldWidth + 11;
if (Math.Abs(diffX) > GetStep())
{
if (diffX > 0) MoveLeft();
else MoveRight();
}
int diffY = objParams.DownBorder - FieldHeight + 11;
if (Math.Abs(diffY) > GetStep())
{
if (diffY > 0) MoveUp();
else MoveDown();
}
}
}

View File

@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectGasolineTanker.MovementStrategy;
public class MoveToCenter : AbstractStrategy
{
protected override bool IsTargetDestinaion()
{
ObjectParameters? objParams = GetObjectParameters;
if (objParams == null)
{
return false;
}
return objParams.ObjectMiddleHorizontal - GetStep() <= FieldWidth / 2 && objParams.ObjectMiddleHorizontal + GetStep() >= FieldWidth / 2 &&
objParams.ObjectMiddleVertical - GetStep() <= FieldHeight / 2 && objParams.ObjectMiddleVertical + GetStep() >= FieldHeight / 2;
}
protected override void MoveToTarget()
{
ObjectParameters? objParams = GetObjectParameters;
if (objParams == null)
{
return;
}
int diffX = objParams.ObjectMiddleHorizontal - FieldWidth / 2;
if (Math.Abs(diffX) > GetStep())
{
if (diffX > 0) MoveLeft();
else MoveRight();
}
int diffY = objParams.ObjectMiddleVertical - FieldHeight / 2;
if (Math.Abs(diffY) > GetStep())
{
if (diffY > 0) MoveUp();
else MoveDown();
}
}
}

View File

@ -0,0 +1,66 @@
using ProjectGasolineTanker.Drawings;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectGasolineTanker.MovementStrategy;
public class MoveableTanker : IMoveableObject
{
/// <summary>
/// Поле-объект класса DrawingTanker или его наследника
/// </summary>
private readonly DrawingTanker? _tanker = null;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="tanker">Объект класса DrawingTanker</param>
public MoveableTanker(DrawingTanker tanker)
{
_tanker = tanker;
}
public ObjectParameters? GetObjectPosition
{
get
{
if (_tanker == null || _tanker.EntityTanker == null || !_tanker.GetPosX.HasValue || !_tanker.GetPosY.HasValue)
{
return null;
}
return new ObjectParameters(_tanker.GetPosX.Value, _tanker.GetPosY.Value, _tanker.GetWidth, _tanker.GetHeight);
}
}
public int GetStep => (int)(_tanker?.EntityTanker?.Step ?? 0);
public bool TryMoveObject(MovementDirection direction)
{
if (_tanker == null || _tanker.EntityTanker == null)
{
return false;
}
return _tanker.MoveTransport(GetDirectionType(direction));
}
/// <summary>
/// Конвертация из MovementDirection в DirectionType
/// </summary>
/// <param name="direction">MovementDirection</param>
/// <returns>DirectionType</returns>
private static DirectionType GetDirectionType(MovementDirection direction)
{
return direction switch
{
MovementDirection.Left => DirectionType.Left,
MovementDirection.Right => DirectionType.Right,
MovementDirection.Up => DirectionType.Up,
MovementDirection.Down => DirectionType.Down,
_ => DirectionType.Unknow,
};
}
}

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectGasolineTanker.MovementStrategy;
public enum MovementDirection
{
Up = 1,
Down = 2,
Left = 3,
Right = 4,
}

View File

@ -0,0 +1,73 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectGasolineTanker.MovementStrategy;
public class ObjectParameters
{
/// <summary>
/// Координата x
/// </summary>
private readonly int _x;
/// <summary>
/// Координата y
/// </summary>
private readonly int _y;
/// <summary>
/// Ширина объекта
/// </summary>
private readonly int _width;
/// <summary>
/// Высота объекта
/// </summary>
private readonly int _height;
/// <summary>
/// Левая граница
/// </summary>
public int LeftBorder => _x;
/// <summary>
/// Верхняя граница
/// </summary>
public int TopBorder => _y;
/// <summary>
/// Правая граница
/// </summary>
public int RightBorder => _x + _width;
/// <summary>
/// Нижняя граница
/// </summary>
public int DownBorder => _y + _height;
/// <summary>
/// Середина объекта
/// </summary>
public int ObjectMiddleHorizontal => _x + _width / 2;
/// <summary>
/// Середина объекта
/// </summary>
public int ObjectMiddleVertical => _y + _height / 2;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="x">Координата x</param>
/// <param name="y">Координата y</param>
/// <param name="width">Ширина объекта</param>
/// <param name="height">Высота объекта</param>
public ObjectParameters(int x, int y, int width, int height)
{
_x = x;
_y = y;
_width = width;
_height = height;
}
}

View File

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

31
laboap1/laboap1.sln Normal file
View File

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.8.34525.116
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "laboap1", "laboap1\laboap1.vcxproj", "{1F4724C2-6BC1-42C2-ACC1-93AAA85BA624}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1F4724C2-6BC1-42C2-ACC1-93AAA85BA624}.Debug|x64.ActiveCfg = Debug|x64
{1F4724C2-6BC1-42C2-ACC1-93AAA85BA624}.Debug|x64.Build.0 = Debug|x64
{1F4724C2-6BC1-42C2-ACC1-93AAA85BA624}.Debug|x86.ActiveCfg = Debug|Win32
{1F4724C2-6BC1-42C2-ACC1-93AAA85BA624}.Debug|x86.Build.0 = Debug|Win32
{1F4724C2-6BC1-42C2-ACC1-93AAA85BA624}.Release|x64.ActiveCfg = Release|x64
{1F4724C2-6BC1-42C2-ACC1-93AAA85BA624}.Release|x64.Build.0 = Release|x64
{1F4724C2-6BC1-42C2-ACC1-93AAA85BA624}.Release|x86.ActiveCfg = Release|Win32
{1F4724C2-6BC1-42C2-ACC1-93AAA85BA624}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {898933DD-7FA8-4FA7-872F-63991ACB024A}
EndGlobalSection
EndGlobal

151
laboap1/laboap1/laboap1.cpp Normal file
View File

@ -0,0 +1,151 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
void insertionSort(int arr[], int size) {
int i, key, j;
for (i = 1; i < size; i++) {
key = arr[i];
j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
void merge(int arr[], int left, int mid, int right) {
int i, j, k;
int n1 = mid - left + 1;
int n2 = right - mid;
int L[n1], R[n2];
for (i = 0; i < n1; i++)
L[i] = arr[left + i];
for (j = 0; j < n2; j++)
R[j] = arr[mid + 1 + j];
i = 0;
j = 0;
k = left;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
}
else {
arr[k] = R[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
void mergeSort(int arr[], int left, int right) {
if (left < right) {
int mid = left + (right - left) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
int main() {
srand(time(0));
int size;
printf("Enter the size of the array: ");
scanf("%d", &size);
int arr[size];
for (int i = 0; i < size; i++) {
arr[i] = rand() % 100;
}
printf("Randomly generated array: ");
printArray(arr, size);
int choice;
printf("Enter 1 to delete an element, 2 to insert a new element: ");
scanf("%d", &choice);
if (choice == 1) {
int index;
printf("Enter the index of the element you want to delete: ");
scanf("%d", &index);
for (int i = index; i < size - 1; i++) {
arr[i] = arr[i + 1];
}
size--;
}
else if (choice == 2) {
int index, element;
printf("Enter the index at which you want to insert the new element: ");
scanf("%d", &index);
printf("Enter the new element: ");
scanf("%d", &element);
for (int i = size; i > index; i--) {
arr[i] = arr[i - 1];
}
arr[index] = element;
size++;
}
else {
printf("Invalid choice");
return 0;
}
printf("Modified array: ");
printArray(arr, size);
int arr_copy[size];
for (int i = 0; i < size; i++) {
arr_copy[i] = arr[i];
}
clock_t start_time = clock();
insertionSort(arr, size);
clock_t end_time = clock();
double insertion_time = ((double)(end_time - start_time)) / CLOCKS_PER_SEC;
printf("Array sorted using Insertion Sort: ");
printArray(arr, size);
printf("Time taken by Insertion Sort: %f seconds\n", insertion_time);
start_time = clock();
mergeSort(arr_copy, 0, size - 1);
end_time = clock();
double merge_time = ((double)(end_time - start_time)) / CLOCKS_PER_SEC;
printf("Array sorted using Merge Sort: ");
printArray(arr_copy, size);
printf("Time taken by Merge Sort: %f seconds\n", merge_time);
return 0;
}

View File

@ -0,0 +1,136 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{1f4724c2-6bc1-42c2-acc1-93aaa85ba624}</ProjectGuid>
<RootNamespace>laboap1</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard_C>Default</LanguageStandard_C>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="laboap1.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Исходные файлы">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Файлы заголовков">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Файлы ресурсов">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="laboap1.cpp">
<Filter>Исходные файлы</Filter>
</ClCompile>
</ItemGroup>
</Project>