diff --git a/AirBomber/AirBomber/AbstractMap.cs b/AirBomber/AirBomber/AbstractMap.cs index 09a11d9..222f669 100644 --- a/AirBomber/AirBomber/AbstractMap.cs +++ b/AirBomber/AirBomber/AbstractMap.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace AirBomber { - internal abstract class AbstractMap + internal abstract class AbstractMap : IEquatable { private IDrawningObject _drawningObject = null; @@ -122,5 +122,27 @@ namespace AirBomber protected abstract void GenerateMap(); protected abstract void DrawRoadPart(Graphics g, int i, int j); protected abstract void DrawBarrierPart(Graphics g, int i, int j); + + public bool Equals(AbstractMap? other) + { + if (other == null || _map != other._map || _width != other._width + || _size_x != other._size_x || _size_y != other._size_y || _height != other._height + || GetType() != other.GetType() || _map.GetLength(0) != other._map.GetLength(0) + || _map.GetLength(1) != other._map.GetLength(1)) + { + return false; + } + for (int i = 0; i < _map.GetLength(0); ++i) + { + for (int j = 0; j < _map.GetLength(1); ++j) + { + if (_map[i,j] != other._map[i,j]) + { + return false; + } + } + } + return true; + } } } diff --git a/AirBomber/AirBomber/AirBomberCompareByColor.cs b/AirBomber/AirBomber/AirBomberCompareByColor.cs new file mode 100644 index 0000000..9b118fe --- /dev/null +++ b/AirBomber/AirBomber/AirBomberCompareByColor.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AirBomber +{ + internal class AirBomberCompareByColor : IComparer + { + public int Compare(IDrawningObject? x, IDrawningObject? y) + { + if (x == null && y == null) + { + return 0; + } + if (x == null && y != null) + { + return 1; + } + if (x != null && y == null) + { + return -1; + } + var xAirBomber = x as DrawningObjectBomber; + var yAirBomber = y as DrawningObjectBomber; + if (xAirBomber == null && yAirBomber == null) + { + return 0; + } + if (xAirBomber == null && yAirBomber != null) + { + return 1; + } + if (xAirBomber != null && yAirBomber == null) + { + return -1; + } + string xAirBomberColor = xAirBomber.GetBomber.AirBomber.BodyColor.Name; + string yAirBomberColor = yAirBomber.GetBomber.AirBomber.BodyColor.Name; + if (xAirBomberColor != yAirBomberColor) + { + return xAirBomberColor.CompareTo(yAirBomberColor); + } + if (xAirBomber.GetBomber.AirBomber is EntityWarplane xWarplane && yAirBomber.GetBomber.AirBomber is EntityWarplane yWarplane) + { + string xWarplaneDopColor = xWarplane.DopColor.Name; + string yWarplaneDopColor = yWarplane.DopColor.Name; + var dopColorCompare = xWarplaneDopColor.CompareTo(yWarplaneDopColor); + if (dopColorCompare != 0) + { + return dopColorCompare; + } + } + var speedCompare = xAirBomber.GetBomber.AirBomber.Speed.CompareTo(yAirBomber.GetBomber.AirBomber.Speed); + if (speedCompare != 0) + { + return speedCompare; + } + return xAirBomber.GetBomber.AirBomber.Weight.CompareTo(yAirBomber.GetBomber.AirBomber.Weight); + } + } +} diff --git a/AirBomber/AirBomber/AirBomberCompareByType.cs b/AirBomber/AirBomber/AirBomberCompareByType.cs new file mode 100644 index 0000000..96825ab --- /dev/null +++ b/AirBomber/AirBomber/AirBomberCompareByType.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AirBomber +{ + internal class AirBomberCompareByType : IComparer + { + public int Compare(IDrawningObject? x, IDrawningObject? y) + { + if (x == null && y == null) + { + return 0; + } + if (x == null && y != null) + { + return 1; + } + if (x != null && y == null) + { + return -1; + } + var xAirBomber = x as DrawningObjectBomber; + var yAirBomber = y as DrawningObjectBomber; + if (xAirBomber == null && yAirBomber == null) + { + return 0; + } + if (xAirBomber == null && yAirBomber != null) + { + return 1; + } + if (xAirBomber != null && yAirBomber == null) + { + return -1; + } + if (xAirBomber.GetBomber.GetType().Name != yAirBomber.GetBomber.GetType().Name) + { + if (xAirBomber.GetBomber.GetType().Name == "DrawningBomber") + { + return -1; + } + } + var speedCompare = xAirBomber.GetBomber.AirBomber.Speed.CompareTo(yAirBomber.GetBomber.AirBomber.Speed); + if (speedCompare != 0) + { + return speedCompare; + } + return xAirBomber.GetBomber.AirBomber.Weight.CompareTo(yAirBomber.GetBomber.AirBomber.Weight); + } + } +} diff --git a/AirBomber/AirBomber/DrawningObjectBomber.cs b/AirBomber/AirBomber/DrawningObjectBomber.cs index b49ee71..e72e856 100644 --- a/AirBomber/AirBomber/DrawningObjectBomber.cs +++ b/AirBomber/AirBomber/DrawningObjectBomber.cs @@ -17,6 +17,8 @@ namespace AirBomber public float Step => _airBomber?.AirBomber?.Step ?? 0; + public DrawningBomber GetBomber => _airBomber; + public (float Left, float Right, float Top, float Bottom) GetCurrentPosition() { return _airBomber?.GetCurrentPosition() ?? default; @@ -40,5 +42,55 @@ namespace AirBomber public string GetInfo() => _airBomber?.GetDataForSave(); public static IDrawningObject Create(string data) => new DrawningObjectBomber(data.CreateDrawningAirBomber()); + + public bool Equals(IDrawningObject? other) + { + if (other == null) + { + return false; + } + var otherBomber = other as DrawningObjectBomber; + if (otherBomber == null) + { + return false; + } + var airBomber = _airBomber.AirBomber; + var otherBomberBomber = otherBomber._airBomber.AirBomber; + if (airBomber.Speed != otherBomberBomber.Speed) + { + return false; + } + if (airBomber.Weight != otherBomberBomber.Weight) + { + return false; + } + if (airBomber.BodyColor != otherBomberBomber.BodyColor) + { + return false; + } + + if ((airBomber is EntityWarplane) && !(otherBomberBomber is EntityWarplane) + || !(airBomber is EntityWarplane) && (otherBomberBomber is EntityWarplane)) + { + return false; + } + + if (airBomber is EntityWarplane warplane && otherBomberBomber is EntityWarplane otherWarplane) + { + if (warplane.DopColor != otherWarplane.DopColor) + { + return false; + } + if (warplane.Weapons != otherWarplane.Weapons) + { + return false; + } + if (warplane.Engines != otherWarplane.Engines) + { + return false; + } + } + return true; + } } } diff --git a/AirBomber/AirBomber/FormMapWithSetAirBomber.Designer.cs b/AirBomber/AirBomber/FormMapWithSetAirBomber.Designer.cs index 27df940..df9834b 100644 --- a/AirBomber/AirBomber/FormMapWithSetAirBomber.Designer.cs +++ b/AirBomber/AirBomber/FormMapWithSetAirBomber.Designer.cs @@ -51,6 +51,8 @@ this.LoadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.openFileDialog = new System.Windows.Forms.OpenFileDialog(); this.saveFileDialog = new System.Windows.Forms.SaveFileDialog(); + this.ButtonSortByType = new System.Windows.Forms.Button(); + this.ButtonSortByColor = new System.Windows.Forms.Button(); this.groupBox1.SuspendLayout(); this.groupBoxMaps.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit(); @@ -59,6 +61,8 @@ // // groupBox1 // + this.groupBox1.Controls.Add(this.ButtonSortByColor); + this.groupBox1.Controls.Add(this.ButtonSortByType); this.groupBox1.Controls.Add(this.groupBoxMaps); this.groupBox1.Controls.Add(this.buttonRight); this.groupBox1.Controls.Add(this.buttonDown); @@ -86,7 +90,7 @@ this.groupBoxMaps.Controls.Add(this.comboBoxSelectorMap); this.groupBoxMaps.Location = new System.Drawing.Point(22, 32); this.groupBoxMaps.Name = "groupBoxMaps"; - this.groupBoxMaps.Size = new System.Drawing.Size(150, 326); + this.groupBoxMaps.Size = new System.Drawing.Size(150, 297); this.groupBoxMaps.TabIndex = 11; this.groupBoxMaps.TabStop = false; this.groupBoxMaps.Text = "Карты"; @@ -103,7 +107,7 @@ // // buttonDeleteMap // - this.buttonDeleteMap.Location = new System.Drawing.Point(0, 273); + this.buttonDeleteMap.Location = new System.Drawing.Point(0, 255); this.buttonDeleteMap.Name = "buttonDeleteMap"; this.buttonDeleteMap.Size = new System.Drawing.Size(150, 34); this.buttonDeleteMap.TabIndex = 4; @@ -267,14 +271,14 @@ // SaveToolStripMenuItem // this.SaveToolStripMenuItem.Name = "SaveToolStripMenuItem"; - this.SaveToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.SaveToolStripMenuItem.Size = new System.Drawing.Size(141, 22); this.SaveToolStripMenuItem.Text = "Сохранение"; this.SaveToolStripMenuItem.Click += new System.EventHandler(this.SaveToolStripMenuItem_Click); // // LoadToolStripMenuItem // this.LoadToolStripMenuItem.Name = "LoadToolStripMenuItem"; - this.LoadToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadToolStripMenuItem.Size = new System.Drawing.Size(141, 22); this.LoadToolStripMenuItem.Text = "Загрузка"; this.LoadToolStripMenuItem.Click += new System.EventHandler(this.LoadToolStripMenuItem_Click); // @@ -287,6 +291,26 @@ // this.saveFileDialog.Filter = "txt file | *.txt"; // + // ButtonSortByType + // + this.ButtonSortByType.Location = new System.Drawing.Point(22, 344); + this.ButtonSortByType.Name = "ButtonSortByType"; + this.ButtonSortByType.Size = new System.Drawing.Size(150, 29); + this.ButtonSortByType.TabIndex = 12; + this.ButtonSortByType.Text = "Сортировать по типу"; + this.ButtonSortByType.UseVisualStyleBackColor = true; + this.ButtonSortByType.Click += new System.EventHandler(this.ButtonSortByType_Click); + // + // ButtonSortByColor + // + this.ButtonSortByColor.Location = new System.Drawing.Point(22, 379); + this.ButtonSortByColor.Name = "ButtonSortByColor"; + this.ButtonSortByColor.Size = new System.Drawing.Size(150, 28); + this.ButtonSortByColor.TabIndex = 13; + this.ButtonSortByColor.Text = "Сортировать по цвету"; + this.ButtonSortByColor.UseVisualStyleBackColor = true; + this.ButtonSortByColor.Click += new System.EventHandler(this.ButtonSortByColor_Click); + // // FormMapWithSetAirBomber // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); @@ -335,5 +359,7 @@ private ToolStripMenuItem LoadToolStripMenuItem; private OpenFileDialog openFileDialog; private SaveFileDialog saveFileDialog; + private Button ButtonSortByColor; + private Button ButtonSortByType; } } \ No newline at end of file diff --git a/AirBomber/AirBomber/FormMapWithSetAirBomber.cs b/AirBomber/AirBomber/FormMapWithSetAirBomber.cs index d014f00..ddb4a3d 100644 --- a/AirBomber/AirBomber/FormMapWithSetAirBomber.cs +++ b/AirBomber/AirBomber/FormMapWithSetAirBomber.cs @@ -12,9 +12,7 @@ using System.Windows.Forms; namespace AirBomber { public partial class FormMapWithSetAirBomber : Form - { - private MapWithSetAirBomberGeneric _mapAirBomberCollectionGeneric; - + { private readonly Dictionary _mapsDict = new() { { "Простая карта", new SimpleMap() }, @@ -261,5 +259,25 @@ namespace AirBomber } } } + + private void ButtonSortByType_Click(object sender, EventArgs e) + { + if (listBoxMaps.SelectedIndex == -1) + { + return; + } + _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].Sort(new AirBomberCompareByType()); + pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); + } + + private void ButtonSortByColor_Click(object sender, EventArgs e) + { + if (listBoxMaps.SelectedIndex == -1) + { + return; + } + _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].Sort(new AirBomberCompareByColor()); + pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); + } } } diff --git a/AirBomber/AirBomber/IDrawningObject.cs b/AirBomber/AirBomber/IDrawningObject.cs index a32cb67..222f745 100644 --- a/AirBomber/AirBomber/IDrawningObject.cs +++ b/AirBomber/AirBomber/IDrawningObject.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace AirBomber { - internal interface IDrawningObject + internal interface IDrawningObject : IEquatable { public float Step { get; } diff --git a/AirBomber/AirBomber/MapWithSetAirBomberGeneric.cs b/AirBomber/AirBomber/MapWithSetAirBomberGeneric.cs index 8e9e2ef..0cfbc9a 100644 --- a/AirBomber/AirBomber/MapWithSetAirBomberGeneric.cs +++ b/AirBomber/AirBomber/MapWithSetAirBomberGeneric.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace AirBomber { internal class MapWithSetAirBomberGeneric - where T : class, IDrawningObject + where T : class, IDrawningObject, IEquatable where U : AbstractMap { private readonly int _pictureWidth; @@ -83,6 +83,11 @@ namespace AirBomber } } + public void Sort(IComparer comparer) + { + _setAirBomber.SortSet(comparer); + } + private void Shaking() { int j = _setAirBomber.Count - 1; diff --git a/AirBomber/AirBomber/SetAirBomberGeneric.cs b/AirBomber/AirBomber/SetAirBomberGeneric.cs index 4cac74d..8be340e 100644 --- a/AirBomber/AirBomber/SetAirBomberGeneric.cs +++ b/AirBomber/AirBomber/SetAirBomberGeneric.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace AirBomber { internal class SetAirBomberGeneric - where T : class + where T : class, IEquatable { private readonly List _places; @@ -28,6 +28,10 @@ namespace AirBomber public int Insert(T airBomber, int position) { + if (_places.Contains(airBomber)) + { + return -1; + } if (_places.Count >= _maxCount) { throw new StorageOverflowException(_maxCount); @@ -87,5 +91,14 @@ namespace AirBomber } } } + + public void SortSet(IComparer comparer) + { + if (comparer == null) + { + return; + } + _places.Sort(comparer); + } } }