This commit is contained in:
DavidMakarov 2023-10-31 21:17:10 +04:00
parent c21d23e3e6
commit 79f59d7743
19 changed files with 298 additions and 160 deletions

View File

@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AirplaneWithRadar.MovementStrategy
namespace AirplaneWithRadar.MovementStrategy
{
public abstract class AbstractStrategy
{

View File

@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AirplaneWithRadar.Entities
namespace AirplaneWithRadar.Entities
{
public class AirplaneEntity
{

View File

@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AirplaneWithRadar.Entities
namespace AirplaneWithRadar.Entities
{
public class AirplaneWithRadarEntity : AirplaneEntity
{

View File

@ -1,9 +1,4 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AirplaneWithRadar.PaintObjects;
using AirplaneWithRadar.PaintObjects;
using AirplaneWithRadar.MovementStrategy;
namespace AirplaneWithRadar.Generics
@ -38,7 +33,7 @@ namespace AirplaneWithRadar.Generics
}
public static bool operator -(AirplanesGenericCollection<T, U> collect, int pos)
{
T? obj = collect.collection.Get(pos);
T? obj = collect.collection[pos];
if (obj == null)
{
return false;
@ -48,7 +43,7 @@ namespace AirplaneWithRadar.Generics
public U? GetU(int pos)
{
return (U?)collection.Get(pos)?.GetMoveableObject;
return (U?)collection[pos]?.GetMoveableObject;
}
public Bitmap ShowAirplanes()
@ -80,9 +75,7 @@ namespace AirplaneWithRadar.Generics
int j = 3;
int k = 0;
for (int i = 0; i < collection.Count; i++)
{
PaintAirplane? airplane = collection.Get(i);
foreach (var airplane in collection.GetAirplanes()) {
if (j < 0)
{
j += 4;

View File

@ -0,0 +1,37 @@
using AirplaneWithRadar.PaintObjects;
using AirplaneWithRadar.MovementStrategy;
namespace AirplaneWithRadar.Generics
{
internal class AirplanesGenericStorage
{
readonly Dictionary<string, AirplanesGenericCollection<PaintAirplane, PaintObjectAirplane>> airplaneStorages;
public List<string> Keys => airplaneStorages.Keys.ToList();
private readonly int pictWidth;
private readonly int pictHeight;
public AirplanesGenericStorage(int pictureWidth, int pictureHeight)
{
airplaneStorages = new Dictionary<string, AirplanesGenericCollection<PaintAirplane, PaintObjectAirplane>>();
pictWidth = pictureWidth;
pictHeight = pictureHeight;
}
public void AddSet(string name)
{
airplaneStorages.Add(name, new AirplanesGenericCollection<PaintAirplane, PaintObjectAirplane>(pictWidth, pictHeight));
}
public void DelSet(string name)
{
airplaneStorages.Remove(name);
}
public AirplanesGenericCollection<PaintAirplane, PaintObjectAirplane>? this[string ind]
{
get
{
if (airplaneStorages.ContainsKey(ind)) return airplaneStorages[ind];
return null;
}
}
}
}

View File

@ -29,17 +29,24 @@
private void InitializeComponent()
{
groupBox1 = new GroupBox();
groupBox2 = new GroupBox();
buttonDelObject = new Button();
buttonAddObject = new Button();
textBoxStorageName = new TextBox();
listBoxStorages = new ListBox();
maskedTextBoxNumber = new TextBox();
ButtonRefreshCollection = new Button();
ButtonDeleteAirplane = new Button();
ButtonAddAirplane = new Button();
pictureBoxCollection = new PictureBox();
groupBox1.SuspendLayout();
groupBox2.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBoxCollection).BeginInit();
SuspendLayout();
//
// groupBox1
//
groupBox1.Controls.Add(groupBox2);
groupBox1.Controls.Add(maskedTextBoxNumber);
groupBox1.Controls.Add(ButtonRefreshCollection);
groupBox1.Controls.Add(ButtonDeleteAirplane);
@ -51,16 +58,66 @@
groupBox1.TabStop = false;
groupBox1.Text = "Инструменты";
//
// groupBox2
//
groupBox2.Controls.Add(buttonDelObject);
groupBox2.Controls.Add(buttonAddObject);
groupBox2.Controls.Add(textBoxStorageName);
groupBox2.Controls.Add(listBoxStorages);
groupBox2.Location = new Point(13, 22);
groupBox2.Name = "groupBox2";
groupBox2.Size = new Size(204, 209);
groupBox2.TabIndex = 5;
groupBox2.TabStop = false;
groupBox2.Text = "Наборы";
//
// buttonDelObject
//
buttonDelObject.Location = new Point(17, 178);
buttonDelObject.Name = "buttonDelObject";
buttonDelObject.Size = new Size(170, 25);
buttonDelObject.TabIndex = 7;
buttonDelObject.Text = "Удалить набор";
buttonDelObject.UseVisualStyleBackColor = true;
buttonDelObject.Click += buttonDelObject_Click;
//
// buttonAddObject
//
buttonAddObject.Location = new Point(17, 51);
buttonAddObject.Name = "buttonAddObject";
buttonAddObject.Size = new Size(170, 23);
buttonAddObject.TabIndex = 6;
buttonAddObject.Text = "Добавить набор";
buttonAddObject.UseVisualStyleBackColor = true;
buttonAddObject.Click += buttonAddObject_Click;
//
// textBoxStorageName
//
textBoxStorageName.Location = new Point(10, 22);
textBoxStorageName.Name = "textBoxStorageName";
textBoxStorageName.Size = new Size(188, 23);
textBoxStorageName.TabIndex = 5;
//
// listBoxStorages
//
listBoxStorages.FormattingEnabled = true;
listBoxStorages.ItemHeight = 15;
listBoxStorages.Location = new Point(10, 93);
listBoxStorages.Name = "listBoxStorages";
listBoxStorages.Size = new Size(188, 79);
listBoxStorages.TabIndex = 4;
listBoxStorages.SelectedIndexChanged += listBoxStorages_SelectedIndexChanged;
//
// maskedTextBoxNumber
//
maskedTextBoxNumber.Location = new Point(39, 148);
maskedTextBoxNumber.Location = new Point(39, 289);
maskedTextBoxNumber.Name = "maskedTextBoxNumber";
maskedTextBoxNumber.Size = new Size(161, 23);
maskedTextBoxNumber.TabIndex = 3;
//
// ButtonRefreshCollection
//
ButtonRefreshCollection.Location = new Point(20, 229);
ButtonRefreshCollection.Location = new Point(20, 370);
ButtonRefreshCollection.Name = "ButtonRefreshCollection";
ButtonRefreshCollection.Size = new Size(194, 46);
ButtonRefreshCollection.TabIndex = 2;
@ -70,7 +127,7 @@
//
// ButtonDeleteAirplane
//
ButtonDeleteAirplane.Location = new Point(20, 177);
ButtonDeleteAirplane.Location = new Point(20, 318);
ButtonDeleteAirplane.Name = "ButtonDeleteAirplane";
ButtonDeleteAirplane.Size = new Size(194, 46);
ButtonDeleteAirplane.TabIndex = 1;
@ -80,7 +137,7 @@
//
// ButtonAddAirplane
//
ButtonAddAirplane.Location = new Point(20, 22);
ButtonAddAirplane.Location = new Point(23, 237);
ButtonAddAirplane.Name = "ButtonAddAirplane";
ButtonAddAirplane.Size = new Size(194, 46);
ButtonAddAirplane.TabIndex = 0;
@ -108,6 +165,8 @@
Text = "FormAirplaneCollection";
groupBox1.ResumeLayout(false);
groupBox1.PerformLayout();
groupBox2.ResumeLayout(false);
groupBox2.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureBoxCollection).EndInit();
ResumeLayout(false);
}
@ -120,5 +179,10 @@
private Button ButtonAddAirplane;
private PictureBox pictureBoxCollection;
private TextBox maskedTextBoxNumber;
private ListBox listBoxStorages;
private GroupBox groupBox2;
private Button buttonDelObject;
private Button buttonAddObject;
private TextBox textBoxStorageName;
}
}

View File

@ -1,69 +1,119 @@
using AirplaneWithRadar.Generics;
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;
using AirplaneWithRadar.PaintObjects;
using AirplaneWithRadar.MovementStrategy;
namespace AirplaneWithRadar
{
public partial class FormAirplaneCollection : Form
{
private readonly AirplanesGenericCollection<PaintAirplane, PaintObjectAirplane> airplanes;
private readonly AirplanesGenericStorage storage;
public FormAirplaneCollection()
{
InitializeComponent();
airplanes = new AirplanesGenericCollection<PaintAirplane, PaintObjectAirplane>(pictureBoxCollection.Width, pictureBoxCollection.Height);
storage = new AirplanesGenericStorage(pictureBoxCollection.Width, pictureBoxCollection.Height);
}
private void ReloadObjects()
{
int index = listBoxStorages.SelectedIndex;
listBoxStorages.Items.Clear();
for (int i = 0; i < storage.Keys.Count; i++)
{
listBoxStorages.Items.Add(storage.Keys[i]);
}
if (listBoxStorages.Items.Count > 0 && (index == -1 || index >= listBoxStorages.Items.Count))
{
listBoxStorages.SelectedIndex = 0;
}
else if (listBoxStorages.Items.Count > 0 && index > -1 && index < listBoxStorages.Items.Count)
{
listBoxStorages.SelectedIndex = index;
}
}
private void buttonAddObject_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBoxStorageName.Text))
{
MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
storage.AddSet(textBoxStorageName.Text);
ReloadObjects();
}
private void buttonDelObject_Click(object sender, EventArgs e)
{
pictureBoxCollection.Image = storage[listBoxStorages.SelectedItem?.ToString() ?? string.Empty]?.ShowAirplanes();
}
private void ButtonAddAirplane_Click(object sender, EventArgs e)
{
if (listBoxStorages.SelectedIndex == -1)
{
return;
}
var obj = storage[listBoxStorages.SelectedItem.ToString() ?? string.Empty];
if (obj == null)
{
return;
}
PlaneVisual form = new();
if (form.ShowDialog() == DialogResult.OK)
{
if (airplanes + form.SelectedAirplane != -1)
if (!(obj + form.SelectedAirplane == -1))
{
MessageBox.Show("Объект добавлен");
pictureBoxCollection.Image = airplanes.ShowAirplanes();
pictureBoxCollection.Image = obj.ShowAirplanes();
}
else
{
MessageBox.Show("Не удалось добавить объект");
}
}
}
private void ButtonDeleteAirplane_Click(object sender, EventArgs e)
{
if (listBoxStorages.SelectedIndex == -1)
{
return;
}
var obj = storage[listBoxStorages.SelectedItem.ToString() ?? string.Empty];
if (obj == null)
{
return;
}
if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
{
return;
}
int pos = Convert.ToInt32(maskedTextBoxNumber.Text);
if (airplanes - pos != false)
if (obj - pos != false)
{
MessageBox.Show("Объект удален");
pictureBoxCollection.Image = airplanes.ShowAirplanes();
pictureBoxCollection.Image = obj.ShowAirplanes();
}
else
{
MessageBox.Show("Не удалось удалить объект");
}
}
private void ButtonRefreshCollection_Click(object sender, EventArgs e)
{
pictureBoxCollection.Image = airplanes.ShowAirplanes();
if (listBoxStorages.SelectedIndex == -1)
{
return;
}
var obj = storage[listBoxStorages.SelectedItem.ToString() ?? string.Empty];
if (obj == null)
{
return;
}
pictureBoxCollection.Image = obj.ShowAirplanes();
}
private void listBoxStorages_SelectedIndexChanged(object sender, EventArgs e)
{
pictureBoxCollection.Image = storage[listBoxStorages.SelectedItem?.ToString() ?? string.Empty]?.ShowAirplanes();
}
}
}

View File

@ -1,4 +1,64 @@
<root>
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing"">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">

View File

@ -1,15 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AirplaneWithRadar
{
internal class GenericClass<T>
where T : AirplaneWithRadar.PaintObjects.PaintAirplaneWithRadar
{
}
}

View File

@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AirplaneWithRadar.MovementStrategy
namespace AirplaneWithRadar.MovementStrategy
{
public interface IMoveableObject
{

View File

@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AirplaneWithRadar.MovementStrategy
namespace AirplaneWithRadar.MovementStrategy
{
public class MoveToBorder : AbstractStrategy
{

View File

@ -1,11 +1,4 @@

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AirplaneWithRadar.MovementStrategy
namespace AirplaneWithRadar.MovementStrategy
{
public class MoveToCenter : AbstractStrategy
{

View File

@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AirplaneWithRadar
namespace AirplaneWithRadar
{
public enum Movement
{

View File

@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AirplaneWithRadar.MovementStrategy
namespace AirplaneWithRadar.MovementStrategy
{
public class ObjectParameters
{

View File

@ -1,9 +1,4 @@
using System;
using System.Collections.Generic;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing.Drawing2D;
using AirplaneWithRadar.Entities;
using AirplaneWithRadar.MovementStrategy;

View File

@ -1,12 +1,4 @@

using System.Collections.Generic;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using AirplaneWithRadar.Entities;
using AirplaneWithRadar.Entities;
namespace AirplaneWithRadar.PaintObjects
{

View File

@ -1,10 +1,4 @@
using AirplaneWithRadar.MovementStrategy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AirplaneWithRadar.PaintObjects;
using AirplaneWithRadar.PaintObjects;
namespace AirplaneWithRadar.MovementStrategy

View File

@ -1,22 +1,24 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AirplaneWithRadar.Generics;
namespace AirplaneWithRadar.Generics;
internal class SetGeneric<T>
where T : class
{
private readonly T?[] places;
public int Count => places.Length;
private readonly List<T?> places;
public int Count => places.Count;
public readonly int maxCount;
public SetGeneric(int count)
{
places = new T?[count];
maxCount = count;
places = new List<T?>(count);
}
public int Insert(T airplane)
{
if (Count == 0)
{
places.Add(airplane);
return 0;
}
int emptyPosition = -1;
for (int i = 0; i < Count; i++)
{
@ -28,15 +30,10 @@ internal class SetGeneric<T>
}
if (emptyPosition < 0)
{
return -1;
places.Add(airplane);
return 0;
}
for (int i = emptyPosition; i > 0; i--)
{
places[i] = places[i - 1];
}
places[0] = airplane;
Insert(airplane, emptyPosition);
return 0;
}
public int Insert(T airplane, int position)
@ -79,15 +76,41 @@ internal class SetGeneric<T>
{
return false;
}
places[position] = null;
places[position]=null;
return true;
}
public T? Get(int position)
public T? this[int position]
{
if (position >= Count && position < 0)
get
{
return null;
if (position >= Count || position < 0)
{
return null;
}
return places[position];
}
set
{
if (position >= Count || position < 0)
{
return;
}
if (Count <= maxCount)
{
Insert(value, position);
}
}
}
public IEnumerable<T?> GetAirplanes(int? maxAirplanes = null)
{
for (int i = 0; i < places.Count; ++i)
{
yield return places[i];
if (maxAirplanes.HasValue && i == maxAirplanes.Value)
{
yield break;
}
}
return places[position];
}
}

View File

@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AirplaneWithRadar.MovementStrategy
namespace AirplaneWithRadar.MovementStrategy
{
public enum Status
{