3 Commits
lab5 ... lab3

Author SHA1 Message Date
Alenka
248af86d1c process1 2023-10-13 00:01:17 +04:00
Alenka
68b85f9f12 start 2023-10-12 23:30:13 +04:00
Alenka
a5d6aca307 Создание 3 лабы 2023-10-12 22:36:13 +04:00
14 changed files with 924 additions and 103 deletions

View File

@@ -0,0 +1,129 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Cruiser.MovementStrategy
{
public abstract class AbstractStrategy
{
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(Direction.Left);
/// <summary>
/// Перемещение вправо
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveRight() => MoveTo(Direction.Right);
/// <summary>
/// Перемещение вверх
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveUp() => MoveTo(Direction.Up);
/// <summary>
/// Перемещение вниз
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться,false - неудача)</returns>
protected bool MoveDown() => MoveTo(Direction.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(Direction directionType)
{
if (_state != Status.InProgress)
{
return false;
}
if (_moveableObject?.CheckCanMove(directionType) ?? false)
{
_moveableObject.MoveObject(directionType);
return true;
}
return false;
}
}
}

View File

@@ -0,0 +1,147 @@
using CruiserGenerics;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//using Cruiser.Drawnings;
//using Cruiser.MovementStrategy;
namespace Cruiser.Generics
{
internal class CarsGenericCollection<T, U>
where T : DrawningCruiser
where U : IMoveableObject
{
/// <summary>
/// Ширина окна прорисовки
/// </summary>
private readonly int _pictureWidth;
/// <summary>
/// Высота окна прорисовки
/// </summary>
private readonly int _pictureHeight;
/// <summary>
/// Размер занимаемого объектом места (ширина)
/// </summary>
private readonly int _placeSizeWidth = 210;
/// <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 CarsGenericCollection(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 T? operator +(CarsGenericCollection<T, U> collect, T?
obj)
{
if (obj == null)
{
return null;
}
return collect?._collection.Insert(obj) ?? null;
}
/// <summary>
/// Перегрузка оператора вычитания
/// </summary>
/// <param name="collect"></param>
/// <param name="pos"></param>
/// <returns></returns>
public static T? operator -(CarsGenericCollection<T, U> collect, int
pos)
{
T? obj = collect._collection.Get(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.Get(pos)?.GetMoveableObject;
}
/// <summary>
/// Вывод всего набора объектов
/// </summary>
/// <returns></returns>
public Bitmap ShowCars()
{
Bitmap bmp = new(_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(Color.Black, 3);
for (int i = 0; i < _pictureWidth / _placeSizeWidth; i++)
{
for (int j = 0; j < _pictureHeight / _placeSizeHeight +
1; ++j)
{//линия рамзетки места
g.DrawLine(pen, i * _placeSizeWidth, j *
_placeSizeHeight, i * _placeSizeWidth + _placeSizeWidth / 2, j *
_placeSizeHeight);
}
g.DrawLine(pen, i * _placeSizeWidth, 0, i *
_placeSizeWidth, _pictureHeight / _placeSizeHeight * _placeSizeHeight);
}
}
/// <summary>
/// Метод прорисовки объектов
/// </summary>
/// <param name="g"></param>
private void DrawObjects(Graphics g)
{
DrawningCruiser car;
int numPlacesInRow = _pictureWidth / _placeSizeWidth;
for (int i = 0; i < _collection.Count; i++)
{
// TODO получение объекта
// TODO установка позиции
// TODO прорисовка объекта
car = _collection.Get(i);
if (car != null)
{
car.SetPosition((i % numPlacesInRow) * _placeSizeWidth + _placeSizeWidth / 20, _placeSizeHeight * (i / numPlacesInRow) + _placeSizeHeight / 10);
//car.SetPosition(_placeSizeWidth * (i/ numPlacesInColumn) + _placeSizeWidth / 20, (i % numPlacesInColumn ) *_placeSizeHeight + _placeSizeHeight / 10);
car.DrawTransport(g);
}
}
}
}
}

View File

@@ -4,9 +4,9 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Cruiser
namespace Cruiser.Entities
{
public class Cruiser
public class EntityCruiser
{
public int Speed { get; private set; }
@@ -17,34 +17,25 @@ namespace Cruiser
public Color BodyColor { get; private set; }
public Color AdditionalColor { get; private set; }
// public Color AdditionalColor { get; private set; }
public bool Headlights { get; private set; }
public bool HelicopterPad { get; private set; }
// public bool Headlights { get; private set; }
// public bool HelicopterPad { get; private set; }
public bool Coating { get; private set; }
// public bool Coating { get; private set; }
public double Step => (double)Speed * 100 / Weight;
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес автомобиля</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="headlights">Признак наличия передних фар</param>
/// <param name="helicopterPad">Признак наличия площадки для вертолета</param>
/// <param name="coating">Признак наличия покрытия</param>
public void Init(int speed, double weight, Color bodyColor, Color
additionalColor, bool headlights, bool helicopterPad, bool coating)
public EntityCruiser(int speed, double weight, Color bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
AdditionalColor = additionalColor;
Headlights = headlights;
HelicopterPad = helicopterPad;
Coating = coating;
}
}
}
}

View File

@@ -3,78 +3,96 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Cruiser.Entities;
namespace Cruiser
namespace Cruiser.DrawningObjects
{
public class DrawningCruiser
{
public Cruiser? Cruiser { get; private set; }
public EntityCruiser? EntityCruiser { get; protected set; }
private int _pictureWidth;
private int _pictureHeight;
private int _startPosX;
protected int _startPosX;
private int _startPosY;
protected int _startPosY;
private readonly int _cruiserWidth = 150;
private readonly int _cruiserHeight = 50;
public int GetPosX => _startPosX;
/// <summary>
/// Координата Y объекта
/// </summary>
public int GetPosY => _startPosY;
/// <summary>
/// Ширина объекта
/// </summary>
public int GetWidth => _cruiserWidth;
/// <summary>
/// Высота объекта
/// </summary>
public int GetHeight => _cruiserHeight;
public IMoveableObject GetMoveableObject => new DrawningObjectCruiser(this);
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Цвет кузова</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="headlights">Признак наличия фар</param>
/// <param name="helicopterPad">Признак наличия антикрыла</param>
/// <param name="coating">Признак наличия гоночной полосы</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
/// <returns>true - объект создан, false - проверка не пройдена, нельзя создать объект в этих размерах</returns>
public bool Init(int speed, double weight, Color bodyColor, Color
additionalColor, bool headlights, bool helicopterPad, bool coating, int width, int height)
public DrawningCruiser(int speed, double weight, Color bodyColor, int width, int height)
{
if (width < _cruiserWidth || height < _cruiserHeight)
{
return;
}
_pictureWidth = width;
_pictureHeight = height;
if (_pictureHeight > _cruiserWidth && _pictureWidth > _cruiserHeight)
{
Cruiser = new Cruiser();
Cruiser.Init(speed, weight, bodyColor, additionalColor,
headlights, helicopterPad, coating);
return true;
}
return false;
EntityCruiser = new EntityCruiser(speed, weight, bodyColor);
}
protected DrawningCruiser(int speed, double weight, Color bodyColor, int
width, int height, int carWidth, int carHeight)
{
if (width <= _cruiserWidth || height <= _cruiserHeight)
{
return;
}
_pictureWidth = width;
_pictureHeight = height;
_cruiserWidth = carWidth;
_cruiserHeight = carHeight;
EntityCruiser = new EntityCruiser(speed, weight, bodyColor);
}
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
public void SetPosition(int x, int y)
{
if (Cruiser == null) return;
while (x + _cruiserWidth > _pictureWidth)
if (x < 0 || x >= _pictureWidth || y < 0 || y >= _pictureHeight)
{
x -= (int)Cruiser.Step;
_startPosX = 0;
_startPosY = 0;
}
while (x < 0)
{
x += (int)Cruiser.Step;
}
while (y + _cruiserHeight > _pictureHeight)
{
y -= (int)Cruiser.Step;
}
while (y < 0)
{
y += (int)Cruiser.Step;
}
_startPosX = x;
_startPosY = y;
@@ -83,55 +101,63 @@ additionalColor, bool headlights, bool helicopterPad, bool coating, int width, i
/// <param name="direction">Направление</param>
public void MoveTransport(Direction direction)
{
if (Cruiser == null)
if (!CanMove(direction) || EntityCruiser == null)
{
return;
}
switch (direction)
{
//влево
case Direction.Left:
if (_startPosX - Cruiser.Step > 0)
{
_startPosX -= (int)Cruiser.Step;
}
_startPosX -= (int)EntityCruiser.Step;
break;
//вверх
case Direction.Up:
if (_startPosY - Cruiser.Step > 0)
{
_startPosY -= (int)Cruiser.Step;
}
_startPosY -= (int)EntityCruiser.Step;
break;
// вправо
case Direction.Right:
if (_startPosX + Cruiser.Step + _cruiserWidth < _pictureWidth)
{
_startPosX += (int)Cruiser.Step;
}
_startPosX += (int)EntityCruiser.Step;
break;
//вниз
case Direction.Down:
_startPosY += (int)EntityCruiser.Step;
break;
case Direction.Down:
if (_startPosY + Cruiser.Step + _cruiserHeight < _pictureHeight)
{
_startPosY += (int)Cruiser.Step;
}
break;
}
}
public bool CanMove(Direction direction)
{
if (EntityCruiser == null)
{
return false;
}
return direction switch
{
//влево
Direction.Left => _startPosX - EntityCruiser.Step > 0,
//вверх
Direction.Up => _startPosY - EntityCruiser.Step > 0,
// вправо
Direction.Right => _startPosX + EntityCruiser.Step + _cruiserWidth < _pictureWidth,
//вниз
Direction.Down => _startPosY + EntityCruiser.Step + _cruiserHeight < _pictureHeight,
_ => false,
};
}
/// <param name="g"></param>
public void DrawTransport(Graphics g)
public virtual void DrawTransport(Graphics g)
{
if (Cruiser == null)
if (EntityCruiser == null)
{
return;
}
Pen pen = new(Color.Black);
Brush additionalBrush = new
SolidBrush(Cruiser.AdditionalColor);
Pen pen = new Pen(Color.Black);
Brush brush = new SolidBrush(EntityCruiser.BodyColor);
//SolidBrush(Cruiser.AdditionalColor);
//границы автомобиля
@@ -145,17 +171,17 @@ additionalColor, bool headlights, bool helicopterPad, bool coating, int width, i
g.DrawRectangle(pen, _startPosX + 20, _startPosY + 4, 70, 52);
//если есть доп.фонари
if (Cruiser.Headlights)
{
/* if (Cruiser.Headlights)
{
Brush brYellow = new SolidBrush(Color.Yellow);
g.FillEllipse(brYellow, _startPosX + 80, _startPosY + 5, 20,
20);
g.FillEllipse(brYellow, _startPosX + 80, _startPosY + 35, 20,
20);
}
Brush brYellow = new SolidBrush(Color.Yellow);
g.FillEllipse(brYellow, _startPosX + 80, _startPosY + 5, 20,
20);
g.FillEllipse(brYellow, _startPosX + 80, _startPosY + 35, 20,
20);
}*/
//основание лодки!!!
Brush br = new SolidBrush(Cruiser.BodyColor);
Brush br = new SolidBrush(EntityCruiser.BodyColor);
g.FillRectangle(br, _startPosX + 10, _startPosY + 15, 10, 30);
g.FillRectangle(br, _startPosX + 90, _startPosY + 15, 10, 30);
g.FillRectangle(br, _startPosX + 20, _startPosY + 5, 70, 50);
@@ -179,22 +205,19 @@ additionalColor, bool headlights, bool helicopterPad, bool coating, int width, i
g.DrawRectangle(Pens.Black, _startPosX + 50,
_startPosY + 19, 30, 25);
if (Cruiser.HelicopterPad)
{
//если есть площадка под вертолет
g.DrawEllipse(pen, _startPosX + 90, _startPosY + 20, 20, 20);
}
if (Cruiser.Coating)
{
//если есть спец покрытие для площадки под вертолет
g.FillEllipse(Brushes.Red, _startPosX + 90, _startPosY + 20, 20, 20);
}
/* if (Cruiser.HelicopterPad)
{
//если есть площадка под вертолет
g.DrawEllipse(pen, _startPosX + 90, _startPosY + 20, 20, 20);
}
if (Cruiser.Coating)
{
//если есть спец покрытие для площадки под вертолет
g.FillEllipse(Brushes.Red, _startPosX + 90, _startPosY + 20, 20, 20);
}*/
}
}
}

View File

@@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Cruiser.DrawningObjects;
using Cruiser.MovementStrategy;
namespace Cruiser.MovementStrategy
{
internal class DrawningObjectCar : IMoveableObject
{
private readonly DrawningCruiser? _drawningCar = null;
public DrawningObjectCar(DrawningCruiser drawningCar)
{
_drawningCar = drawningCar;
}
public ObjectParameters? GetObjectPosition
{
get
{
if (_drawningCar == null || _drawningCar.EntityCruiser ==
null)
{
return null;
}
return new ObjectParameters(_drawningCar.GetPosX,
_drawningCar.GetPosY, _drawningCar.GetWidth, _drawningCar.GetHeight);
}
}
public int GetStep => (int)(_drawningCar?.EntityCruiser?.Step ?? 0);
public bool CheckCanMove(Direction direction) =>
_drawningCar?.CanMove(direction) ?? false;
public void MoveObject(Direction direction) =>
_drawningCar?.MoveTransport(direction);
}
}

View File

@@ -0,0 +1,57 @@
using Cruiser.DrawningObjects;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Cruiser.Entities;
using Cruiser;
namespace Cruiser.DrawningObjects
{
public class DrawningPro : DrawningCruiser
{
public DrawningPro(int speed, double weight, Color bodyColor, Color additionalColor, bool headlights, bool helicopterPad, bool coating, int width, int height) : base(speed, weight, bodyColor, width, height, 150, 50)
{
if (EntityCruiser != null)
{
EntityCruiser = new Pro(speed, weight, bodyColor, additionalColor, headlights, helicopterPad, coating);
}
}
public override void DrawTransport(Graphics g)
{
if (EntityCruiser is not Pro cruiser)
{
return;
}
Pen pen = new Pen(Color.Black);
Brush addBrush = new SolidBrush(cruiser.AdditionalColor);
Brush brush = new SolidBrush(cruiser.BodyColor);
base.DrawTransport(g);
if (cruiser.Headlights)
{
Brush brYellow = new SolidBrush(Color.Yellow);
g.FillEllipse(brYellow, _startPosX + 80, _startPosY + 5, 20,
20);
g.FillEllipse(brYellow, _startPosX + 80, _startPosY + 35, 20,
20);
}
if (cruiser.HelicopterPad)
{
//если есть площадка под вертолет
g.DrawEllipse(pen, _startPosX + 90, _startPosY + 20, 20, 20);
}
/* if (cruiser.Coating)
{
//если есть спец покрытие для площадки под вертолет
g.FillEllipse(Brushes.Red, _startPosX + 90, _startPosY + 20, 20, 20);
}*/
}
}
}

View File

@@ -0,0 +1,47 @@
namespace Cruiser
{
partial class FormCarCollection
{
/// <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.SuspendLayout();
//
// FormCarCollection
//
this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 25F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Name = "FormCarCollection";
this.Text = "FormCarCollection";
this.Load += new System.EventHandler(this.FormCarCollection_Load);
this.ResumeLayout(false);
}
#endregion
}
}

View File

@@ -0,0 +1,95 @@
using Cruiser.DrawningObjects;
using Cruiser.Generics;
using Cruiser.MovementStrategy;
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 Cruiser.MovementStrategy;
using Cruiser.DrawningObjects;
using Cruiser.Generics;
namespace DumpTruck
{
public partial class FormCarCollection : Form
{
private readonly CarsGenericCollection<DrawningCruiser, DrawningObjectCar> _cars;
public FormCarCollection()
{
InitializeComponent();
_cars = new CarsGenericCollection<DrawningCruiser, DrawningObjectCar>(pictureBoxCollection.Width, pictureBoxCollection.Height);
}
private void Form2_Load(object sender, EventArgs e)
{
}
private void pictureBoxCollection_Click(object sender, EventArgs e)
{
}
private void ButtonAddCar_Click(object sender, EventArgs e)
{
FormDumpTruck form = new();
if (form.ShowDialog() == DialogResult.OK)
{
if (_cars + form.SelectedCar != null)
{
MessageBox.Show("Объект добавлен");
pictureBoxCollection.Image = _cars.ShowCars();
}
else
{
MessageBox.Show("Не удалось добавить объект");
}
}
}
private void ButtonRemoveCar_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Удалить объект?", "Удаление",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
{
return;
}
int pos;
if (maskedTextBoxNumber.Text == null || !int.TryParse(maskedTextBoxNumber.Text, out pos))
{
MessageBox.Show("Введите номер парковочного места");
return;
}
if (_cars - pos != null)
{
MessageBox.Show("Объект удален");
pictureBoxCollection.Image = _cars.ShowCars();
}
else
{
MessageBox.Show("Не удалось удалить объект");
}
}
private void ButtonRefreshCollection_Click(object sender, EventArgs e)
{
pictureBoxCollection.Image = _cars.ShowCars();
}
private void maskedTextBoxNumber_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
{
}
}
}

View File

@@ -0,0 +1,60 @@
<root>
<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,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Cruiser.MovementStrategy
{
public interface IMoveableObject
{
ObjectParameters? GetObjectPosition { get; }
/// <summary>
/// Шаг объекта
/// </summary>
int GetStep { get; }
/// <summary>
/// Проверка, можно ли переместиться по нужному направлению
/// </summary>
/// <param name="direction"></param>
/// <returns></returns>
bool CheckCanMove(Direction direction);
/// <summary>
/// Изменение направления пермещения объекта
/// </summary>
/// <param name="direction">Направление</param>
void MoveObject(Direction direction);
}
}

View File

@@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Cruiser.MovementStrategy
{
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;
}
}
}

31
Cruiser/Cruiser/Pro.cs Normal file
View File

@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Net.Mime.MediaTypeNames;
namespace Cruiser.Entities
{
public class Pro : EntityCruiser
{
public Color AdditionalColor { get; private set; }
public bool Headlights { get; private set; }
public bool HelicopterPad { get; private set; }
public bool Coating { get; private set; }
public Pro(int speed, double weight, Color bodyColor, Color
additionalColor, bool headlights, bool helicopterPad, bool coating) : base(speed, weight, bodyColor)
{
AdditionalColor = additionalColor;
Headlights = headlights;
HelicopterPad = helicopterPad;
Coating = coating;
}
}
}

View File

@@ -0,0 +1,106 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CruiserGenerics
{
internal class SetGeneric<T>
where T : class
{
/// <summary>
/// Массив объектов, которые храним
/// </summary>
private readonly T?[] _places;
/// <summary>
/// Количество объектов в массиве
/// </summary>
public int Count => _places.Length;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="count"></param>
///
public int startPointer = 0;
public SetGeneric(int count)
{
_places = new T?[count];
}
/// <summary>
/// Добавление объекта в набор
/// </summary>
/// <param name="car">Добавляемый автомобиль</param>
/// <returns></returns>
public T? Insert(T car)
{
if (_places[Count - 1] != null)
return null;
return Insert(car, 0);
}
/// <summary>
/// Добавление объекта в набор на конкретную позицию
/// </summary>
/// <param name="car">Добавляемый автомобиль</param>
/// <param name="position">Позиция</param>
/// <returns></returns>
public T? Insert(T car, int position)
{
if (!(position >= 0 && position < Count))
return null;
if (_places[position] != null)
{
int indexEnd = position;
while (_places[indexEnd] != null)
{
indexEnd++;
}
if (indexEnd == Count)
return null;
for (int i = indexEnd + 1; i > position; i--)
{
_places[i] = _places[i - 1];
}
}
_places[position] = car;
return car;
}
// TODO проверка, что элемент массива по этой позиции пустой, если нет, то
// проверка, что после вставляемого элемента в массиве есть пустой элемент
// сдвиг всех объектов, находящихся справа от позиции до первого пустого элемента
// TODO вставка по позиции
/// <summary>
/// Удаление объекта из набора с конкретной позиции
/// </summary>
/// <param name="position"></param>
/// <returns></returns>
public bool Remove(int position)
{
if (position < Count && position >= 0)
{
_places[position] = null;
return true;
}
return false;
}
/// <summary>
/// Получение объекта из набора по позиции
/// </summary>
/// <param name="position"></param>
/// <returns></returns>
public T? Get(int position)
{
if (position < Count && position >= 0) { return _places[position]; }
return null;
}
}
}

15
Cruiser/Cruiser/Status.cs Normal file
View File

@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Cruiser.MovementStrategy
{
public enum Status
{
NotInit,
InProgress,
Finish
}
}