diff --git a/AirplaneWithRadar/AirplaneWithRadar/AbstractMap.cs b/AirplaneWithRadar/AirplaneWithRadar/AbstractMap.cs index cbe5959..1934d8f 100644 --- a/AirplaneWithRadar/AirplaneWithRadar/AbstractMap.cs +++ b/AirplaneWithRadar/AirplaneWithRadar/AbstractMap.cs @@ -32,7 +32,61 @@ namespace AirplaneWithRadar public Bitmap MoveObject(Direction direction) { // TODO проверка, что объект может переместится в требуемом направлении - if (true) + + if (direction == Direction.Right) + { + for (int i = (int)(_drawingObject.GetCurrentPosition().Right / _size_x + 1); i < _drawingObject.GetCurrentPosition().Right + _drawingObject.Step / _size_x + 1; i++) + { + for (int j = (int)(_drawingObject.GetCurrentPosition().Top / _size_y + 1 ); j < _drawingObject.GetCurrentPosition().Bottom / _size_y + 1; j++) + { + if (_map[i, j] == _barrier) + { + break; + } + } + } + } + if (direction == Direction.Up) + { + for (int i = (int)(_drawingObject.GetCurrentPosition().Top - _drawingObject.Step / _size_y); i < _drawingObject.GetCurrentPosition().Top / _size_y; i++) + { + for (int j = (int)(_drawingObject.GetCurrentPosition().Left / _size_x); j < _drawingObject.GetCurrentPosition().Right / _size_x; j++) + { + if (_map[i, j] == _barrier) + { + break; + } + } + } + } + if (direction == Direction.Left) + { + for (int i = (int)(_drawingObject.GetCurrentPosition().Left - _drawingObject.Step / _size_x); i < _drawingObject.GetCurrentPosition().Left / _size_x; i++) + { + for (int j = (int)(_drawingObject.GetCurrentPosition().Top / _size_y); j < _drawingObject.GetCurrentPosition().Bottom / _size_y; j++) + { + if (_map[i, j] == _barrier) + { + break; + } + } + } + } + if (direction == Direction.Down) + { + + for (int i = (int)(_drawingObject.GetCurrentPosition().Bottom / _size_y); i < _drawingObject.GetCurrentPosition().Bottom + _drawingObject.Step / _size_y; i++) + { + for (int j = (int)(_drawingObject.GetCurrentPosition().Left / _size_x); j < _drawingObject.GetCurrentPosition().Right / _size_x; j++) + { + if (_map[i, j] == _barrier) + { + break; + } + } + } + } + if (true) { _drawingObject.MoveObject(direction); } @@ -47,6 +101,16 @@ namespace AirplaneWithRadar int x = _random.Next(0, 10); int y = _random.Next(0, 10); _drawingObject.SetObject(x, y, _width, _height); + for (int i = (int)(_drawingObject.GetCurrentPosition().Left/_size_x); i < _drawingObject.GetCurrentPosition().Right/_size_x; i++) + { + for (int j = (int)(_drawingObject.GetCurrentPosition().Top/_size_y); j < _drawingObject.GetCurrentPosition().Bottom/_size_y; j++) + { + if (_map[i,j] == _barrier) + { + return false; + } + } + } // TODO проверка, что объект не "накладывается" на закрытые участки return true; } diff --git a/AirplaneWithRadar/AirplaneWithRadar/DrawingAirplane.cs b/AirplaneWithRadar/AirplaneWithRadar/DrawingAirplane.cs index bc174ff..ffadaa1 100644 --- a/AirplaneWithRadar/AirplaneWithRadar/DrawingAirplane.cs +++ b/AirplaneWithRadar/AirplaneWithRadar/DrawingAirplane.cs @@ -14,13 +14,13 @@ namespace AirplaneWithRadar /// /// Класс-сущность /// - public EntityAirplane Airplane { protected set; get; } + public EntityAirplane Airplane { get; protected set; } /// - /// Левая координата отрисовки самолета + /// Левая координата отрисовки автомобиля /// protected float _startPosX; /// - /// Верхняя кооридната отрисовки самолета + /// Верхняя кооридната отрисовки автомобиля /// protected float _startPosY; /// @@ -32,18 +32,18 @@ namespace AirplaneWithRadar /// private int? _pictureHeight = null; /// - /// Ширина отрисовки самолета + /// Ширина отрисовки автомобиля /// private readonly int _airplaneWidth = 303; /// - /// Высота отрисовки самолета + /// Высота отрисовки автомобиля /// - private readonly int _airplaneHeight = 102; + private readonly int _airplaneHeight = 107; /// /// Инициализация свойств /// /// Скорость - /// Вес самолета + /// Вес автомобиля /// Цвет кузова public DrawingAirplane(int speed, float weight, Color bodyColor) { @@ -55,16 +55,16 @@ namespace AirplaneWithRadar /// Скорость /// Вес автомобиля /// Цвет кузова - /// Ширина отрисовки автомобиля - /// Высота отрисовки автомобиля - protected DrawingAirplane(int speed, float weight, Color bodyColor, int airplaneWidth, int airplaneHeight) : this(speed, weight, bodyColor) + /// Ширина отрисовки автомобиля + /// Высота отрисовки автомобиля + protected DrawingAirplane(int speed, float weight, Color bodyColor, int airplaneWidth, int airplaneHeight) : + this(speed, weight, bodyColor) { _airplaneWidth = airplaneWidth; _airplaneHeight = airplaneHeight; } - /// - /// Установка позиции самолета + /// Установка позиции автомобиля /// /// Координата X /// Координата Y @@ -72,28 +72,32 @@ namespace AirplaneWithRadar /// Высота картинки public void SetPosition(int x, int y, int width, int height) { - // TODO проверки - if (x > 0 && x < width) + // TODO checks + if (x > 0 && x < width) { _startPosX = x; } - if (y > 0 && y < height) + if (y > 0 && y < height) { _startPosY = y; - } + } if (width > 0) { _pictureWidth = width; } - if (height > 0) + if (height > 0) { _pictureHeight = height; - } - - + } + + + //_startPosX = x; + //_startPosY = y; + //_pictureWidth = width; + //_pictureHeight = height; } /// - /// Изменение направления перемещения + /// Изменение направления пермещения /// /// Направление public void MoveTransport(Direction direction) @@ -141,7 +145,7 @@ namespace AirplaneWithRadar public virtual void DrawTransport(Graphics g) { if (_startPosX < 0 || _startPosY < 0 - || !_pictureHeight.HasValue || !_pictureWidth.HasValue) + || !_pictureHeight.HasValue || !_pictureWidth.HasValue) { return; } @@ -181,7 +185,6 @@ namespace AirplaneWithRadar g.FillRectangle(brBlack, _startPosX + 90, _startPosY + 67, 90, 8); g.FillEllipse(brBlack, _startPosX + 83, _startPosY + 66, 9, 9); g.FillEllipse(brBlack, _startPosX + 175, _startPosY + 66, 9, 9); - } /// /// Смена границ формы отрисовки @@ -213,7 +216,7 @@ namespace AirplaneWithRadar /// public (float Left, float Right, float Top, float Bottom) GetCurrentPosition() { - return (_startPosX, _startPosY, _startPosX + _airplaneWidth, _startPosY + _airplaneHeight); + return (_startPosX, _startPosX + _airplaneWidth, _startPosY, _startPosY + _airplaneHeight); } } diff --git a/AirplaneWithRadar/AirplaneWithRadar/DrawingAirplaneWithRadar.cs b/AirplaneWithRadar/AirplaneWithRadar/DrawingAirplaneWithRadar.cs index 3af778f..ea5724a 100644 --- a/AirplaneWithRadar/AirplaneWithRadar/DrawingAirplaneWithRadar.cs +++ b/AirplaneWithRadar/AirplaneWithRadar/DrawingAirplaneWithRadar.cs @@ -12,15 +12,16 @@ namespace AirplaneWithRadar /// Инициализация свойств /// /// Скорость - /// Вес самолета - /// Цвет самолета + /// Вес автомобиля + /// Цвет кузова /// Дополнительный цвет - /// Признак наличия радара - /// Признак наличия дополнительных топливных баков - public DrawingAirplaneWithRadar(int speed, float weight, Color bodyColor, Color dopColor, bool radar, bool extraFuelTank) : base(speed, weight, bodyColor, 110, 60) + /// Признак наличия обвеса + /// Признак наличия антикрыла + public DrawingAirplaneWithRadar(int speed, float weight, Color bodyColor, Color dopColor, bool radar, bool extraFuelTank) : base(speed, weight, bodyColor, 303, 102) { Airplane = new EntityAirplaneWithRadar(speed, weight, bodyColor, dopColor, radar, extraFuelTank); } + public override void DrawTransport(Graphics g) { if (Airplane is not EntityAirplaneWithRadar airplaneWithRadar) diff --git a/AirplaneWithRadar/AirplaneWithRadar/DrawingObjectAirplane.cs b/AirplaneWithRadar/AirplaneWithRadar/DrawingObjectAirplane.cs index 787cb3e..08ac4fd 100644 --- a/AirplaneWithRadar/AirplaneWithRadar/DrawingObjectAirplane.cs +++ b/AirplaneWithRadar/AirplaneWithRadar/DrawingObjectAirplane.cs @@ -28,7 +28,7 @@ namespace AirplaneWithRadar } public void DrawingObject(Graphics g) { - // TODO + _airplane.DrawTransport(g); } } diff --git a/AirplaneWithRadar/AirplaneWithRadar/EntityAirplane.cs b/AirplaneWithRadar/AirplaneWithRadar/EntityAirplane.cs index 167e6dc..eeb5690 100644 --- a/AirplaneWithRadar/AirplaneWithRadar/EntityAirplane.cs +++ b/AirplaneWithRadar/AirplaneWithRadar/EntityAirplane.cs @@ -42,6 +42,8 @@ namespace AirplaneWithRadar Weight = weight <= 0 ? rnd.Next(40, 70) : weight; BodyColor = bodyColor; } + + } } diff --git a/AirplaneWithRadar/AirplaneWithRadar/EntityAirplaneWithRadar.cs b/AirplaneWithRadar/AirplaneWithRadar/EntityAirplaneWithRadar.cs index b5ca4bc..9026595 100644 --- a/AirplaneWithRadar/AirplaneWithRadar/EntityAirplaneWithRadar.cs +++ b/AirplaneWithRadar/AirplaneWithRadar/EntityAirplaneWithRadar.cs @@ -13,11 +13,11 @@ namespace AirplaneWithRadar /// public Color DopColor { get; private set; } /// - /// Признак наличия радара + /// Признак наличия обвеса /// public bool Radar { get; private set; } /// - /// Признак наличия дополнительных топливных баков + /// Признак наличия антикрыла /// public bool ExtraFuelTank { get; private set; } /// @@ -27,8 +27,8 @@ namespace AirplaneWithRadar /// Вес автомобиля /// Цвет кузова /// Дополнительный цвет - /// Признак наличия радара - /// Признак наличия дополнительных топливных баков + /// Признак наличия обвеса + /// Признак наличия антикрыла public EntityAirplaneWithRadar(int speed, float weight, Color bodyColor, Color dopColor, bool radar, bool extraFuelTank) : base(speed, weight, bodyColor) { DopColor = dopColor; @@ -36,5 +36,6 @@ namespace AirplaneWithRadar ExtraFuelTank = extraFuelTank; } + } } diff --git a/AirplaneWithRadar/AirplaneWithRadar/FormAirplaneWithRadar.cs b/AirplaneWithRadar/AirplaneWithRadar/FormAirplaneWithRadar.cs index b5c0eb3..f93bb8a 100644 --- a/AirplaneWithRadar/AirplaneWithRadar/FormAirplaneWithRadar.cs +++ b/AirplaneWithRadar/AirplaneWithRadar/FormAirplaneWithRadar.cs @@ -25,6 +25,7 @@ namespace AirplaneWithRadar private void SetData() { Random rnd = new(); + _airplane.SetPosition(rnd.Next(10, 100), rnd.Next(10, 100), pictureBoxAirplane.Width, pictureBoxAirplane.Height); toolStripStatusLabelSpeed.Text = $": {_airplane.Airplane.Speed}"; toolStripStatusLabelWeight.Text = $": {_airplane.Airplane.Weight}"; @@ -37,6 +38,7 @@ namespace AirplaneWithRadar /// private void ButtonCreate_Click(object sender, EventArgs e) { + Random rnd = new(); _airplane = new DrawingAirplane(rnd.Next(100, 300), rnd.Next(1000, 2000), Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256))); SetData(); diff --git a/AirplaneWithRadar/AirplaneWithRadar/FormMap.Designer.cs b/AirplaneWithRadar/AirplaneWithRadar/FormMap.Designer.cs index d55abcb..977ebcf 100644 --- a/AirplaneWithRadar/AirplaneWithRadar/FormMap.Designer.cs +++ b/AirplaneWithRadar/AirplaneWithRadar/FormMap.Designer.cs @@ -158,7 +158,8 @@ this.comboBoxSelectorMap.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.comboBoxSelectorMap.FormattingEnabled = true; this.comboBoxSelectorMap.Items.AddRange(new object[] { - "Простая карта"}); + "Простая карта", + "Собственная карта"}); this.comboBoxSelectorMap.Location = new System.Drawing.Point(12, 12); this.comboBoxSelectorMap.Name = "comboBoxSelectorMap"; this.comboBoxSelectorMap.Size = new System.Drawing.Size(182, 33); diff --git a/AirplaneWithRadar/AirplaneWithRadar/FormMap.cs b/AirplaneWithRadar/AirplaneWithRadar/FormMap.cs index 5f87b94..9313a2d 100644 --- a/AirplaneWithRadar/AirplaneWithRadar/FormMap.cs +++ b/AirplaneWithRadar/AirplaneWithRadar/FormMap.cs @@ -74,8 +74,8 @@ namespace AirplaneWithRadar private void ButtonCreateModif_Click(object sender, EventArgs e) { Random rnd = new(); - var airplane = new DrawingAirplaneWithRadar(rnd.Next(100, 300), rnd.Next(1000, 2000), Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0,256)), - Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)),Convert.ToBoolean(rnd.Next(0, 2)), Convert.ToBoolean(rnd.Next(0,2))); + var airplane = new DrawingAirplaneWithRadar(rnd.Next(100, 300), rnd.Next(1000, 2000), Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)), + Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)), Convert.ToBoolean(rnd.Next(0, 2)), Convert.ToBoolean(rnd.Next(0, 2))); SetData(airplane); } @@ -93,6 +93,9 @@ namespace AirplaneWithRadar case "Простая карта": _abstractMap = new SimpleMap(); break; + case "Собственная карта": + _abstractMap = new MyMap(); + break; } } } diff --git a/AirplaneWithRadar/AirplaneWithRadar/MyMap.cs b/AirplaneWithRadar/AirplaneWithRadar/MyMap.cs new file mode 100644 index 0000000..a789586 --- /dev/null +++ b/AirplaneWithRadar/AirplaneWithRadar/MyMap.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AirplaneWithRadar +{ + /// + /// Собственная реализация абсрактного класса AbstractMap + /// + internal class MyMap : AbstractMap + { + /// + /// Цвет участка закрытого + /// + private readonly Brush barrierColor = new SolidBrush(Color.White); + /// + /// Цвет участка открытого + /// + private readonly Brush roadColor = new SolidBrush(Color.Blue); + protected override void DrawBarrierPart(Graphics g, int i, int j) + { + g.FillRectangle(barrierColor, i * _size_x, j * _size_y, i * (_size_x + 1), j * (_size_y + 1)); + } + protected override void DrawRoadPart(Graphics g, int i, int j) + { + g.FillRectangle(roadColor, i * _size_x, j * _size_y, i * (_size_x + 1), j * (_size_y + 1)); + } + protected override void GenerateMap() + { + _map = new int[100, 100]; + _size_x = (float)_width / _map.GetLength(0); + _size_y = (float)_height / _map.GetLength(1); + //int counter = 0; + for (int i = 0; i < _map.GetLength(0); ++i) + { + for (int j = 0; j < _map.GetLength(1); ++j) + { + _map[i, j] = _freeRoad; + } + } + + + int counter = 0; + + for (int j = 0; j < _map.GetLength(1); j++) + { + int startX = _random.Next(0, 80); + int x = _random.Next(0, 20); + counter = 0; + while (counter < x) + { + for (int i = startX; i < startX + x; i++) + { + _map[i, j] = _barrier; + counter++; + } + } + j++; + } + //for (int i = 0; i < _map.GetLength(0); ++i) + //{ + // int startX = _random.Next(0, 90); + // int x = _random.Next(0, 100 - startX - 10); + // counter = x; + // while (counter > 0) + // { + // for (int j = 0; j < _map.GetLength(1); ++j) + // { + // _map[i, j] = _barrier; + // counter--; + // } + // } + + //} + //while (counter < 50) + //{ + // int x = _random.Next(0, 100); + // int y = _random.Next(0, 100); + // if (_map[x, y] == _freeRoad) + // { + // _map[x, y] = _barrier; + // counter++; + // } + //} + + } + } +} + diff --git a/AirplaneWithRadar/AirplaneWithRadar/SimpleMap.cs b/AirplaneWithRadar/AirplaneWithRadar/SimpleMap.cs index 582db27..6117e5e 100644 --- a/AirplaneWithRadar/AirplaneWithRadar/SimpleMap.cs +++ b/AirplaneWithRadar/AirplaneWithRadar/SimpleMap.cs @@ -21,13 +21,11 @@ namespace AirplaneWithRadar private readonly Brush roadColor = new SolidBrush(Color.Gray); protected override void DrawBarrierPart(Graphics g, int i, int j) { - g.FillRectangle(barrierColor, i * _size_x, j * _size_y, i * (_size_x + - 1), j * (_size_y + 1)); + g.FillRectangle(barrierColor, i * _size_x, j * _size_y, i * (_size_x + 1), j * (_size_y + 1)); } protected override void DrawRoadPart(Graphics g, int i, int j) { - g.FillRectangle(roadColor, i * _size_x, j * _size_y, i * (_size_x + - 1), j * (_size_y + 1)); + g.FillRectangle(roadColor, i * _size_x, j * _size_y, i * (_size_x + 1), j * (_size_y + 1)); } protected override void GenerateMap() {