лаб - 3
This commit is contained in:
parent
e3b92a45ff
commit
e1db93a2e7
@ -32,52 +32,124 @@ namespace AircraftCarrier
|
||||
}
|
||||
public Bitmap MoveObject(Direction direction)
|
||||
{
|
||||
// TODO проверка, что объект может переместится в требуемом
|
||||
(float leftX, float topY, float rightX, float bottomY) = _drawningObject.GetCurrentPosition();
|
||||
bool roadIsClear = true;
|
||||
(float Left, float Top, float Right, float Bottom) = _drawningObject.GetCurrentPosition();
|
||||
int xNumOfCells;
|
||||
int yNumOfCells;
|
||||
int xObjOffset;
|
||||
int yObjOffset;
|
||||
|
||||
float aircraftcarrierWidth = rightX - leftX;
|
||||
float aircraftcarrierHeight = bottomY - topY;
|
||||
for (int i = 0; i < _map.GetLength(0); i++)
|
||||
{
|
||||
for (int j = 0; j < _map.GetLength(1); j++)
|
||||
{
|
||||
if (_map[i, j] == _barrier)
|
||||
{
|
||||
switch (direction)
|
||||
{
|
||||
case Direction.Up:
|
||||
if (_size_y * (j + 1) >= topY - _drawningObject.Step && _size_y * (j + 1) < topY && _size_x * (i + 1) > leftX
|
||||
&& _size_x * (i + 1) <= rightX)
|
||||
xNumOfCells = (int)Math.Ceiling((Right - Left) / _size_x);
|
||||
yNumOfCells = (int)Math.Ceiling(_drawningObject.Step / _size_y);
|
||||
xObjOffset = (int)(Left / _size_x);
|
||||
yObjOffset = (int)Math.Floor(Top / _size_y);
|
||||
|
||||
for (int i = 0; i < yNumOfCells; i++)
|
||||
{
|
||||
return DrawMapWithObject();
|
||||
if (!roadIsClear)
|
||||
{
|
||||
break;
|
||||
}
|
||||
for (int j = 0; j < xNumOfCells; j++)
|
||||
{
|
||||
if (yObjOffset - i < 0 || xObjOffset + j >= _map.GetLength(1))
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (_map[xObjOffset + j, yObjOffset - i] == _barrier)
|
||||
{
|
||||
roadIsClear = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case Direction.Down:
|
||||
if (_size_y * j <= bottomY + _drawningObject.Step && _size_y * j > bottomY && _size_x * (i + 1) > leftX
|
||||
&& _size_x * (i + 1) <= rightX)
|
||||
xNumOfCells = (int)Math.Ceiling((Right - Left) / _size_x);
|
||||
yNumOfCells = (int)Math.Ceiling(_drawningObject.Step / _size_y);
|
||||
xObjOffset = (int)(Left / _size_x);
|
||||
yObjOffset = (int)Math.Ceiling(Bottom / _size_y);
|
||||
|
||||
for (int i = 0; i < yNumOfCells; i++)
|
||||
{
|
||||
return DrawMapWithObject();
|
||||
if (!roadIsClear)
|
||||
{
|
||||
break;
|
||||
}
|
||||
for (int j = 0; j < xNumOfCells; j++)
|
||||
{
|
||||
if (yObjOffset + i >= _map.GetLength(0) || xObjOffset + j >= _map.GetLength(1))
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (_map[xObjOffset + j, yObjOffset + i] == _barrier)
|
||||
{
|
||||
roadIsClear = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case Direction.Left:
|
||||
if (_size_x * (i + 1) >= leftX - _drawningObject.Step && _size_x * (i + 1) < leftX && _size_y * (j + 1) < bottomY
|
||||
&& _size_y * (j + 1) >= topY)
|
||||
xNumOfCells = (int)Math.Ceiling(_drawningObject.Step / _size_x);
|
||||
yNumOfCells = (int)Math.Ceiling((Bottom - Top) / _size_y);
|
||||
xObjOffset = (int)Math.Floor(Left / _size_x);
|
||||
yObjOffset = (int)(Top / _size_y);
|
||||
|
||||
for (int i = 0; i < yNumOfCells; i++)
|
||||
{
|
||||
return DrawMapWithObject();
|
||||
if (!roadIsClear)
|
||||
{
|
||||
break;
|
||||
}
|
||||
for (int j = 0; j < xNumOfCells; j++)
|
||||
{
|
||||
if (yObjOffset + i >= _map.GetLength(0) || xObjOffset - j < 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (_map[xObjOffset - j, yObjOffset + i] == _barrier)
|
||||
{
|
||||
roadIsClear = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case Direction.Right:
|
||||
if (_size_x * i <= rightX + _drawningObject.Step && _size_x * i > leftX && _size_y * (j + 1) < bottomY
|
||||
&& _size_y * (j + 1) >= topY)
|
||||
xNumOfCells = (int)Math.Ceiling(_drawningObject.Step / _size_x);
|
||||
yNumOfCells = (int)Math.Ceiling((Bottom - Top) / _size_y);
|
||||
xObjOffset = (int)(Right / _size_x);
|
||||
yObjOffset = (int)Math.Ceiling(Top / _size_y);
|
||||
|
||||
for (int i = 0; i < yNumOfCells; i++)
|
||||
{
|
||||
return DrawMapWithObject();
|
||||
if (!roadIsClear)
|
||||
{
|
||||
break;
|
||||
}
|
||||
for (int j = 0; j < xNumOfCells; j++)
|
||||
{
|
||||
if (yObjOffset + i >= _map.GetLength(0) || xObjOffset + j >= _map.GetLength(1))
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (_map[xObjOffset + j, yObjOffset + i] == _barrier)
|
||||
{
|
||||
roadIsClear = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (true)
|
||||
if (roadIsClear)
|
||||
{
|
||||
_drawningObject.MoveObject(direction);
|
||||
}
|
||||
@ -85,31 +157,56 @@ namespace AircraftCarrier
|
||||
}
|
||||
private bool SetObjectOnMap()
|
||||
{
|
||||
(float leftX, float topY, float rightX, float bottomY) = _drawningObject.GetCurrentPosition();
|
||||
if (_drawningObject == null || _map == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
float aircraftcarrierWidth = rightX - leftX;
|
||||
float aircraftcarrierHeight = bottomY - topY;
|
||||
int x = _random.Next(0, 10);
|
||||
int y = _random.Next(0, 10);
|
||||
for (int i = 0; i < _map.GetLength(0); ++i)
|
||||
int y = _random.Next(50, 100);
|
||||
|
||||
(float Left, float Top, float Right, float Bottom) = _drawningObject.GetCurrentPosition();
|
||||
int xNumOfCells = (int)Math.Ceiling(Right / _size_x) - (int)Math.Floor(Left / _size_x);
|
||||
int yNumOfCells = (int)Math.Ceiling(Bottom / _size_y) - (int)Math.Floor(Top / _size_y);
|
||||
int xObjOffset = (int)(x / _size_x);
|
||||
int yObjOffset = (int)(y / _size_y);
|
||||
|
||||
while (y < _height - (Bottom - Top))
|
||||
{
|
||||
for (int j = 0; j < _map.GetLength(1); ++j)
|
||||
while (x < _width - (Right - Left))
|
||||
{
|
||||
if (_map[i, j] == _barrier)
|
||||
if (AreaIsFree(xNumOfCells, yNumOfCells, xObjOffset, yObjOffset))
|
||||
{
|
||||
if (x + aircraftcarrierWidth >= _size_x * i && x <= _size_x * i && y + aircraftcarrierHeight > _size_y * j && y <= _size_y * j)
|
||||
_drawningObject.SetObject(x, y, _width, _height);
|
||||
return true;
|
||||
}
|
||||
x += (int)_size_x;
|
||||
xObjOffset = (int)(x / _size_x);
|
||||
}
|
||||
x = 0;
|
||||
y += (int)_size_y;
|
||||
yObjOffset = (int)(y / _size_y);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
private bool AreaIsFree(int xNumOfCells, int yNumOfCells, int xObjOffset, int yObjOffset)
|
||||
{
|
||||
for (int i = 0; i <= yNumOfCells; i++)
|
||||
{
|
||||
for (int j = 0; j <= xNumOfCells; j++)
|
||||
{
|
||||
if (yObjOffset + i >= _map.GetLength(0) || xObjOffset + j >= _map.GetLength(1))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (_map[xObjOffset + j, yObjOffset + i] == _barrier)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
_drawningObject.SetObject(x, y, _width, _height);
|
||||
return true;
|
||||
}
|
||||
|
||||
private Bitmap DrawMapWithObject()
|
||||
{
|
||||
Bitmap bmp = new(_width, _height);
|
||||
@ -138,6 +235,5 @@ namespace AircraftCarrier
|
||||
protected abstract void GenerateMap();
|
||||
protected abstract void DrawRoadPart(Graphics g, int i, int j);
|
||||
protected abstract void DrawBarrierPart(Graphics g, int i, int j);
|
||||
|
||||
}
|
||||
}
|
@ -16,7 +16,6 @@ namespace AircraftCarrier
|
||||
/// Цвет участка открытого
|
||||
/// </summary>
|
||||
private readonly Brush roadColor = new SolidBrush(Color.LightBlue);
|
||||
|
||||
protected override void DrawBarrierPart(Graphics g, int i, int j)
|
||||
{
|
||||
g.FillEllipse(barrierColor, i * (_size_x - 1), j * (_size_y - 1), 40, 15);
|
||||
@ -38,7 +37,7 @@ namespace AircraftCarrier
|
||||
_map[i, j] = _freeRoad;
|
||||
}
|
||||
}
|
||||
while (counter < 5)
|
||||
while (counter < 7)
|
||||
{
|
||||
int x = _random.Next(0, 100);
|
||||
int y = _random.Next(0, 100);
|
||||
|
@ -6,7 +6,7 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace AircraftCarrier
|
||||
{
|
||||
internal enum Direction
|
||||
public enum Direction
|
||||
{
|
||||
None = 0,
|
||||
Up = 1,
|
||||
|
@ -10,7 +10,7 @@ namespace AircraftCarrier
|
||||
/// <summary>
|
||||
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
|
||||
/// </summary>
|
||||
internal class DrawningAircraftCarrier
|
||||
public class DrawningAircraftCarrier
|
||||
{
|
||||
/// <summary>
|
||||
/// Класс-сущность
|
||||
@ -36,8 +36,8 @@ namespace AircraftCarrier
|
||||
/// Ширина отрисовки самолета
|
||||
/// </summary>
|
||||
|
||||
protected readonly int _aircraftcarrierWidth = 270;
|
||||
protected readonly int _aircraftcarrierHeight = 120;
|
||||
protected readonly int _aircraftcarrierWidth = 230;
|
||||
protected readonly int _aircraftcarrierHeight = 80;
|
||||
public DrawningAircraftCarrier(int speed, float weight, Color bodyColor)
|
||||
{
|
||||
AircraftCarrier = new EntityAircraftCarrier(speed, weight, bodyColor);
|
||||
@ -53,7 +53,6 @@ namespace AircraftCarrier
|
||||
{
|
||||
_startPosX = x;
|
||||
_startPosY = y;
|
||||
|
||||
_pictureWidth = width;
|
||||
_pictureHeigth = height;
|
||||
}
|
||||
@ -99,20 +98,20 @@ namespace AircraftCarrier
|
||||
return;
|
||||
}
|
||||
Pen pen = new(Color.Black);
|
||||
Point PointFront_1 = new Point((int)_startPosX, (int)_startPosY);//основа
|
||||
Point PointFront_2 = new Point((int)_startPosX + 160, (int)_startPosY);
|
||||
Point PointFront_3 = new Point((int)_startPosX + 220, (int)_startPosY + 40);
|
||||
Point PointFront_4 = new Point((int)_startPosX + 160, (int)_startPosY + 80);
|
||||
Point PointFront_5 = new Point((int)_startPosX, (int)_startPosY + 80);
|
||||
Point PointFront_1 = new Point((int)_startPosX + 10, (int)_startPosY);//основа
|
||||
Point PointFront_2 = new Point((int)_startPosX + 170, (int)_startPosY);
|
||||
Point PointFront_3 = new Point((int)_startPosX + 230, (int)_startPosY + 40);
|
||||
Point PointFront_4 = new Point((int)_startPosX + 170, (int)_startPosY + 80);
|
||||
Point PointFront_5 = new Point((int)_startPosX + 10, (int)_startPosY + 80);
|
||||
Point[] PointsFront = { PointFront_1, PointFront_2, PointFront_3, PointFront_4, PointFront_5 };
|
||||
g.DrawPolygon(pen, PointsFront);
|
||||
Brush brBlack = new SolidBrush(Color.Black);//наружние блоки
|
||||
g.FillRectangle(brBlack, _startPosX - 9, _startPosY + 20, 10, 15);
|
||||
g.FillRectangle(brBlack, _startPosX - 9, _startPosY + 55, 10, 15);
|
||||
Brush br = new SolidBrush(Color.Red);//внутренние блоки
|
||||
g.FillRectangle(br, _startPosX + 110, _startPosY + 24, 20, 30);
|
||||
g.FillRectangle(br, _startPosX + 90, _startPosY + 36, 20, 10);
|
||||
g.FillEllipse(br, _startPosX + 130, _startPosY + 27, 32, 30);
|
||||
g.FillRectangle(brBlack, _startPosX, _startPosY + 20, 10, 15);
|
||||
g.FillRectangle(brBlack, _startPosX, _startPosY + 55, 10, 15);
|
||||
Brush br = new SolidBrush(AircraftCarrier?.BodyColor ?? Color.Black);//внутренние блоки
|
||||
g.FillRectangle(br, _startPosX + 130, _startPosY + 24, 20, 30);
|
||||
g.FillRectangle(br, _startPosX + 110, _startPosY + 36, 20, 10);
|
||||
g.FillEllipse(br, _startPosX + 150, _startPosY + 27, 32, 30);
|
||||
}
|
||||
public void ChangeBorders(int width, int height)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user