ПИбд-21 Ярускин Салих 8 лаб простая #8

Closed
Salikh wants to merge 6 commits from laba8 into laba7
10 changed files with 278 additions and 70 deletions

View File

@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AirBomber.Generics
{
internal class BomberCollectionInfo : IEquatable<BomberCollectionInfo>
{
public string Name { get; private set; }
public string Description { get; private set; }
public BomberCollectionInfo(string name, string description)
{
Name = name;
Description = description;
}
public bool Equals(BomberCollectionInfo? other)
{
if (other == null || Name == null || other.Name == null) return false;
if (Name == other.Name) return true;
throw new NotImplementedException();
}
public override int GetHashCode()
{
return Name?.GetHashCode() ?? 0;
}
}
}

View File

@ -0,0 +1,40 @@
using AirBomber.DrawningObjects;
using AirBomber.Entities;
using AirBomber.Generics;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AirBomber
{
internal class BomberCompareByColor : IComparer<DrawningBomber?>
{
public int Compare(DrawningBomber? x, DrawningBomber? y)
{
if (x == null || x.EntityBomber == null)
{
throw new ArgumentNullException(nameof(x));
}
if (y == null || y.EntityBomber == null)
{
throw new ArgumentNullException(nameof(y));
}
if (x.EntityBomber.BodyColor != y.EntityBomber.BodyColor)
{
return x.EntityBomber.BodyColor.Name.CompareTo(y.EntityBomber.BodyColor.Name);
}
if (x.GetType() == y.GetType() && x is DrawningAirBomber)
{
return ((EntityAirBomber)x.EntityBomber).DopColor.Name.CompareTo(((EntityAirBomber)y.EntityBomber).DopColor.Name);
}
var speedCompare = x.EntityBomber.Speed.CompareTo(y.EntityBomber.Speed);
if (speedCompare != 0)
{
return speedCompare;
}
return x.EntityBomber.Weight.CompareTo(y.EntityBomber.Weight);
}
}
}

View File

@ -0,0 +1,32 @@
using AirBomber.DrawningObjects;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AirBomber
{
internal class BomberCompareByType : IComparer<DrawningBomber?>
{
public int Compare(DrawningBomber? x, DrawningBomber? y)
{
if (x == null || x.EntityBomber == null)
throw new ArgumentNullException(nameof(x));
if (y == null || y.EntityBomber == null)
throw new ArgumentNullException(nameof(y));
if (x.GetType().Name != y.GetType().Name)
{
return x.GetType().Name.CompareTo(y.GetType().Name);
}
var speedCompare = x.EntityBomber.Speed.CompareTo(y.EntityBomber.Speed);
if (speedCompare != 0)
return speedCompare;
return x.EntityBomber.Weight.CompareTo(y.EntityBomber.Weight);
}
}
}

View File

@ -6,6 +6,7 @@ using System.Threading.Tasks;
using AirBomber.DrawningObjects;
using AirBomber.MovementStrategy;
using ProjectBomber.Generics;
using Microsoft.VisualBasic.Logging;
namespace AirBomber.Generics
@ -24,7 +25,7 @@ namespace AirBomber.Generics
private readonly int _placeSizeWidth = 155;
private readonly int _placeSizeHeight = 185;
private readonly SetGeneric<T> _collection;
public void Sort(IComparer<T?> comparer) => _collection.SortSet(comparer);
public BomberGenericCollection(int picWidth, int picHeight)
{
int width = picWidth / _placeSizeWidth;
@ -34,13 +35,13 @@ namespace AirBomber.Generics
_collection = new SetGeneric<T>(width * height);
}
public static int operator +(BomberGenericCollection<T, U> collect, T? obj)
public static bool operator +(BomberGenericCollection<T, U> collect, T? obj)
{
if (obj == null)
{
return -1;
return false;
}
return collect._collection.Insert(obj);
return collect?._collection.Insert(obj, new DrawningBomberEqutables()) ?? false;
}
public static T? operator -(BomberGenericCollection<T, U> collect, int pos)

View File

@ -11,12 +11,12 @@ namespace AirBomber.Generics
{
internal class BomberGenericStorage
{
readonly Dictionary<string, BomberGenericCollection<DrawningBomber, DrawningObjectBomber>> _bomberStorage;
readonly Dictionary<BomberCollectionInfo, BomberGenericCollection<DrawningBomber, DrawningObjectBomber>> _bomberStorage;
/// <summary>
/// Возвращение списка названий наборов
/// </summary>
public List<string> Keys => _bomberStorage.Keys.ToList();
public List<BomberCollectionInfo> Keys => _bomberStorage.Keys.ToList();
/// <summary>
/// Ширина окна отрисовки
/// </summary>
@ -44,36 +44,37 @@ namespace AirBomber.Generics
/// <param name="pictureHeight"></param>
public BomberGenericStorage(int pictureWidth, int pictureHeight)
{
_bomberStorage = new Dictionary<string, BomberGenericCollection<DrawningBomber, DrawningObjectBomber>>();
_bomberStorage = new Dictionary<BomberCollectionInfo, BomberGenericCollection<DrawningBomber, DrawningObjectBomber>>();
_pictureWidth = pictureWidth;
_pictureHeight = pictureHeight;
}
public void AddSet(string name)
{
// TODO Прописать логику для добавления
if (!_bomberStorage.ContainsKey(name))
if (!_bomberStorage.ContainsKey(new BomberCollectionInfo(name, string.Empty)))
{
var bomberCollection = new BomberGenericCollection<DrawningBomber, DrawningObjectBomber>(_pictureWidth, _pictureHeight);
_bomberStorage.Add(name, bomberCollection);
_bomberStorage.Add(new BomberCollectionInfo(name, string.Empty), bomberCollection);
}
}
public void DelSet(string name)
{
// TODO Прописать логику для удаления
if (_bomberStorage.ContainsKey(name))
if (_bomberStorage.ContainsKey(new BomberCollectionInfo(name, string.Empty)))
{
_bomberStorage.Remove(name);
_bomberStorage.Remove(new BomberCollectionInfo(name, string.Empty));
}
}
public BomberGenericCollection<DrawningBomber, DrawningObjectBomber>? this[string ind]
{
get
{
BomberCollectionInfo indObj = new BomberCollectionInfo(ind, string.Empty);
// TODO Продумать логику получения набора
if (_bomberStorage.ContainsKey(ind))
if (_bomberStorage.ContainsKey(indObj))
{
return _bomberStorage[ind];
return _bomberStorage[indObj];
}
return null;
}
@ -85,14 +86,14 @@ namespace AirBomber.Generics
File.Delete(filename);
}
StringBuilder data = new();
foreach (KeyValuePair<string, BomberGenericCollection<DrawningBomber, DrawningObjectBomber>> record in _bomberStorage)
foreach (KeyValuePair<BomberCollectionInfo, BomberGenericCollection<DrawningBomber, DrawningObjectBomber>> record in _bomberStorage)
{
StringBuilder records = new();
foreach (DrawningBomber? elem in record.Value.GetPlane)
{
records.Append($"{elem?.GetDataForSave(_separatorForObject)}{_separatorRecords}");
}
data.AppendLine($"{record.Key}{_separatorForKeyValue}{records}");
data.AppendLine($"{record.Key.Name}{_separatorForKeyValue}{records}");
}
if (data.Length == 0)
{
@ -162,7 +163,7 @@ namespace AirBomber.Generics
}
}
_bomberStorage.Add(name, collection);
_bomberStorage.Add(new BomberCollectionInfo(name, string.Empty), collection);
}
}
}

View File

@ -52,13 +52,13 @@ namespace AirBomber.DrawningObjects
}
public void SetPosition(int x, int y)
{
if (_startPosX + _PlaneWidth > _pictureWidth)
if (x < 0 || x + _PlaneWidth > _pictureWidth)
{
_startPosX = _pictureWidth - _PlaneWidth;
x = _pictureWidth - _PlaneWidth;
}
if (_startPosY + _PlaneHeight > 740)
if (y < 0 || y + _PlaneWidth > _pictureHeight)
{
_startPosY = 740 - _PlaneHeight;
y = _pictureHeight - _PlaneWidth;
}
_startPosX = x;
_startPosY = y;

View File

@ -0,0 +1,59 @@
using AirBomber.DrawningObjects;
using AirBomber.Entities;
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AirBomber
{
internal class DrawningBomberEqutables : IEqualityComparer<DrawningBomber?>
{
public bool Equals(DrawningBomber? x, DrawningBomber? y)
{
if (x == null || x.EntityBomber == null)
{
throw new ArgumentNullException(nameof(x));
}
if (y == null || y.EntityBomber == null)
{
throw new ArgumentNullException(nameof(y));
}
if (x.GetType().Name != y.GetType().Name)
{
return false;
}
if (x.EntityBomber.Speed != y.EntityBomber.Speed)
{
return false;
}
if (x.EntityBomber.Weight != y.EntityBomber.Weight)
{
return false;
}
if (x.EntityBomber.BodyColor != y.EntityBomber.BodyColor)
{
return false;
}
if (x is EntityAirBomber && y is EntityAirBomber)
{
EntityAirBomber EntityX = (EntityAirBomber)x.EntityBomber;
EntityAirBomber EntityY = (EntityAirBomber)y.EntityBomber;
if (EntityX.DopColor != EntityY.DopColor)
return false;
if (EntityX.Toplivo != EntityY.Toplivo)
return false;
if (EntityX.Rocket != EntityY.Rocket)
return false;
}
return true;
}
public int GetHashCode([DisallowNull] DrawningBomber obj)
{
return obj.GetHashCode();
}
}
}

View File

@ -29,6 +29,8 @@
private void InitializeComponent()
{
Tools = new GroupBox();
ButtonSortByColor = new Button();
ButtonSortByType = new Button();
Kit = new GroupBox();
RemoveKit = new Button();
AddKit = new Button();
@ -53,41 +55,58 @@
//
// Tools
//
Tools.Controls.Add(ButtonSortByColor);
Tools.Controls.Add(ButtonSortByType);
Tools.Controls.Add(Kit);
Tools.Controls.Add(ButtonRefreshCollection);
Tools.Controls.Add(ButtonRemoveBomber);
Tools.Controls.Add(ButtonAddBomber);
Tools.Controls.Add(MessageBoxBomber);
Tools.Location = new Point(471, 4);
Tools.Margin = new Padding(3, 2, 3, 2);
Tools.Location = new Point(538, 5);
Tools.Name = "Tools";
Tools.Padding = new Padding(3, 2, 3, 2);
Tools.Size = new Size(219, 417);
Tools.Size = new Size(250, 595);
Tools.TabIndex = 0;
Tools.TabStop = false;
Tools.Text = "Инструменты";
//
// ButtonSortByColor
//
ButtonSortByColor.Location = new Point(28, 372);
ButtonSortByColor.Name = "ButtonSortByColor";
ButtonSortByColor.Size = new Size(192, 37);
ButtonSortByColor.TabIndex = 6;
ButtonSortByColor.Text = "Сортировка по цвету";
ButtonSortByColor.UseVisualStyleBackColor = true;
ButtonSortByColor.Click += ButtonSortByColor_Click;
//
// ButtonSortByType
//
ButtonSortByType.Location = new Point(29, 329);
ButtonSortByType.Name = "ButtonSortByType";
ButtonSortByType.Size = new Size(192, 37);
ButtonSortByType.TabIndex = 5;
ButtonSortByType.Text = "Сортировка по типу";
ButtonSortByType.UseVisualStyleBackColor = true;
ButtonSortByType.Click += ButtonSortByType_Click;
//
// Kit
//
Kit.Controls.Add(RemoveKit);
Kit.Controls.Add(AddKit);
Kit.Controls.Add(KitTextbox);
Kit.Controls.Add(listBoxStorages);
Kit.Location = new Point(15, 25);
Kit.Margin = new Padding(3, 2, 3, 2);
Kit.Location = new Point(17, 33);
Kit.Name = "Kit";
Kit.Padding = new Padding(3, 2, 3, 2);
Kit.Size = new Size(199, 212);
Kit.Size = new Size(227, 283);
Kit.TabIndex = 4;
Kit.TabStop = false;
Kit.Text = "Наборы";
//
// RemoveKit
//
RemoveKit.Location = new Point(10, 173);
RemoveKit.Margin = new Padding(3, 2, 3, 2);
RemoveKit.Location = new Point(11, 231);
RemoveKit.Name = "RemoveKit";
RemoveKit.Size = new Size(169, 27);
RemoveKit.Size = new Size(193, 36);
RemoveKit.TabIndex = 3;
RemoveKit.Text = "Удалить набор";
RemoveKit.UseVisualStyleBackColor = true;
@ -95,10 +114,9 @@
//
// AddKit
//
AddKit.Location = new Point(10, 47);
AddKit.Margin = new Padding(3, 2, 3, 2);
AddKit.Location = new Point(11, 63);
AddKit.Name = "AddKit";
AddKit.Size = new Size(169, 27);
AddKit.Size = new Size(193, 36);
AddKit.TabIndex = 2;
AddKit.Text = "Добавить набор";
AddKit.UseVisualStyleBackColor = true;
@ -106,29 +124,26 @@
//
// KitTextbox
//
KitTextbox.Location = new Point(13, 22);
KitTextbox.Margin = new Padding(3, 2, 3, 2);
KitTextbox.Location = new Point(15, 29);
KitTextbox.Name = "KitTextbox";
KitTextbox.Size = new Size(166, 23);
KitTextbox.Size = new Size(189, 27);
KitTextbox.TabIndex = 1;
//
// listBoxStorages
//
listBoxStorages.FormattingEnabled = true;
listBoxStorages.ItemHeight = 15;
listBoxStorages.Location = new Point(10, 82);
listBoxStorages.Margin = new Padding(3, 2, 3, 2);
listBoxStorages.ItemHeight = 20;
listBoxStorages.Location = new Point(11, 109);
listBoxStorages.Name = "listBoxStorages";
listBoxStorages.Size = new Size(169, 79);
listBoxStorages.Size = new Size(193, 104);
listBoxStorages.TabIndex = 0;
listBoxStorages.SelectedIndexChanged += ListBoxObjects_SelectedIndexChanged;
//
// ButtonRefreshCollection
//
ButtonRefreshCollection.Location = new Point(24, 336);
ButtonRefreshCollection.Margin = new Padding(3, 2, 3, 2);
ButtonRefreshCollection.Location = new Point(27, 545);
ButtonRefreshCollection.Name = "ButtonRefreshCollection";
ButtonRefreshCollection.Size = new Size(169, 28);
ButtonRefreshCollection.Size = new Size(193, 37);
ButtonRefreshCollection.TabIndex = 3;
ButtonRefreshCollection.Text = "Обновить коллекцию";
ButtonRefreshCollection.UseVisualStyleBackColor = true;
@ -136,10 +151,9 @@
//
// ButtonRemoveBomber
//
ButtonRemoveBomber.Location = new Point(24, 301);
ButtonRemoveBomber.Margin = new Padding(3, 2, 3, 2);
ButtonRemoveBomber.Location = new Point(27, 498);
ButtonRemoveBomber.Name = "ButtonRemoveBomber";
ButtonRemoveBomber.Size = new Size(169, 31);
ButtonRemoveBomber.Size = new Size(193, 41);
ButtonRemoveBomber.TabIndex = 2;
ButtonRemoveBomber.Text = "Удалить самолёт";
ButtonRemoveBomber.UseVisualStyleBackColor = true;
@ -147,10 +161,9 @@
//
// ButtonAddBomber
//
ButtonAddBomber.Location = new Point(24, 241);
ButtonAddBomber.Margin = new Padding(3, 2, 3, 2);
ButtonAddBomber.Location = new Point(27, 418);
ButtonAddBomber.Name = "ButtonAddBomber";
ButtonAddBomber.Size = new Size(169, 31);
ButtonAddBomber.Size = new Size(193, 41);
ButtonAddBomber.TabIndex = 1;
ButtonAddBomber.Text = "Добавить самолёт";
ButtonAddBomber.UseVisualStyleBackColor = true;
@ -158,18 +171,16 @@
//
// MessageBoxBomber
//
MessageBoxBomber.Location = new Point(24, 276);
MessageBoxBomber.Margin = new Padding(3, 2, 3, 2);
MessageBoxBomber.Location = new Point(27, 465);
MessageBoxBomber.Name = "MessageBoxBomber";
MessageBoxBomber.Size = new Size(169, 23);
MessageBoxBomber.Size = new Size(193, 27);
MessageBoxBomber.TabIndex = 0;
//
// PicBoxBomberCollection
//
PicBoxBomberCollection.Location = new Point(7, 28);
PicBoxBomberCollection.Margin = new Padding(3, 2, 3, 2);
PicBoxBomberCollection.Location = new Point(8, 37);
PicBoxBomberCollection.Name = "PicBoxBomberCollection";
PicBoxBomberCollection.Size = new Size(473, 422);
PicBoxBomberCollection.Size = new Size(478, 563);
PicBoxBomberCollection.TabIndex = 1;
PicBoxBomberCollection.TabStop = false;
//
@ -179,8 +190,8 @@
menuStrip.Items.AddRange(new ToolStripItem[] { fileToolStripMenuItem });
menuStrip.Location = new Point(0, 0);
menuStrip.Name = "menuStrip";
menuStrip.Padding = new Padding(5, 2, 0, 2);
menuStrip.Size = new Size(700, 24);
menuStrip.Padding = new Padding(6, 3, 0, 3);
menuStrip.Size = new Size(800, 30);
menuStrip.TabIndex = 2;
menuStrip.Text = "Файл";
//
@ -188,20 +199,20 @@
//
fileToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { SaveToolStripMenuItem, LoadToolStripMenuItem });
fileToolStripMenuItem.Name = "fileToolStripMenuItem";
fileToolStripMenuItem.Size = new Size(48, 20);
fileToolStripMenuItem.Size = new Size(59, 24);
fileToolStripMenuItem.Text = "Файл";
//
// SaveToolStripMenuItem
//
SaveToolStripMenuItem.Name = "SaveToolStripMenuItem";
SaveToolStripMenuItem.Size = new Size(141, 22);
SaveToolStripMenuItem.Size = new Size(177, 26);
SaveToolStripMenuItem.Text = "Сохранение";
SaveToolStripMenuItem.Click += SaveToolStripMenuItem_Click;
//
// LoadToolStripMenuItem
//
LoadToolStripMenuItem.Name = "LoadToolStripMenuItem";
LoadToolStripMenuItem.Size = new Size(141, 22);
LoadToolStripMenuItem.Size = new Size(177, 26);
LoadToolStripMenuItem.Text = "Загрузка";
LoadToolStripMenuItem.Click += LoadToolStripMenuItem_Click;
//
@ -217,14 +228,13 @@
//
// FormBomberCollection
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(700, 467);
ClientSize = new Size(800, 623);
Controls.Add(PicBoxBomberCollection);
Controls.Add(Tools);
Controls.Add(menuStrip);
MainMenuStrip = menuStrip;
Margin = new Padding(3, 2, 3, 2);
Name = "FormBomberCollection";
Text = "FormBomberCollection";
Tools.ResumeLayout(false);
@ -257,5 +267,7 @@
private ToolStripMenuItem LoadToolStripMenuItem;
private OpenFileDialog openFileDialog;
private OpenFileDialog saveFileDialog;
private Button ButtonSortByColor;
private Button ButtonSortByType;
}
}

View File

@ -35,7 +35,7 @@ namespace AirBomber
listBoxStorages.Items.Clear();
for (int i = 0; i < _bomber.Keys.Count; i++)
{
listBoxStorages.Items.Add(_bomber.Keys[i]);
listBoxStorages.Items.Add(_bomber.Keys[i].Name);
}
if (listBoxStorages.Items.Count > 0 && (index == -1 || index
>= listBoxStorages.Items.Count))
@ -80,6 +80,11 @@ namespace AirBomber
PicBoxBomberCollection.Image = obj.ShowBomber();
_logger.LogInformation($"Добавлен объект в набор {listBoxStorages.SelectedItem.ToString()}");
}
catch (ArgumentException ex)
{
MessageBox.Show("Такой объект уже существует");
_logger.LogWarning($"{ex.Message} в наборе {listBoxStorages.SelectedItem.ToString()}");
}
catch (Exception ex)
{
MessageBox.Show("Не удалось добавить объект");
@ -209,5 +214,25 @@ namespace AirBomber
}
}
}
private void ButtonSortByType_Click(object sender, EventArgs e) => CompareBombers(new BomberCompareByType());
private void ButtonSortByColor_Click(object sender, EventArgs e) => CompareBombers(new BomberCompareByColor());
private void CompareBombers(IComparer<DrawningBomber?> comparer)
{
if (listBoxStorages.SelectedIndex == -1)
{
return;
}
var obj = _bomber[listBoxStorages.SelectedItem.ToString() ??
string.Empty];
if (obj == null)
{
return;
}
obj.Sort(comparer);
PicBoxBomberCollection.Image = obj.ShowBomber();
}
}
}

View File

@ -36,14 +36,17 @@ namespace ProjectBomber.Generics
_maxCount = count;
_places = new List<T?>(count);
}
public void SortSet(IComparer<T?> comparer) => _places.Sort(comparer);
/// <summary>
/// Добавление объекта в набор
/// </summary>
/// <param name="plane">Добавляемая установка</param>
/// <returns></returns>
public int Insert(T plane)
public bool Insert(T plane, IEqualityComparer<T>? equal = null)
{
return Insert(plane, 0);
Insert(plane, 0, equal);
return true;
}
/// <summary>
/// Добавление объекта в набор на конкретную позицию
@ -51,15 +54,20 @@ namespace ProjectBomber.Generics
/// <param name="plane">Добавляемая установка</param>
/// <param name="position">Позиция</param>
/// <returns></returns>
public int Insert(T plane, int position)
public bool Insert(T plane, int position, IEqualityComparer<T>? equal = null)
{
if (position < 0 || position >= _maxCount)
throw new BomberNotFoundException(position);
if (Count >= _maxCount)
throw new StorageOverflowException(position);
_places.Insert(0, plane);
return position;
if (equal != null)
{
if (_places.Contains(plane, equal))
throw new ArgumentException(nameof(plane));
}
_places.Insert(position, plane);
return true;
}
/// <summary>
/// Удаление объекта из набора с конкретной позиции