ISEbd-12_Frolova.A.S._LabWork02_Simple #2

Closed
Fr_Alyona wants to merge 3 commits from LabWork02 into LabWork01
8 changed files with 277 additions and 128 deletions
Showing only changes of commit 1310766ce8 - Show all commits

View File

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

View File

@ -1,14 +1,18 @@
namespace ProjectCatamaran;
using ProjectCatamaran.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawningCatamaran
namespace ProjectCatamaran.Drawnings;
public class DrawningBoat
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityCatamaran? EntityCatamaran { get; private set; }
public EntityBoat? EntityBoat { get; protected set; }
/// <summary>
/// Ширина окна
@ -23,43 +27,56 @@ public class DrawningCatamaran
/// <summary>
/// Левая координата прорисовки катамарана
/// </summary>
private int? _startPosX;
protected int? _startPosX;
/// <summary>
/// Верхняя координата прорисовки катамарана
/// </summary>
private int? _startPosY;
protected int? _startPosY;
/// <summary>
/// Ширина прорисовки катамарана
/// </summary>
private readonly int _drawningCatamaranWidth = 87;
private readonly int _drawningCatamaranWidth = 80;
/// <summary>
/// Высота прорисовки катамарана
/// </summary>
private readonly int _drawningCatamaranHeight = 81;
private readonly int _drawningCatamaranHeight = 62;
/// <summary>
/// Инициализация свойств
/// Пустой конструктор
/// </summary>
/// <param name="speed"></param>
/// <param name="weight"></param>
/// <param name="bodyColor"></param>
/// <param name="additionalColor"></param>
/// <param name="sail"></param>
/// <param name="leftfloater"></param>
/// <param name="rightfloater"></param>
public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool sail,
bool leftfloater, bool rightfloater)
private DrawningBoat()
{
EntityCatamaran = new EntityCatamaran();
EntityCatamaran.Init(speed, weight, bodyColor, additionalColor, sail, leftfloater, rightfloater);
_pictureWidth = null;
_pictureHeight = null;
_startPosX = null;
_startPosY = null;
}
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed"></param>
/// <param name="weight"></param>
/// <param name="bodyColor"></param
public DrawningBoat(int speed, double weight, Color bodyColor) : this()
{
EntityBoat = new EntityBoat(speed, weight, bodyColor);
}
/// <summary>
/// Конструктор для наследников
/// </summary>
/// <param name="drawningCatamaranWidth">Ширина прорисовки катамарана</param>
/// <param name="drawningCatamaranHeight">Высота прорисовки катамарана</param>
protected DrawningBoat(int drawningCatamaranWidth, int drawningCatamaranHeight) : this()
{
_drawningCatamaranWidth = drawningCatamaranWidth;
_drawningCatamaranHeight = drawningCatamaranHeight;
}
/// <summary>
/// Установка границ поля
@ -98,14 +115,21 @@ public class DrawningCatamaran
return;
}
if (x < 0 || x + _drawningCatamaranWidth > _pictureWidth || y < 0 || y + _drawningCatamaranHeight > _pictureHeight)
if (x < 0 || x + _drawningCatamaranWidth > _pictureWidth)
{
_startPosX = _pictureWidth - _drawningCatamaranWidth;
_startPosY = _pictureHeight - _drawningCatamaranHeight;
}
else
{
_startPosX = x;
}
if (y < 0 || y + _drawningCatamaranHeight > _pictureHeight)
{
_startPosY = _pictureHeight - _drawningCatamaranHeight;
}
else
{
_startPosY = y;
}
}
@ -117,7 +141,7 @@ public class DrawningCatamaran
/// <returns>- перемещение выполнено, false - перемещение невозможно</returns>
public bool MoveTransport(DirectionType direction)
{
if (EntityCatamaran == null || !_startPosX.HasValue || !_startPosY.HasValue)
if (EntityBoat == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return false;
}
@ -125,31 +149,31 @@ public class DrawningCatamaran
{
//влево
case DirectionType.Left:
if (_startPosX.Value - EntityCatamaran.Step > 0)
if (_startPosX.Value - EntityBoat.Step > 0)
{
_startPosX -= (int)EntityCatamaran.Step;
_startPosX -= (int)EntityBoat.Step;
}
return true;
//вверх
case DirectionType.Up:
if (_startPosY.Value - EntityCatamaran.Step > 0)
if (_startPosY.Value - EntityBoat.Step > 0)
{
_startPosY -= (int)EntityCatamaran.Step;
_startPosY -= (int)EntityBoat.Step;
}
return true;
// вправо
case DirectionType.Right:
if (_startPosX.Value + EntityCatamaran.Step + _drawningCatamaranWidth < _pictureWidth)
if (_startPosX.Value + EntityBoat.Step + _drawningCatamaranWidth < _pictureWidth)
{
_startPosX += (int)EntityCatamaran.Step;
_startPosX += (int)EntityBoat.Step;
return true;
}
return true;
//вниз
case DirectionType.Down:
if (_startPosY.Value + EntityCatamaran.Step + _drawningCatamaranHeight < _pictureHeight)
if (_startPosY.Value + EntityBoat.Step + _drawningCatamaranHeight < _pictureHeight)
{
_startPosY += (int)EntityCatamaran.Step;
_startPosY += (int)EntityBoat.Step;
}
return true;
default:
@ -161,57 +185,30 @@ public class DrawningCatamaran
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public void DrawTransport(Graphics g)
public virtual void DrawTransport(Graphics g)
{
if (EntityCatamaran == null || !_startPosX.HasValue || !_startPosY.HasValue)
if (EntityBoat == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
Pen pen = new(Color.Black);
Brush bodyColorBrush = new SolidBrush(EntityCatamaran.BodyColor);
Brush additionalBrush = new SolidBrush(EntityCatamaran.AdditionalColor);
Brush bodyColorBrush = new SolidBrush(EntityBoat.BodyColor);
//тело катамарана
g.FillRectangle(bodyColorBrush, _startPosX.Value + 10, _startPosY.Value + 40, 57, 30);
g.DrawRectangle(pen, _startPosX.Value + 10, _startPosY.Value + 40, 57, 30);
g.FillRectangle(bodyColorBrush, _startPosX.Value, _startPosY.Value + 32, 57, 30);
g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 32, 57, 30);
g.FillEllipse(bodyColorBrush, _startPosX.Value + 20, _startPosY.Value + 48, 40, 13);
g.DrawEllipse(pen, _startPosX.Value + 20, _startPosY.Value + 48, 40, 13);
g.FillEllipse(bodyColorBrush, _startPosX.Value + 9, _startPosY.Value + 40, 40, 13);
g.DrawEllipse(pen, _startPosX.Value + 9, _startPosY.Value + 40, 40, 13);
//нос катамарана
Point[] Nose = new Point[3];
Nose[0].X = _startPosX.Value + 67; Nose[0].Y = _startPosY.Value + 40;
Nose[1].X = _startPosX.Value + 88; Nose[1].Y = _startPosY.Value + 55;
Nose[2].X = _startPosX.Value + 67; Nose[2].Y = _startPosY.Value + 70;
Nose[0].X = _startPosX.Value + 57; Nose[0].Y = _startPosY.Value + 32;
Nose[1].X = _startPosX.Value + 80; Nose[1].Y = _startPosY.Value + 47;
Nose[2].X = _startPosX.Value + 57; Nose[2].Y = _startPosY.Value + 62;
g.FillPolygon(bodyColorBrush, Nose);
g.DrawPolygon(pen, Nose);
//поплавки
if (EntityCatamaran.Leftfloater)
{
g.FillEllipse(additionalBrush, _startPosX.Value + 10, _startPosY.Value + 27, 57, 13);
g.DrawEllipse(pen, _startPosX.Value + 10, _startPosY.Value + 27, 57, 13);
}
if (EntityCatamaran.Rightfloater)
{
g.FillEllipse(additionalBrush, _startPosX.Value + 10, _startPosY.Value + 70, 57, 13);
g.DrawEllipse(pen, _startPosX.Value + 10, _startPosY.Value + 70, 57, 13);
}
//флаг
if (EntityCatamaran.Sail)
{
g.DrawLine(pen, _startPosX.Value + 38, _startPosY.Value + 55, _startPosX.Value + 38, _startPosY.Value + 10);
Point[] Flag = new Point[3];
Flag[0].X = _startPosX.Value + 38; Flag[0].Y = _startPosY.Value + 10;
Flag[1].X = _startPosX.Value + 55; Flag[1].Y = _startPosY.Value + 45;
Flag[2].X = _startPosX.Value + 38; Flag[2].Y = _startPosY.Value + 45;
g.FillPolygon(additionalBrush, Flag);
g.DrawPolygon(pen, Flag);
}
}
}

View File

@ -0,0 +1,95 @@
using ProjectCatamaran.Entities;
namespace ProjectCatamaran.Drawnings;
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawningCatamaran : DrawningBoat
{
/// <summary>
/// Ширина окна
/// </summary>
private int? _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int? _pictureHeight;
/// <summary>
/// Левая координата прорисовки катамарана
/// </summary>
private int? GetPosX => _startPosX;
/// <summary>
/// Верхняя координата прорисовки катамарана
/// </summary>
private int? GetPosY => _startPosY;
/// <summary>
/// Ширина прорисовки катамарана
/// </summary>
private readonly int _drawningCatamaranWidth = 79;
/// <summary>
/// Высота прорисовки катамарана
/// </summary>
private readonly int _drawningCatamaranHeight = 75;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed"></param>
/// <param name="weight"></param>
/// <param name="bodyColor"></param>
/// <param name="additionalColor"></param>
/// <param name="sail"></param>
/// <param name="leftfloater"></param>
/// <param name="rightfloater"></param>
public DrawningCatamaran(int speed, double weight, Color bodyColor, Color additionalColor, bool sail, bool leftfloater, bool rightfloater) : base(79, 75)
{
EntityBoat = new EntityCatamaran(speed, weight, bodyColor, additionalColor, sail, leftfloater, rightfloater);
}
public override void DrawTransport(Graphics g)
{
if (EntityBoat == null || EntityBoat is not EntityCatamaran catamaran || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
Pen pen = new(Color.Black);
Brush additionalBrush = new SolidBrush(catamaran.AdditionalColor);
base.DrawTransport(g);
//поплавки
if (catamaran.Leftfloater)
{
g.FillEllipse(additionalBrush, _startPosX.Value, _startPosY.Value + 20, 57, 13);
g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value + 20, 57, 13);
}
if (catamaran.Rightfloater)
{
g.FillEllipse(additionalBrush, _startPosX.Value, _startPosY.Value + 62, 57, 13);
g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value + 62, 57, 13);
}
//флаг
if (catamaran.Sail)
{
g.DrawLine(pen, _startPosX.Value + 29, _startPosY.Value + 48, _startPosX.Value + 29, _startPosY.Value);
Point[] Flag = new Point[3];
Flag[0].X = _startPosX.Value + 29; Flag[0].Y = _startPosY.Value + 38;
Flag[1].X = _startPosX.Value + 48; Flag[1].Y = _startPosY.Value + 38;
Flag[2].X = _startPosX.Value + 29; Flag[2].Y = _startPosY.Value;
g.FillPolygon(additionalBrush, Flag);
g.DrawPolygon(pen, Flag);
}
}
}

View File

@ -1,24 +1,10 @@
namespace ProjectCatamaran;
namespace ProjectCatamaran.Entities;
/// <summary>
/// Класс-сущность "Катамаран"
/// </summary>
public class EntityCatamaran
public class EntityCatamaran : EntityBoat
{
/// <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>
/// Дополнительный цвет (для опциональных элементов)
@ -40,14 +26,9 @@ public class EntityCatamaran
/// </summary>
public bool Sail { get; private set; }
/// <summary>
///
/// </summary>
public double Step => Speed * 100 / Weight;
/// <summary>
///
/// Инициализация полей объекта-класса катамарана
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
@ -56,11 +37,8 @@ public class EntityCatamaran
/// <param name="leftfloater">Признак наличия левого поплавка</param>
/// <param name="rightfloater">Признак наличия правого поплавка</param>
/// <param name="sail">Признак наличия паруса</param>
public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool leftfloater, bool rightfloater, bool sail)
public EntityCatamaran(int speed, double weight, Color bodyColor, Color additionalColor, bool leftfloater, bool rightfloater, bool sail) : base(speed, weight, bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
AdditionalColor = additionalColor;
Leftfloater = leftfloater;
Rightfloater = rightfloater;

View File

@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectCatamaran.Entities;
/// <summary>
/// Класс-сущности "Катамарана_1"
/// </summary>
public class EntityBoat
{
/// <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 => Speed * 100 / Weight;
/// <summary>
/// Конструктор сущности
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
public EntityBoat(int speed, double weight, Color bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
}
}

View File

@ -34,6 +34,7 @@
buttonLeft = new Button();
buttonDown = new Button();
buttonRight = new Button();
buttonCreatBoat = new Button();
((System.ComponentModel.ISupportInitialize)pictureBoxCatamaran).BeginInit();
SuspendLayout();
//
@ -45,16 +46,15 @@
pictureBoxCatamaran.Size = new Size(800, 450);
pictureBoxCatamaran.TabIndex = 0;
pictureBoxCatamaran.TabStop = false;
pictureBoxCatamaran.Click += ButtonMove_Click;
//
// buttonCreateCatamaran
//
buttonCreateCatamaran.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCreateCatamaran.Location = new Point(12, 409);
buttonCreateCatamaran.Name = "buttonCreateCatamaran";
buttonCreateCatamaran.Size = new Size(94, 29);
buttonCreateCatamaran.Size = new Size(203, 29);
buttonCreateCatamaran.TabIndex = 1;
buttonCreateCatamaran.Text = "Создать";
buttonCreateCatamaran.Text = "Создать катамаран";
buttonCreateCatamaran.UseVisualStyleBackColor = true;
buttonCreateCatamaran.Click += ButtonCreateCatamaran_Click;
//
@ -108,11 +108,23 @@
buttonRight.UseVisualStyleBackColor = false;
buttonRight.Click += ButtonMove_Click;
//
// buttonCreatBoat
//
buttonCreatBoat.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCreatBoat.Location = new Point(233, 409);
buttonCreatBoat.Name = "buttonCreatBoat";
buttonCreatBoat.Size = new Size(203, 29);
buttonCreatBoat.TabIndex = 6;
buttonCreatBoat.Text = "Создать лодку";
buttonCreatBoat.UseVisualStyleBackColor = true;
buttonCreatBoat.Click += ButtonCreatBoat_Click;
//
// FormCatamaran
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450);
Controls.Add(buttonCreatBoat);
Controls.Add(buttonRight);
Controls.Add(buttonDown);
Controls.Add(buttonLeft);
@ -133,5 +145,6 @@
private Button buttonLeft;
private Button buttonDown;
private Button buttonRight;
private Button buttonCreatBoat;
}
}

View File

@ -7,6 +7,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ProjectCatamaran.Drawnings;
namespace ProjectCatamaran
{
@ -15,7 +16,7 @@ namespace ProjectCatamaran
/// <summary>
/// Поле-объект для прорисовки объекта
/// </summary>
private DrawningCatamaran? _drawningCatamaran;
private DrawningBoat? _drawningBoat;
/// <summary>
/// Конструктор формы
@ -25,40 +26,63 @@ namespace ProjectCatamaran
InitializeComponent();
}
/// <summary>
/// Создание объекта класса-перемещения
/// </summary>
/// <param name="type"></param>
private void CreateObject(string type)
{
Random random = new();
switch (type)
{
case nameof(DrawningBoat):
_drawningBoat = new DrawningBoat(random.Next(100,
300), random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)));
break;
case nameof(DrawningCatamaran):
_drawningBoat = new DrawningCatamaran(random.Next(100, 300), random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)),
Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)));
break;
default:
return;
}
_drawningBoat.SetPictureSize(pictureBoxCatamaran.Width, pictureBoxCatamaran.Height);
_drawningBoat.SetPosition(random.Next(10, 100), random.Next(10, 100));
Draw();
}
/// <summary>
/// Обработка нажатия кнопки "Создать"
/// Обработка нажатия кнопки "Создать катамаран"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonCreateCatamaran_Click(object sender, EventArgs e)
{
Random random = new();
_drawningCatamaran = new DrawningCatamaran();
_drawningCatamaran.Init(random.Next(100, 300), random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)),
Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)));
_drawningCatamaran.SetPictureSize(pictureBoxCatamaran.Width, pictureBoxCatamaran.Height);
_drawningCatamaran.SetPosition(random.Next(10, 100), random.Next(10, 100));
Draw();
private void ButtonCreateCatamaran_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningCatamaran));
}
/// <summary>
/// Обработка нажатия кнопки "Создать лодку"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonCreatBoat_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningBoat));
/// <summary>
/// Метод прорисовки катамарана
/// </summary>
private void Draw()
{
if (_drawningCatamaran == null)
if (_drawningBoat == null)
{
return;
}
Bitmap bmp = new(pictureBoxCatamaran.Width,
pictureBoxCatamaran.Height);
Graphics gr = Graphics.FromImage(bmp);
_drawningCatamaran.DrawTransport(gr);
_drawningBoat.DrawTransport(gr);
pictureBoxCatamaran.Image = bmp;
}
@ -70,7 +94,7 @@ namespace ProjectCatamaran
private void ButtonMove_Click(object sender, EventArgs e)
{
if (_drawningCatamaran == null)
if (_drawningBoat == null)
{
return;
}
@ -79,16 +103,16 @@ namespace ProjectCatamaran
switch (name)
{
case "buttonUp":
result = _drawningCatamaran.MoveTransport(DirectionType.Up);
result = _drawningBoat.MoveTransport(DirectionType.Up);
break;
case "buttonDown":
result = _drawningCatamaran.MoveTransport(DirectionType.Down);
result = _drawningBoat.MoveTransport(DirectionType.Down);
break;
case "buttonLeft":
result = _drawningCatamaran.MoveTransport(DirectionType.Left);
result = _drawningBoat.MoveTransport(DirectionType.Left);
break;
case "buttonRight":
result = _drawningCatamaran.MoveTransport(DirectionType.Right);
result = _drawningBoat.MoveTransport(DirectionType.Right);
break;
}
if (result)
@ -97,5 +121,6 @@ namespace ProjectCatamaran
}
}
}
}

View File

@ -1,4 +1,4 @@
namespace ProjectCatamaran
namespace ProjectCatamaran.Resources
{
internal static class Program
{