Compare commits

...

4 Commits

Author SHA1 Message Date
VanyaAlekseev
4beddff8a2 SemesterFirstLabFourthBomberBase 2023-11-02 20:15:56 +04:00
VanyaAlekseev
4b4f3eed79 SemesterFirstLabThirdBomberBase 2023-10-21 15:06:49 +04:00
VanyaAlekseev
35feab6891 SemesterFirstLabSecondBomberBase 2023-10-14 19:05:33 +04:00
VanyaAlekseev
b27e94da30 SemesterFirstLabFirstBomberBase 2023-10-13 22:42:19 +04:00
23 changed files with 2912 additions and 10 deletions

View File

@ -0,0 +1,133 @@
using ProjectBomber.MovementStrategy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectBomber.MovementStrategy
{
/// <summary>
/// Класс-стратегия перемещения объекта
/// </summary>
public abstract class AbstractStrategy
{
/// <summary>
/// Перемещаемый объект
/// </summary>
private IMoveableObject _moveableObject;
/// <summary>
/// Статус перемещения
/// </summary>
private Status _state = Status.NotInit;
/// <summary>
/// Ширина поля
/// </summary>
protected int FieldWidth { get; private set; }
/// <summary>
/// Высота поля
/// </summary>
protected int FieldHeight { get; private set; }
/// <summary>
/// Статус перемещения
/// </summary>
public Status GetStatus() { return _state; }
/// <summary>
/// Установка данных
/// </summary>
/// <param name="moveableObject">Перемещаемый объект</param>
/// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param>
public void SetData(IMoveableObject moveableObject, int width, int height)
{
if (moveableObject == null)
{
_state = Status.NotInit;
return;
}
_state = Status.InProgress;
_moveableObject = moveableObject;
FieldWidth = width;
FieldHeight = height;
}
/// <summary>
/// Шаг перемещения
/// </summary>
public void MakeStep()
{
if (_state != Status.InProgress)
{
return;
}
if (IsTargetDestinaion())
{
_state = Status.Finish;
return;
}
MoveToTarget();
}
/// <summary>
/// Перемещение влево
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false -неудача)</returns>
protected bool MoveLeft() => MoveTo(DirectionType.Left);
/// <summary>
/// Перемещение вправо
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveRight() => MoveTo(DirectionType.Right);
/// <summary>
/// Перемещение вверх
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveUp() => MoveTo(DirectionType.Up);
/// <summary>
/// Перемещение вниз
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveDown() => MoveTo(DirectionType.Down);
/// <summary>
/// Параметры объекта
/// </summary>
protected ObjectParameters GetObjectParameters => _moveableObject?.GetObjectPosition;
/// <summary>
/// Шаг объекта
/// </summary>
/// <returns></returns>
protected int? GetStep()
{
if (_state != Status.InProgress)
{
return null;
}
return _moveableObject?.GetStep;
}
/// <summary>
/// Перемещение к цели
/// </summary>
protected abstract void MoveToTarget();
/// <summary>
/// Достигнута ли цель
/// </summary>
/// <returns></returns>
protected abstract bool IsTargetDestinaion();
/// <summary>
/// Попытка перемещения в требуемом направлении
/// </summary>
/// <param name="directionType">Направление</param>
/// <returns>Результат попытки (true - удалось переместиться, false - неудача)</returns>
private bool MoveTo(DirectionType directionType)
{
if (_state != Status.InProgress)
{
return false;
}
if (_moveableObject?.CheckCanMove(directionType) ?? false)
{
_moveableObject.MoveObject(directionType);
return true;
}
return false;
}
}
}

View File

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectBomber
{
public enum DirectionType
{
/// <summary>
/// Вверх
/// </summary>
Up = 1,
/// <summary>
/// Вниз
/// </summary>
Down = 2,
/// <summary>
/// Влево
/// </summary>
Left = 3,
/// <summary>
/// Вправо
/// </summary>
Right = 4
}
}

View File

@ -0,0 +1,284 @@
using ProjectBomber.Entities;
using ProjectBomber.MovementStrategy;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectBomber.DrawningObjects
{
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawningBomber
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityBomber EntityBomber { get; protected set; }
/// <summary>
/// Ширина окна
/// </summary>
private int _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int _pictureHeight;
/// <summary>
/// Левая координата прорисовки бомбардировщика
/// </summary>
protected int _startPosX;
/// <summary>
/// Верхняя кооридната прорисовки бомбардировщика
/// </summary>
protected int _startPosY;
/// <summary>
/// Ширина прорисовки бомбардировщика
/// </summary>
protected readonly int _bomberWidth = 60;
/// <summary>
/// Высота прорисовки бомбардировщика
/// </summary>
protected readonly int _bomberHeight = 55;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
public DrawningBomber(int speed, double weight, Color bodyColor, int width, int height)
{
_pictureWidth = width;
_pictureHeight = height;
EntityBomber = new EntityBomber(speed, weight, bodyColor);
if ((_bomberWidth >= _pictureWidth) || (_bomberHeight >= _pictureHeight))
{
Console.WriteLine("Проверка не пройдена, нельзя создать объект в этих размерах");
if (_bomberWidth >= _pictureWidth)
{
_bomberWidth = _pictureWidth - _bomberWidth;
}
if (_bomberHeight >= _pictureHeight)
{
_bomberHeight = _pictureHeight - _bomberHeight;
}
}
else
{
Console.WriteLine("Объект создан");
}
}
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
/// <param name="bomberWidth">Ширина прорисовки бомбардировщика</param>
/// <param name="bomberHeight">Высота прорисовки бомбардировщика</param>
protected DrawningBomber(int speed, double weight, Color bodyColor, int width, int height, int bomberWidth, int bomberHeight)
{
_pictureWidth = width;
_pictureHeight = height;
_bomberWidth = bomberWidth;
_bomberHeight = bomberHeight;
EntityBomber = new EntityBomber(speed, weight, bodyColor);
}
/// <summary>
/// Координата X объекта
/// </summary>
public int GetPosX => _startPosX;
/// <summary>
/// Координата Y объекта
/// </summary>
public int GetPosY => _startPosY;
/// <summary>
/// Ширина объекта
/// </summary>
public int GetWidth => _bomberWidth;
/// <summary>
/// Высота объекта
/// </summary>
public int GetHeight => _bomberHeight;
/// <summary>
/// Проверка, что объект может переместится по указанному направлению
/// </summary>
/// <param name="direction">Направление</param>
/// <returns>true - можно переместится по указанному направлению</returns>
public bool CanMove(DirectionType direction)
{
if (EntityBomber == null)
{
return false;
}
if (direction == DirectionType.Left)
{
return _startPosX - EntityBomber.Step > 0;
}
else if (direction == DirectionType.Up)
{
return _startPosY - EntityBomber.Step > 0;
}
else if (direction == DirectionType.Down)
{
return _startPosY + EntityBomber.Step < _pictureHeight;
}
else if (direction == DirectionType.Right)
{
return _startPosX + EntityBomber.Step < _pictureWidth;
}
return false; // Возвращаем false в случае неподдерживаемого направления
}
/// <summary>
/// Установка позиции
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
public void SetPosition(int x, int y)
{
// TODO: Изменение x, y, если при установке объект выходит за границы
_startPosX = x;
_startPosY = y;
// если выходит за границы, возвращаем на форму
if (_startPosX + _bomberWidth > _pictureWidth)
{
_startPosX = _pictureWidth - _bomberWidth;
}
if (_startPosY + _bomberHeight > _pictureHeight)
{
_startPosY = _pictureHeight - _bomberHeight;
}
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
public void MoveTransport(DirectionType direction)
{
if (EntityBomber == null)
{
return;
}
switch (direction)
{
//влево
case DirectionType.Left:
if (_startPosX - EntityBomber.Step > 0)
{
_startPosX -= (int)EntityBomber.Step;
}
break;
//вверх
case DirectionType.Up:
if (_startPosY - EntityBomber.Step > 0)
{
_startPosY -= (int)EntityBomber.Step;
}
break;
// вправо
case DirectionType.Right:
if (_startPosX + EntityBomber.Step > 0)
{
_startPosX += (int)EntityBomber.Step;
}
if (_startPosX + _bomberWidth > _pictureWidth)
{
_startPosX = _pictureWidth - _bomberWidth;
}
break;
//вниз
case DirectionType.Down:
if (_startPosY + EntityBomber.Step > 0)
{
_startPosY += (int)EntityBomber.Step;
}
if (_startPosY + _bomberHeight > _pictureHeight)
{
_startPosY = _pictureHeight - _bomberHeight;
}
break;
}
}
/// <summary>
/// Получение объекта IMoveableObject из объекта DrawningCar
/// </summary>
public IMoveableObject GetMoveableObject => new
DrawningObjectBomber(this);
public virtual void DrawTransport(Graphics g)
{
if (EntityBomber == null)
{
return;
}
Pen pen = new Pen(Color.Black);
Brush bodyBrush = new SolidBrush(EntityBomber.BodyColor);
// крыло 1
GraphicsPath path = new GraphicsPath();
path.StartFigure();
path.AddLine(_startPosX + 20, _startPosY + 30, _startPosX + 20, _startPosY + 0);
path.AddLine(_startPosX + 20, _startPosY + 0, _startPosX + 25, _startPosY + 0);
path.AddLine(_startPosX + 25, _startPosY + 0, _startPosX + 30, _startPosY + 30);
path.AddLine(_startPosX + 30, _startPosY + 30, _startPosX + 20, _startPosY + 30);
path.CloseFigure();
// Заливаем цветом
g.FillPath(Brushes.Blue, path);
// Рисуем контур линии
// крыло 2
g.DrawPath(pen, path);
path.StartFigure();
path.AddLine(_startPosX + 20, _startPosY + 40, _startPosX + 20, _startPosY + 70);
path.AddLine(_startPosX + 20, _startPosY + 70, _startPosX + 25, _startPosY + 70);
path.AddLine(_startPosX + 25, _startPosY + 70, _startPosX + 30, _startPosY + 40);
path.AddLine(_startPosX + 30, _startPosY + 40, _startPosX + 20, _startPosY + 40);
path.CloseFigure();
// Заливаем цветом
g.FillPath(Brushes.Blue, path);
// Рисуем контур линии
g.DrawPath(pen, path);
// фюзеляж
GraphicsPath path1 = new GraphicsPath();
Brush brGreen = new SolidBrush(Color.Green);
g.FillRectangle(bodyBrush, _startPosX + 10, _startPosY + 30, 50, 10);
//нос
path1.StartFigure();
path1.AddLine(_startPosX + 10, _startPosY + 30, _startPosX + 0, _startPosY + 35);
path1.AddLine(_startPosX + 0, _startPosY + 35, _startPosX + 10, _startPosY + 40);
path1.AddLine(_startPosX + 10, _startPosY + 40, _startPosX + 10, _startPosY + 30);
path1.CloseFigure();
// Заливаем цветом
Brush brOrange = new SolidBrush(Color.Orange);
g.FillPath(brOrange, path1);
// Рисуем контур линии
g.DrawPath(pen, path1);
// Горизонтальное оперение 1
path1.StartFigure();
path1.AddLine(_startPosX + 50, _startPosY + 30, _startPosX + 60, _startPosY + 20);
path1.AddLine(_startPosX + 60, _startPosY + 20, _startPosX + 60, _startPosY + 30);
path1.AddLine(_startPosX + 60, _startPosY + 30, _startPosX + 50, _startPosY + 30);
path1.CloseFigure();
// Заливаем цветом
g.FillPath(brOrange, path1);
// Рисуем контур линии
g.DrawPath(pen, path1);
// Горизонтальное оперение 2
path1.StartFigure();
path1.AddLine(_startPosX + 50, _startPosY + 40, _startPosX + 60, _startPosY + 50);
path1.AddLine(_startPosX + 60, _startPosY + 50, _startPosX + 60, _startPosY + 40);
path1.AddLine(_startPosX + 60, _startPosY + 40, _startPosX + 50, _startPosY + 40);
path1.CloseFigure();
// Заливаем цветом
g.FillPath(brOrange, path1);
// Рисуем контур линии
g.DrawPath(pen, path1);
}
}
}

View File

@ -0,0 +1,67 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ProjectBomber.Entities;
namespace ProjectBomber.DrawningObjects
{
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawningBomberAdvanced : DrawningBomber
{
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="bombs">Признак наличия обвеса</param>
/// <param name="fuelTanks">Признак наличия антикрыла</param>
/// <param name="line">Признак наличия гоночной полосы</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
public DrawningBomberAdvanced(int speed, double weight, Color bodyColor, Color
additionalColor, bool bombs, bool fuelTanks, bool line, int width, int height) :
base(speed, weight, bodyColor, width, height, 60, 60)
{
if (EntityBomber != null)
{
EntityBomber = new EntityBomberAdvanced(speed, weight, bodyColor,
additionalColor, bombs, fuelTanks, line);
}
}
public override void DrawTransport(Graphics g)
{
if (EntityBomber is EntityBomberAdvanced bomber)
{
Pen pen = new Pen(Color.Black);
Brush additionalBrush = new SolidBrush(bomber.AdditionalColor);
// Бомбы
if (bomber.Bombs)
{
g.FillRectangle(additionalBrush, _startPosX + 15, _startPosY + 18, 18, 4);
g.FillRectangle(additionalBrush, _startPosX + 15, _startPosY + 48, 18, 4);
}
base.DrawTransport(g);
// баки с топливом
if (bomber.FuelTanks)
{
g.FillRectangle(additionalBrush, _startPosX + 40, _startPosY + 28, 10, 3);
g.FillRectangle(additionalBrush, _startPosX + 40, _startPosY + 40, 10, 3);
}
// линия
if (bomber.Line)
{
g.FillRectangle(additionalBrush, _startPosX + 10, _startPosY + 34, 50, 2);
}
}
}
}
}

View File

@ -0,0 +1,38 @@
using ProjectBomber.DrawningObjects;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectBomber.MovementStrategy
{
/// <summary>
/// Реализация интерфейса IDrawningObject для работы с объектом DrawningCar (паттерн Adapter)
/// </summary>
public class DrawningObjectBomber : IMoveableObject
{
private readonly DrawningBomber _drawningBomber = null;
public DrawningObjectBomber(DrawningBomber drawningBomber)
{
_drawningBomber = drawningBomber;
}
public ObjectParameters GetObjectPosition
{
get
{
if (_drawningBomber == null || _drawningBomber.EntityBomber == null)
{
return null;
}
return new ObjectParameters(_drawningBomber.GetPosX,
_drawningBomber.GetPosY, _drawningBomber.GetWidth, _drawningBomber.GetHeight);
}
}
public int GetStep => (int)(_drawningBomber?.EntityBomber?.Step ?? 0);
public bool CheckCanMove(DirectionType direction) =>
_drawningBomber?.CanMove(direction) ?? false;
public void MoveObject(DirectionType direction) =>
_drawningBomber?.MoveTransport(direction);
}
}

View File

@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectBomber.Entities
{
/// <summary>
/// Класс-сущность "Бомбардировщик"
/// </summary>
public class EntityBomber
{
/// <summary>
/// Скорость
/// </summary>
public int Speed { get; private set; }
/// <summary>
/// Вес
/// </summary>
public double Weight { get; private set; }
/// <summary>
/// Основной цвет
/// </summary>
public Color BodyColor { get; private set; }
/// <summary>
/// Шаг перемещения автомобиля
/// </summary>
public double Step => (double)Speed * 100 / Weight;
/// <summary>
/// Конструктор с параметрами
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес самолета</param>
/// <param name="bodyColor">Основной цвет</param>
public EntityBomber(int speed, double weight, Color bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
}
}
}

View File

@ -0,0 +1,51 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ProjectBomber.Entities;
namespace ProjectBomber.Entities
{
/// <summary>
/// Класс-сущность "Бомбардировщик"
/// </summary>
public class EntityBomberAdvanced : EntityBomber
{
/// <summary>
/// Дополнительный цвет (для опциональных элементов)
/// </summary>
public Color AdditionalColor { get; private set; }
/// <summary>
/// Признак (опция) наличия бомб
/// </summary>
public bool Bombs { get; private set; }
/// <summary>
/// Признак (опция) наличия топливных баков
/// </summary>
public bool FuelTanks { get; private set; }
/// <summary>
/// Признак (опция) наличия полосы
/// </summary>
public bool Line { get; private set; }
/// <summary>
/// Инициализация полей объекта-класса спортивного автомобиля
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес автомобиля</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="bombs">Признак наличия бомб</param>
/// <param name="fuelTanks">Признак наличия топливных баков</param>
/// <param name="line">Признак наличия полосы</param>
public EntityBomberAdvanced(int speed, double weight, Color bodyColor, Color additionalColor, bool bombs, bool fuelTanks, bool line):
base(speed, weight, bodyColor)
{
AdditionalColor = additionalColor;
Bombs = bombs;
FuelTanks = fuelTanks;
Line = line;
}
}
}

View File

@ -1,6 +1,6 @@
namespace ProjectBomber
{
partial class Form1
partial class FormBomber
{
/// <summary>
/// Обязательная переменная конструктора.
@ -28,13 +28,166 @@
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Text = "Form1";
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormBomber));
this.pictureBoxBomber = new System.Windows.Forms.PictureBox();
this.ButtonCreateBomber = new System.Windows.Forms.Button();
this.buttonUp = new System.Windows.Forms.Button();
this.buttonLeft = new System.Windows.Forms.Button();
this.buttonDown = new System.Windows.Forms.Button();
this.buttonRight = new System.Windows.Forms.Button();
this.comboBox1Strategy = new System.Windows.Forms.ComboBox();
this.ButtonCreatePlane = new System.Windows.Forms.Button();
this.ButtonStep = new System.Windows.Forms.Button();
this.ButtonSelectPlane = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxBomber)).BeginInit();
this.SuspendLayout();
//
// pictureBoxBomber
//
this.pictureBoxBomber.Dock = System.Windows.Forms.DockStyle.Fill;
this.pictureBoxBomber.Location = new System.Drawing.Point(0, 0);
this.pictureBoxBomber.Name = "pictureBoxBomber";
this.pictureBoxBomber.Size = new System.Drawing.Size(884, 461);
this.pictureBoxBomber.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
this.pictureBoxBomber.TabIndex = 0;
this.pictureBoxBomber.TabStop = false;
//
// ButtonCreateBomber
//
this.ButtonCreateBomber.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.ButtonCreateBomber.Location = new System.Drawing.Point(12, 421);
this.ButtonCreateBomber.Name = "ButtonCreateBomber";
this.ButtonCreateBomber.Size = new System.Drawing.Size(150, 27);
this.ButtonCreateBomber.TabIndex = 2;
this.ButtonCreateBomber.Text = "Создать бомбардировщик";
this.ButtonCreateBomber.UseVisualStyleBackColor = true;
this.ButtonCreateBomber.Click += new System.EventHandler(this.ButtonCreateBomber_Click);
//
// buttonUp
//
this.buttonUp.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.buttonUp.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("buttonUp.BackgroundImage")));
this.buttonUp.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.buttonUp.Location = new System.Drawing.Point(764, 353);
this.buttonUp.Name = "buttonUp";
this.buttonUp.Size = new System.Drawing.Size(46, 45);
this.buttonUp.TabIndex = 4;
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 = ((System.Drawing.Image)(resources.GetObject("buttonLeft.BackgroundImage")));
this.buttonLeft.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.buttonLeft.Location = new System.Drawing.Point(712, 404);
this.buttonLeft.Name = "buttonLeft";
this.buttonLeft.Size = new System.Drawing.Size(46, 45);
this.buttonLeft.TabIndex = 5;
this.buttonLeft.UseVisualStyleBackColor = true;
this.buttonLeft.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 = ((System.Drawing.Image)(resources.GetObject("buttonDown.BackgroundImage")));
this.buttonDown.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.buttonDown.Location = new System.Drawing.Point(764, 404);
this.buttonDown.Name = "buttonDown";
this.buttonDown.Size = new System.Drawing.Size(46, 45);
this.buttonDown.TabIndex = 6;
this.buttonDown.UseVisualStyleBackColor = true;
this.buttonDown.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 = ((System.Drawing.Image)(resources.GetObject("buttonRight.BackgroundImage")));
this.buttonRight.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.buttonRight.Location = new System.Drawing.Point(816, 404);
this.buttonRight.Name = "buttonRight";
this.buttonRight.Size = new System.Drawing.Size(46, 45);
this.buttonRight.TabIndex = 7;
this.buttonRight.UseVisualStyleBackColor = true;
this.buttonRight.Click += new System.EventHandler(this.ButtonMove_Click);
//
// comboBox1Strategy
//
this.comboBox1Strategy.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboBox1Strategy.FormattingEnabled = true;
this.comboBox1Strategy.Items.AddRange(new object[] {
"_abstractStrategy",
"_MyabstractStrategy"});
this.comboBox1Strategy.Location = new System.Drawing.Point(712, 12);
this.comboBox1Strategy.Name = "comboBox1Strategy";
this.comboBox1Strategy.Size = new System.Drawing.Size(150, 21);
this.comboBox1Strategy.TabIndex = 8;
//
// ButtonCreatePlane
//
this.ButtonCreatePlane.Location = new System.Drawing.Point(168, 421);
this.ButtonCreatePlane.Name = "ButtonCreatePlane";
this.ButtonCreatePlane.Size = new System.Drawing.Size(121, 27);
this.ButtonCreatePlane.TabIndex = 9;
this.ButtonCreatePlane.Text = "Создать самолет";
this.ButtonCreatePlane.UseVisualStyleBackColor = true;
this.ButtonCreatePlane.Click += new System.EventHandler(this.ButtonCreatePlane_Click);
//
// ButtonStep
//
this.ButtonStep.Location = new System.Drawing.Point(712, 39);
this.ButtonStep.Name = "ButtonStep";
this.ButtonStep.Size = new System.Drawing.Size(150, 22);
this.ButtonStep.TabIndex = 10;
this.ButtonStep.Text = "Шаг";
this.ButtonStep.UseVisualStyleBackColor = true;
this.ButtonStep.Click += new System.EventHandler(this.ButtonStep_Click);
//
// ButtonSelectPlane
//
this.ButtonSelectPlane.Location = new System.Drawing.Point(295, 421);
this.ButtonSelectPlane.Name = "ButtonSelectPlane";
this.ButtonSelectPlane.Size = new System.Drawing.Size(101, 28);
this.ButtonSelectPlane.TabIndex = 11;
this.ButtonSelectPlane.Text = "Выбрать";
this.ButtonSelectPlane.UseVisualStyleBackColor = true;
this.ButtonSelectPlane.Click += new System.EventHandler(this.ButtonSelectPlane_Click);
//
// FormBomber
//
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
this.ClientSize = new System.Drawing.Size(884, 461);
this.Controls.Add(this.ButtonSelectPlane);
this.Controls.Add(this.ButtonStep);
this.Controls.Add(this.ButtonCreatePlane);
this.Controls.Add(this.comboBox1Strategy);
this.Controls.Add(this.buttonRight);
this.Controls.Add(this.buttonDown);
this.Controls.Add(this.buttonLeft);
this.Controls.Add(this.buttonUp);
this.Controls.Add(this.ButtonCreateBomber);
this.Controls.Add(this.pictureBoxBomber);
this.Name = "FormBomber";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Бомбардировщик";
((System.ComponentModel.ISupportInitialize)(this.pictureBoxBomber)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.PictureBox pictureBoxBomber;
private System.Windows.Forms.Button ButtonCreateBomber;
private System.Windows.Forms.Button buttonUp;
private System.Windows.Forms.Button buttonLeft;
private System.Windows.Forms.Button buttonDown;
private System.Windows.Forms.Button buttonRight;
private System.Windows.Forms.ComboBox comboBox1Strategy;
private System.Windows.Forms.Button ButtonCreatePlane;
private System.Windows.Forms.Button ButtonStep;
private System.Windows.Forms.Button ButtonSelectPlane;
}
}

View File

@ -1,4 +1,6 @@
using System;
using ProjectBomber.DrawningObjects;
using ProjectBomber.MovementStrategy;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
@ -10,11 +12,157 @@ using System.Windows.Forms;
namespace ProjectBomber
{
public partial class Form1 : Form
public partial class FormBomber : Form
{
public Form1()
/// <summary>
/// Поле-объект для прорисовки объекта
/// </summary>
private DrawningBomber _drawningBomber;
/// <summary>
/// Стратегии перемещения
/// </summary>
private AbstractStrategy _abstractStrategy;
/// <summary>
/// Выбранный автомобиль
/// </summary>
public DrawningBomber SelectedBomber { get; private set; }
public FormBomber()
{
InitializeComponent();
_abstractStrategy = null;
SelectedBomber = null;
}
private void Draw()
{
if (_drawningBomber == null)
{
return;
}
Bitmap bmp = new Bitmap(pictureBoxBomber.Width, pictureBoxBomber.Height);
Graphics gr = Graphics.FromImage(bmp);
_drawningBomber.DrawTransport(gr);
pictureBoxBomber.Image = bmp;
}
/// <summary>
/// Обработка нажатия кнопки "Создать бомбардировщик"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonCreateBomber_Click(object sender, EventArgs e)
{
Random random = new Random();
Color color = Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256));
Color dopColor = Color.FromArgb(random.Next(0, 256),
random.Next(0, 256), random.Next(0, 256));
//выбор основного цвета и дополнительного
ColorDialog colorDialog = new ColorDialog();
if (colorDialog.ShowDialog() == DialogResult.OK)
{
color = colorDialog.Color;
if (colorDialog.ShowDialog() == DialogResult.OK)
{
dopColor = colorDialog.Color;
}
}
_drawningBomber = new DrawningBomberAdvanced(random.Next(100, 300), random.Next(1000, 3000),
color, dopColor, Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)),
Convert.ToBoolean(random.Next(0, 2)), pictureBoxBomber.Width, pictureBoxBomber.Height);
_drawningBomber.SetPosition(random.Next(10, 100), random.Next(10, 100));
Draw();
}
/// <summary>
/// Обработка нажатия кнопки "Создать самолёт"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonCreatePlane_Click(object sender, EventArgs e)
{
Random random = new Random();
Color color = Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256));
ColorDialog colorDialog = new ColorDialog();
if (colorDialog.ShowDialog() == DialogResult.OK)
{
color = colorDialog.Color;
}
_drawningBomber = new DrawningBomber(random.Next(100, 300), random.Next(1000, 3000), color, pictureBoxBomber.Width, pictureBoxBomber.Height);
_drawningBomber.SetPosition(random.Next(10, 100), random.Next(10, 100));
Draw();
}
/// <summary>
/// Изменение размеров формы
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonMove_Click(object sender, EventArgs e)
{
if (_drawningBomber == null)
{
return;
}
string name = ((Button)sender)?.Name ?? string.Empty;
switch (name)
{
case "buttonUp":
_drawningBomber.MoveTransport(DirectionType.Up);
break;
case "buttonDown":
_drawningBomber.MoveTransport(DirectionType.Down);
break;
case "buttonLeft":
_drawningBomber.MoveTransport(DirectionType.Left);
break;
case "buttonRight":
_drawningBomber.MoveTransport(DirectionType.Right);
break;
}
Draw();
}
private void ButtonStep_Click(object sender, EventArgs e)
{
if (_drawningBomber == null)
{
return;
}
if (comboBox1Strategy.Enabled)
{
int selectedIndex = comboBox1Strategy.SelectedIndex;
if (selectedIndex == 0)
{
_abstractStrategy = new MoveToCenter();
}
else if (selectedIndex == 1)
{
_abstractStrategy = new MoveToBottomRight();
}
if (_abstractStrategy != null)
{
_abstractStrategy.SetData(new DrawningObjectBomber(_drawningBomber), pictureBoxBomber.Width, pictureBoxBomber.Height);
comboBox1Strategy.Enabled = false;
}
}
if (_abstractStrategy == null)
{
return;
}
_abstractStrategy.MakeStep();
Draw();
if (_abstractStrategy.GetStatus() == Status.Finish)
{
comboBox1Strategy.Enabled = true;
_abstractStrategy = null;
}
}
/// <summary>
/// Выбор самолета
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonSelectPlane_Click(object sender, EventArgs e)
{
SelectedBomber = _drawningBomber;
DialogResult = DialogResult.OK;
}
}
}

View File

@ -0,0 +1,788 @@
<?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">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="buttonUp.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
RU5ErkJggg==
</value>
</data>
<data name="buttonLeft.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="buttonDown.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="buttonRight.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
RU5ErkJggg==
</value>
</data>
</root>

View File

@ -0,0 +1,187 @@
namespace ProjectBomber
{
partial class FormPlaneCollection
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.groupBoxSet = new System.Windows.Forms.GroupBox();
this.ButtonDelObject = new System.Windows.Forms.Button();
this.ListBoxStorages = new System.Windows.Forms.ListBox();
this.ButtonAddObject = new System.Windows.Forms.Button();
this.textBoxStorageName = new System.Windows.Forms.TextBox();
this.ButtonRefreshCollection = new System.Windows.Forms.Button();
this.ButtonRemovePlane = new System.Windows.Forms.Button();
this.maskedTextBoxNumber = new System.Windows.Forms.TextBox();
this.ButtonAddPlane = new System.Windows.Forms.Button();
this.pictureBoxCollection = new System.Windows.Forms.PictureBox();
this.groupBox1.SuspendLayout();
this.groupBoxSet.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxCollection)).BeginInit();
this.SuspendLayout();
//
// groupBox1
//
this.groupBox1.Controls.Add(this.groupBoxSet);
this.groupBox1.Controls.Add(this.ButtonRefreshCollection);
this.groupBox1.Controls.Add(this.ButtonRemovePlane);
this.groupBox1.Controls.Add(this.maskedTextBoxNumber);
this.groupBox1.Controls.Add(this.ButtonAddPlane);
this.groupBox1.Location = new System.Drawing.Point(586, 2);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(216, 563);
this.groupBox1.TabIndex = 0;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Инструменты";
//
// groupBoxSet
//
this.groupBoxSet.Controls.Add(this.ButtonDelObject);
this.groupBoxSet.Controls.Add(this.ListBoxStorages);
this.groupBoxSet.Controls.Add(this.ButtonAddObject);
this.groupBoxSet.Controls.Add(this.textBoxStorageName);
this.groupBoxSet.Location = new System.Drawing.Point(21, 25);
this.groupBoxSet.Name = "groupBoxSet";
this.groupBoxSet.Size = new System.Drawing.Size(180, 274);
this.groupBoxSet.TabIndex = 4;
this.groupBoxSet.TabStop = false;
this.groupBoxSet.Text = "Наборы";
//
// ButtonDelObject
//
this.ButtonDelObject.Location = new System.Drawing.Point(7, 226);
this.ButtonDelObject.Name = "ButtonDelObject";
this.ButtonDelObject.Size = new System.Drawing.Size(161, 37);
this.ButtonDelObject.TabIndex = 3;
this.ButtonDelObject.Text = "Удалить набор";
this.ButtonDelObject.UseVisualStyleBackColor = true;
this.ButtonDelObject.Click += new System.EventHandler(this.ButtonDelObject_Click);
//
// ListBoxStorages
//
this.ListBoxStorages.FormattingEnabled = true;
this.ListBoxStorages.Location = new System.Drawing.Point(9, 112);
this.ListBoxStorages.Name = "ListBoxStorages";
this.ListBoxStorages.Size = new System.Drawing.Size(162, 95);
this.ListBoxStorages.TabIndex = 2;
this.ListBoxStorages.SelectedIndexChanged += new System.EventHandler(this.ListBoxStorages_SelectedIndexChanged);
//
// ButtonAddObject
//
this.ButtonAddObject.Location = new System.Drawing.Point(8, 61);
this.ButtonAddObject.Name = "ButtonAddObject";
this.ButtonAddObject.Size = new System.Drawing.Size(164, 34);
this.ButtonAddObject.TabIndex = 1;
this.ButtonAddObject.Text = "Добавить набор";
this.ButtonAddObject.UseVisualStyleBackColor = true;
this.ButtonAddObject.Click += new System.EventHandler(this.ButtonAddObject_Click);
//
// textBoxStorageName
//
this.textBoxStorageName.Location = new System.Drawing.Point(7, 21);
this.textBoxStorageName.Name = "textBoxStorageName";
this.textBoxStorageName.Size = new System.Drawing.Size(166, 20);
this.textBoxStorageName.TabIndex = 0;
//
// ButtonRefreshCollection
//
this.ButtonRefreshCollection.Location = new System.Drawing.Point(18, 509);
this.ButtonRefreshCollection.Name = "ButtonRefreshCollection";
this.ButtonRefreshCollection.Size = new System.Drawing.Size(178, 41);
this.ButtonRefreshCollection.TabIndex = 3;
this.ButtonRefreshCollection.Text = "Обновить коллекцию";
this.ButtonRefreshCollection.UseVisualStyleBackColor = true;
this.ButtonRefreshCollection.Click += new System.EventHandler(this.ButtonRefreshCollection_Click);
//
// ButtonRemovePlane
//
this.ButtonRemovePlane.Location = new System.Drawing.Point(18, 430);
this.ButtonRemovePlane.Name = "ButtonRemovePlane";
this.ButtonRemovePlane.Size = new System.Drawing.Size(179, 41);
this.ButtonRemovePlane.TabIndex = 2;
this.ButtonRemovePlane.Text = "Удалить самолет";
this.ButtonRemovePlane.UseVisualStyleBackColor = true;
this.ButtonRemovePlane.Click += new System.EventHandler(this.ButtonRemovePlane_Click);
//
// maskedTextBoxNumber
//
this.maskedTextBoxNumber.Location = new System.Drawing.Point(18, 388);
this.maskedTextBoxNumber.Name = "maskedTextBoxNumber";
this.maskedTextBoxNumber.Size = new System.Drawing.Size(180, 20);
this.maskedTextBoxNumber.TabIndex = 1;
//
// ButtonAddPlane
//
this.ButtonAddPlane.Location = new System.Drawing.Point(18, 327);
this.ButtonAddPlane.Name = "ButtonAddPlane";
this.ButtonAddPlane.Size = new System.Drawing.Size(185, 40);
this.ButtonAddPlane.TabIndex = 0;
this.ButtonAddPlane.Text = "Добавить самолет";
this.ButtonAddPlane.UseVisualStyleBackColor = true;
this.ButtonAddPlane.Click += new System.EventHandler(this.ButtonAddPlane_Click);
//
// pictureBoxCollection
//
this.pictureBoxCollection.Location = new System.Drawing.Point(-2, 2);
this.pictureBoxCollection.Name = "pictureBoxCollection";
this.pictureBoxCollection.Size = new System.Drawing.Size(600, 563);
this.pictureBoxCollection.TabIndex = 1;
this.pictureBoxCollection.TabStop = false;
//
// FormPlaneCollection
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 564);
this.Controls.Add(this.pictureBoxCollection);
this.Controls.Add(this.groupBox1);
this.Name = "FormPlaneCollection";
this.Text = "Набор самолетов";
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.groupBoxSet.ResumeLayout(false);
this.groupBoxSet.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxCollection)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.Button ButtonRefreshCollection;
private System.Windows.Forms.Button ButtonRemovePlane;
private System.Windows.Forms.TextBox maskedTextBoxNumber;
private System.Windows.Forms.Button ButtonAddPlane;
private System.Windows.Forms.PictureBox pictureBoxCollection;
private System.Windows.Forms.GroupBox groupBoxSet;
private System.Windows.Forms.Button ButtonDelObject;
private System.Windows.Forms.ListBox ListBoxStorages;
private System.Windows.Forms.Button ButtonAddObject;
private System.Windows.Forms.TextBox textBoxStorageName;
}
}

View File

@ -0,0 +1,182 @@
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 ProjectBomber.MovementStrategy;
using ProjectBomber.Generics;
using ProjectBomber.DrawningObjects;
namespace ProjectBomber
{
/// <summary>
/// Форма для работы с набором объектов класса DrawningBomber
/// </summary>
public partial class FormPlaneCollection : Form
{
/// <summary>
/// Набор объектов
/// </summary>
private readonly PlanesGenericStorage _storage;
/// <summary>
/// Конструктор
/// </summary>
public FormPlaneCollection()
{
InitializeComponent();
_storage = new PlanesGenericStorage(pictureBoxCollection.Width, pictureBoxCollection.Height);
}
/// <summary>
/// Заполнение listBoxObjects
/// </summary>
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;
}
}
/// <summary>
/// Добавление набора в коллекцию
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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();
}
/// <summary>
/// Выбор набора
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ListBoxStorages_SelectedIndexChanged(object sender, EventArgs e)
{
pictureBoxCollection.Image =
_storage[ListBoxStorages.SelectedItem?.ToString() ?? string.Empty]?.ShowPlanes();
}
/// <summary>
/// Удаление набора
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonDelObject_Click(object sender, EventArgs e)
{
if (ListBoxStorages.SelectedIndex == -1)
{
return;
}
if (MessageBox.Show($"Удалить объект {ListBoxStorages.SelectedItem}?", "Удаление", MessageBoxButtons.YesNo,
MessageBoxIcon.Question) == DialogResult.Yes)
{
_storage.DelSet(ListBoxStorages.SelectedItem.ToString()?? string.Empty);
ReloadObjects();
}
}
/// <summary>
/// Добавление объекта в набор
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonAddPlane_Click(object sender, EventArgs e)
{
if (ListBoxStorages.SelectedIndex == -1)
{
return;
}
var obj = _storage[ListBoxStorages.SelectedItem.ToString() ??
string.Empty];
if (obj == null)
{
return;
}
FormBomber form = new FormBomber();
if (form.ShowDialog() == DialogResult.OK)
{
if (obj + form.SelectedBomber)
{
MessageBox.Show("Объект добавлен");
pictureBoxCollection.Image = obj.ShowPlanes();
}
else
{
MessageBox.Show("Не удалось добавить объект");
}
}
}
/// <summary>
/// Удаление объекта из набора
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonRemovePlane_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 (obj - pos != null)
{
MessageBox.Show("Объект удален");
pictureBoxCollection.Image = obj.ShowPlanes();
}
else
{
MessageBox.Show("Не удалось удалить объект");
}
}
/// <summary>
/// Обновление рисунка по набору
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonRefreshCollection_Click(object sender, EventArgs e)
{
if (ListBoxStorages.SelectedIndex == -1)
{
return;
}
var obj = _storage[ListBoxStorages.SelectedItem.ToString() ??
string.Empty];
if (obj == null)
{
return;
}
pictureBoxCollection.Image = obj.ShowPlanes();
}
}
}

View File

@ -0,0 +1,120 @@
<?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">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,35 @@
using ProjectBomber.MovementStrategy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectBomber.MovementStrategy
{
/// <summary>
/// Интерфейс для работы с перемещаемым объектом
/// </summary>
public interface IMoveableObject
{
/// <summary>
/// Получение координаты X объекта
/// </summary>
ObjectParameters GetObjectPosition { get; }
/// <summary>
/// Шаг объекта
/// </summary>
int GetStep { get; }
/// <summary>
/// Проверка, можно ли переместиться по нужному направлению
/// </summary>
/// <param name="direction"></param>
/// <returns></returns>
bool CheckCanMove(DirectionType direction);
/// <summary>
/// Изменение направления пермещения объекта
/// </summary>
/// <param name="direction">Направление</param>
void MoveObject(DirectionType direction);
}
}

View File

@ -0,0 +1,43 @@
using ProjectBomber.MovementStrategy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectBomber
{
public class MoveToBottomRight : AbstractStrategy
{
protected override bool IsTargetDestinaion()
{
var objParams = GetObjectParameters;
if (objParams == null)
{
return false;
}
return objParams.RightBorder <= FieldWidth &&
objParams.RightBorder + GetStep() >= FieldWidth &&
objParams.DownBorder <= FieldHeight &&
objParams.DownBorder + GetStep() >= FieldHeight;
}
protected override void MoveToTarget()
{
var objParams = GetObjectParameters;
if (objParams == null)
{
return;
}
var diffX = FieldWidth - objParams.RightBorder;
if (Math.Abs(diffX) > GetStep())
{
MoveRight();
}
var diffY = FieldHeight - objParams.DownBorder;
if (Math.Abs(diffY) > GetStep())
{
MoveDown();
}
}
}
}

View File

@ -0,0 +1,59 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectBomber.MovementStrategy
{
/// <summary>
/// Стратегия перемещения объекта в центр экрана
/// </summary>
public class MoveToCenter : AbstractStrategy
{
protected override bool IsTargetDestinaion()
{
var objParams = GetObjectParameters;
if (objParams == null)
{
return false;
}
return objParams.ObjectMiddleHorizontal <= FieldWidth / 2 &&
objParams.ObjectMiddleHorizontal + GetStep() >= FieldWidth / 2 &&
objParams.ObjectMiddleVertical <= FieldHeight / 2 &&
objParams.ObjectMiddleVertical + GetStep() >= FieldHeight / 2;
}
protected override void MoveToTarget()
{
var objParams = GetObjectParameters;
if (objParams == null)
{
return;
}
var diffX = objParams.ObjectMiddleHorizontal - FieldWidth / 2;
if (Math.Abs(diffX) > GetStep())
{
if (diffX > 0)
{
MoveLeft();
}
else
{
MoveRight();
}
}
var diffY = objParams.ObjectMiddleVertical - FieldHeight / 2;
if (Math.Abs(diffY) > GetStep())
{
if (diffY > 0)
{
MoveUp();
}
else
{
MoveDown();
}
}
}
}
}

View File

@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectBomber.MovementStrategy
{
/// <summary>
/// Параметры-координаты объекта
/// </summary>
public class ObjectParameters
{
private readonly int _x;
private readonly int _y;
private readonly int _width;
private readonly int _height;
/// <summary>
/// Левая граница
/// </summary>
public int LeftBorder => _x;
/// <summary>
/// Верхняя граница
/// </summary>
public int TopBorder => _y;
/// <summary>
/// Правая граница
/// </summary>
public int RightBorder => _x + _width;
/// <summary>
/// Нижняя граница
/// </summary>
public int DownBorder => _y + _height;
/// <summary>
/// Середина объекта
/// </summary>
public int ObjectMiddleHorizontal => _x + _width / 2;
/// <summary>
/// Середина объекта
/// </summary>
public int ObjectMiddleVertical => _y + _height / 2;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
/// <param name="width">Ширина</param>
/// <param name="height">Высота</param>
public ObjectParameters(int x, int y, int width, int height)
{
_x = x;
_y = y;
_width = width;
_height = height;
}
}
}

View File

@ -0,0 +1,167 @@
using ProjectBomber.MovementStrategy;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ProjectBomber.DrawningObjects;
namespace ProjectBomber.Generics
{
/// <summary>
/// Параметризованный класс для набора объектов DrawningBomber
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="U"></typeparam>
internal class PlanesGenericCollection<T, U>
where T : DrawningBomber
where U : IMoveableObject
{
/// <summary>
/// Ширина окна прорисовки
/// </summary>
private readonly int _pictureWidth;
/// <summary>
/// Высота окна прорисовки
/// </summary>
private readonly int _pictureHeight;
/// <summary>
/// Размер занимаемого объектом места (ширина)
/// </summary>
private readonly int _placeSizeWidth = 200;
/// <summary>
/// Размер занимаемого объектом места (высота)
/// </summary>
private readonly int _placeSizeHeight = 90;
/// <summary>
/// Набор объектов
/// </summary>
private readonly SetGeneric<T> _collection;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="picWidth"></param>
/// <param name="picHeight"></param>
public PlanesGenericCollection(int picWidth, int picHeight)
{
int width = picWidth / _placeSizeWidth;
int height = picHeight / _placeSizeHeight;
_pictureWidth = picWidth;
_pictureHeight = picHeight;
_collection = new SetGeneric<T>(width * height);
}
/// <summary>
/// Перегрузка оператора сложения
/// </summary>
/// <param name="collect"></param>
/// <param name="obj"></param>
/// <returns></returns>
public static bool operator +(PlanesGenericCollection<T, U> collect, T
obj)
{
if (obj == null)
{
return false;
}
collect?._collection.Insert(obj);
return true;
}
/// <summary>
/// Перегрузка оператора вычитания
/// </summary>
/// <param name="collect"></param>
/// <param name="pos"></param>
/// <returns></returns>
public static T operator -(PlanesGenericCollection<T, U> collect, int pos)
{
T obj = collect._collection[pos];
if (obj != null)
{
collect._collection.Remove(pos);
}
return obj;
}
/// <summary>
/// Получение объекта IMoveableObject
/// </summary>
/// <param name="pos"></param>
/// <returns></returns>
public U GetU(int pos)
{
return (U)_collection[pos]?.GetMoveableObject;
}
/// <summary>
/// Вывод всего набора объектов
/// </summary>
/// <returns></returns>
public Bitmap ShowPlanes()
{
Bitmap bmp = new Bitmap(_pictureWidth, _pictureHeight);
Graphics gr = Graphics.FromImage(bmp);
DrawBackground(gr);
DrawObjects(gr);
return bmp;
}
/// <summary>
/// Метод отрисовки фона
/// </summary>
/// <param name="g"></param>
private void DrawBackground(Graphics g)
{
Pen pen = new Pen(Color.Black, 3);
int numColumns = _pictureWidth / _placeSizeWidth;
int numRows = _pictureHeight / _placeSizeHeight;
for (int i = 0; i <= numColumns; i++)
{
for (int j = 0; j <= numRows; ++j)
{
// Линии разметки места
int x = i * _placeSizeWidth;
int y = j * _placeSizeHeight;
g.DrawLine(pen, x, y, x + _placeSizeWidth / 2, y);
}
g.DrawLine(pen, i * _placeSizeWidth, 0, i * _placeSizeWidth, numRows * _placeSizeHeight);
}
}
/// <summary>
/// Метод прорисовки объектов
/// </summary>
/// <param name="g"></param>
private void DrawObjects(Graphics g)
{
int numColumns = _pictureWidth / _placeSizeWidth;
int column = numColumns - 1;
int row = 0;
foreach (var plane in _collection.GetPlanes())
{
// Установка позиции бомбардировщика
int xPosition = column * _placeSizeWidth;
int yPosition = row * _placeSizeHeight;
if (plane != null)
{
// Перемещение по ячейкам влево, вниз
column--;
if (column < 0)
{
column = numColumns - 1;
row++;
}
plane.SetPosition(xPosition, yPosition);
plane.DrawTransport(g);
}
else
{
column--;
if (column < 0)
{
column = numColumns - 1;
row++;
}
}
}
}
}
}

View File

@ -0,0 +1,97 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ProjectBomber.DrawningObjects;
using ProjectBomber.MovementStrategy;
namespace ProjectBomber.Generics
{
/// <summary>
/// Класс для хранения коллекции
/// </summary>
internal class PlanesGenericStorage
{
/// <summary>
/// Словарь (хранилище)
/// </summary>
readonly Dictionary<string, PlanesGenericCollection<DrawningBomber,
DrawningObjectBomber>> _planeStorages;
/// <summary>
/// Возвращение списка названий наборов
/// </summary>
public List<string> Keys => _planeStorages.Keys.ToList();
/// <summary>
/// Ширина окна отрисовки
/// </summary>
private readonly int _pictureWidth;
/// <summary>
/// Высота окна отрисовки
/// </summary>
private readonly int _pictureHeight;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="pictureWidth"></param>
/// <param name="pictureHeight"></param>
public PlanesGenericStorage(int pictureWidth, int pictureHeight)
{
_planeStorages = new Dictionary<string,
PlanesGenericCollection<DrawningBomber, DrawningObjectBomber>>();
_pictureWidth = pictureWidth;
_pictureHeight = pictureHeight;
}
/// <summary>
/// Добавление набора
/// </summary>
/// <param name="name">Название набора</param>
public void AddSet(string name)
{
// Создаем новый набор и добавляем его в словарь
if (!_planeStorages.ContainsKey(name))
{
_planeStorages[name] = new PlanesGenericCollection<DrawningBomber, DrawningObjectBomber>(_pictureWidth, _pictureHeight);
}
else
{
throw new ArgumentException("Набор с таким именем уже существует");
}
}
/// <summary>
/// Удаление набора
/// </summary>
/// <param name="name">Название набора</param>
public void DelSet(string name)
{
// Удаляем набор из словаря по имени
if (_planeStorages.ContainsKey(name))
{
_planeStorages.Remove(name);
}
else
{
throw new ArgumentException("Набор с таким именем не найден.");
}
}
/// <summary>
/// Доступ к набору
/// </summary>
/// <param name="ind"></param>
/// <returns></returns>
public PlanesGenericCollection<DrawningBomber, DrawningObjectBomber> this[string ind]
{
get
{
if (_planeStorages.ContainsKey(ind))
{
return _planeStorages[ind];
}
else
{
throw new KeyNotFoundException($"Набор с именем '{ind}' не найден.");
}
}
}
}
}

View File

@ -16,7 +16,7 @@ namespace ProjectBomber
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
Application.Run(new FormPlaneCollection());
}
}
}

View File

@ -12,6 +12,21 @@
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
@ -46,14 +61,41 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="AbstractStrategy.cs" />
<Compile Include="Direction.cs" />
<Compile Include="DrawningBomber.cs" />
<Compile Include="DrawningBomberAdvanced.cs" />
<Compile Include="DrawningObjectBomber.cs" />
<Compile Include="EntityBomber.cs" />
<Compile Include="EntityBomberAdvanced.cs" />
<Compile Include="Form1.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Form1.Designer.cs">
<DependentUpon>Form1.cs</DependentUpon>
</Compile>
<Compile Include="FormPlaneCollection.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FormPlaneCollection.Designer.cs">
<DependentUpon>FormPlaneCollection.cs</DependentUpon>
</Compile>
<Compile Include="IMoveableObject.cs" />
<Compile Include="MoveToBottomRight.cs" />
<Compile Include="MoveToCenter.cs" />
<Compile Include="ObjectParameters.cs" />
<Compile Include="PlanesGenericCollection.cs" />
<Compile Include="PlanesGenericStorage.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SetGeneric.cs" />
<Compile Include="Status.cs" />
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FormPlaneCollection.resx">
<DependentUpon>FormPlaneCollection.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
@ -76,5 +118,17 @@
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.7.2">
<Visible>False</Visible>
<ProductName>Microsoft .NET Framework 4.7.2 %28x86 и x64%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@ -0,0 +1,143 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectBomber.Generics
{
/// <summary>
/// Параметризованный набор объектов
/// </summary>
/// <typeparam name="T"></typeparam>
internal class SetGeneric<T>
where T : class
{
/// <summary>
/// Список объектов, которые храним
/// </summary>
private readonly List<T> _places;
/// <summary>
/// Количество объектов в списке
/// </summary>
public int Count => _places.Count;
/// <summary>
/// Максимальное количество объектов в списке
/// </summary>
private readonly int _maxCount;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="count"></param>
public SetGeneric(int count)
{
_maxCount = count;
_places = new List<T>(count);
}
/// <summary>
/// Добавление объекта в набор
/// </summary>
/// <param name="plane">Добавляемый самолет</param>
/// <returns></returns>
public bool Insert(T plane)
{
if (_places.Count == 0)
{
_places.Add(plane);
return true;
}
else
{
if (_places.Count < _maxCount)
{
_places.Add(plane);
for (int i = 0; i < _places.Count; i++)
{
T temp = _places[i];
_places[i] = _places[_places.Count - 1];
_places[_places.Count - 1] = temp;
}
return true;
}
}
return true;
}
/// <summary>
/// Добавление объекта в набор на конкретную позицию
/// </summary>
/// <param name="plane">Добавляемый самолет</param>
/// <param name="position">Позиция</param>
/// <returns></returns>
public bool Insert(T plane, int position)
{
if (position < 0 || position >= _maxCount)
{
return false;
}
if (position < _places.Count && _places[position] == null)
{
_places[position] = plane;
}
else
{
// Ищем первую пустую позицию и вставляем туда.
for (int i = 0; i < _maxCount; i++)
{
if (_places[i] == null)
{
_places[i] = plane;
break;
}
}
}
return true;
}
/// <summary>
/// Удаление объекта из набора с конкретной позиции
/// </summary>
/// <param name="position"></param>
/// <returns></returns>
public bool Remove(int position)
{
if (position < 0 || position >= _maxCount)
return false;
_places[position] = null;
return true;
}
/// <summary>
/// Получение объекта из набора по позиции
/// </summary>
/// <param name="position"></param>
/// <returns></returns>
public T this[int position]
{
get
{
if (position < 0 || position >= _maxCount)
return null;
return _places[position];
}
set
{
if (position < 0 || position >= _maxCount || _places.Count >= _maxCount)
return; // Неправильная позиция или нет места для вставки
_places[position] = value;
}
}
/// <summary>
/// Проход по списку
/// </summary>
/// <returns></returns>
public IEnumerable<T> GetPlanes(int? maxPlanes = null)
{
for (int i = 0; i < _places.Count; ++i)
{
yield return _places[i];
if (maxPlanes.HasValue && i == maxPlanes.Value)
{
yield break;
}
}
}
}
}

View File

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectBomber.MovementStrategy
{
public enum Status
{
/// <summary>
/// Вверх
/// </summary>
NotInit = 1,
/// <summary>
/// Вниз
/// </summary>
InProgress = 2,
/// <summary>
/// Влево
/// </summary>
Finish = 3
}
}