From 8730380d165fe22850b095a1a56c34b93f023e47 Mon Sep 17 00:00:00 2001 From: "yuliya.mavrina@internet.ru" Date: Sun, 1 Oct 2023 23:05:05 +0300 Subject: [PATCH 1/4] =?UTF-8?q?=D0=9B=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=20=E2=84=961?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DoubleDeckerBus/DoubleDeckerBus.sln | 25 ++++ .../DoubleDeckerBus/DirectionBus.cs | 17 +++ .../DoubleDeckerBus.Designer.cs | 137 ++++++++++++++++++ .../DoubleDeckerBus/DoubleDeckerBus.cs | 57 ++++++++ .../DoubleDeckerBus/DoubleDeckerBus.csproj | 11 ++ .../DoubleDeckerBus/DoubleDeckerBus.resx | 120 +++++++++++++++ .../DoubleDeckerBus/DrawningBus.cs | 130 +++++++++++++++++ DoubleDeckerBus/DoubleDeckerBus/EntityBus.cs | 23 +++ DoubleDeckerBus/DoubleDeckerBus/Program.cs | 17 +++ .../Properties/Resources.Designer.cs | 103 +++++++++++++ .../DoubleDeckerBus/Properties/Resources.resx | 133 +++++++++++++++++ .../DoubleDeckerBus/Resources/arrowDown.jpg | Bin 0 -> 33694 bytes .../DoubleDeckerBus/Resources/arrowLeft.jpg | Bin 0 -> 32434 bytes .../DoubleDeckerBus/Resources/arrowRight.jpg | Bin 0 -> 32298 bytes .../DoubleDeckerBus/Resources/arrowUp.jpg | Bin 0 -> 32650 bytes 15 files changed, 773 insertions(+) create mode 100644 DoubleDeckerBus/DoubleDeckerBus.sln create mode 100644 DoubleDeckerBus/DoubleDeckerBus/DirectionBus.cs create mode 100644 DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.Designer.cs create mode 100644 DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.cs create mode 100644 DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.csproj create mode 100644 DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.resx create mode 100644 DoubleDeckerBus/DoubleDeckerBus/DrawningBus.cs create mode 100644 DoubleDeckerBus/DoubleDeckerBus/EntityBus.cs create mode 100644 DoubleDeckerBus/DoubleDeckerBus/Program.cs create mode 100644 DoubleDeckerBus/DoubleDeckerBus/Properties/Resources.Designer.cs create mode 100644 DoubleDeckerBus/DoubleDeckerBus/Properties/Resources.resx create mode 100644 DoubleDeckerBus/DoubleDeckerBus/Resources/arrowDown.jpg create mode 100644 DoubleDeckerBus/DoubleDeckerBus/Resources/arrowLeft.jpg create mode 100644 DoubleDeckerBus/DoubleDeckerBus/Resources/arrowRight.jpg create mode 100644 DoubleDeckerBus/DoubleDeckerBus/Resources/arrowUp.jpg diff --git a/DoubleDeckerBus/DoubleDeckerBus.sln b/DoubleDeckerBus/DoubleDeckerBus.sln new file mode 100644 index 0000000..5e4da88 --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.7.34024.191 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DoubleDeckerBus", "DoubleDeckerBus\DoubleDeckerBus.csproj", "{733E4772-39B5-4155-BB09-07F2025C8475}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {733E4772-39B5-4155-BB09-07F2025C8475}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {733E4772-39B5-4155-BB09-07F2025C8475}.Debug|Any CPU.Build.0 = Debug|Any CPU + {733E4772-39B5-4155-BB09-07F2025C8475}.Release|Any CPU.ActiveCfg = Release|Any CPU + {733E4772-39B5-4155-BB09-07F2025C8475}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {5A7B2FB1-2C70-4096-8533-3A0542E01030} + EndGlobalSection +EndGlobal diff --git a/DoubleDeckerBus/DoubleDeckerBus/DirectionBus.cs b/DoubleDeckerBus/DoubleDeckerBus/DirectionBus.cs new file mode 100644 index 0000000..0ec093a --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus/DirectionBus.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DoubleDeckerBus +{ + internal enum DirectionBus + { + None = 0, + Up = 1, + Down = 2, + Left = 3, + Right = 4 + } +} diff --git a/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.Designer.cs b/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.Designer.cs new file mode 100644 index 0000000..f5ce44d --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.Designer.cs @@ -0,0 +1,137 @@ +namespace DoubleDeckerBus +{ + partial class DoubleDeckerBus + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + pictureBoxBus = new PictureBox(); + buttonCreate = new Button(); + buttonUp = new Button(); + buttonLeft = new Button(); + buttonDown = new Button(); + buttonRight = new Button(); + ((System.ComponentModel.ISupportInitialize)pictureBoxBus).BeginInit(); + SuspendLayout(); + // + // pictureBoxBus + // + pictureBoxBus.Dock = DockStyle.Fill; + pictureBoxBus.Location = new Point(0, 0); + pictureBoxBus.Name = "pictureBoxBus"; + pictureBoxBus.Size = new Size(884, 461); + pictureBoxBus.SizeMode = PictureBoxSizeMode.AutoSize; + pictureBoxBus.TabIndex = 0; + pictureBoxBus.TabStop = false; + // + // buttonCreate + // + buttonCreate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreate.Location = new Point(12, 426); + buttonCreate.Name = "buttonCreate"; + buttonCreate.Size = new Size(75, 23); + buttonCreate.TabIndex = 1; + buttonCreate.Text = "Создать"; + buttonCreate.UseVisualStyleBackColor = true; + buttonCreate.Click += buttonCreate_Click; + // + // buttonUp + // + buttonUp.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonUp.BackgroundImage = Properties.Resources.arrowUp; + buttonUp.BackgroundImageLayout = ImageLayout.Zoom; + buttonUp.Location = new Point(806, 386); + buttonUp.Name = "buttonUp"; + buttonUp.Size = new Size(30, 30); + buttonUp.TabIndex = 2; + buttonUp.UseVisualStyleBackColor = true; + buttonUp.Click += buttonMove_Click; + // + // buttonLeft + // + buttonLeft.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonLeft.BackgroundImage = Properties.Resources.arrowLeft; + buttonLeft.BackgroundImageLayout = ImageLayout.Zoom; + buttonLeft.Location = new Point(770, 422); + buttonLeft.Name = "buttonLeft"; + buttonLeft.Size = new Size(30, 30); + buttonLeft.TabIndex = 3; + buttonLeft.UseVisualStyleBackColor = true; + buttonLeft.Click += buttonMove_Click; + // + // buttonDown + // + buttonDown.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonDown.BackgroundImage = Properties.Resources.arrowDown; + buttonDown.BackgroundImageLayout = ImageLayout.Zoom; + buttonDown.Location = new Point(806, 422); + buttonDown.Name = "buttonDown"; + buttonDown.Size = new Size(30, 30); + buttonDown.TabIndex = 4; + buttonDown.UseVisualStyleBackColor = true; + buttonDown.Click += buttonMove_Click; + // + // buttonRight + // + buttonRight.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonRight.BackgroundImage = Properties.Resources.arrowRight; + buttonRight.BackgroundImageLayout = ImageLayout.Zoom; + buttonRight.Location = new Point(842, 422); + buttonRight.Name = "buttonRight"; + buttonRight.Size = new Size(30, 30); + buttonRight.TabIndex = 5; + buttonRight.UseVisualStyleBackColor = true; + buttonRight.Click += buttonMove_Click; + // + // DoubleDeckerBus + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(884, 461); + Controls.Add(buttonRight); + Controls.Add(buttonDown); + Controls.Add(buttonLeft); + Controls.Add(buttonUp); + Controls.Add(buttonCreate); + Controls.Add(pictureBoxBus); + Name = "DoubleDeckerBus"; + StartPosition = FormStartPosition.CenterParent; + Text = "DoubleDeckerBus"; + ((System.ComponentModel.ISupportInitialize)pictureBoxBus).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private PictureBox pictureBoxBus; + private Button buttonCreate; + private Button buttonUp; + private Button buttonLeft; + private Button buttonDown; + private Button buttonRight; + } +} \ No newline at end of file diff --git a/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.cs b/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.cs new file mode 100644 index 0000000..c5f235b --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.cs @@ -0,0 +1,57 @@ +namespace DoubleDeckerBus +{ + public partial class DoubleDeckerBus : Form + { + private DrawningBus? _drawningBus; + public DoubleDeckerBus() + { + InitializeComponent(); + } + private void Draw() + { + if (_drawningBus == null) + { + return; + } + Bitmap bmp = new(pictureBoxBus.Width, + pictureBoxBus.Height); + Graphics gr = Graphics.FromImage(bmp); + _drawningBus.DrawTransport(gr); + pictureBoxBus.Image = bmp; + } + + private void buttonCreate_Click(object sender, EventArgs e) + { + Random random = new(); + _drawningBus = new DrawningBus(random.Next(100, 300), random.Next(1000, 3000), Color.FromArgb(random.Next(0, 256), random.Next(0, 256), +random.Next(0, 256)), pictureBoxBus.Width, pictureBoxBus.Height); + Draw(); + } + private void buttonMove_Click(object sender, EventArgs e) + { + if (_drawningBus == null) + { + return; + } + string name = ((Button)sender)?.Name ?? string.Empty; + switch (name) + { + case "buttonUp": + _drawningBus.MoveTransport(DirectionBus.Up); + break; + case "buttonDown": + _drawningBus.MoveTransport(DirectionBus.Down); + break; + case "buttonLeft": + _drawningBus.MoveTransport(DirectionBus.Left); + break; + case "buttonRight": + _drawningBus.MoveTransport(DirectionBus.Right); + break; + } + Draw(); + } + + + } +} \ No newline at end of file diff --git a/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.csproj b/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.csproj new file mode 100644 index 0000000..b57c89e --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.csproj @@ -0,0 +1,11 @@ + + + + WinExe + net6.0-windows + enable + true + enable + + + \ No newline at end of file diff --git a/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.resx b/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/DoubleDeckerBus/DoubleDeckerBus/DrawningBus.cs b/DoubleDeckerBus/DoubleDeckerBus/DrawningBus.cs new file mode 100644 index 0000000..7571c88 --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus/DrawningBus.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DoubleDeckerBus +{ + internal class DrawningBus + { + public EntityBus? EntityBus { get; private set; } + private int? _pictureWidth = null; + private int? _pictureHeight = null; + private float _startPosX; + private float _startPosY; + private readonly int _busWidth = 100; + private readonly int _busHeight = 70; + public DrawningBus(int speed, float weight, Color bodyColor, int width, int height) + { + _pictureWidth = width; + _pictureHeight = height; + EntityBus = new EntityBus(speed, weight, bodyColor); + } + public void SetPosition(int x, int y, int width, int height) + { + if (_pictureWidth <= _busWidth || _pictureHeight <= _busHeight) + { + _pictureWidth = null; + _pictureHeight = null; + return; + } + _startPosX = x; + _startPosY = y; + _pictureWidth = width; + _pictureHeight = height; + } + public void MoveTransport(DirectionBus direction) + { + if (EntityBus == null) + { + return; + } + switch (direction) + { + case DirectionBus.Left: + if (_startPosX - EntityBus.Step > 0) + { + _startPosX -= (int)EntityBus.Step; + } + break; + case DirectionBus.Up: + if (_startPosY - EntityBus.Step > 0) + { + _startPosY -= (int)EntityBus.Step; + } + break; + case DirectionBus.Right: + if (_startPosX + _busWidth + EntityBus.Step < _pictureWidth) + { + _startPosX += EntityBus.Step; + } + break; + + case DirectionBus.Down: + if (_startPosY + _busHeight + EntityBus.Step < _pictureHeight) + { + _startPosY += EntityBus.Step; + } + break; + } + + } + public void DrawTransport(Graphics g) + { + if (EntityBus == null) + { + return; + } + Pen pen = new(Color.Black); + + g.DrawRectangle(pen, _startPosX - 1, _startPosY + 11, 100, 60); + Brush brBodyColor = new SolidBrush(EntityBus.BodyColor); + g.FillRectangle(brBodyColor, _startPosX, _startPosY + 10, 100, 60); + + g.DrawRectangle(pen, _startPosX + 30, _startPosY + 20, 10, 20); + Brush brBlack = new SolidBrush(Color.Black); + g.FillRectangle(brBlack, _startPosX + 30, _startPosY + 20, 10, 20); + + g.DrawEllipse(pen, _startPosX + 7, _startPosY + 55, 20, 20); + g.DrawEllipse(pen, _startPosX + 77, _startPosY + 55, 20, 20); + g.FillEllipse(brBlack, _startPosX + 7, _startPosY + 55, 20, 20); + g.FillEllipse(brBlack, _startPosX + 77, _startPosY + 55, 20, 20); + + Brush brBlue = new SolidBrush(Color.Blue); + g.FillEllipse(brBlue, _startPosX + 10, _startPosY + 15, 10, 15); + g.FillEllipse(brBlue, _startPosX + 50, _startPosY + 15, 10, 15); + g.FillEllipse(brBlue, _startPosX + 70, _startPosY + 15, 10, 15); + g.FillEllipse(brBlue, _startPosX + 90, _startPosY + 15, 10, 15); + + g.FillEllipse(brBlue, _startPosX + 10, _startPosY + 35, 10, 15); + g.FillEllipse(brBlue, _startPosX + 50, _startPosY + 35, 10, 15); + g.FillEllipse(brBlue, _startPosX + 70, _startPosY + 35, 10, 15); + g.FillEllipse(brBlue, _startPosX + 90, _startPosY + 35, 10, 15); + } + public void ChangeBorders(int width, int height) + { + _pictureWidth = width; + _pictureHeight = height; + if (_pictureWidth <= _busWidth || _pictureHeight <= _busHeight) + { + _pictureWidth = null; + _pictureHeight = null; + return; + } + if (_startPosX + _busWidth > _pictureWidth) + { + _startPosX = _pictureWidth.Value - _busWidth; + } + if (_startPosY + _busHeight > _pictureHeight) + { + _startPosY = _pictureHeight.Value - _busHeight; + } + } + + public (float Left, float Right, float Top, float Bottom) GetCurrentPosition() + { + return (_startPosX, _startPosX + _busWidth, _startPosY, _startPosY + _busHeight); + } + } +} diff --git a/DoubleDeckerBus/DoubleDeckerBus/EntityBus.cs b/DoubleDeckerBus/DoubleDeckerBus/EntityBus.cs new file mode 100644 index 0000000..1ab74f9 --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus/EntityBus.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DoubleDeckerBus +{ + internal class EntityBus + { + public int Speed { get; private set; } + public float Weight { get; private set; } + public Color BodyColor { get; private set; } + public float Step => (float)Speed * 100 / Weight; + public EntityBus(int speed, float weight, Color bodyColor) + { + Random rnd = new Random(); + Speed = (speed <= 0) ? rnd.Next(250, 300) : speed; + Weight = (weight <= 0) ? rnd.Next(50, 70) : weight; + BodyColor = bodyColor; + } + } +} diff --git a/DoubleDeckerBus/DoubleDeckerBus/Program.cs b/DoubleDeckerBus/DoubleDeckerBus/Program.cs new file mode 100644 index 0000000..fa559b5 --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus/Program.cs @@ -0,0 +1,17 @@ +namespace DoubleDeckerBus +{ + internal static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + // To customize application configuration such as set high DPI settings or default font, + // see https://aka.ms/applicationconfiguration. + ApplicationConfiguration.Initialize(); + Application.Run(new DoubleDeckerBus()); + } + } +} \ No newline at end of file diff --git a/DoubleDeckerBus/DoubleDeckerBus/Properties/Resources.Designer.cs b/DoubleDeckerBus/DoubleDeckerBus/Properties/Resources.Designer.cs new file mode 100644 index 0000000..31fbf58 --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus/Properties/Resources.Designer.cs @@ -0,0 +1,103 @@ +//------------------------------------------------------------------------------ +// +// Этот код создан программой. +// Исполняемая версия:4.0.30319.42000 +// +// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +// повторной генерации кода. +// +//------------------------------------------------------------------------------ + +namespace DoubleDeckerBus.Properties { + using System; + + + /// + /// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д. + /// + // Этот класс создан автоматически классом StronglyTypedResourceBuilder + // с помощью такого средства, как ResGen или Visual Studio. + // Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen + // с параметром /str или перестройте свой проект VS. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DoubleDeckerBus.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Перезаписывает свойство CurrentUICulture текущего потока для всех + /// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrowDown { + get { + object obj = ResourceManager.GetObject("arrowDown", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrowLeft { + get { + object obj = ResourceManager.GetObject("arrowLeft", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrowRight { + get { + object obj = ResourceManager.GetObject("arrowRight", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrowUp { + get { + object obj = ResourceManager.GetObject("arrowUp", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/DoubleDeckerBus/DoubleDeckerBus/Properties/Resources.resx b/DoubleDeckerBus/DoubleDeckerBus/Properties/Resources.resx new file mode 100644 index 0000000..59a6f4d --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus/Properties/Resources.resx @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\arrowUp.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\arrowLeft.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\arrowDown.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\arrowRight.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/DoubleDeckerBus/DoubleDeckerBus/Resources/arrowDown.jpg b/DoubleDeckerBus/DoubleDeckerBus/Resources/arrowDown.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ec97b0448bb7de7842fbdffa84bc58c22aab47bf GIT binary patch literal 33694 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 URj}GbM){hZ(7<2qi-ZkrXrPrMHQsNDXf$W{e?u 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 jMmHEZJO-xkmfDmaR zATW-hs3z{Ld^0RUuyG*AE%aBmen@Ix#CNVt!H z{{X`LU*&%w*3IpsV4b3~6d*ZQ2gp7i)CMxJOc5UM1VClG_8{Doh1p)XNW+MUCXj+< zFm|GnjL`bmei{P(PaPO%kwE;6o~UF?Nc`MieEgq_|Mug2ajXU)M6X3}fgO;QmX?v0 zl9iE>k&}~^S41f(Dkvx}Te4IcrK72*tD~u{t-r!#wZ6exLv3xe6=toOITnl6TfNa{ z!#Zmd3+y^^BM3P;IYk9U4J9Rwb<4GvubcNv^bn}XisM2^#Bv~^f~9MS7{nUKxXM z)Vi3&8?uI5Z#_~aHjb{a@QXMlC$FZiu}pL2s?}(W5!Q0O)rO6m?6wiM+dDWqkvzS2 zdhhy$?7wgSfq*~?^-$#DBT>;uX{UdWJ#+StbIeOg$tjnwT)oE1%*xKm<>Ybm|GLd9 zDJ?6%bNBI+r&ZN8&;G7`)x>XZX?^{st+T89V^42i|G=Q&%h>qD*U71G(_*>Aa{he% z5bVFmr2^%Wkd#D9%82DcNJPO6sUj)0++2Fe77v-d;Y$tH#mJ(zCf>O9NY2oLII8Lw z(I~IB0^7M#AQo*-vj3T2r~Z#5`eFfRV#=k@$<9X=!>B?^W@4|-L@aP`>`!uF9RJ>b`8|h~whg&kn zCS+!3^tv6tzIFRHeOf3~7O*A12N%!GJP`r9%v9so=l&vKx>y9-{bvFZwynV;fK#Ej z`(1qhRs`yw`cA%v&A8L+qbo;lIexv0>*LX3k>q!0+*lj#d%s5?Y{v#R@gNrH9`_w< zfn~&_jr96$KZ+vh?Y=LFN4c{TGyPy}>Gz>;jrVaCxJ|&ScrsS2CXbB_n?PM-OVur7 zOV(+-OTWoY!q>85KOIpc?s;BYyk+p1{Mfx&ry=6izr&XsZuFGt@ny3K8?BS-8dil<(eFhAp%3K%bAkkked#LF&GU`4r9w)NS=Uyc!S^sY~?H&mNKJ<9AxA# zx+7z)4~svV2GJaMiHvfp4Idmh-yr=adsR$Y<@uw`rrBO$O08dv)CLmbaR$6{r?{VZ zWgSWvL(dfjI^9q};D%y^aizefba9Vu8M>IqG0gTbzIB6sZ$dT03X>a?)*4sYOr}?~ zzq&(})X0&zx<~?w_jpdkP2v;a*2U2Nv0YR~3Gjh5F*AA+E8o zq#rTlD#k;Af9y8lGM>+qbwVSfSs{VQbb;G+f$wDMw6_Hl>>+ktRdAJHsEL~)#^9Ba zEC^!^Je3)SVnlN;@PGgcFK`nN4qK)v7Ac2owtB_=*q{#wU#Y2XB{(Ep-Mcwd+}=he zFyF!aZG$`+xMOC~2*L(=5H=(}H4Fu&!^C3?$AAehzziFL$U-nypgPcql_EeC0jC=* zV6lS*KIF2%Bf)BO$Ye2!(*Q$Zl;=n=beMbGC19_>bhNg+L=%)B3W`Gs9DZ^Nj#m%t zY6~2k+w?qoPCze1u@SE|-h|gUY0$fwUO;zxR0XsGtITu=0FCy)qz!k@9{cv*fvllka>4{ke;*G9l&sKY~VdkQi(k1jKSt@*oI<(;^y@vj$>m zXF~68ahnX%!;1MVLvX<&k_r{Gaim>SY$VFR?W#fo6$01Y23yU9qilkCNJKn@t;t#{ zJZ<6)rM^+UX539#=FJ5GOm61X701?#S_-_Q>w9j5rnC-nzMW@+*N~>lNHO-EkSn^F z4tMj%X;Ko)4vT>9B@wu{>lz!0J;2yx0WY3%bN1Ou&h$>#AHtMpGSrgg!4V8WUtK)b zuQ>?(vXf{LNObcSfnrDc_)=dRLtez1>K7L{%ac1!Puz&tDT)w9=5P|0v?S?{RWhYCvku{4F;K_fZur%B78?F12af2ypV9POnvMRzW`Ycu60LRm`(hC z`s1k1;%T|!*=f3P)x}SGqt~Z`gr|Z;;ADmfoa4|RAMMQe`7z_qteSKU5nyLRRm>5A zE{c7^adQ#aLJ)yUHxYQ+pr#`Na+7Cp{piZc0TGyD`A)gbn8F%f|EggzAp%;_5o1r< z;(3~vDw=jX{PBQv{uU8@^gd72lt<{Fl9P-yh`D|tMqo&8EVT>k67qG4hsI()&C;z~ z^ZIpd8YX5F?ZdwY<%+;%bv;b|t$un&iNq~_jBD<4s9hHeTGG%GYucy2q|UbWjp3yO z>pBRn3vqq2K5&}m`gDsWG*pR`*eObF(1X|lfpkLXC;21B3Qbe;Qm;lY*O8}_6 zLc@H6%SSeNAy;HLfv%$y* z!2B+>J|F@|?!0I~uq>PxU2SsFx0o>5iR0d!<$>UwDl>JI-^Il~l&`Gw23l_eiwu>@ zSLACTho+nLrU;SB)5u*A-4wQ;2s~cHrZ;HT2xkgSXAD>}vxuAYk=h1zb)kw2QphO9 zP4-aQN14&|2XWB2om69#SB{>WqR)NONwNQZ#zqA2yOqC>@}ypjs7wWHEgOBwwcbQX zj;IMTG`y*=y4+DxbChYf#f^yxNbx&kb!qzsPr_Qa26^cymdxWqZ}+$Bx%y2V8#c?n zH&o^jX6Qx}#xjpLnVu!hO4l9#JobF-8GUKf=)+vYsQVkB_@r0~T^Vc#T0&uDY7~Os zds_^?*(MqV%gD)7yh$f{hU2BtRX_vIcku>ir@KVgb*M<8!dQ3Q6W4XA1vm84cUH2s zUhVP~^;S$UMKb9nL~{fGw%$W`EKU0KC~JCTU)u{2*!Rbmy>Uv*r_)bQ6uUJZx61BU zIoNcw`y8_~+xp&#U1PHtq~${n3C@zd#iLO9LhBm~w&c;D+0rM2uGE2L*|2LYO19MI z&s$Hpz^U}JSK@axs+=w3H#e1O4U$%+9#l0ewL@pV1e~w_?z%|!QC{Trr7n%ePc;vx zg_%ZV^@eh-Gpb`)`cTu@aUZ&y^E>fp5m0;R!EFr{_hnJWY;8{A>;XUv5 zSCYKKhw;)jc{L@#21mw<%?#9tg2xgmZJ5UhhzRc$1Vhs%&fk4AEq^eNh6Et)RJMfDXb}*$kL#4D>+?0$T zRE`_u-O0oz}&1AkV2kJxa?1NU{54zZPy2L<^e@XV-hwtlq8gdvZKX@M|HuKSwT53-=L zhub|$I3COq;B6p+5{STa8W65XCOAAN9E6@phAJO2DYsAr^iwk?*PN?EF2x?WdZD68 znT+2){tots3?P+E;3gg{shldLI<#`j!=X*u0K2FywHeAziUr2j5HRf~t|F%(VJi7o z`kg(-X7Wyco0m||7B2teXl_@GLTNk?+zYHiDiRxhiWmdo0(;=;XsE&!#Ku63qq0Pr zl)jFuL`?ET#y8}z^wv!shn%;tFfp%Lb`E}vc;)OZV)TFZsmk~tn!}Nhm?Kj-ev!m= zyu7$?9T@(Z4G>4!oI?6DwGrVR5g?C!YQm$EAAYJ^o^4LLM49^0+#D^$vWj;Un0p{U zpn-!9(x+oT$ASl~F@w`!j^`j8WW>b71f3SHxRNnZKizu$0BdnF30ZjIH?b6Iv8v{yG1^xj+3 z+?Tf>ywXTFaw~n_Uzq|{zs()@t!0Jwj=R+|l!xW+Fa3gTAI8)`hv-2d0#{;Uv-At} z!(Y*Z_AF`?`p(jT+wifB&o$rZ69c$X6Z$>99%xM1(jsv1J^hI3_m3hFulF{}_kEo3 z8?GBKH+%00?u_1C@#?R$eUp1(yKYkr;JDqf+1K=uBq6qa%AuHkPiA(MUL6NAMlbmW ze10SX$MpnR!X-hSGiLO5nVG;p<)Dq-ek0>f=+BSt`g;Th00t44+#;+OOEpCH)zm<7-$JG}nsZTk@$>q2V@>=QTA3r8JxR_}XK-7r= zWt!cx4;LGjpJ4?ea>d)#Km;cTJI0;&*X170(;y{boPolYc`qP5^H||@FvsIF} zj@}d<92UGka<6`L@WGHno1$$D=33tb_r=Ag2Da7_`wna(ZrlD(4R~Z@@K0Z&qM}Tq zEKEWp0!+;}Zro^Uw$60jI%8PF_|Vai$i30VA%_hAX<*y_L;ewzut-X1h`zYNy?&vG zBW(;0AExZvbYSlROTT^lERFs4TI@46H{Z9{c<(+7bK`v$7W=F$%{Qz&VD4w|vxC85 z|GNBt3kAF$6ls%P#QweTR+ndJ=t0~6(cLX;)Bk$fzuVcrZExg$TXFEo*leS*xs|8* z_Ln#yWnyV%`5!0#sAp{|7Vtj=w*658F@$^nLL9=c|9|1NaFKa|ya3k%T=PO;UX>Tv zwE)+=5SUlx1$HgKH7^9_Re6D33vkT~fq7M4VAld%^Fm-=l^58x0N1<_m{;Wmb}hg) zF9haQd4XLEaLo&Wc~xFu*8*JgLSSB%7udA`*SrvzSLFqEExTv zwE)+=5SUlx1$HgKH7^9_Re6D3|JULA_fs4DL*SztQSh0Jxm*)S2?_Ck_>zSGrDVlf z8>HlAWTa&kqoAMONdKIguz0t2~hI?e6EREz4}5+)){J$C074Hu7!J@^MPgg z;J~uHwk_%9y5rfOLu^y}K47Qbu%m4clz5-mIqRzVq45kKH;i+8jy)6gtv=i(O`4Pef z&88E>>!09$fk$9+z3sQ`Vwk}q_S;PnXjuRB*vvTzQ#F3%g*L{N`FyjS|1seu5 z2)(*su_b+4`n51rh^-vGS8@P8K6*=UvVE#S=Jr@WMYH1I@xbQPq73-ZZvuS8%xGqR zvsO{Y{vStx_I+PEVus7Hd88M6bi>pmZpODTm~Ep*1gevd`|w4eulfbOo!*VtEfms7 zyT)q16r1R&l^C|v)_hjFXn^WAyKrpaTk)O6~Hd=6BiO7y;sm%x@P ztFMcI!e)1yVB<=`h=8qZe_&GY`l^xRLd(9>T`u2-C@?`s0zKYzW^K?6tY7#id>pN^ znqecAI@5c#-O6sdRl0Ilb$`)_hx+M8-6GIwekY`Kbm=&*+f8?EIqu7d>@<8f zzj|8lS(EDt<(@qc1u)IW*kjWcaT6>0ZmOJwAFm2ICfuGB)%wLU29~1UTVJi|a}|EL zR@sy0KLB%4;P#v#tnS`5ROIqreUuaLM`~7MSVqZP$-nrOxLvpyBLbm^Ub{=5>2$2{ z(ksQWIdNxf@N9*(?*xwJ{H@z>qjO|DuC#*_3 zjNDd14?7v@xx1eokaL@~ED!Qov0;Vc6HBf2-FEA{osUX7y=*_cedPJ->65&e^v#0y zu6=E51D>>bR&Ty@QH$Fh%G&VqBw>6-gxd|(vByPLz`VZLw~!irc4v}L>x7Qep=&0& z0rl*91F68uyV-pG=4z~V};Nt zk;bQ25lzV;X)2#ECKE;zT=+S$n0)Sk zyW}+*|G9fH`C1@ifK*J5F@o7ML_pQ)KGn2~>s^RkMUH6NnRY)A@#1Wu{oR{27bbSv zo!vWvUmoRg_uAcfJ_>hudG2Ra`fqF*50^116k@>nC!Q{K`ijlLgtMiOsNeFvNX{N4c>u*UC7&a}=ZziR$iIDycPgj@PGX3(!`-}k87s*&l8m+(8oxAN z+z+rIM1U*vB2dDUOJ`=0lkNkD`_%nI?hu>6-y9QI*(1(AC94IVF$NP* zL~oX#SX$t)p(~yD;&`)BF&423^Bm7Xiv`}{>}6>H^W31@AW%ODc|#13`51&!En80Y zC>Nh=O1{j{y>GNFueGNun+zb6N|sD;aZJVv@^z}Jsu^3#r(_-T9Kkg+=Em%x*N_J! zmc#u(tyMk~sgdmi>rMnYMBYq&k;)Ap+F}rrb=a;>yFv0T*UEDvc3*?!8!UWxm&vmr z{Ss?vX~|+NE^YJ*)jE8=8rPRf?_ZT0pz1RuwEm165+5;a?cSCUvrR7?A zl*U3N2P^nl7clv`83`>+1y0%nEJjWR?BW9eQr85tqj}nY&I+HF#%Ca(j zN>&0Jqr-U~)Np)5K})WO2bz01<}WX8zgwY|-CukQgNtcT_~MB(;_kS}#qwO%;pJ@P zs`D%-G$JA}JCk9vZJJNC+{ntL0w<>6Rse4HQ0PbM9=>|K@a!CqzG;GQn?q|6pU`ba z1Yh#6nJfuQ57)OlN|Q+lGqq$=GAV@sED1K@Oj%(}d z&6GO%3Vy09BpT+eD+T45dXfqvxSa0Z8w4Ds4s7&hT_vfyIO63qbG z)PtT*Mtf^eO7bP^Ci0q(a=oC2C-;@CoxOXIPP?o6{mIatmb}+|Xg_JE9PVVX z;!bGwOSlI9og13<0tIGRnDpNuNcOh87Anb^3YO*H?-T(-#%#54dya8B^?p-GS*q|( z*%vJ0%cw`p_C}&&u%43-hHcOW@$x};T~+exN`u)kP$0RSlP_@d>S7pralI&yD1ji0 zV(hxdFFjuw3yfGNP(36TgoV34?UfPh5<`{X$m?b0Q-gWH*oJ_mdHyjc*em%6CWwg7 z&8ew#emmxwU(xU|qS(@uMitA<{RbmRy8Hcz_k+&I`S0)aW_#e3y?S%KuvI=(54^&h z1tB=+2TC}3p_1XG|J&0uqsj&5Cqlr9+HwO{g|^_VsmDZ7z)lgkcwPiXyj?2-#)?S0 zY6qi`v&94W#U38eUgDP=i09YwL)bE(Gq2rcf{BAoI^19Kt*9WRlX<3FXajS;gjXhV z_)+$1P4x2iXALrSi1m5(Ia&m_+nk>5wSlrnUd3`xHS$Oj#+hjaRXC;;Km-o#aLQyX zNk0vB6XtCo%qF1A@A1LZLTZ()E0l*>vM^ppZ%}_ty@LYzx!Kt$XbZ)2O)b`EVwDXB zq!@5>^T&w!V|azKUasoVYzPyxq5)Z>O-lLa;1!&xO&5@P`EU$UoD1%D8&smG*op*(YnXoXiVY?ZV#W5#pI=1||92wLk* zY!Ur~-ZO9CvQt6lTX7#v4+|&9Q3&#R{!#2%s38ZfJohx#fgN|5aV#{lWmnU(+fI8t zkHWlXC8}>AqtZm6$zmpdJN49XWn-`2_=^UamweBA_NZV~gGyI?3A##~Bw@qLQe6#8 zK=ZHs4&DvQPz@RE-x$t}LQTMlpsvBmXRdEb2}EE9oC>NO;_$M!nuNm`ePVGPUbfQG zDQ;+Mp<{v*-l(bNs*Mo=1%^46P<_8U-fU2eg$LLP6l5a>+&d{&av|-kYzT!8Gtpa{ zbR><>L?dc*bJ`BMjKDM&suYMI=*+RWFVt7>F`IWmZ4){(TnT2K^EpY{V4STJIY~?QTIlJ9~f=0aU z&uzr(mbp;(H2so?h`n8B7unuFruS8rEBCf)OL)fZXSg?5LzS#+ zT9g>gyqq>8XQ?bE@XO-_=Ty^35SSYjF=kN^z-l8xHO4DCr@9SzdF*f~F(?G9FoV3= zRI`&l<#+^RRJoh_oY*=7~I zc}=A;E!uYPsWqg0y(mkJUY&leE;M-miJR;H94v&sJyM-g=TMMNsSqSGX)_h>$oy?& z0(UFqD6co0?83|EU}b5A&T3gdW}kwa7q(#|H|08W_DN8QoBbGVP2j|xQq(l3piw2JB6An~y=$q_nT z;0~4;0@c~kc(Xq_=6PlA;5}62u9 zuu)U1MmEwbnyW(bMos+sgz2ZQo7_WUs#&;slra-e#aDRVDt>{}B#;yBUzl%2b}3Jx zUrD!E%gV~EZ{785V2sn(QjyTCIkvnje@?UVgcFe{jBQJFsS6D=!7 zJAOdBJ#tp#bd77uh|!%#gW3D6{FJxa1PRh%JGwfdB2MRc+3AvV zX7@sU4`;{sCjp6B4fLetc%+4Wxa6TH1}>7!Wh>8}&O$bv(N-B}yR37%WSLtey(3Jf zo0#9U;>ZU|_!#lk@bWwf0y#O{*{j}iB~q0D=aso9zcv?UI)lb;F!z-Gq}aJSGBY=a zM>lz=MqjJ!IzhA1o0cE{v(ikpR~KD7b!Lj*$0Z%7gFDe?vwj zvNEknaq>Zy4vNsKX`PY&;JXj{0X}J->e{>OKA(kNfS}>tb|q6)lUkQ#eZ#Kv0XdF; zB^$e|F!y+-5;l4>!P(%AJ9FQ_#4gJf+z9U*mQH!52K8pV-O=UEwAFeuW zl4qS2?&WOsybzw~dl@&{?5hTK9ZlR1m~l*6@Lu&#>Yp7fv#P*Mrd={gmkWpbxu zZNj(1cVYOUyZFKyuArt$S#`#l_0ktLbVZY2O8pzTN9x7iTWP;3JN3LR+h{Ym>GJPc z4+1lZnrr|&SLJL7a2eky8r;z5fmuRd2E3tC-Ty`tDPe@pS^Oa_i1 zR1vm+P!@!pc~Y&`K6-ZWJoxUuYPXE-$Yhq@hypKoTLp7QQ8x%rgP7mGTPLQJ1YSpBvN$=in8_avs*maOQJ#k~* z9=F$m3wJbhCya_dN37|t|D8VSp@j7Lveuf;sXQC1l`y`ap8WKoZ>9$YtjuhX1XU|`jCUs%z+^gv+#tNgL8{J3Rx>vrXfJ#5SkrOkSl zk{93-aKvTKI>UU2V)v*Ct~lVLSO#&XKIdo@v+|=~r3e&dGEutunv(nh2xdh8fjgAu}=A`+ZW5_ zT{o_NKI1m&27SMt)bN)0%Zim>^dVyErE*V+QUC;FL*eapFvG}40 zblmV2bazBVOYHv3t1Eb--(bR_>H%+|+(gF(;R=CrA6$cLaZUQCtSBO| z!hInYh^nQh`j^Z&svHP8J^@9n$Q8zj={lU++IK?wd z-#(mzDG{$cwG*6%0jvgf`-fAL^{>u*xBHHc_#!jDT{{jl3c^&2Ga*-mI-MN{`h-hD zRg@pY73f^$tJ%es^v?GmV5X%T8BcvvV7enMj_J(OvWHLU&+58NYkyYM%lJs4*W3BB z*NA}Rr%}^c#SexvO64NZ7CAB%p7{E5LykW8Q88_{Km-Eb zFYQ=#qq7|AvcsKE@;pOXA#C{a<(_;@JQH_+z(@Y|C-d=a_hb*4DbT}y^wbtG{;Ue< zrq80Ebx$j{5<2K-AFP^6ylHZ!Gk(c;as`gI+2QY9v+sq2%9DQ--#WRN{%8aL+orQm zulpat`)BqK*L*Lw-9#_Pb^LmIX+YHj_0imt?h|C2HBZ`pZ7IuhoDBYyNl|XT^*ABI zzU4vh?A1ztJ-r!RbK#6#(NyiwW9@?HnSpM5BUL(ZA*+a@x>%JIH&_w{RuxzIYgV0>ofce&$7$VN{mts>bb&4$|SSUZ_sy zo`4)+705ASMiiq2Oz>NkDN2Z`&17igV+J$R^D$4LYv$qVRqsUWM)6?ib%JAR0}Wk2 z4;T#(5sS1?08?9Oh9fW5QxJhij+Gy+I+Ul!@6D;n^Qna=VAxPMI_$_GCSEeUoEk=YKz{T|p>0)!i-CknluPadPLwnd#VvUxE#%pS_mR3AWjj2s|ar;ZAaGZ^&YD)IgvV=Ae3v(rWh;1RGY@$->CxpYNw`UnWdx}<<*N| zbf#=DXlPc?{?Aci#-i)Fzw91pSzPpbIM{Dj*OpIN3H6pIJj<{K8_!oNPPuI#J(;-Z z3VUED%{Eo}UFq#uf1lGygVBRW3uE_04vbeB6{5%URUgtw&8~r7+?2q@Mooe-MTjGI z30z!5BIw%@-6it4>u31QBr#v0C!d|I4Tq$cp&M6Paj5#52>f0EjbTyccXaWAw&>~B zxM*las(#_ZBx%00$t3)~L)*h!vY`KvE18=2-s6yC5`O9DOt#p0sQ5FtM1~2YB}mLA zftDVgp2+bet@o#M#<7S;<3skUYfN#ms~Yhtf*n=3z#I*>>{q5si4|PPAT$LnSC}Uo zAvX}ZjZXPSE}6-G3=MPFuIp7B{1}>ILQGU+jxYiA){ijVdE#|W3|xDVnh7?Z?$94{ z)QsolXI{t4U5MrwrDHs4O@e!gc)c|z-{^svy@DrI>GGwcb;-e@l;E&3R_u#Y8;rm7 zZ|~;!$;3*s8mH{POHQqR*sIWvs{OF8`Qqm{M&EXN{3-l|?>R%SI67X;F;9PYx(eML zvn8s5+4Ay3b<5@*yQ71H{SbapRI62 z*nmcAEmUa9fhEAG(DtJEQ1TRvi=>uWGZSGd#oCHj`EVTyNe_)!sw+j+#g?IzT>^bP z1J8Shp0TBL3Z5Ph&zRbA*lij*wSO@umG1ObSk>SY)CW($nj03sF?;Mw3LKQ=5;d1) zScI{vnhOf?*~NqOraW&Dua&c9^>pbp-Hv3Qw?YJVw%g&gPqvfc8tM7aMAm-rW7eXf zN3Tc}5D(@&B!dJvLL4|!z=HWJPcS!QEfADwPJYv=2FbnuiM@>{TojnJ0fNVl(v+R) z1y#Tt{&n+0O~Cbl*E3F@JUV9x|2QoRn_oUeG-!~>ZxRd;j2g^PJ)D&ew;DjfJyvvA zOcjhB$*E8Yh&wrZ{4O(e5}YF3nY&2MM<&=(!sX0s-uDfPK2zGGV8Y3bJ7Xceffr{M zeS_A3Y+i&@@mbnE@=bdpbb5FWpzL4Y%;2s^t3O=}GqO^kVQ38%vv=>lSLWE4fiE{T zA>Ls3y@FwoB*IFFQ!Mwsl(A*JgVF(2g^c$ZH#lGOQa9irNWD$2WRjwP+3fu5>nylq`jsa6ih% z7r4QY$cIw|udeibbWIMLEd^JFU5WOpYmb{^K^!qZD%(qj1<@F&GWkGRf2nz0AwWPx7~L0aervC;1Jp2)c@|_3`aE!JZ)8 z1T@0?Q4QK6fDO>0T!SHtr;c}%R%P{G2$XPU8QBK1m5=4#4ng$}c=Yvf5!b#^*W)nL zn&DLcFdpJUL6u3Pn|Vsdt6;YDFvMq=2X_RHRSpF^{$dzZ!{v0cu?d|2FpjaV7c)AK||OKUaYoM4Ipq%Af9B+j|r@9i)fGyS>JRyjW^0u z+{RVgq(XI)TN;>oMI7}2TdHilZ7_{_Z(Z5avDgV8%=7c4RutHt73@$@Wl+>vWdny$ zy3LEUqb1wxZ3{zk&tdM7SN>53*YRMSYe*)LQ%J93;>vn8xL$!?k6>WOAyD-g^ILtF z)l34peir&0Z+1So;OkaAUYsgi86aF*7bLu=Jd2=Sv`EjcvtUu`);YqP8aH~+vq0)$ z)kSdnjUzSVN*pHCPLdPP=iV6;05qC)^7@87?4`cpNyAo`IAt1Hlc|9C7jPppELj_1` zj^;?Q6Ped~Galx^0KBxAX8GcC7%DIxo0t98)r&2WUS4G+CL&(89F9oUTI%|yJm7Hw z^OoXCJJ z_tW0D-LnVjO>mvUHa=ldHnXPJm#O!~y`+8mGj3d}VC%+9{A<|c1K0EqIo4@$mB2DA zbh=K+zA!T3e;x4n%GETyk)V;2TY}to>;wfWqR>Juf@ETF)_!MmdlW+bijyH1gVxmg zD?WK}kGp#V?;cb!a3UdeOrUj0%STJ-Kr0~LEvS-!Zo?7gMaZo!hN{t=-;9kn5&)J6 zCk*r^7#c7JR#1hmf|<_4)Y70A0sRayEL|yL;MkJl&@0BgG_9fm;pUa&HNo{%beAyt zNF2@?aH_Nf^10~+Lrw){g-+!*c^XWk{g5h2p%9Ny>>#GL#87o-&RgCqe-@qQrydf{ z{6_D(Oz-pyYM*#V?^p08O1(7qT|2WAddBg^3DePf(-O@FuD&cgR{Xi_zw=>;xi{ZqF^*7;kZ;7p0UG+W~#50=-&`9ecEt`QaL$rN-+VINsECBCrynZ^$5j- z%s`mCd2xa{MQDv+R1aj80X$hrF8&?!1T=KbN3+dUsqWH&;6Qc_R(3-jPP?&;m9q0{ zjCbyu9=$l+7oznR5%5LAEZ5}e7p4XeoTuRJ>6L4q>P?J7-ehi$sWo1fYl-c>x$PcT ziBPx71?(UYk|1?--y0cSDIpNCO0Tk%&X7ikR!(ut3S~U_b(_QH{mf?)RaQN ziSJ>6DtOF^g+48esOGd`wl+bsNK3)sJuEIV$IBK}Z7?>5H(i~4coTaLbBr3ynGZ^g z3O69!_V_UtLoRitl~--L*zlg$LlVdL%d^iI6n!XJ4eu(I+i)Kp&0p-#x`<$Tk&}Y; zxB5ejV#y~Qo`f2ze!*1C?hwDlSEa@F!TpG!Mh zw;Icf-wCy=N6EioTHSWdHMhjkZWo{0ZZ^$4#@}4pJ%rbhZd=ccJh&o$SA-HSlq@%Q zU*cEDAjW^}L5(8z+3_mSxT((BJe7RruTYObO^%ogq~dwukRx4J_KTA>YcY74*Gu74 zL|lca5RC+`3V0Q$bv1IjlHDc3oou+Z_qfk>fB`d_90o|$XbpxuMBW551arn~7F2CU zQ26<1jYgurcq+mGp~PG`5q_TFNFx_vXUHH1m}6X(>>AMEv;7hS_$n?)4=Q9-|%d%ycclzV(xO?Z^y8d~0F`+h0U zZGI)@=W^AuHx{fowA3-lkpN6wP|5BxO{f+Q(bCa5eo)W1HkTTE*WHnm^#KM&*UOCd zmVBL_C~{b|ZiDTElp6s>j-kI_4D}s}Vk^Dp1*;OQw*=bP^ff6_v zoa1%VzdLv(?YX`PlpaW!a>d5NRQrF?+i&Bw_EKsy|D< zZ}C)zuup`qOF-mfivbp`X3E>FatTjG1dMy(F9sOf&#WCr(CRnBei-9*h#Xae!U(&r zvuEMOVI*R*hfD9IL?5QrhvA0Lu@{v+=SUXW3)RZbs^1)g*GzJR-%|;CLLd9kEu67L z+WX~W9@(sccb{VKbmk1%)WDxpn1U;m$L*t!C(7^WeTBbz(MdYs(I&pB_O(dor1_Mu z@MK8ksLsHX?$xnpcc&K5NYf~0n^SzLVLq>m)P?HyvEGHvtwN-Yg5dUJ|G8aDv(3%E z)I|3S%?}eU=&I;_8H*ADMx86X>OjZDP*fyt_)Y%7hvQOvzH%fj`!Yr!SZm{YzCdRj zk)CF2Gliu;?-94C_8U#}1}8tmX{>n4_kj{ph%SY7oUr&t^C+=0iNU?Y33uVV$ z^*IjeGizSt&SuW2%76Z4Bxmo80`=(3Gu0>2_r9|4+>PxR?M*-E_)PuE@0*K`cDslNB+9Ew?cXQhWQRSt)}ieDFkg6x*WLx9YmXdklN|@$@ZK+uy;s6S2&R zc@?gqZMX?SnrFO6$qGpq_*JN14%JVQxLP@8h6nvQU-HU@{qW}5fQLKy@I)f>(A{jY zG;C>O!v-Zocgcf~@=cU%?vfB}>GIrw1YwCovpN+7d>e2+J}pe{{YELoE4GhJdj<^B z7h(7_@8YC=8%eXG)d59>YrgPJ>J8YRo zkB^ObJz|MrWG3^{HN8>33jwu6?}>+%6PhhczRHK5*Lx$i0Rr@4Ec2jWGNC@&NB|a7 z)K!^G5EPl$pUFZbcz6)jBgw4yX!v!2RRi$IOnSh*Ox(hNRu0Nt(&beqtPMq+Yc($< z*#p10%;^HWE2ou1fcNtLww*A)3q37+2iOF|AS6W<olX%YgefO^W$H)ESu65TXx^Xjm_RPG`Ja3uV*{{O4 z!fvqG(bmBhAP@+!8~y>po>iqb2_eA%5Q#t=03Zz{!9sw9XIk(Vf5cLNg69bM2O#wS zEkA`Y5T9dUo$DtFMk1=$jat8G-*^EdxCRLkm4~ z3w_g-`tYZog`qhBl4nu>L?uhq&Px1yu6Hg|e2y|U1K`}b|C}=s|A}t?6S*u{ESjGA z$mRb_lFkb~kH9j2{hMt*)z9IPEmBAY%5vado3Q4$Qq5{yc4DOvQ z$wsLDdwv;#{ksm_XF($V**#fOghc*xErnYj8&bpPF8&<2SVNG!x^z@C4j5OAnTbdbc z)-g0P5H*5Wuwa4gLRlp_IVFQtYO4(9{1MiHCDNjOArxX2KrTU`mLP2Hx-=DtTtGZJHv zl6h5n_0}5?6-dp)YYhFPjx3N_uBfD}vQ}#y7N>1wY+`C=ZehL6#@5c>!IA9Yx!r5W zZ{7icLBV?|A)(PRv2pPUiAhI~9Y1mM)M@&;tnBj_axPwC6ciS**qq{$(wny`DsNX+ z-?{tf&&Tyo8lFCT-qOl_{if~hyY`;mzK@?i_kS4}9QipqHa;;qHO&*rC6e=>&o9CL z7rB-|xsVbPC zmaj4DSvw*UO)S}ePp~8ZN0R+3*ni||2eK#xoIKPLfCrO_;U>eid7gVWL^&9NmXJGa z6mjj!rROfnu|Lz6X3;^2(WOSPR+%aJIm-wH!{bs>BT$Bi7KORR2DQv6m?r!BqVa;E zSF*oR?>5jui&ie-SfkMuta4`Y6urSUT2=qTo`?3+9plD%La-oPx%Z{(%r`jYe67X# z)6rRi84UH&PI*4hK?n}hHy~gg4?DrGHA3*9UYEaiiN@p3GGm#I5Lmr}m1OWe zYfcHli(5j_wUs76Wgme5`CSMmn^-FRy@DP1*)c4FS_KR1h2Tf2-%y1RT+xO1xdG#2 zu&`EC7KH!#44weLp>6Ogak@naLU2NGA#Az{F)@y>qguEhs(p{o1G?>8I3oUl%~Sj% zss)H|mzs3#cj`ar2G%rgiiJqLx(}2KjSzS2iNMr2vsc}wVpgBA`gGBz#k{2a=VxD8 ze!P6nVKd`E>Ea$&3>ay-j79Wb!6L?bT4*b9z3_NM({RPm5;$}qIu4t;q2A;Z8Ui$P z2}dEgrnsUe{q+|{E;ySUo#hC!X&-Mm(XTFYcR?{g!T@Y>7{^7d9B{z^ar5wBUP2M7 zezTkS80e*`;l^YWicd4Q2B$Vj4j8ptFTInYII7N>X`IEK`lRntueba%8kmvm#fKFf z-d9(33W7UAkXH}sJ-Y}4PecbC+W}6KejkgF)U>jwmu8w~#IRQNX*-jc-ZuMLko`Dn zidCpeWVbfMn;zw6-U_=A~JbGN!#V{z1w3KE&`!%)^b`#3s zdVIa#;860lSuE;O{YE`eOBEvojIpJEo5MkyJNpl__bk2K7cpb^Hgft6Q#8CDXDQLx zJ+f&BL=a+nehnAHgK)}7ZjLG4Tf*GJaBh;E9w2JbRDCAt=1vi1R7cRSZ;PW&v=3k3OTj<_oiq>T8UOE;5J8X>~RSBki#CgKx>OI{4ZFogV8?hlP?z!dVx zVi}Psv5x+5L<1Kw9x*^rQYysM`H)fw3w<5>uKCS4`BGNze;9HxN9st|W2zNi#+mZz zi^S2h_N%XA=$0=Y@#@};De0U+>8LRsm=XG z9h%zujSoh6O-M*QDQjXQRFBiW^7o`(*RsH#W@ls$29eQw*oSggc5)T%(#afY%lBja zJNV-XnQJa*Wxa0+T3K-R<%^yVHzw5gzjb_jV)T<=h?MKA%xSOdGL#EuG70Qegx)J? z04D$v-b@A@-Yf$|W1*E`5r47*&8J_zp{X(q3F_)bO(>%O*Z03`kRh)WG5!}NElVN^ zD_lpUcFe?8Z1CUzFxVtNQT_wJS|jE9)}kVeoBq=um@{kkyK_%$Cm)givhPF9rc!p* z)eb*d$=Jtq{P6~fWGYMI)=o?}?$iM_a-E0*Nbv-ynTzM&l_^D!1)I08&i`Qgh9)wT z76u_~+R_{2FSl!yz{yXe`;b9BI!anfS=}xa^mX-I&)AT*CdcdBHzz}7k8`f%Ns160 z4=50VSM`&#d_RHK+3$%SUshM2Gk&S?JatCp+abjsb^K%R*!ud9RoIcn8;3X`08C1~ zIs2}a`l!4a-~U+%1OjOKmhBX140m!)uDYUXetk{)cG>O05=cn{J*ldXIQr+;W^SwM z$TX%@ii=1Y5|~oO97tnK&zqDC$fT3>N718I5K0>mlif;?YYf`wb1IolGl+Dc@7BQ) zm}uk$npNCAA;@?p1YZlOhQ9g3<#|gd1rMkbTS)YS>f>02ZRv1^2+%ToCCDS8y|EB; zMf9(fk!&*VQHs36EA#1&udsP#wiJ;OQiR&4yJP0YVIm0XO@%;h1XxTr7S+G0c8Z@b zxLY+^?mp!y1S_3>@OVP-ZaWJzvFRI`#o1-ajKhwUMFiaPm1qP` z+^W>sjxS-#^4;mXl~@gxKxsns^H5j35NK3sjK8kUOX57DP9wUgZEb?5+O`vxC`|PP zTRb^vur!<0C=!4~q?c6>E@EG7K z-Ny|fKA@TV{GxVhwps|TU*k6>l|OP9f~D()Kn&sXOxJ)W8mr#GrhXF!bmO@2ctpd< z9EQz9Gu(~qhN=a@U4f1=(D+b0^F$<@^P=Kb;!2g!yvbEoY#OdN6?UahSV(s>XUa1o z@O`{K(Oel1LLZ9%h^7jGpWlpT3+`Lea$KZyW*zwktP2|-bi*RJ5Y1jFo4B`OTpgUO zNa&WYQ76-Y0eyGuNtPaiu+Fh0{;6LHQ>MBQ1N?K~ku3wJ8KVOHb^O;dNWB}wr}l2C z6@v2e*~}2kgyk{}lf1@9JW0^d9>5F&AE>PmP1upBRIIvLKF*xUSAr23<)qHEqJB3z zaaPWFd;i%AgdfHq&hxLsOgVY!fFW_sNw-?`+Z%|iJ3@i$&_JGuGOWdN*pEhA0V_|>#E=Za>Jk%s{bxBPq8cXc6#Q+blKao2dlMiPt2vhep z%>?%9o4mD2!VC&0@=W56tC{F}3pfa-8xkrgN)2r$BcX$P%aro}n+zgCZ1zH%@}}`0 zjKFhTN*g00lwdSg%o-vr`Flnr;SG>XOc6PCa1^C(sJGT7gkO!A$;3j`w#ficdToBMMnm%}lPpVnSltuMASVZKI zBU+^Emc?*5HwZFPm0~u&oq#IlM3=O*)2#UrEy!Fq(?8v$xw$3yqWU$x7DUC-YbbRa z0G%2TG2>oHB;k0y5)==%Ur{aAP&6_x)eSk$K|l+XN2nJwV3AGY<^EYszsXml%xy8S zts4W*Mzj#tmU9#(zKkArvFLtxI`AR&(q!RiL@=U}qBgtDm}ty5k<EY z6@RX|+bsk|F9g$qn3bB1n8)!_EI2$4%Sy+A83>0at#6A3P)^Yy_Wh!!m%|pnkwo>tOwcHc4OAV8Zmmv-`t{3FIT7Sh3LjgmLq6_lx`DrDB#~IusIUHx-GX2r zKb$V#Pf)~^UEk6u8rFhW`PSEih-_N7Y3|`W?Rbqd91uu$I{K1xjvO3EE&Mj_Ihe9e&7`1L{ zT6N9&2SGZ7a}5}cvsFNd$QQH{jp{bso$me%z~Fw=yKqa-EkkQIB}QI*1ZtpA;2DPIB=GNZJ=*9=Hx~B`32v!6G5- zKv+=Bo|Oq<`@^Fx5-c^vty{ozQL(P3)#j+cU<=YV+rMkT-z+u%9!q?DyiUBKPDIpR zU43(Nb6q_HT?2!Su*Syd#PFCs2^+(sSO49>wxH;MsE`9OArav#MGfxpkBE)2)QpV{ z3A6~_6Kw1s7-+oFe~)3{Mt%LjJsbA~8tQKhG&Bq}HP$yX2-f%4{AYk+2mbB;e+vcd z4~k@A9Tl_(K5X)ch}duS-+I2ZS@(av?LX}VZQBzQWF^}E*{El}QQy=9K7bN$3F#P{ z8vmCYf7RQpD-!U(2yFGM1Y!u!{zV+Zzw-aWXTFm;fjke_JX~`^U{00i*)oDi5( z<#~3^!!;)a=2Ur}UGs3w34u9Po@duQTysKTPL=1`H4oRE5SUZtd3MdiH75k-RC%6V z^Ki`xfjL#4XV*Mjb3$NFmFL+t57(R!m{a9>cFn^zCj{nHd7fSKaLoyUIaQu#*F0Qv zLSRmn=h-z6*PIZTQ{{Pf&BHY(1m;wEo?Y{B%?W`yRi0oDi5( z<#~3^!!;)a=2Ur}UH{kN`p;V%LE-RKjd=J@hB(^;3W*f`g&zs{7cDKyn}C*)l9H5` zm64TQD6?>(+@ht6 zZlN4z&Yxe|95cl}qWCyd& z40&t!Q3qPMRmGJ(<3^Wx8qd$2mF)XU?A#JD$_V}uKm_6J?}hO<_$9fuFLAWr3GC%7 z#?rEcV30lfg{r+<_5MKhq){|HU34G;e}1L>9tVeW?POG02)Jb5tVFLJ!bPaA;8_hUNy+s4@8 z_>Xi`>Sg$ja^F`TNq}eB36kjHKd5hLYdU}M$fgGc+3#mEUS=H-0xgX3G&PoW*1BX}T1J0tRVYUggqW-R*%nSH@zm}}{+5zWh zMW0jTyMFLU;iBq&Hb6C_QZ=J|z~OEh7jyjC_$-!BbqpVjFp@n-Kckh(06D{~bi1^h z*PjhkWV(H9&LXI<$mt`Ji9uw1dx6G7{8U?X!PE=a*M%#eZsfSB13Q#TKTxE_KuW+q$=67P10)NU&$X*`FD7h~GIA5h^ zeb1dMoj+6rpBAa8u9ZLfWyje&{C&@p4G#HKw}pQ<+NJrar}=7t+AZ6uee3})RW4Ec z4`0ax2ZKu=?QLF~+``c5tFn8r{_PJN{L3tX3fVql`skp>5ayJ85I%dt%Pk96@rikOF}EggbAiqy$= zuM?|1nm?aG4Al-l7<irZn95yIELyV+ln3X zzrh#k>jU8Rnf#e4+>4PT^|hZK^$P?tKa(yP7fF>;AGP0rFZ!)7hY3oAVBz*>C;5p! z)UK^H4_GeQ-=x^`^yPa6J{zH?92xbL=9NM6%!%D>Yn z%48DH->{F|@D{#;|DZl`Y#)h)y6*?yHRRv@3*YUZ58sC#s^ZUxYRdEklweWtCB$Rj zJ5TZtii_O)D5`>8qI-`=I<&A|vJr2okM^MC$Cts;r1U;@<^Pc-;9YmO@F<(4pg4XC zTf2Tfa-A6zwQIBi&xJ4IANDdhQ*WP#MHQ@Ad2H+iym;C8ZHM4D`0nBkTnm&3QEhxG zSFoc}qkV+>N^`xYMOGLHO>^HlMcgz)(1SYpm&-6Ea=&CT=1UZ8}hqMYcxUrS)o=gWIFi9FbKI<+(~F2xL1-}+(~R)B{{e!TyDLZ z$H5Z)tBZClwqW!M^b+W~xyO?V|KcBs+q92Wg#Skfnv2#50J; z`K2)>WEODD!;L*2aP_4iDT9vb7U!}=4Y-__i7Clqty~Kci7C!vIp$%Jo-^z#dAKu^ zq1$}1NRI&$#}Rf|(n8ZpFDmYX87Kx?Sbldyv4cT=*-favl2(?r3inydk+Zz>$wM}< zHX!O0wqG#PR8x)qCI@_Jxq(p+!zs33Wxi>~`E$ zTN~2ix*B?NdsdJRS`V#igZ)fDuTMbYN)!&@JkTr+W3VAK)KfL&M!NQvQ8!d8luz4? z%PpC_9dKbTSdvhZnNSSdtBn)k2tiiSRnUwn5&;guStCLXB#Cg}Rv6}_4v6Xw z&hTCY)EwPTV@#|z%wZzF4bDvfv&f3&ch7yOB!EoNZ;eD9mJ1GibNSCnUBSTb&lku- z;+c|~kkNKV&>VuKgC-&#I(NGLZ6A&8FQ}Hipi;D69sAvG)+%EbQP$c)AC=FbnjZT` z{W?bdBIj&J3uE=N+HodifFm@Fr9r1^z^Rl*!atFOGVXQu{_FC_$OpE5IR-G7 zzcg>~emtC!HkP6C?02oK=!p|8<@v66`ijnQGdwrLH|lTh%bgk-S$s%;YF|m{ftzfW zLGC8dkZ=CeRDROdl`r{#Jew_8qk%f)On>w@F^|DghS!B%-ca9^}?Uir>J!dK* z(Y0fkQUxQwE?lqxNj#6tYldOaBqIX{T-Y2(*fU~7>{F+z)*mF>W$J5{~^eR|X*-uq@`9t+H{754o{ba3Hgtqr+>$q<- zp)~w>*?kP3GW~!~39xdSz5ZY|_0ex5izydKCtAkV>LEGWlTwnld_6_0592+nKYdaz z*uBMz{B-rz3C;WsE$@jNTFuY>cKO-r8_$B*tq~YCKT|keWj%JL+wSp}5$m4oIc1x$ zTur~5ewtUZY{5E#gh^GO@2RpBKN&$o?NYm=f>ov`f2>`={`y>VI%7dh?cgiEw0bSA z{GNV$rLD7vuQr_0%#sq%1GsZCMck(~WU(<~qWvyhu?h`uk8+cMS3SbmPbzo>%j6-b zUHXdjONw+51x*x>OlDbnFqEL`vTb@VLd~m)3TC~rg;YTQtz z_S{wlhmt~X5S0dXn(c9_#?8QfkXZ4wL1E=|vC`N8d7UHO*jW2I8X2IA?|Tz5sXFat zn6=CJXZ{VMppUBk$$+wW_DR-ZLxwk?Uc`=~4d`I}f?4sUD$)(DO9ZsY^vAn_oeKR_ z<;3C6oY}+jv*@xWl`VIx5+rM7s2iEsybm;cl@z*4qR1IId%zXPLRIZMEcG9^PhHW(YoWUm# zZcOF%QLI#_6t|C{pSiucu|y(F2sUa3+&1Fx9FwdyEU#RcM&k8Oe7ClI{a2b%i~gs) z(;KLUJedpL&gC|k?G*0054}4b3K$=(Wk(EZqSA{8qkgx1Sl$|Ow03d8RN?Sf`w^sq zso}cwac6{JL%+`gj1ctwZkd+s-_}CCVfVQFn}+JH1ec$?ZhJR%hAVY%Y>`bFk2T{R z=e=ICdgwK&awRE*dE%i|@zWAdm-Y((BM{=W0+AgxXY08$&Xeie>KzNiv_N5)xd#K8 z1x+?Xq}rvNFk?k}rUhxY_H_|W=pufQ5YIVbmR^;bF(nEIn^5NuKu^Z73WequoP(i} zfquQcRj9~WWwC5j80WoULYEqDGuOVxqxl+I(`F2shT=hw0fK@3npt1A z7eCfmdp>feKF;DK|LAx8*IcT0?-xW=NFuuhhE1Q-LoPQrf}{_F!GqpGK$)#yFZ;Im z-7SLj`?iH62R{$bR?QwN7aV#0{`+-}-nK^OP9bP}E(BlX2rC?JrezP}n5yD`XcsY1 zdmS->Zm5vKI}^Ot+bPewx35dD*%i{QAvO46WzEAAPb9Nf!4!9C&5IA-+U@q_Q2xxm zL-vB!5rvaShSvP05_;xd_o8?oy+?%yOGn2eo;(ODYyVss+iU4R<57F|S>nM>KF*y{ z-=Y%7)clLz*gnM;&?Pml{ni?*nx{dksJ)r>>|VvCy(e}b@Z^5fXeo0aE0P+F_)|k| zC*NsUC#`o=SoQs5M#Z&1U+($&OoNY3xnAj|FcR_2bY%Su{;^8Nk?>EFU2bxToFhpt zg_Eahe_-Xt-M{*UBCgo2F1D&H)!%bFUxi_#tjY1LH`ro}8_NxOUettoolJ()dfYF& zwHYR^($1?G_i;N@52xE1+FnvApUwECybHy1maD?e2E{cVzs!LpbxZT<}e(b057|QNBl3zUPMet%~ew?F1LMOv&%p z*Y#F4UKP#kQ|MK9cu~4y+7w6J_FB`Ztxp9+!iwME6wg*Nnb(1IP zacE%oD*S%gN52kgFX7w|;;?0EVc@!<_7knIGkC?Xx?%o9ZC-i3ujb9+h!f)*qupcE zU%96AXJ>J--SW{*UZ2|NHSV!}8p}c%pRZyM-rpL3#U)B|=O@%#S?q*@fsWQLOy}3x z9;Z9h8uV7%f@ZtnqfK!z2N2Fw-aX&-1)uWXl7h1PllQ6r`1n^jKO$9Y;z>+(%B_sN z9V-r}o8$-hl_sM{VmXiHr9)P%{$qDotZM9KY{S#Xd(O_3A?1>Z;oJKx6UxhL;bNX1 zs`Yv^I?*CiCsxjMU17jvv+iw}kLB^})#mwun&gS5GJ0Hl@NP_{{i#R?6-KsP!9`^G z^N=q!Bwfc$+jgZzp3_9=(QO7u+7m^n^Dga4<)NaWY?3L3?Qr$fI(z7~rY;7I!LY0s zQUV_aAV(O+Y+E+V{WeYAHJyQ}bWl-|glw?%y01BmdofA*kKsYe4(i&Mj#7rHZE&u4C2sc87}5RQ+ygUM(Wtge zd86JeN=Y2uq?KSuVZC#@o#!kW#_D@do@g1uAY4f;-^S12HtG)Teo%Q<@Kg2TpHJSJ zE0ZsGzcJ;n_mfu3n6inn&YG;fwddK2{J6V^3$n3K3)+cUO+qldOCBbS+hz4U4!!<2^t5g^!Hdxc_KGlvdki} zEiUr;%vM{%3*2ORlHUnmdHg8u3w288q!64g*O)!dt$MgKe@507`ZC+~Us%qbMS;;8 z!@qBanS{1pI4%T7-cqL+cQ{iE|Fp3A7$0Y)*0SMxp?P|5`xER(a_UlPU$fpSlh%{& zE{~R8G4IW*AP-{~YoF&7H_8~2unVnWDyO89BKLFJyQ?uYPhZ^g`(JF#IHgMni)6en zm!)h?E4WhAge|FRzLT15z6nHZ6o8L`fJrl!h*YZbWgqiG7ODH zB%g8j?x*BchuXK{$KO&{3ycu`2W?bsoa)uc1e*%dkit4lq_gA@<{mDtr3vwOIKY%7 z4H>U=&vbofN5F4sj?FkOlt6CJ;%HhO7#w=E__;|VB6!;n^&*DFvX=8 zuGN##T7bFHEZPynNGitAJiL=zxAx}WrYR^YXyKUAq(v0q&bS1`IVX*HA^~N+;6Ao_c(B#urrf~ z9F%%f7J1fj3Pzx#7P;-R>#~%)CubugW+mFPzn6QpQ9mw#Ii1>;LotYn#zsiE>qhK! zaz?|=i*s4A;2_asgkb5IEOPZScq(y8j~F)}Ofdb|Wyy^`UWLigTaf7CApwL*GgVFZCQWyqg zOj;jh*?ur|O;0(3gTXP&o$dzH&w3u@-e?W*z9f|-QSW~H3Wl*|)B_Tpx#b_9n&QAj zL!I#46asx~ag7^#V`5}MD1N-Yc5Ioi{f?M&pAlsKH%li$b*D9SUoRMnt;+X2Xm7@gHa@(Xi)rM7^Dh%x^Gxu(LHwA?mntvI zKKWdt2>wq5we9UD+#2_KBZ-3{Cfp9leZ5s3uD$t?`xwv&XNJ{|tz$}dlSW*7bHdam zlRc7~G=BQ+9oWyqdMWUOTquI`W3eX`aH2L^=Prh2=A{KGZMz zUd?>3mwta(^miZbnmwU|A5$tDP%rqs{=2PWCMgUvTacIHY`ry=p5Pmjz*$s4Q>4e? z;J!*Q4bf;{&GJNEDK(V=$e*|=Rvl*%1%Y;2fm2l1_S{tg!Z_}Zr4+=|O&+BeuP)Eu zVsFyg_Ps?0?#*1(WMq0F&l9}e8<7f%^z$A=>?dMJh4%3%t;MlRvq+_R6+rB~MDZ@% z@gR-J7k>tJPO@|0V@JDBxAl0~TyKOUm8-6!T>Ul;ziaKZ*&D#(=cIt`E zp`IB8zYC=!FPy;Ufi&8&?Dp|p6@$R- zPKiPku52>Yz5xSDSs^_R%tPF9vdC)D&nwbHZ6it8b}VQQ-O)7S>>HZ!hGtk}%MmOY zauwXq6@o3sJtsGvE{_>m$3JtIGn*tL{KKD#n5Lz0YsG!k&Ztfl8D=nGe$3e5PUqku zC-+;29u-N1Yny~~`@=&`J~knCd{{gEJJkK_M`3%{PVC=~KV`Mg=bunY;>B%<_Bd$cdMai(c_*UmP~dMH0A%?^pXu_>DTN@3M!0&rlS(I;l4z|fWh8C?93%~`#40FqQ>{d)ltyXq zDmd>IhNlA?B^GDD(YUvSOr>VGTQ#TK4cSu4P#`*&)dLymP+>H$-A#sZJ=$YasQnkX z{Duh}i`#L3GPFH?=wL~xjSmTWcRKiML|X{z%}c3mWnzE2_>X7&vaUleMG5;n@nbOg zC~rY|e&Y0r6q6XZ$Y;Stm7f^JB<7DDW_lp^KGL2{p6MxJ@>VG6SZ>f zTiFcjJ0H)z)C%7J@y6OH2WEno4O|kO)`5?>XztVzW39_?>|VkU%{A}lA?Z8X4|8Th zzh(+P#*RI8&m`Vz9g2CIy8S{^yLEL{R>aaLcPw2nixL#@nC9I0WpL|vBXkJ*3ml=< zLMtn1JqKwX;R-rvB}@g#EwOWVS@_{f8AB2gPkycM;t977P|L!wYAswkDvs%Fqgoo| z>{fO=k8rHRW#Lnn%$7#SYRh8a$-zR&y@6X1_Z0gWnXElRK$c_fQQRv;j$DCARB0-! zH@9sjEOhl;d)zp&q?v*;tS3+(>6TI3Aj7|CJ&5g`d{8;&N6!`lSenm^p+a~4lKO$y zN>DBSoa@l2r_rcIG-a5&Njs>P& zdg1EmR;vm`mdGB>VBZlIhhgs75aIF(v7*_wnbb{+BrF+%dXhtj<~J8^2eLW{vd}l+ zDI6G1uV~)|T?VcLi_|OBEP`BiA}mO8`UMz9HWls&ceuWDfgYul{5r1Lg&APy?h1Dl zf528RHr*?=*;P@h?`T1nz+6qljHJ?&n+b9X+Ntih;e(6Cu?kqP*XjT=%&-^IOx zRJ_p9oC%^yrA=qxIYGLR0=O*no9cF;~ozk4rLs!Skh+o}y9eOJDfP%t@sfLC@cbT$ys4&b`gq9>kg8k0vCT-O_ zmv*SHsWRXc_9^EZt2d7zCjth7Lim&Jm_=d97(lpc=x0TjIlJ9ZapXU+9P~#w{fcfF z0XDnB>q?CU`L{)QZrKoez1Xwz!AU4z7+Ms$4;nuBZTayWjq#`Z4WD_hw<+-%2B9$04n4i*b9(4z zh5-fjCH^as6);NPNk6+f?sMU}D_u#2nZ-D{PIuyS`eFSCK}=a$@sH#wj%*-wQ?MwxolrvuW-yw7OPJequq9Q5?^UtB0@E-I zFRqy&T^j1y;OJS8hsG5VVrR4{)YBW-_~Hg@$T^r#4UX0d`mS&7j7sl?^f9an<|PWr zWSASffI$h?O%>^y#C-Kkd-fjuppVYwj4tiEQNJ zq28QWJBLPaSSfkfs4YC?wd!~YBKK`FBnpo*rz3CtU9K3T+4_HbSj{I zSEUvjF4sT6aP~GN6yhGPBLr$&FHJ=;)3qIzJ~6-|;FB!}=>9LzmLV_KG~X_=L16$| z88e&xO@_z?)tEvCv`cicLg`>VkwrE|dY+B=aC4U1^2_E$Mkq!S^g0SFeaD*Wbdxe8 z>557v3X~V?R)*+eNZX&E6bIS!?(_$K2GA~5$t zW^6VgY09_r>hW|p@$RmOU7}}vKy#DKqs#)|!}xw83fQg9b_0;(5j#16C6 zMr6xjkPqOJw){`d_g~(+gi#nVt+)$7`(1H&Y&{lJHLydu^cgcv8SlzOM zfE`?pLRXzakn3=&x5$IlL$?0ZCKPJs-=rzQ=w$*jjEO>KM?2lVQi=w8x|(cHBux@N zw_0_&f_x;Ee&7jQU}dQ+gVga^!L1kvB&E(u?Tu<4r8S-o zM8w!dnU(hcKsl(TNfdvb%>JBWc(uc!g4~@MzS_(Btew@9BCKKwM*1iP8YZzF4;BL} zGVO42RC3$>CT(?Z4x|^U+f8C8BpN3YYMJuQ9147>uB%B?O>u(C3^fhF<&M~Hef!rJ zT%gIy;2tJIe@asltL2Oho+4TU%of0)&?6UzP=YJrFjgI_==s)27&mZ$fwl`yHe5V= z`StD_2=@nVp5QzaINB)=X)tma_m1k#PqE)!h^bgq0DZHZ8kb%}DxL8tJ;{7J$y{XJ z`-aKb`={R$=WomYs?;mLXWlOLb=vF6{&)Pc4)|ZV$e%hpXu5bR!1Yof{f(>1c+*E^ zJDDp}zOGlxWjno=?g&ofX6Ke3Q)_7nXGaq>+-tp0^SI@23X&_=uB!O6sdeDwRi^Ti z=}^<~kfFwHT?uXu{w+KwllL|0gGnlHtKJN;!KOslFP(Uc{zluOA3Qgyof9u2rhjP6 zPT;IM_X&YzpXmD@k-s0LZXs&ppKA0F)HxkP`2JqqnQt(MG^HJ8q{dIay{>#;55G#F zpo;b7B0f+<;1^R~aq*MG?z5b|LV!O&?Rw~gD1IBql;0}g-h^LCd5ZthT{z?2AfUo$ zFh9D>E%wk;N7`wY>t=i(y7H5E!f)L?bP>F5g?Y0ly5JXDMx}UEi{P#ZZj)505bO_u zDXwQCgn(+J(cvAz7lL+p159(R@-x^>2*z9S%ch&8;9@vDB!5&0U>8)IbrauV*tun4 z#0+o!Qzb;lG&igv6incUW(@^Lme)?sQlI3^P@UmUL>gxne(PYQT**=%^|N>w|CA{Y zkvMkLk^GVcJEperL%N1DLo~*gK?7L(Rbbq6U1}Qh*FhODnK5NQmcf&O;&;JChe|wu z4Ff-m-T*~}rZz2MMe`TDc3So#E@Dic55HRTpG$bb(!+{^BX9gf<9HCiIg-9FfZa^c zuz{YaaGlZMOG9Zc{pJyQ`y#=w2NRVtCIoyf6{%TC(TR-f2uEHyfr|gB3gI5c z;h#L%g}0vO?q?j(=X(fViYn0hO9cq6RpzF%ff1GAv+ zaOeZGVfbMC;sjhYroe?&nl68xl`4c&To58K{<$7Ikm7!`c*qW`0XN7W#rBl*l#E{e z)98;s{l@e{@~4*P_xY*wYdaNG5v`QM?4rZjn-BJ6@RVZ2HA}o2J}7F8>J3n*lr^T> z>H`r^p#BfoVSQ%clBu`$Xhrdh7rm;=(#r2p(?v6fm~ChI+h&WjxT|tphijI$Z>uXC zR76dtN Date: Fri, 6 Oct 2023 17:29:04 +0300 Subject: [PATCH 2/4] =?UTF-8?q?=D0=9B=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=20=E2=84=961?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DoubleDeckerBus/DoubleDeckerBus/DirectionBus.cs | 2 +- .../DoubleDeckerBus/DoubleDeckerBus.Designer.cs | 1 + DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.cs | 8 +++++--- DoubleDeckerBus/DoubleDeckerBus/DrawningBus.cs | 2 -- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/DoubleDeckerBus/DoubleDeckerBus/DirectionBus.cs b/DoubleDeckerBus/DoubleDeckerBus/DirectionBus.cs index 0ec093a..07db3c8 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/DirectionBus.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/DirectionBus.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace DoubleDeckerBus { - internal enum DirectionBus + public enum DirectionBus { None = 0, Up = 1, diff --git a/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.Designer.cs b/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.Designer.cs index f5ce44d..802179b 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.Designer.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.Designer.cs @@ -46,6 +46,7 @@ pictureBoxBus.SizeMode = PictureBoxSizeMode.AutoSize; pictureBoxBus.TabIndex = 0; pictureBoxBus.TabStop = false; + pictureBoxBus.Click += pictureBoxBus_Click; // // buttonCreate // diff --git a/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.cs b/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.cs index c5f235b..1605bdc 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.cs @@ -13,8 +13,7 @@ namespace DoubleDeckerBus { return; } - Bitmap bmp = new(pictureBoxBus.Width, - pictureBoxBus.Height); + Bitmap bmp = new(pictureBoxBus.Width, pictureBoxBus.Height); Graphics gr = Graphics.FromImage(bmp); _drawningBus.DrawTransport(gr); pictureBoxBus.Image = bmp; @@ -52,6 +51,9 @@ random.Next(0, 256)), pictureBoxBus.Width, pictureBoxBus.Height); Draw(); } - + private void pictureBoxBus_Click(object sender, EventArgs e) + { + + } } } \ No newline at end of file diff --git a/DoubleDeckerBus/DoubleDeckerBus/DrawningBus.cs b/DoubleDeckerBus/DoubleDeckerBus/DrawningBus.cs index 7571c88..9492405 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/DrawningBus.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/DrawningBus.cs @@ -31,8 +31,6 @@ namespace DoubleDeckerBus } _startPosX = x; _startPosY = y; - _pictureWidth = width; - _pictureHeight = height; } public void MoveTransport(DirectionBus direction) { -- 2.25.1 From 5b3f2c0ab161413d935df75184b5b9091d57a5d9 Mon Sep 17 00:00:00 2001 From: "yuliya.mavrina@internet.ru" Date: Sat, 14 Oct 2023 17:51:12 +0300 Subject: [PATCH 3/4] =?UTF-8?q?=D0=9B=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=20=E2=84=962?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DoubleDeckerBus/DirectionBus.cs | 2 +- .../DoubleDeckerBus.Designer.cs | 76 +++++++-- .../DoubleDeckerBus/DoubleDeckerBus.cs | 74 +++++++- .../DoubleDeckerBus/DrawningBus.cs | 130 -------------- .../DrawningObjects/DrawningBus.cs | 160 ++++++++++++++++++ .../DrawningDoubleDeckerBus.cs | 79 +++++++++ .../DoubleDeckerBus/Entities/EntityBus.cs | 24 +++ .../Entities/EntityDoubleDeckerBus.cs | 26 +++ DoubleDeckerBus/DoubleDeckerBus/EntityBus.cs | 23 --- .../MovementStrategy/AbstractStrategy.cs | 72 ++++++++ .../MovementStrategy/DrawningObjectBus.cs | 40 +++++ .../MovementStrategy/IMoveableObject.cs | 16 ++ .../MovementStrategy/MoveToBorder.cs | 58 +++++++ .../MovementStrategy/MoveToCenter.cs | 57 +++++++ .../MovementStrategy/ObjectParameters.cs | 30 ++++ .../MovementStrategy/Status.cs | 15 ++ 16 files changed, 706 insertions(+), 176 deletions(-) delete mode 100644 DoubleDeckerBus/DoubleDeckerBus/DrawningBus.cs create mode 100644 DoubleDeckerBus/DoubleDeckerBus/DrawningObjects/DrawningBus.cs create mode 100644 DoubleDeckerBus/DoubleDeckerBus/DrawningObjects/DrawningDoubleDeckerBus.cs create mode 100644 DoubleDeckerBus/DoubleDeckerBus/Entities/EntityBus.cs create mode 100644 DoubleDeckerBus/DoubleDeckerBus/Entities/EntityDoubleDeckerBus.cs delete mode 100644 DoubleDeckerBus/DoubleDeckerBus/EntityBus.cs create mode 100644 DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/AbstractStrategy.cs create mode 100644 DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/DrawningObjectBus.cs create mode 100644 DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/IMoveableObject.cs create mode 100644 DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MoveToBorder.cs create mode 100644 DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MoveToCenter.cs create mode 100644 DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/ObjectParameters.cs create mode 100644 DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/Status.cs diff --git a/DoubleDeckerBus/DoubleDeckerBus/DirectionBus.cs b/DoubleDeckerBus/DoubleDeckerBus/DirectionBus.cs index 0ec093a..07db3c8 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/DirectionBus.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/DirectionBus.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace DoubleDeckerBus { - internal enum DirectionBus + public enum DirectionBus { None = 0, Up = 1, diff --git a/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.Designer.cs b/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.Designer.cs index f5ce44d..0c2e372 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.Designer.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.Designer.cs @@ -29,11 +29,14 @@ private void InitializeComponent() { pictureBoxBus = new PictureBox(); - buttonCreate = new Button(); + buttonCreateBus = new Button(); buttonUp = new Button(); buttonLeft = new Button(); buttonDown = new Button(); buttonRight = new Button(); + buttonCreatDoubleDeckerDus = new Button(); + buttonStep_Click = new Button(); + comboBoxStrategy = new ComboBox(); ((System.ComponentModel.ISupportInitialize)pictureBoxBus).BeginInit(); SuspendLayout(); // @@ -46,17 +49,18 @@ pictureBoxBus.SizeMode = PictureBoxSizeMode.AutoSize; pictureBoxBus.TabIndex = 0; pictureBoxBus.TabStop = false; + // - // buttonCreate + // buttonCreateBus // - buttonCreate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; - buttonCreate.Location = new Point(12, 426); - buttonCreate.Name = "buttonCreate"; - buttonCreate.Size = new Size(75, 23); - buttonCreate.TabIndex = 1; - buttonCreate.Text = "Создать"; - buttonCreate.UseVisualStyleBackColor = true; - buttonCreate.Click += buttonCreate_Click; + buttonCreateBus.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateBus.Location = new Point(12, 409); + buttonCreateBus.Name = "buttonCreateBus"; + buttonCreateBus.Size = new Size(117, 40); + buttonCreateBus.TabIndex = 1; + buttonCreateBus.Text = "Создать автобус"; + buttonCreateBus.UseVisualStyleBackColor = true; + buttonCreateBus.Click += buttonCreateBus_Click; // // buttonUp // @@ -68,7 +72,8 @@ buttonUp.Size = new Size(30, 30); buttonUp.TabIndex = 2; buttonUp.UseVisualStyleBackColor = true; - buttonUp.Click += buttonMove_Click; + buttonUp.AutoSizeChanged += ButtonMove_Click; + buttonUp.Click += ButtonMove_Click; // // buttonLeft // @@ -80,7 +85,8 @@ buttonLeft.Size = new Size(30, 30); buttonLeft.TabIndex = 3; buttonLeft.UseVisualStyleBackColor = true; - buttonLeft.Click += buttonMove_Click; + buttonLeft.AutoSizeChanged += ButtonMove_Click; + buttonLeft.Click += ButtonMove_Click; // // buttonDown // @@ -92,7 +98,8 @@ buttonDown.Size = new Size(30, 30); buttonDown.TabIndex = 4; buttonDown.UseVisualStyleBackColor = true; - buttonDown.Click += buttonMove_Click; + buttonDown.AutoSizeChanged += ButtonMove_Click; + buttonDown.Click += ButtonMove_Click; // // buttonRight // @@ -104,18 +111,52 @@ buttonRight.Size = new Size(30, 30); buttonRight.TabIndex = 5; buttonRight.UseVisualStyleBackColor = true; - buttonRight.Click += buttonMove_Click; + buttonRight.AutoSizeChanged += ButtonMove_Click; + buttonRight.Click += ButtonMove_Click; + // + // buttonCreatDoubleDeckerDus + // + buttonCreatDoubleDeckerDus.Location = new Point(135, 409); + buttonCreatDoubleDeckerDus.Name = "buttonCreatDoubleDeckerDus"; + buttonCreatDoubleDeckerDus.Size = new Size(136, 40); + buttonCreatDoubleDeckerDus.TabIndex = 6; + buttonCreatDoubleDeckerDus.Text = "Создать двухэтажный автобус"; + buttonCreatDoubleDeckerDus.UseVisualStyleBackColor = true; + buttonCreatDoubleDeckerDus.Click += buttonCreatDoubleDeckerDus_Click; + // + // buttonStep_Click + // + buttonStep_Click.Location = new Point(797, 41); + buttonStep_Click.Name = "buttonStep_Click"; + buttonStep_Click.Size = new Size(75, 23); + buttonStep_Click.TabIndex = 7; + buttonStep_Click.Text = "Шаг"; + buttonStep_Click.UseVisualStyleBackColor = true; + buttonStep_Click.Click += buttonStep_Click_Click; + // + // comboBoxStrategy + // + comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxStrategy.FormattingEnabled = true; + comboBoxStrategy.Items.AddRange(new object[] { "MoveToCenter", "MoveToBorder" }); + comboBoxStrategy.Location = new Point(751, 12); + comboBoxStrategy.Name = "comboBoxStrategy"; + comboBoxStrategy.Size = new Size(121, 23); + comboBoxStrategy.TabIndex = 8; // // DoubleDeckerBus // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(884, 461); + Controls.Add(comboBoxStrategy); + Controls.Add(buttonStep_Click); + Controls.Add(buttonCreatDoubleDeckerDus); Controls.Add(buttonRight); Controls.Add(buttonDown); Controls.Add(buttonLeft); Controls.Add(buttonUp); - Controls.Add(buttonCreate); + Controls.Add(buttonCreateBus); Controls.Add(pictureBoxBus); Name = "DoubleDeckerBus"; StartPosition = FormStartPosition.CenterParent; @@ -128,10 +169,13 @@ #endregion private PictureBox pictureBoxBus; - private Button buttonCreate; + private Button buttonCreateBus; private Button buttonUp; private Button buttonLeft; private Button buttonDown; private Button buttonRight; + private Button buttonCreatDoubleDeckerDus; + private Button buttonStep_Click; + private ComboBox comboBoxStrategy; } } \ No newline at end of file diff --git a/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.cs b/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.cs index c5f235b..e4e5994 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/DoubleDeckerBus.cs @@ -1,8 +1,12 @@ +using DoubleDeckerBus.DrawningObjects; +using DoubleDeckerBus.MovementStrategy; + namespace DoubleDeckerBus { public partial class DoubleDeckerBus : Form { private DrawningBus? _drawningBus; + private AbstractStrategy? _abstractStrategy; public DoubleDeckerBus() { InitializeComponent(); @@ -20,14 +24,36 @@ namespace DoubleDeckerBus pictureBoxBus.Image = bmp; } - private void buttonCreate_Click(object sender, EventArgs e) + private void buttonCreateBus_Click(object sender, EventArgs e) { Random random = new(); - _drawningBus = new DrawningBus(random.Next(100, 300), random.Next(1000, 3000), Color.FromArgb(random.Next(0, 256), random.Next(0, 256), -random.Next(0, 256)), pictureBoxBus.Width, pictureBoxBus.Height); + _drawningBus = new DrawningBus(random.Next(100, 300), + random.Next(1000, 3000), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), + random.Next(0, 256)), + pictureBoxBus.Width, pictureBoxBus.Height); + _drawningBus.SetPosition(random.Next(10, 100), random.Next(10, + 100)); Draw(); } - private void buttonMove_Click(object sender, EventArgs e) + + private void buttonCreatDoubleDeckerDus_Click(object sender, EventArgs e) + { + Random random = new(); + _drawningBus = new DrawningDoubleDeckerBus(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)), Convert.ToBoolean(random.Next(0, 2)), + pictureBoxBus.Width, pictureBoxBus.Height); + _drawningBus.SetPosition(random.Next(10, 100), random.Next(10, + 100)); + Draw(); + } + private void ButtonMove_Click(object sender, EventArgs e) { if (_drawningBus == null) { @@ -52,6 +78,42 @@ random.Next(0, 256)), pictureBoxBus.Width, pictureBoxBus.Height); Draw(); } - + private void buttonStep_Click_Click(object sender, EventArgs e) + { + if (_drawningBus == null) + { + return; + } + if (comboBoxStrategy.Enabled) + { + _abstractStrategy = comboBoxStrategy.SelectedIndex + switch + { + 0 => new MoveToCenter(), + 1 => new MoveToBorder(), + _ => null, + }; + if (_abstractStrategy == null) + { + return; + } + _abstractStrategy.SetData(new + DrawningObjectBus(_drawningBus), pictureBoxBus.Width, + pictureBoxBus.Height); + comboBoxStrategy.Enabled = false; + } + if (_abstractStrategy == null) + { + return; + } + _abstractStrategy.MakeStep(); + Draw(); + if (_abstractStrategy.GetStatus() == Status.Finish) + { + comboBoxStrategy.Enabled = true; + _abstractStrategy = null; + } + } } -} \ No newline at end of file +} + diff --git a/DoubleDeckerBus/DoubleDeckerBus/DrawningBus.cs b/DoubleDeckerBus/DoubleDeckerBus/DrawningBus.cs deleted file mode 100644 index 7571c88..0000000 --- a/DoubleDeckerBus/DoubleDeckerBus/DrawningBus.cs +++ /dev/null @@ -1,130 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace DoubleDeckerBus -{ - internal class DrawningBus - { - public EntityBus? EntityBus { get; private set; } - private int? _pictureWidth = null; - private int? _pictureHeight = null; - private float _startPosX; - private float _startPosY; - private readonly int _busWidth = 100; - private readonly int _busHeight = 70; - public DrawningBus(int speed, float weight, Color bodyColor, int width, int height) - { - _pictureWidth = width; - _pictureHeight = height; - EntityBus = new EntityBus(speed, weight, bodyColor); - } - public void SetPosition(int x, int y, int width, int height) - { - if (_pictureWidth <= _busWidth || _pictureHeight <= _busHeight) - { - _pictureWidth = null; - _pictureHeight = null; - return; - } - _startPosX = x; - _startPosY = y; - _pictureWidth = width; - _pictureHeight = height; - } - public void MoveTransport(DirectionBus direction) - { - if (EntityBus == null) - { - return; - } - switch (direction) - { - case DirectionBus.Left: - if (_startPosX - EntityBus.Step > 0) - { - _startPosX -= (int)EntityBus.Step; - } - break; - case DirectionBus.Up: - if (_startPosY - EntityBus.Step > 0) - { - _startPosY -= (int)EntityBus.Step; - } - break; - case DirectionBus.Right: - if (_startPosX + _busWidth + EntityBus.Step < _pictureWidth) - { - _startPosX += EntityBus.Step; - } - break; - - case DirectionBus.Down: - if (_startPosY + _busHeight + EntityBus.Step < _pictureHeight) - { - _startPosY += EntityBus.Step; - } - break; - } - - } - public void DrawTransport(Graphics g) - { - if (EntityBus == null) - { - return; - } - Pen pen = new(Color.Black); - - g.DrawRectangle(pen, _startPosX - 1, _startPosY + 11, 100, 60); - Brush brBodyColor = new SolidBrush(EntityBus.BodyColor); - g.FillRectangle(brBodyColor, _startPosX, _startPosY + 10, 100, 60); - - g.DrawRectangle(pen, _startPosX + 30, _startPosY + 20, 10, 20); - Brush brBlack = new SolidBrush(Color.Black); - g.FillRectangle(brBlack, _startPosX + 30, _startPosY + 20, 10, 20); - - g.DrawEllipse(pen, _startPosX + 7, _startPosY + 55, 20, 20); - g.DrawEllipse(pen, _startPosX + 77, _startPosY + 55, 20, 20); - g.FillEllipse(brBlack, _startPosX + 7, _startPosY + 55, 20, 20); - g.FillEllipse(brBlack, _startPosX + 77, _startPosY + 55, 20, 20); - - Brush brBlue = new SolidBrush(Color.Blue); - g.FillEllipse(brBlue, _startPosX + 10, _startPosY + 15, 10, 15); - g.FillEllipse(brBlue, _startPosX + 50, _startPosY + 15, 10, 15); - g.FillEllipse(brBlue, _startPosX + 70, _startPosY + 15, 10, 15); - g.FillEllipse(brBlue, _startPosX + 90, _startPosY + 15, 10, 15); - - g.FillEllipse(brBlue, _startPosX + 10, _startPosY + 35, 10, 15); - g.FillEllipse(brBlue, _startPosX + 50, _startPosY + 35, 10, 15); - g.FillEllipse(brBlue, _startPosX + 70, _startPosY + 35, 10, 15); - g.FillEllipse(brBlue, _startPosX + 90, _startPosY + 35, 10, 15); - } - public void ChangeBorders(int width, int height) - { - _pictureWidth = width; - _pictureHeight = height; - if (_pictureWidth <= _busWidth || _pictureHeight <= _busHeight) - { - _pictureWidth = null; - _pictureHeight = null; - return; - } - if (_startPosX + _busWidth > _pictureWidth) - { - _startPosX = _pictureWidth.Value - _busWidth; - } - if (_startPosY + _busHeight > _pictureHeight) - { - _startPosY = _pictureHeight.Value - _busHeight; - } - } - - public (float Left, float Right, float Top, float Bottom) GetCurrentPosition() - { - return (_startPosX, _startPosX + _busWidth, _startPosY, _startPosY + _busHeight); - } - } -} diff --git a/DoubleDeckerBus/DoubleDeckerBus/DrawningObjects/DrawningBus.cs b/DoubleDeckerBus/DoubleDeckerBus/DrawningObjects/DrawningBus.cs new file mode 100644 index 0000000..38d1741 --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus/DrawningObjects/DrawningBus.cs @@ -0,0 +1,160 @@ +using DoubleDeckerBus.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DoubleDeckerBus.DrawningObjects +{ + public class DrawningBus + { + public EntityBus? EntityBus { get; protected set; } + private int? _pictureWidth; + private int? _pictureHeight; + protected int _startPosX; + protected int _startPosY; + protected readonly int _busWidth = 110; + protected readonly int _busHeight = 70; + public int GetPosX => _startPosX; + public int GetPosY => _startPosY; + public int GetWidth => _busWidth; + public int GetHeight => _busHeight; + public DrawningBus(int speed, float weight, Color bodyColor, int + width, int height) + { + if (width < _busWidth || height < _busHeight) + { + return; + } + _pictureWidth = width; + _pictureHeight = height; + EntityBus = new EntityBus(speed, weight, bodyColor); + } + protected DrawningBus(int speed, float weight, Color bodyColor, int width, int height, int busWidth, int busHeight) + { + if (width <= _busWidth || height <= _busHeight) + { + return; + } + _pictureWidth = width; + _pictureHeight = height; + _busWidth = busWidth; + _busHeight = busHeight; + EntityBus = new EntityBus(speed, weight, bodyColor); + } + public void SetPosition(int x, int y) + { + if (_pictureWidth <= _busWidth || _pictureHeight <= _busHeight) + { + _pictureWidth = null; + _pictureHeight = null; + return; + } + _startPosX = x; + _startPosY = y; + } + public bool CanMove(DirectionBus direction) + { + if (EntityBus == null) + { + return false; + } + return direction switch + { + //влево + DirectionBus.Left => _startPosX - EntityBus.Step > 0, + //вверх + DirectionBus.Up => _startPosY - EntityBus.Step > 0, + //вправо + DirectionBus.Right => _startPosX + _busWidth + EntityBus.Step < _pictureWidth, + //вниз + DirectionBus.Down => _startPosY + _busHeight + EntityBus.Step < _pictureHeight, + _ => false, + }; + } + public void MoveTransport(DirectionBus direction) + { + if (!CanMove(direction) || EntityBus == null) + { + return; + } + switch (direction) + { + //влево + case DirectionBus.Left: + _startPosX -= (int)EntityBus.Step; + break; + //вверх + case DirectionBus.Up: + _startPosY -= (int)EntityBus.Step; + break; + // вправо + case DirectionBus.Right: + _startPosX += (int)EntityBus.Step; + break; + //вниз + case DirectionBus.Down: + _startPosY += (int)EntityBus.Step; + break; + } + } + + public virtual void DrawTransport(Graphics g) + { + if (EntityBus == null) + { + return; + } + if (EntityBus == null) + { + return; + } + + Pen pen = new(Color.Black); + + //границы автобсуса + g.DrawRectangle(pen, _startPosX - 1, _startPosY + 11, 100, 30); + Brush brBodyColor = new SolidBrush(EntityBus.BodyColor); + g.FillRectangle(brBodyColor, _startPosX, _startPosY + 10, 100, 30); + + //Дверь + g.DrawRectangle(pen, _startPosX + 30, _startPosY + 20, 10, 20); + Brush brBlack = new SolidBrush(Color.Black); + g.FillRectangle(brBlack, _startPosX + 30, _startPosY + 20, 10, 20); + + //Колеса + g.DrawEllipse(pen, _startPosX + 7, _startPosY + 35, 10, 10); + g.DrawEllipse(pen, _startPosX + 77, _startPosY + 35, 10, 10); + g.FillEllipse(brBlack, _startPosX + 7, _startPosY + 35, 10, 10); + g.FillEllipse(brBlack, _startPosX + 77, _startPosY + 35, 10, 10); + + //окна + Brush brBlue = new SolidBrush(Color.Blue); + g.FillEllipse(brBlue, _startPosX + 10, _startPosY + 15, 10, 15); + g.FillEllipse(brBlue, _startPosX + 50, _startPosY + 15, 10, 15); + g.FillEllipse(brBlue, _startPosX + 70, _startPosY + 15, 10, 15); + g.FillEllipse(brBlue, _startPosX + 90, _startPosY + 15, 10, 15); + + //g.DrawRectangle(pen, _startPosX - 1, _startPosY + 11, 100, 30); + //Brush brBodyColor = new SolidBrush(EntityBus.BodyColor); + //g.FillRectangle(brBodyColor, _startPosX, _startPosY + 10, 100, 30); + + //g.DrawRectangle(pen, _startPosX + 30, _startPosY + 20, 10, 20); + //Brush brBlack = new SolidBrush(Color.Black); + //g.FillRectangle(brBlack, _startPosX + 30, _startPosY + 20, 10, 20); + + //g.DrawEllipse(pen, _startPosX + 7, _startPosY + 35, 10, 10); + //g.DrawEllipse(pen, _startPosX + 77, _startPosY + 35, 10, 10); + //g.FillEllipse(brBlack, _startPosX + 7, _startPosY + 35, 10, 10); + //g.FillEllipse(brBlack, _startPosX + 77, _startPosY + 35, 10, 10); + + //Brush brBlue = new SolidBrush(Color.Blue); + //g.FillEllipse(brBlue, _startPosX + 10, _startPosY + 15, 10, 15); + //g.FillEllipse(brBlue, _startPosX + 50, _startPosY + 15, 10, 15); + //g.FillEllipse(brBlue, _startPosX + 70, _startPosY + 15, 10, 15); + //g.FillEllipse(brBlue, _startPosX + 90, _startPosY + 15, 10, 15); + } + + } +} diff --git a/DoubleDeckerBus/DoubleDeckerBus/DrawningObjects/DrawningDoubleDeckerBus.cs b/DoubleDeckerBus/DoubleDeckerBus/DrawningObjects/DrawningDoubleDeckerBus.cs new file mode 100644 index 0000000..38a86a2 --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus/DrawningObjects/DrawningDoubleDeckerBus.cs @@ -0,0 +1,79 @@ +using DoubleDeckerBus.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Net.NetworkInformation; + +namespace DoubleDeckerBus.DrawningObjects +{ + public class DrawningDoubleDeckerBus : DrawningBus + { + public DrawningDoubleDeckerBus(int speed, float weight, Color bodyColor, + Color additionalColor, bool secondFloor, bool ladder, bool lineBetweenFloor, int width, int height) : + base(speed, weight, bodyColor, width, height, 120, 85) + { + + if (EntityBus != null) + { + EntityBus = new EntityDoubleDeckerBus(speed, weight, bodyColor, + additionalColor, secondFloor, ladder, lineBetweenFloor); + } + } + + public override void DrawTransport(Graphics g) + { + if (EntityBus is not EntityDoubleDeckerBus doubleDeckerBus) + { + return; + } + + Pen pen = new(Color.Black); + Brush brAdditionalColor = new SolidBrush(doubleDeckerBus.AdditionalColor); + Brush brBlue = new SolidBrush(Color.Blue); + Brush brBlack = new SolidBrush(Color.Black); + + if (doubleDeckerBus.SecondFloor) + { + g.FillRectangle(brAdditionalColor, _startPosX, _startPosY + 10, 100, 30); + + g.DrawRectangle(pen, _startPosX + 30, _startPosY + 20, 10, 20); + g.FillRectangle(brBlack, _startPosX + 30, _startPosY + 20, 10, 20); + + + g.FillEllipse(brBlue, _startPosX + 10, _startPosY + 15, 10, 15); + g.FillEllipse(brBlue, _startPosX + 50, _startPosY + 15, 10, 15); + g.FillEllipse(brBlue, _startPosX + 70, _startPosY + 15, 10, 15); + g.FillEllipse(brBlue, _startPosX + 90, _startPosY + 15, 10, 15); + } + + _startPosY += 30; + base.DrawTransport(g); + _startPosY -= 30; + + if (doubleDeckerBus.Ladder) + { + if (doubleDeckerBus.SecondFloor == true) + { + //Вертикальные прямые + g.DrawLine(pen, new Point((int)(_startPosX), (int)(_startPosY + 70)), new Point((int)(_startPosX), (int)(_startPosY + 10))); + g.DrawLine(pen, new Point((int)(_startPosX + 10), (int)(_startPosY + 70)), new Point((int)(_startPosX + 10), (int)(_startPosY + 10))); + + //Горизонтальные прямые + g.DrawLine(pen, new Point((int)(_startPosX), (int)(_startPosY + 20)), new Point((int)(_startPosX + 10), (int)(_startPosY + 20))); + g.DrawLine(pen, new Point((int)(_startPosX), (int)(_startPosY + 30)), new Point((int)(_startPosX + 10), (int)(_startPosY + 30))); + g.DrawLine(pen, new Point((int)(_startPosX), (int)(_startPosY + 40)), new Point((int)(_startPosX + 10), (int)(_startPosY + 40))); + g.DrawLine(pen, new Point((int)(_startPosX), (int)(_startPosY + 50)), new Point((int)(_startPosX + 10), (int)(_startPosY + 50))); + g.DrawLine(pen, new Point((int)(_startPosX), (int)(_startPosY + 60)), new Point((int)(_startPosX + 10), (int)(_startPosY + 60))); + } + } + + + } + } +} + + + + diff --git a/DoubleDeckerBus/DoubleDeckerBus/Entities/EntityBus.cs b/DoubleDeckerBus/DoubleDeckerBus/Entities/EntityBus.cs new file mode 100644 index 0000000..6e75501 --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus/Entities/EntityBus.cs @@ -0,0 +1,24 @@ +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; + } + } + +} + diff --git a/DoubleDeckerBus/DoubleDeckerBus/Entities/EntityDoubleDeckerBus.cs b/DoubleDeckerBus/DoubleDeckerBus/Entities/EntityDoubleDeckerBus.cs new file mode 100644 index 0000000..a762a85 --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus/Entities/EntityDoubleDeckerBus.cs @@ -0,0 +1,26 @@ +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 Ladder { get; private set; } + public bool LineBetweenFloor { get; private set; } + public EntityDoubleDeckerBus(int speed, double weight, Color bodyColor, Color + additionalColor, bool secondFloor, bool ladder, bool lineBetweenFloor) : + base(speed, weight, bodyColor) + { + AdditionalColor = additionalColor; + SecondFloor = secondFloor; + Ladder = ladder; + LineBetweenFloor = lineBetweenFloor; + } + } + +} diff --git a/DoubleDeckerBus/DoubleDeckerBus/EntityBus.cs b/DoubleDeckerBus/DoubleDeckerBus/EntityBus.cs deleted file mode 100644 index 1ab74f9..0000000 --- a/DoubleDeckerBus/DoubleDeckerBus/EntityBus.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace DoubleDeckerBus -{ - internal class EntityBus - { - public int Speed { get; private set; } - public float Weight { get; private set; } - public Color BodyColor { get; private set; } - public float Step => (float)Speed * 100 / Weight; - public EntityBus(int speed, float weight, Color bodyColor) - { - Random rnd = new Random(); - Speed = (speed <= 0) ? rnd.Next(250, 300) : speed; - Weight = (weight <= 0) ? rnd.Next(50, 70) : weight; - BodyColor = bodyColor; - } - } -} diff --git a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/AbstractStrategy.cs b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/AbstractStrategy.cs new file mode 100644 index 0000000..c2613cf --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/AbstractStrategy.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +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(DirectionBus.Left); + protected bool MoveRight() => MoveTo(DirectionBus.Right); + protected bool MoveUp() => MoveTo(DirectionBus.Up); + protected bool MoveDown() => MoveTo(DirectionBus.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(DirectionBus directionType) + { + if (_state != Status.InProgress) + { + return false; + } + if (_moveableObject?.CheckCanMove(directionType) ?? false) + { + _moveableObject.MoveObject(directionType); + return true; + } + return false; + } + } +} diff --git a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/DrawningObjectBus.cs b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/DrawningObjectBus.cs new file mode 100644 index 0000000..d81df87 --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/DrawningObjectBus.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using DoubleDeckerBus.DrawningObjects; + +namespace DoubleDeckerBus.MovementStrategy +{ + public class DrawningObjectBus : IMoveableObject + { + private readonly DrawningBus? _drawningBus = null; + public DrawningObjectBus(DrawningBus drawningBus) + { + _drawningBus = drawningBus; + } + public ObjectParameters? GetObjectPosition + { + get + { + if (_drawningBus == null || _drawningBus.EntityBus == null) + { + return null; + } + return new ObjectParameters(_drawningBus.GetPosX, + _drawningBus.GetPosY, _drawningBus.GetWidth, _drawningBus.GetHeight); + } + } + + public int GetStep => (int)(_drawningBus?.EntityBus?.Step ?? 0); + + public bool CheckCanMove(DirectionBus direction) => + _drawningBus?.CanMove(direction) ?? false; + + public void MoveObject(DirectionBus direction) => + _drawningBus?.MoveTransport(direction); + } +} + diff --git a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/IMoveableObject.cs b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/IMoveableObject.cs new file mode 100644 index 0000000..d116928 --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/IMoveableObject.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DoubleDeckerBus.MovementStrategy +{ + public interface IMoveableObject + { + ObjectParameters? GetObjectPosition { get; } + int GetStep { get; } + bool CheckCanMove(DirectionBus direction); + void MoveObject(DirectionBus direction); + } +} diff --git a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MoveToBorder.cs b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MoveToBorder.cs new file mode 100644 index 0000000..8115183 --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MoveToBorder.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DoubleDeckerBus.MovementStrategy +{ + public 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.RightBorder - FieldWidth; + if (Math.Abs(diffX) > GetStep()) + { + if (diffX > 0) + { + MoveLeft(); + } + else + { + MoveRight(); + } + } + var diffY = objParams.DownBorder - FieldHeight; + if (Math.Abs(diffY) > GetStep()) + { + if (diffY > 0) + { + MoveUp(); + } + else + { + MoveDown(); + } + } + } + } +} diff --git a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MoveToCenter.cs b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MoveToCenter.cs new file mode 100644 index 0000000..609c7bf --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MoveToCenter.cs @@ -0,0 +1,57 @@ +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(); + } + } + } + } + +} diff --git a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/ObjectParameters.cs b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/ObjectParameters.cs new file mode 100644 index 0000000..e7136da --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/ObjectParameters.cs @@ -0,0 +1,30 @@ +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; + } + } + +} diff --git a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/Status.cs b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/Status.cs new file mode 100644 index 0000000..c7168d3 --- /dev/null +++ b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/Status.cs @@ -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 + } +} \ No newline at end of file -- 2.25.1 From 41f1398da6ebafb57f6c475c082607794686803c Mon Sep 17 00:00:00 2001 From: "yuliya.mavrina@internet.ru" Date: Sat, 14 Oct 2023 18:26:14 +0300 Subject: [PATCH 4/4] =?UTF-8?q?=D0=9B=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=20=E2=84=962.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DrawningObjects/DrawningBus.cs | 29 +++---------------- .../DrawningDoubleDeckerBus.cs | 1 - 2 files changed, 4 insertions(+), 26 deletions(-) diff --git a/DoubleDeckerBus/DoubleDeckerBus/DrawningObjects/DrawningBus.cs b/DoubleDeckerBus/DoubleDeckerBus/DrawningObjects/DrawningBus.cs index 38d1741..7940935 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/DrawningObjects/DrawningBus.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/DrawningObjects/DrawningBus.cs @@ -113,48 +113,27 @@ namespace DoubleDeckerBus.DrawningObjects Pen pen = new(Color.Black); - //границы автобсуса + g.DrawRectangle(pen, _startPosX - 1, _startPosY + 11, 100, 30); Brush brBodyColor = new SolidBrush(EntityBus.BodyColor); g.FillRectangle(brBodyColor, _startPosX, _startPosY + 10, 100, 30); - //Дверь + g.DrawRectangle(pen, _startPosX + 30, _startPosY + 20, 10, 20); Brush brBlack = new SolidBrush(Color.Black); g.FillRectangle(brBlack, _startPosX + 30, _startPosY + 20, 10, 20); - //Колеса + g.DrawEllipse(pen, _startPosX + 7, _startPosY + 35, 10, 10); g.DrawEllipse(pen, _startPosX + 77, _startPosY + 35, 10, 10); g.FillEllipse(brBlack, _startPosX + 7, _startPosY + 35, 10, 10); g.FillEllipse(brBlack, _startPosX + 77, _startPosY + 35, 10, 10); - //окна Brush brBlue = new SolidBrush(Color.Blue); g.FillEllipse(brBlue, _startPosX + 10, _startPosY + 15, 10, 15); g.FillEllipse(brBlue, _startPosX + 50, _startPosY + 15, 10, 15); g.FillEllipse(brBlue, _startPosX + 70, _startPosY + 15, 10, 15); - g.FillEllipse(brBlue, _startPosX + 90, _startPosY + 15, 10, 15); - - //g.DrawRectangle(pen, _startPosX - 1, _startPosY + 11, 100, 30); - //Brush brBodyColor = new SolidBrush(EntityBus.BodyColor); - //g.FillRectangle(brBodyColor, _startPosX, _startPosY + 10, 100, 30); - - //g.DrawRectangle(pen, _startPosX + 30, _startPosY + 20, 10, 20); - //Brush brBlack = new SolidBrush(Color.Black); - //g.FillRectangle(brBlack, _startPosX + 30, _startPosY + 20, 10, 20); - - //g.DrawEllipse(pen, _startPosX + 7, _startPosY + 35, 10, 10); - //g.DrawEllipse(pen, _startPosX + 77, _startPosY + 35, 10, 10); - //g.FillEllipse(brBlack, _startPosX + 7, _startPosY + 35, 10, 10); - //g.FillEllipse(brBlack, _startPosX + 77, _startPosY + 35, 10, 10); - - //Brush brBlue = new SolidBrush(Color.Blue); - //g.FillEllipse(brBlue, _startPosX + 10, _startPosY + 15, 10, 15); - //g.FillEllipse(brBlue, _startPosX + 50, _startPosY + 15, 10, 15); - //g.FillEllipse(brBlue, _startPosX + 70, _startPosY + 15, 10, 15); - //g.FillEllipse(brBlue, _startPosX + 90, _startPosY + 15, 10, 15); + g.FillEllipse(brBlue, _startPosX + 90, _startPosY + 15, 10, 15); } - } } diff --git a/DoubleDeckerBus/DoubleDeckerBus/DrawningObjects/DrawningDoubleDeckerBus.cs b/DoubleDeckerBus/DoubleDeckerBus/DrawningObjects/DrawningDoubleDeckerBus.cs index 38a86a2..6a7cd3c 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/DrawningObjects/DrawningDoubleDeckerBus.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/DrawningObjects/DrawningDoubleDeckerBus.cs @@ -41,7 +41,6 @@ namespace DoubleDeckerBus.DrawningObjects g.DrawRectangle(pen, _startPosX + 30, _startPosY + 20, 10, 20); g.FillRectangle(brBlack, _startPosX + 30, _startPosY + 20, 10, 20); - g.FillEllipse(brBlue, _startPosX + 10, _startPosY + 15, 10, 15); g.FillEllipse(brBlue, _startPosX + 50, _startPosY + 15, 10, 15); g.FillEllipse(brBlue, _startPosX + 70, _startPosY + 15, 10, 15); -- 2.25.1