From 5836ed32782925025f814ef33bc6b8e30daaa6ef Mon Sep 17 00:00:00 2001 From: Sem730 Date: Tue, 11 Oct 2022 09:02:35 +0300 Subject: [PATCH 1/2] generic classes --- .../MapWithSetLocomotivesGeneric.cs | 140 ++++++++++++++++++ .../SetLocomotivesGeneric.cs | 78 ++++++++++ 2 files changed, 218 insertions(+) create mode 100644 ProjectLocomotive/ProjectLocomotive/MapWithSetLocomotivesGeneric.cs create mode 100644 ProjectLocomotive/ProjectLocomotive/SetLocomotivesGeneric.cs diff --git a/ProjectLocomotive/ProjectLocomotive/MapWithSetLocomotivesGeneric.cs b/ProjectLocomotive/ProjectLocomotive/MapWithSetLocomotivesGeneric.cs new file mode 100644 index 0000000..5cb3fa5 --- /dev/null +++ b/ProjectLocomotive/ProjectLocomotive/MapWithSetLocomotivesGeneric.cs @@ -0,0 +1,140 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectLocomotive +{ + internal class MapWithSetLocomotivesGeneric + where T : class, IDrawningObject + where U : AbstractMap + { + /// Ширина окна отрисовки + private readonly int _pictureWidth; + /// Высота окна отрисовки + private readonly int _pictureHeight; + /// Размер занимаемого объектом места (ширина) + private readonly int _placeSizeWidth = 210; + /// Размер занимаемого объектом места (высота) + private readonly int _placeSizeHeight = 90; + /// Набор объектов + private readonly SetLocomotivesGeneric _setLocomotives; + /// Карта + private readonly U _map; + /// Конструктор + public MapWithSetLocomotivesGeneric(int picWidth, int picHeight, U map) + { + int width = picWidth / _placeSizeWidth; + int height = picHeight / _placeSizeHeight; + _setLocomotives = new SetLocomotivesGeneric(width * height); + _pictureWidth = picWidth; + _pictureHeight = picHeight; + _map = map; + } + /// Перегрузка оператора сложения + public static bool operator +(MapWithSetLocomotivesGeneric map, T locomotive) + { + return map._setLocomotives.Insert(locomotive); + } + /// Перегрузка оператора вычитания + public static bool operator -(MapWithSetLocomotivesGeneric map, int position) + { + return map._setLocomotives.Remove(position); + } + /// Вывод всего набора объектов + public Bitmap ShowSet() + { + Bitmap bmp = new(_pictureWidth, _pictureHeight); + Graphics gr = Graphics.FromImage(bmp); + DrawBackground(gr); + DrawLocomotives(gr); + return bmp; + } + /// Просмотр объекта на карте + public Bitmap ShowOnMap() + { + Shaking(); + for (int i = 0; i < _setLocomotives.Count; i++) + { + var locomotive = _setLocomotives.Get(i); + if (locomotive != null) + { + return _map.CreateMap(_pictureWidth, _pictureHeight, locomotive); + } + } + return new(_pictureWidth, _pictureHeight); + } + /// Перемещение объекта по крате + public Bitmap MoveObject(Direction direction) + { + if (_map != null) + { + return _map.MoveObject(direction); + } + return new(_pictureWidth, _pictureHeight); + } + /// "Взбалтываем" набор, чтобы все элементы оказались в начале + private void Shaking() + { + int j = _setLocomotives.Count - 1; + for (int i = 0; i < _setLocomotives.Count; i++) + { + if (_setLocomotives.Get(i) == null) + { + for (; j > i; j--) + { + var locomotive = _setLocomotives.Get(j); + if (locomotive != null) + { + _setLocomotives.Insert(locomotive, i); + _setLocomotives.Remove(j); + break; + } + } + if (j <= i) + { + return; + } + } + } + } + /// Метод отрисовки фона + private void DrawBackground(Graphics g) + { + Pen pen = new(Color.Black, 3); + for (int i = 0; i < _pictureWidth / _placeSizeWidth; i++) + { + for (int j = 0; j < _pictureHeight / _placeSizeHeight + 1; ++j) + { //линия рамзетки места + g.DrawLine(pen, i * _placeSizeWidth, j * _placeSizeHeight, i * + _placeSizeWidth + _placeSizeWidth / 2, j * _placeSizeHeight); + } + g.DrawLine(pen, i * _placeSizeWidth, 0, i * _placeSizeWidth, + (_pictureHeight / _placeSizeHeight) * _placeSizeHeight); + } + } + /// Метод прорисовки объектов + private void DrawLocomotives(Graphics g) + { + int width = _pictureWidth / _placeSizeWidth; + int height = _pictureHeight / _placeSizeHeight; + + int curWidth = 0; + int curHeight = 0; + + for (int i = 0; i < _setLocomotives.Count; i++) + { + // установка позиции + _setLocomotives.Get(i)?.SetObject(curWidth * _placeSizeWidth, curHeight * _placeSizeHeight, _pictureWidth, _pictureHeight); + _setLocomotives.Get(i)?.DrawningObject(g); + if (curWidth < width) curWidth++; + else + { + curWidth = 0; + curHeight++; + } + } + } + } +} diff --git a/ProjectLocomotive/ProjectLocomotive/SetLocomotivesGeneric.cs b/ProjectLocomotive/ProjectLocomotive/SetLocomotivesGeneric.cs new file mode 100644 index 0000000..02b94b3 --- /dev/null +++ b/ProjectLocomotive/ProjectLocomotive/SetLocomotivesGeneric.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectLocomotive +{ + /// + /// Параметризованный набор объектов + /// + /// + internal class SetLocomotivesGeneric + where T : class + { + private readonly T[] _places; + + /// Количество объектов в массиве + public int Count => _places.Length; + /// Конструктор + public SetLocomotivesGeneric(int count) + { + _places = new T[count]; + } + /// Добавление объекта в набор + public bool Insert(T locomotive) + { + return Insert(locomotive, 0); + } + /// Добавление объекта в набор на конкретную позицию + public bool Insert(T locomotive, int position) + { + if (position >= _places.Length || position < 0) return false; + + if (_places[position] == null) + { + _places[position] = locomotive; + return true; + } + + int emptyEl = -1; + + for (int i = position + 1; i < Count; i++) + { + if (_places[i] == null) emptyEl = i; + break; + } + + if (emptyEl == -1) + { + return false; + } + + for (int i = emptyEl; i > position; i--) + { + _places[i] = _places[i - 1]; + } + _places[position] = locomotive; + return true; + } + /// Удаление объекта из набора с конкретной позиции + public bool Remove(int position) + { + if (position >= _places.Length || position < 0) return false; + _places[position] = null; + return true; + } + /// Получение объекта из набора по позиции + public T Get(int position) + { + if (position >= _places.Length || position < 0) + { + return null; + } + return _places[position]; + } + } +} From e4d9e2aed1ad5651ddede15125e3b83b3f2b7b48 Mon Sep 17 00:00:00 2001 From: Sem730 Date: Tue, 11 Oct 2022 14:14:13 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=93=D0=BE=D1=82=D0=BE=D0=B2=D0=B0=D1=8F?= =?UTF-8?q?=20=D1=82=D1=80=D0=B5=D1=82=D1=8C=D1=8F=20=D0=BB=D0=B0=D0=B1?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectLocomotive/Direction.cs | 2 +- .../ProjectLocomotive/DrawningLocomotive.cs | 4 +- .../ProjectLocomotive/EntityLocomotive.cs | 2 +- .../FormLocomotive.Designer.cs | 13 + .../ProjectLocomotive/FormLocomotive.cs | 43 +++- .../ProjectLocomotive/FormMap.Designer.cs | 218 ----------------- .../ProjectLocomotive/FormMap.cs | 105 -------- .../FormMapWithSetLocomotives.Designer.cs | 226 ++++++++++++++++++ .../FormMapWithSetLocomotives.cs | 137 +++++++++++ ...ap.resx => FormMapWithSetLocomotives.resx} | 3 - .../MapWithSetLocomotivesGeneric.cs | 59 ++++- .../ProjectLocomotive/Program.cs | 2 +- .../ProjectLocomotive/RailroadMap.cs | 62 +++++ .../SetLocomotivesGeneric.cs | 27 ++- .../ProjectLocomotive/SpikeMap.cs | 59 +++++ 15 files changed, 606 insertions(+), 356 deletions(-) delete mode 100644 ProjectLocomotive/ProjectLocomotive/FormMap.Designer.cs delete mode 100644 ProjectLocomotive/ProjectLocomotive/FormMap.cs create mode 100644 ProjectLocomotive/ProjectLocomotive/FormMapWithSetLocomotives.Designer.cs create mode 100644 ProjectLocomotive/ProjectLocomotive/FormMapWithSetLocomotives.cs rename ProjectLocomotive/ProjectLocomotive/{FormMap.resx => FormMapWithSetLocomotives.resx} (93%) create mode 100644 ProjectLocomotive/ProjectLocomotive/RailroadMap.cs create mode 100644 ProjectLocomotive/ProjectLocomotive/SpikeMap.cs diff --git a/ProjectLocomotive/ProjectLocomotive/Direction.cs b/ProjectLocomotive/ProjectLocomotive/Direction.cs index cf1a741..c59629e 100644 --- a/ProjectLocomotive/ProjectLocomotive/Direction.cs +++ b/ProjectLocomotive/ProjectLocomotive/Direction.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace ProjectLocomotive { - internal enum Direction + public enum Direction { None = 0, Up = 1, diff --git a/ProjectLocomotive/ProjectLocomotive/DrawningLocomotive.cs b/ProjectLocomotive/ProjectLocomotive/DrawningLocomotive.cs index 38519a0..ccc0749 100644 --- a/ProjectLocomotive/ProjectLocomotive/DrawningLocomotive.cs +++ b/ProjectLocomotive/ProjectLocomotive/DrawningLocomotive.cs @@ -9,7 +9,7 @@ namespace ProjectLocomotive /// /// Класс, отвечающий за прорисовку и перемещение объекта-сущности /// - internal class DrawningLocomotive + public class DrawningLocomotive { /// /// Класс-сущность @@ -167,6 +167,8 @@ namespace ProjectLocomotive g.DrawLine(pen, _startPosX + 30, _startPosY + 8, _startPosX + 30, _startPosY + 25); g.DrawLine(pen, _startPosX + 30, _startPosY + 25, _startPosX + 20, _startPosY + 25); g.DrawLine(pen, _startPosX + 20, _startPosY + 25, _startPosX + 20, _startPosY + 6); + + } /// /// Смена границ формы отрисовки diff --git a/ProjectLocomotive/ProjectLocomotive/EntityLocomotive.cs b/ProjectLocomotive/ProjectLocomotive/EntityLocomotive.cs index 1f7dfe1..add3955 100644 --- a/ProjectLocomotive/ProjectLocomotive/EntityLocomotive.cs +++ b/ProjectLocomotive/ProjectLocomotive/EntityLocomotive.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace ProjectLocomotive { - internal class EntityLocomotive + public class EntityLocomotive { /// /// Скорость diff --git a/ProjectLocomotive/ProjectLocomotive/FormLocomotive.Designer.cs b/ProjectLocomotive/ProjectLocomotive/FormLocomotive.Designer.cs index 1a7a23d..31e6f76 100644 --- a/ProjectLocomotive/ProjectLocomotive/FormLocomotive.Designer.cs +++ b/ProjectLocomotive/ProjectLocomotive/FormLocomotive.Designer.cs @@ -39,6 +39,7 @@ this.toolStripStatusLabelBodyColor = new System.Windows.Forms.ToolStripStatusLabel(); this.statusStrip = new System.Windows.Forms.StatusStrip(); this.buttonCreateModif = new System.Windows.Forms.Button(); + this.buttonSelectLocomotive = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)(this.pictureBoxLocomotive)).BeginInit(); this.statusStrip.SuspendLayout(); this.SuspendLayout(); @@ -155,11 +156,22 @@ this.buttonCreateModif.UseVisualStyleBackColor = true; this.buttonCreateModif.Click += new System.EventHandler(this.ButtonCreateModif_Click); // + // buttonSelectLocomotive + // + this.buttonSelectLocomotive.Location = new System.Drawing.Point(495, 370); + this.buttonSelectLocomotive.Name = "buttonSelectLocomotive"; + this.buttonSelectLocomotive.Size = new System.Drawing.Size(104, 36); + this.buttonSelectLocomotive.TabIndex = 8; + this.buttonSelectLocomotive.Text = "Выбрать"; + this.buttonSelectLocomotive.UseVisualStyleBackColor = true; + this.buttonSelectLocomotive.Click += new System.EventHandler(this.buttonSelectLocomotive_Click); + // // FormLocomotive // this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 25F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(800, 450); + this.Controls.Add(this.buttonSelectLocomotive); this.Controls.Add(this.buttonCreateModif); this.Controls.Add(this.buttonRight); this.Controls.Add(this.buttonDown); @@ -191,5 +203,6 @@ private ToolStripStatusLabel toolStripStatusLabelBodyColor; private StatusStrip statusStrip; private Button buttonCreateModif; + private Button buttonSelectLocomotive; } } \ No newline at end of file diff --git a/ProjectLocomotive/ProjectLocomotive/FormLocomotive.cs b/ProjectLocomotive/ProjectLocomotive/FormLocomotive.cs index f361b4c..8fbcbc4 100644 --- a/ProjectLocomotive/ProjectLocomotive/FormLocomotive.cs +++ b/ProjectLocomotive/ProjectLocomotive/FormLocomotive.cs @@ -3,6 +3,10 @@ namespace ProjectLocomotive public partial class FormLocomotive : Form { private DrawningLocomotive _elloc; + /// + /// + /// + public DrawningLocomotive SelectedLocomotive { get; private set; } public FormLocomotive() { @@ -39,7 +43,15 @@ namespace ProjectLocomotive private void ButtonCreate_Click(object sender, EventArgs e) { Random rnd = new(); - _elloc = new DrawningLocomotive(rnd.Next(100, 300), rnd.Next(1000, 2000), Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256))); + //_elloc = new DrawningLocomotive(rnd.Next(100, 300), rnd.Next(1000, 2000), Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256))); + Color color = Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)); + ColorDialog dialog = new(); + if (dialog.ShowDialog() == DialogResult.OK) + { + color = dialog.Color; + } + _elloc = new DrawningLocomotive(rnd.Next(100, 300), rnd.Next(1000, 2000), color); + _elloc.SetPosition(rnd.Next(10, 100), rnd.Next(10, 100), pictureBoxLocomotive.Width, pictureBoxLocomotive.Height); SetData(); Draw(); } @@ -87,12 +99,37 @@ namespace ProjectLocomotive private void ButtonCreateModif_Click(object sender, EventArgs e) { Random rnd = new(); + Color color = Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)); + ColorDialog dialog = new(); + if (dialog.ShowDialog() == DialogResult.OK) + { + color = dialog.Color; + } + Color dopColor = Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)); + ColorDialog dialogDop = new(); + if (dialogDop.ShowDialog() == DialogResult.OK) + { + dopColor = dialogDop.Color; + } _elloc = new DrawningElectroLocomotive(rnd.Next(100, 300), rnd.Next(1000, 2000), - Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)), - Color.FromArgb(rnd.Next(1, 100), rnd.Next(1, 100), rnd.Next(1, 100)), + color, + dopColor, + //Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)), + //Color.FromArgb(rnd.Next(1, 100), rnd.Next(1, 100), rnd.Next(1, 100)), Convert.ToBoolean(rnd.Next(0, 1)), Convert.ToBoolean(rnd.Next(0, 1))); SetData(); Draw(); } + + private void pictureBoxLocomotive_Click(object sender, EventArgs e) + { + + } + + private void buttonSelectLocomotive_Click(object sender, EventArgs e) + { + SelectedLocomotive = _elloc; + DialogResult = DialogResult.OK; + } } } \ No newline at end of file diff --git a/ProjectLocomotive/ProjectLocomotive/FormMap.Designer.cs b/ProjectLocomotive/ProjectLocomotive/FormMap.Designer.cs deleted file mode 100644 index 12f06b9..0000000 --- a/ProjectLocomotive/ProjectLocomotive/FormMap.Designer.cs +++ /dev/null @@ -1,218 +0,0 @@ -namespace ProjectLocomotive -{ - partial class FormMap - { - /// - /// 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() - { - this.pictureBoxCar = new System.Windows.Forms.PictureBox(); - this.statusStrip = new System.Windows.Forms.StatusStrip(); - this.toolStripStatusLabelSpeed = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolStripStatusLabelWeight = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolStripStatusLabelBodyColor = new System.Windows.Forms.ToolStripStatusLabel(); - this.buttonCreate = new System.Windows.Forms.Button(); - this.buttonUp = new System.Windows.Forms.Button(); - this.buttonLeft = new System.Windows.Forms.Button(); - this.buttonRight = new System.Windows.Forms.Button(); - this.buttonDown = new System.Windows.Forms.Button(); - this.buttonCreateModif = new System.Windows.Forms.Button(); - this.comboBoxSelectorMap = new System.Windows.Forms.ComboBox(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxCar)).BeginInit(); - this.statusStrip.SuspendLayout(); - this.SuspendLayout(); - // - // pictureBoxCar - // - this.pictureBoxCar.Dock = System.Windows.Forms.DockStyle.Fill; - this.pictureBoxCar.Location = new System.Drawing.Point(0, 0); - this.pictureBoxCar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); - this.pictureBoxCar.Name = "pictureBoxCar"; - this.pictureBoxCar.Size = new System.Drawing.Size(1143, 718); - this.pictureBoxCar.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; - this.pictureBoxCar.TabIndex = 0; - this.pictureBoxCar.TabStop = false; - // - // statusStrip - // - this.statusStrip.ImageScalingSize = new System.Drawing.Size(24, 24); - this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripStatusLabelSpeed, - this.toolStripStatusLabelWeight, - this.toolStripStatusLabelBodyColor}); - this.statusStrip.Location = new System.Drawing.Point(0, 718); - this.statusStrip.Name = "statusStrip"; - this.statusStrip.Padding = new System.Windows.Forms.Padding(1, 0, 20, 0); - this.statusStrip.Size = new System.Drawing.Size(1143, 32); - this.statusStrip.TabIndex = 1; - // - // toolStripStatusLabelSpeed - // - this.toolStripStatusLabelSpeed.Name = "toolStripStatusLabelSpeed"; - this.toolStripStatusLabelSpeed.Size = new System.Drawing.Size(93, 25); - this.toolStripStatusLabelSpeed.Text = "Скорость:"; - // - // toolStripStatusLabelWeight - // - this.toolStripStatusLabelWeight.Name = "toolStripStatusLabelWeight"; - this.toolStripStatusLabelWeight.Size = new System.Drawing.Size(43, 25); - this.toolStripStatusLabelWeight.Text = "Вес:"; - // - // toolStripStatusLabelBodyColor - // - this.toolStripStatusLabelBodyColor.Name = "toolStripStatusLabelBodyColor"; - this.toolStripStatusLabelBodyColor.Size = new System.Drawing.Size(55, 25); - this.toolStripStatusLabelBodyColor.Text = "Цвет:"; - // - // buttonCreate - // - this.buttonCreate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonCreate.Location = new System.Drawing.Point(17, 650); - this.buttonCreate.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); - this.buttonCreate.Name = "buttonCreate"; - this.buttonCreate.Size = new System.Drawing.Size(107, 38); - this.buttonCreate.TabIndex = 2; - this.buttonCreate.Text = "Создать"; - this.buttonCreate.UseVisualStyleBackColor = true; - this.buttonCreate.Click += new System.EventHandler(this.ButtonCreate_Click); - // - // buttonUp - // - this.buttonUp.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonUp.BackgroundImage = global::ProjectLocomotive.Properties.Resources.up; - this.buttonUp.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.buttonUp.Location = new System.Drawing.Point(1031, 583); - this.buttonUp.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); - this.buttonUp.Name = "buttonUp"; - this.buttonUp.Size = new System.Drawing.Size(43, 50); - this.buttonUp.TabIndex = 3; - this.buttonUp.UseVisualStyleBackColor = true; - this.buttonUp.Click += new System.EventHandler(this.ButtonMove_Click); - // - // buttonLeft - // - this.buttonLeft.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonLeft.BackgroundImage = global::ProjectLocomotive.Properties.Resources.left; - this.buttonLeft.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.buttonLeft.Location = new System.Drawing.Point(980, 643); - this.buttonLeft.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); - this.buttonLeft.Name = "buttonLeft"; - this.buttonLeft.Size = new System.Drawing.Size(43, 50); - this.buttonLeft.TabIndex = 4; - this.buttonLeft.UseVisualStyleBackColor = true; - this.buttonLeft.Click += new System.EventHandler(this.ButtonMove_Click); - // - // buttonRight - // - this.buttonRight.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonRight.BackgroundImage = global::ProjectLocomotive.Properties.Resources.right; - this.buttonRight.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.buttonRight.Location = new System.Drawing.Point(1083, 643); - this.buttonRight.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); - this.buttonRight.Name = "buttonRight"; - this.buttonRight.Size = new System.Drawing.Size(43, 50); - this.buttonRight.TabIndex = 5; - this.buttonRight.UseVisualStyleBackColor = true; - this.buttonRight.Click += new System.EventHandler(this.ButtonMove_Click); - // - // buttonDown - // - this.buttonDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonDown.BackgroundImage = global::ProjectLocomotive.Properties.Resources.down; - this.buttonDown.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.buttonDown.Location = new System.Drawing.Point(1031, 643); - this.buttonDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); - this.buttonDown.Name = "buttonDown"; - this.buttonDown.Size = new System.Drawing.Size(43, 50); - this.buttonDown.TabIndex = 6; - this.buttonDown.UseVisualStyleBackColor = true; - this.buttonDown.Click += new System.EventHandler(this.ButtonMove_Click); - // - // buttonCreateModif - // - this.buttonCreateModif.Location = new System.Drawing.Point(149, 650); - this.buttonCreateModif.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); - this.buttonCreateModif.Name = "buttonCreateModif"; - this.buttonCreateModif.Size = new System.Drawing.Size(157, 38); - this.buttonCreateModif.TabIndex = 7; - this.buttonCreateModif.Text = "Модификация"; - this.buttonCreateModif.UseVisualStyleBackColor = true; - this.buttonCreateModif.Click += new System.EventHandler(this.ButtonCreateModif_Click); - // - // comboBoxSelectorMap - // - this.comboBoxSelectorMap.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxSelectorMap.FormattingEnabled = true; - this.comboBoxSelectorMap.Items.AddRange(new object[] { - "Простая карта", - "Море"}); - this.comboBoxSelectorMap.Location = new System.Drawing.Point(17, 20); - this.comboBoxSelectorMap.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); - this.comboBoxSelectorMap.Name = "comboBoxSelectorMap"; - this.comboBoxSelectorMap.Size = new System.Drawing.Size(171, 33); - this.comboBoxSelectorMap.TabIndex = 8; - this.comboBoxSelectorMap.SelectedIndexChanged += new System.EventHandler(this.ComboBoxSelectorMap_SelectedIndexChanged); - // - // FormMap - // - this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 25F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1143, 750); - this.Controls.Add(this.comboBoxSelectorMap); - this.Controls.Add(this.buttonCreateModif); - this.Controls.Add(this.buttonDown); - this.Controls.Add(this.buttonRight); - this.Controls.Add(this.buttonLeft); - this.Controls.Add(this.buttonUp); - this.Controls.Add(this.buttonCreate); - this.Controls.Add(this.pictureBoxCar); - this.Controls.Add(this.statusStrip); - this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); - this.Name = "FormMap"; - this.Text = "Карта"; - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxCar)).EndInit(); - this.statusStrip.ResumeLayout(false); - this.statusStrip.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private PictureBox pictureBoxCar; - private StatusStrip statusStrip; - private ToolStripStatusLabel toolStripStatusLabelSpeed; - private ToolStripStatusLabel toolStripStatusLabelWeight; - private ToolStripStatusLabel toolStripStatusLabelBodyColor; - private Button buttonCreate; - private Button buttonUp; - private Button buttonLeft; - private Button buttonRight; - private Button buttonDown; - private Button buttonCreateModif; - private ComboBox comboBoxSelectorMap; - } -} \ No newline at end of file diff --git a/ProjectLocomotive/ProjectLocomotive/FormMap.cs b/ProjectLocomotive/ProjectLocomotive/FormMap.cs deleted file mode 100644 index b072f4b..0000000 --- a/ProjectLocomotive/ProjectLocomotive/FormMap.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; - -namespace ProjectLocomotive -{ - public partial class FormMap : Form - { - private AbstractMap _abstractMap; - - public FormMap() - { - InitializeComponent(); - _abstractMap = new SimpleMap(); - } - /// - /// Заполнение информации по объекту - /// - /// - private void SetData(DrawningLocomotive loc) - { - toolStripStatusLabelSpeed.Text = $"Скорость: {loc.Locomotivе.Speed}"; - toolStripStatusLabelWeight.Text = $"Вес: {loc.Locomotivе.Weight}"; - toolStripStatusLabelBodyColor.Text = $"Цвет: {loc.Locomotivе.BodyColor.Name}"; - pictureBoxCar.Image = _abstractMap.CreateMap(pictureBoxCar.Width, pictureBoxCar.Height, - new DrawningObject(loc)); - } - /// - /// Обработка нажатия кнопки "Создать" - /// - /// - /// - private void ButtonCreate_Click(object sender, EventArgs e) - { - Random rnd = new(); - var car = new DrawningLocomotive(rnd.Next(100, 300), rnd.Next(1000, 2000), Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256))); - SetData(car); - } - /// - /// Изменение размеров формы - /// - /// - /// - private void ButtonMove_Click(object sender, EventArgs e) - { - //получаем имя кнопки - string name = ((Button)sender)?.Name ?? string.Empty; - Direction dir = Direction.None; - switch (name) - { - case "buttonUp": - dir = Direction.Up; - break; - case "buttonDown": - dir = Direction.Down; - break; - case "buttonLeft": - dir = Direction.Left; - break; - case "buttonRight": - dir = Direction.Right; - break; - } - pictureBoxCar.Image = _abstractMap?.MoveObject(dir); - } - /// - /// Обработка нажатия кнопки "Модификация" - /// - /// - /// - private void ButtonCreateModif_Click(object sender, EventArgs e) - { - Random rnd = new(); - var car = new DrawningElectroLocomotive(rnd.Next(100, 300), rnd.Next(1000, 2000), - Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)), - Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)), - Convert.ToBoolean(rnd.Next(0, 2)), Convert.ToBoolean(rnd.Next(0, 2))); - SetData(car); - } - /// - /// Смена карты - /// - /// - /// - private void ComboBoxSelectorMap_SelectedIndexChanged(object sender, EventArgs e) - { - switch (comboBoxSelectorMap.Text) - { - case "Простая карта": - _abstractMap = new SimpleMap(); - break; - - case "Море": - _abstractMap = new SeaMap(); - break; - } - } - } -} diff --git a/ProjectLocomotive/ProjectLocomotive/FormMapWithSetLocomotives.Designer.cs b/ProjectLocomotive/ProjectLocomotive/FormMapWithSetLocomotives.Designer.cs new file mode 100644 index 0000000..64d196e --- /dev/null +++ b/ProjectLocomotive/ProjectLocomotive/FormMapWithSetLocomotives.Designer.cs @@ -0,0 +1,226 @@ +namespace ProjectLocomotive +{ + partial class FormMapWithSetLocomotives + { + /// + /// 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() + { + this.groupBoxTools = new System.Windows.Forms.GroupBox(); + this.buttonLeft = new System.Windows.Forms.Button(); + this.buttonRight = new System.Windows.Forms.Button(); + this.buttonDown = new System.Windows.Forms.Button(); + this.buttonUp = new System.Windows.Forms.Button(); + this.buttonShowOnMap = new System.Windows.Forms.Button(); + this.buttonShowStorage = new System.Windows.Forms.Button(); + this.buttonRemoveLocomotive = new System.Windows.Forms.Button(); + this.maskedTextBoxPosition = new System.Windows.Forms.MaskedTextBox(); + this.buttonAddLocomotive = new System.Windows.Forms.Button(); + this.comboBoxSelectorMap = new System.Windows.Forms.ComboBox(); + this.pictureBox = new System.Windows.Forms.PictureBox(); + this.groupBoxTools.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit(); + this.SuspendLayout(); + // + // groupBoxTools + // + this.groupBoxTools.Controls.Add(this.buttonLeft); + this.groupBoxTools.Controls.Add(this.buttonRight); + this.groupBoxTools.Controls.Add(this.buttonDown); + this.groupBoxTools.Controls.Add(this.buttonUp); + this.groupBoxTools.Controls.Add(this.buttonShowOnMap); + this.groupBoxTools.Controls.Add(this.buttonShowStorage); + this.groupBoxTools.Controls.Add(this.buttonRemoveLocomotive); + this.groupBoxTools.Controls.Add(this.maskedTextBoxPosition); + this.groupBoxTools.Controls.Add(this.buttonAddLocomotive); + this.groupBoxTools.Controls.Add(this.comboBoxSelectorMap); + this.groupBoxTools.Dock = System.Windows.Forms.DockStyle.Right; + this.groupBoxTools.Location = new System.Drawing.Point(725, 0); + this.groupBoxTools.Margin = new System.Windows.Forms.Padding(4); + this.groupBoxTools.Name = "groupBoxTools"; + this.groupBoxTools.Padding = new System.Windows.Forms.Padding(4); + this.groupBoxTools.Size = new System.Drawing.Size(275, 630); + this.groupBoxTools.TabIndex = 0; + this.groupBoxTools.TabStop = false; + this.groupBoxTools.Text = "Инструменты"; + // + // buttonLeft + // + this.buttonLeft.BackgroundImage = global::ProjectLocomotive.Properties.Resources.left; + this.buttonLeft.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.buttonLeft.Location = new System.Drawing.Point(52, 558); + this.buttonLeft.Margin = new System.Windows.Forms.Padding(4); + this.buttonLeft.Name = "buttonLeft"; + this.buttonLeft.Size = new System.Drawing.Size(50, 50); + this.buttonLeft.TabIndex = 7; + this.buttonLeft.UseVisualStyleBackColor = true; + this.buttonLeft.Click += new System.EventHandler(this.buttonMove_Click); + // + // buttonRight + // + this.buttonRight.BackgroundImage = global::ProjectLocomotive.Properties.Resources.right; + this.buttonRight.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.buttonRight.Location = new System.Drawing.Point(168, 558); + this.buttonRight.Margin = new System.Windows.Forms.Padding(4); + this.buttonRight.Name = "buttonRight"; + this.buttonRight.Size = new System.Drawing.Size(50, 50); + this.buttonRight.TabIndex = 7; + this.buttonRight.UseVisualStyleBackColor = true; + this.buttonRight.Click += new System.EventHandler(this.buttonMove_Click); + // + // buttonDown + // + this.buttonDown.BackgroundImage = global::ProjectLocomotive.Properties.Resources.down; + this.buttonDown.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.buttonDown.Location = new System.Drawing.Point(110, 558); + this.buttonDown.Margin = new System.Windows.Forms.Padding(4); + this.buttonDown.Name = "buttonDown"; + this.buttonDown.Size = new System.Drawing.Size(50, 50); + this.buttonDown.TabIndex = 7; + this.buttonDown.UseVisualStyleBackColor = true; + this.buttonDown.Click += new System.EventHandler(this.buttonMove_Click); + // + // buttonUp + // + this.buttonUp.BackgroundImage = global::ProjectLocomotive.Properties.Resources.up; + this.buttonUp.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.buttonUp.Location = new System.Drawing.Point(110, 500); + this.buttonUp.Margin = new System.Windows.Forms.Padding(4); + this.buttonUp.Name = "buttonUp"; + this.buttonUp.Size = new System.Drawing.Size(50, 50); + this.buttonUp.TabIndex = 6; + this.buttonUp.UseVisualStyleBackColor = true; + this.buttonUp.Click += new System.EventHandler(this.buttonMove_Click); + // + // buttonShowOnMap + // + this.buttonShowOnMap.Location = new System.Drawing.Point(9, 352); + this.buttonShowOnMap.Margin = new System.Windows.Forms.Padding(4); + this.buttonShowOnMap.Name = "buttonShowOnMap"; + this.buttonShowOnMap.Size = new System.Drawing.Size(259, 36); + this.buttonShowOnMap.TabIndex = 5; + this.buttonShowOnMap.Text = "Посмотреть карту"; + this.buttonShowOnMap.UseVisualStyleBackColor = true; + this.buttonShowOnMap.Click += new System.EventHandler(this.buttonShowOnMap_Click); + // + // buttonShowStorage + // + this.buttonShowStorage.Location = new System.Drawing.Point(9, 309); + this.buttonShowStorage.Margin = new System.Windows.Forms.Padding(4); + this.buttonShowStorage.Name = "buttonShowStorage"; + this.buttonShowStorage.Size = new System.Drawing.Size(259, 36); + this.buttonShowStorage.TabIndex = 4; + this.buttonShowStorage.Text = "Посмотреть хранилище"; + this.buttonShowStorage.UseVisualStyleBackColor = true; + this.buttonShowStorage.Click += new System.EventHandler(this.buttonShowStorage_Click); + // + // buttonRemoveLocomotive + // + this.buttonRemoveLocomotive.Location = new System.Drawing.Point(9, 264); + this.buttonRemoveLocomotive.Margin = new System.Windows.Forms.Padding(4); + this.buttonRemoveLocomotive.Name = "buttonRemoveLocomotive"; + this.buttonRemoveLocomotive.Size = new System.Drawing.Size(259, 38); + this.buttonRemoveLocomotive.TabIndex = 3; + this.buttonRemoveLocomotive.Text = "Удалить локомотив"; + this.buttonRemoveLocomotive.UseVisualStyleBackColor = true; + this.buttonRemoveLocomotive.Click += new System.EventHandler(this.buttonRemoveLocomotive_Click); + // + // maskedTextBoxPosition + // + this.maskedTextBoxPosition.Location = new System.Drawing.Point(8, 199); + this.maskedTextBoxPosition.Margin = new System.Windows.Forms.Padding(4); + this.maskedTextBoxPosition.Mask = "00"; + this.maskedTextBoxPosition.Name = "maskedTextBoxPosition"; + this.maskedTextBoxPosition.Size = new System.Drawing.Size(259, 31); + this.maskedTextBoxPosition.TabIndex = 2; + // + // buttonAddLocomotive + // + this.buttonAddLocomotive.Location = new System.Drawing.Point(8, 120); + this.buttonAddLocomotive.Margin = new System.Windows.Forms.Padding(4); + this.buttonAddLocomotive.Name = "buttonAddLocomotive"; + this.buttonAddLocomotive.Size = new System.Drawing.Size(260, 36); + this.buttonAddLocomotive.TabIndex = 1; + this.buttonAddLocomotive.Text = "Добавить локомотив"; + this.buttonAddLocomotive.UseVisualStyleBackColor = true; + this.buttonAddLocomotive.Click += new System.EventHandler(this.buttonAddLocomotive_Click); + // + // comboBoxSelectorMap + // + this.comboBoxSelectorMap.FormattingEnabled = true; + this.comboBoxSelectorMap.Items.AddRange(new object[] { + "Simple Map", + "Spike Map", + "Rail Map"}); + this.comboBoxSelectorMap.Location = new System.Drawing.Point(8, 49); + this.comboBoxSelectorMap.Margin = new System.Windows.Forms.Padding(4); + this.comboBoxSelectorMap.Name = "comboBoxSelectorMap"; + this.comboBoxSelectorMap.Size = new System.Drawing.Size(259, 33); + this.comboBoxSelectorMap.TabIndex = 0; + this.comboBoxSelectorMap.SelectedIndexChanged += new System.EventHandler(this.comboBoxSelectorMap_SelectedIndexChanged); + // + // pictureBox + // + this.pictureBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.pictureBox.Location = new System.Drawing.Point(0, 0); + this.pictureBox.Margin = new System.Windows.Forms.Padding(4); + this.pictureBox.Name = "pictureBox"; + this.pictureBox.Size = new System.Drawing.Size(725, 630); + this.pictureBox.TabIndex = 1; + this.pictureBox.TabStop = false; + // + // FormMapWithSetLocomotives + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 25F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1000, 630); + this.Controls.Add(this.pictureBox); + this.Controls.Add(this.groupBoxTools); + this.Margin = new System.Windows.Forms.Padding(4); + this.Name = "FormMapWithSetLocomotives"; + this.Text = "Карта с набором объектов"; + this.groupBoxTools.ResumeLayout(false); + this.groupBoxTools.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private GroupBox groupBoxTools; + private PictureBox pictureBox; + private ComboBox comboBoxSelectorMap; + private Button buttonAddLocomotive; + private MaskedTextBox maskedTextBoxPosition; + private Button buttonRemoveLocomotive; + private Button buttonShowStorage; + private Button buttonShowOnMap; + private Button buttonUp; + private Button buttonDown; + private Button buttonRight; + private Button buttonLeft; + } +} \ No newline at end of file diff --git a/ProjectLocomotive/ProjectLocomotive/FormMapWithSetLocomotives.cs b/ProjectLocomotive/ProjectLocomotive/FormMapWithSetLocomotives.cs new file mode 100644 index 0000000..c1ba911 --- /dev/null +++ b/ProjectLocomotive/ProjectLocomotive/FormMapWithSetLocomotives.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ProjectLocomotive +{ + public partial class FormMapWithSetLocomotives : Form + { + /// Объект от класса карты с набором объектов + private MapWithSetLocomotivesGeneric _mapLocomotivesCollectionGeneric; + public FormMapWithSetLocomotives() + { + InitializeComponent(); + } + /// Выбор карты + private void comboBoxSelectorMap_SelectedIndexChanged(object sender, EventArgs e) + { + AbstractMap map = null; + switch (comboBoxSelectorMap.Text) + { + case "Simple Map": + map = new SimpleMap(); + break; + case "Spike Map": + map = new SpikeMap(); + break; + case "Rail Map": + map = new RailroadMap(); + break; + } + if (map != null) + { + _mapLocomotivesCollectionGeneric = new MapWithSetLocomotivesGeneric + (pictureBox.Width, pictureBox.Height, map); + } + else + { + _mapLocomotivesCollectionGeneric = null; + } + } + /// Добавление объекта + private void buttonAddLocomotive_Click(object sender, EventArgs e) + { + if (_mapLocomotivesCollectionGeneric == null) + { + return; + } + FormLocomotive form = new(); + if (form.ShowDialog() == DialogResult.OK) + { + DrawningObject locomotive = new(form.SelectedLocomotive); + if (_mapLocomotivesCollectionGeneric + locomotive != -1) + { + MessageBox.Show("Объект добавлен"); + pictureBox.Image = _mapLocomotivesCollectionGeneric.ShowSet(); + } + else + { + MessageBox.Show("Не удалось добавить объект"); + } + } + } + /// Удаление объекта + private void buttonRemoveLocomotive_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(maskedTextBoxPosition.Text)) + { + return; + } + if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + { + return; + } + int pos = Convert.ToInt32(maskedTextBoxPosition.Text); + if (_mapLocomotivesCollectionGeneric - pos is not null) + { + MessageBox.Show("Объект удален"); + pictureBox.Image = _mapLocomotivesCollectionGeneric.ShowSet(); + } + else + { + MessageBox.Show("Не удалось удалить объект"); + } + } + /// Вывод набора + private void buttonShowStorage_Click(object sender, EventArgs e) + { + if (_mapLocomotivesCollectionGeneric == null) + { + return; + } + pictureBox.Image = _mapLocomotivesCollectionGeneric.ShowSet(); + } + /// Вывод карты + private void buttonShowOnMap_Click(object sender, EventArgs e) + { + if (_mapLocomotivesCollectionGeneric == null) + { + return; + } + pictureBox.Image = _mapLocomotivesCollectionGeneric.ShowOnMap(); + } + /// Перемещение + private void buttonMove_Click(object sender, EventArgs e) + { + if (_mapLocomotivesCollectionGeneric == null) + { + return; + } + //получаем имя кнопки + string name = ((Button)sender)?.Name ?? string.Empty; + Direction dir = Direction.None; + switch (name) + { + case "buttonUp": + dir = Direction.Up; + break; + case "buttonDown": + dir = Direction.Down; + break; + case "buttonLeft": + dir = Direction.Left; + break; + case "buttonRight": + dir = Direction.Right; + break; + } + pictureBox.Image = _mapLocomotivesCollectionGeneric.MoveObject(dir); + } + } +} diff --git a/ProjectLocomotive/ProjectLocomotive/FormMap.resx b/ProjectLocomotive/ProjectLocomotive/FormMapWithSetLocomotives.resx similarity index 93% rename from ProjectLocomotive/ProjectLocomotive/FormMap.resx rename to ProjectLocomotive/ProjectLocomotive/FormMapWithSetLocomotives.resx index 2c0949d..f298a7b 100644 --- a/ProjectLocomotive/ProjectLocomotive/FormMap.resx +++ b/ProjectLocomotive/ProjectLocomotive/FormMapWithSetLocomotives.resx @@ -57,7 +57,4 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 17, 17 - \ No newline at end of file diff --git a/ProjectLocomotive/ProjectLocomotive/MapWithSetLocomotivesGeneric.cs b/ProjectLocomotive/ProjectLocomotive/MapWithSetLocomotivesGeneric.cs index 5cb3fa5..09e40b0 100644 --- a/ProjectLocomotive/ProjectLocomotive/MapWithSetLocomotivesGeneric.cs +++ b/ProjectLocomotive/ProjectLocomotive/MapWithSetLocomotivesGeneric.cs @@ -33,12 +33,12 @@ namespace ProjectLocomotive _map = map; } /// Перегрузка оператора сложения - public static bool operator +(MapWithSetLocomotivesGeneric map, T locomotive) + public static int operator +(MapWithSetLocomotivesGeneric map, T locomotive) { return map._setLocomotives.Insert(locomotive); } /// Перегрузка оператора вычитания - public static bool operator -(MapWithSetLocomotivesGeneric map, int position) + public static T operator -(MapWithSetLocomotivesGeneric map, int position) { return map._setLocomotives.Remove(position); } @@ -102,16 +102,50 @@ namespace ProjectLocomotive /// Метод отрисовки фона private void DrawBackground(Graphics g) { - Pen pen = new(Color.Black, 3); - for (int i = 0; i < _pictureWidth / _placeSizeWidth; i++) + //Pen pen = new(Color.Black, 3); + //for (int i = 0; i < _pictureWidth / _placeSizeWidth; i++) + //{ + // for (int j = 0; j < _pictureHeight / _placeSizeHeight + 1; ++j) + // { //линия рамзетки места + // g.DrawLine(pen, i * _placeSizeWidth, j * _placeSizeHeight, i * + // _placeSizeWidth + _placeSizeWidth / 2, j * _placeSizeHeight); + // } + // g.DrawLine(pen, i * _placeSizeWidth, 0, i * _placeSizeWidth, + // (_pictureHeight / _placeSizeHeight) * _placeSizeHeight); + //} + Pen pen; + + for (int j = _placeSizeHeight; j < _pictureHeight; j += _placeSizeHeight) { - for (int j = 0; j < _pictureHeight / _placeSizeHeight + 1; ++j) - { //линия рамзетки места - g.DrawLine(pen, i * _placeSizeWidth, j * _placeSizeHeight, i * - _placeSizeWidth + _placeSizeWidth / 2, j * _placeSizeHeight); + //нижняя линия рельс + pen = new(Color.Black, 5); + + g.DrawLine(pen, 0, j, _pictureWidth, j); + for (int i = 0; i < _pictureWidth; i += 20) + { + g.DrawLine(pen, i, j, i, j + 10); + } + g.DrawLine(pen, 0, j + 10, _pictureWidth, j + 10); + + //верхняя линия рельс + + pen = new(Color.DarkGray, 4); + + g.DrawLine(pen, 0, j - 20, _pictureWidth, j - 20); + for (int i = 0; i < _pictureWidth; i += 20) + { + g.DrawLine(pen, i, j - 20, i, j - 10); + } + g.DrawLine(pen, 0, j - 10, _pictureWidth, j - 10); + + //фонари + for (int i = _placeSizeWidth; i < _pictureWidth; i += _placeSizeWidth) + { + pen = new(Color.Black, 10); + g.DrawLine(pen, i, j - _placeSizeHeight + 20, i, j); + pen = new(Color.Yellow, 20); + g.DrawLine(pen, i, j - _placeSizeHeight + 18, i, j - _placeSizeHeight + 38); } - g.DrawLine(pen, i * _placeSizeWidth, 0, i * _placeSizeWidth, - (_pictureHeight / _placeSizeHeight) * _placeSizeHeight); } } /// Метод прорисовки объектов @@ -126,13 +160,14 @@ namespace ProjectLocomotive for (int i = 0; i < _setLocomotives.Count; i++) { // установка позиции - _setLocomotives.Get(i)?.SetObject(curWidth * _placeSizeWidth, curHeight * _placeSizeHeight, _pictureWidth, _pictureHeight); + //_setLocomotives.Get(i)?.SetObject(curWidth * _placeSizeWidth, curHeight * _placeSizeHeight, _pictureWidth, _pictureHeight); + _setLocomotives.Get(i)?.SetObject(curWidth * _placeSizeWidth + 10, curHeight * _placeSizeHeight + 470, _pictureWidth, _pictureHeight); _setLocomotives.Get(i)?.DrawningObject(g); if (curWidth < width) curWidth++; else { curWidth = 0; - curHeight++; + curHeight--; } } } diff --git a/ProjectLocomotive/ProjectLocomotive/Program.cs b/ProjectLocomotive/ProjectLocomotive/Program.cs index 76a287d..e256676 100644 --- a/ProjectLocomotive/ProjectLocomotive/Program.cs +++ b/ProjectLocomotive/ProjectLocomotive/Program.cs @@ -11,7 +11,7 @@ namespace ProjectLocomotive // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new FormMap()); + Application.Run(new FormMapWithSetLocomotives()); } } } \ No newline at end of file diff --git a/ProjectLocomotive/ProjectLocomotive/RailroadMap.cs b/ProjectLocomotive/ProjectLocomotive/RailroadMap.cs new file mode 100644 index 0000000..c6dd5cf --- /dev/null +++ b/ProjectLocomotive/ProjectLocomotive/RailroadMap.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectLocomotive +{ + internal class RailroadMap : AbstractMap + { + /// Цвет участка закрытого + private readonly Brush barrierColor = new SolidBrush(Color.Black); + /// Цвет участка открытого + private readonly Brush roadColor = new SolidBrush(Color.Gray); + + protected override void DrawBarrierPart(Graphics g, int i, int j) + { + g.FillRectangle(barrierColor, i * _size_x, j * _size_y, i * (_size_x + + 1), j * (_size_y + 1)); + } + + protected override void DrawRoadPart(Graphics g, int i, int j) + { + g.FillRectangle(roadColor, i * _size_x, j * _size_y, i * (_size_x + + 1), j * (_size_y + 1)); + } + + protected override void GenerateMap() + { + _map = new int[100, 100]; + _size_x = (float)_width / _map.GetLength(0); + _size_y = (float)_height / _map.GetLength(1); + int counter = 0; + for (int i = 0; i < _map.GetLength(0); ++i) + { + for (int j = 0; j < _map.GetLength(1); ++j) + { + _map[i, j] = _freeRoad; + } + } + while (counter < 1) + { + int y = _random.Next(0, 95); + + for (int x = 0; x < 99; x++) + { + _map[x, y] = _barrier; + _map[x, y + 5] = _barrier; + + if (x % 5 == 0) + { + _map[x, y + 1] = _barrier; + _map[x, y + 2] = _barrier; + _map[x, y + 3] = _barrier; + _map[x, y + 4] = _barrier; + } + } + counter += 1; + } + } + } +} diff --git a/ProjectLocomotive/ProjectLocomotive/SetLocomotivesGeneric.cs b/ProjectLocomotive/ProjectLocomotive/SetLocomotivesGeneric.cs index 02b94b3..f15e904 100644 --- a/ProjectLocomotive/ProjectLocomotive/SetLocomotivesGeneric.cs +++ b/ProjectLocomotive/ProjectLocomotive/SetLocomotivesGeneric.cs @@ -23,32 +23,36 @@ namespace ProjectLocomotive _places = new T[count]; } /// Добавление объекта в набор - public bool Insert(T locomotive) + public int Insert(T locomotive) { return Insert(locomotive, 0); } /// Добавление объекта в набор на конкретную позицию - public bool Insert(T locomotive, int position) + public int Insert(T locomotive, int position) { - if (position >= _places.Length || position < 0) return false; + if (position >= _places.Length || position < 0) return -1; if (_places[position] == null) { _places[position] = locomotive; - return true; + return position; } int emptyEl = -1; for (int i = position + 1; i < Count; i++) { - if (_places[i] == null) emptyEl = i; - break; + if (_places[i] == null) + { + emptyEl = i; + break; + } + } if (emptyEl == -1) { - return false; + return -1; } for (int i = emptyEl; i > position; i--) @@ -56,14 +60,15 @@ namespace ProjectLocomotive _places[i] = _places[i - 1]; } _places[position] = locomotive; - return true; + return position; } /// Удаление объекта из набора с конкретной позиции - public bool Remove(int position) + public T Remove(int position) { - if (position >= _places.Length || position < 0) return false; + if (position >= _places.Length || position < 0) return null; _places[position] = null; - return true; + T result = _places[position]; + return result; } /// Получение объекта из набора по позиции public T Get(int position) diff --git a/ProjectLocomotive/ProjectLocomotive/SpikeMap.cs b/ProjectLocomotive/ProjectLocomotive/SpikeMap.cs new file mode 100644 index 0000000..b2e9be8 --- /dev/null +++ b/ProjectLocomotive/ProjectLocomotive/SpikeMap.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectLocomotive +{ + internal class SpikeMap : AbstractMap + { + /// Цвет участка закрытого + private readonly Brush barrierColor = new SolidBrush(Color.Black); + /// Цвет участка открытого + private readonly Brush roadColor = new SolidBrush(Color.Gray); + + protected override void DrawBarrierPart(Graphics g, int i, int j) + { + g.FillRectangle(barrierColor, i * _size_x, j * _size_y, i * (_size_x + + 1), j * (_size_y + 1)); + } + + protected override void DrawRoadPart(Graphics g, int i, int j) + { + g.FillRectangle(roadColor, i * _size_x, j * _size_y, i * (_size_x + + 1), j * (_size_y + 1)); + } + + protected override void GenerateMap() + { + _map = new int[100, 100]; + _size_x = (float)_width / _map.GetLength(0); + _size_y = (float)_height / _map.GetLength(1); + int counter = 0; + for (int i = 0; i < _map.GetLength(0); ++i) + { + for (int j = 0; j < _map.GetLength(1); ++j) + { + _map[i, j] = _freeRoad; + } + } + while (counter < 15) + { + int x = _random.Next(1, 99); + int y = _random.Next(1, 99); + if (_map[x, y] == _freeRoad) + { + _map[x, y] = _barrier; + + if (_map[x + 1, y] == _freeRoad) _map[x + 1, y] = _barrier; + if (_map[x - 1, y] == _freeRoad) _map[x - 1, y] = _barrier; + if (_map[x, y + 1] == _freeRoad) _map[x, y + 1] = _barrier; + if (_map[x, y - 1] == _freeRoad) _map[x, y - 1] = _barrier; + + counter++; + } + } + } + } +}