diff --git a/laba1Loco/AbstractStrategy.java b/laba1Loco/AbstractStrategy.java new file mode 100644 index 0000000..0229b0e --- /dev/null +++ b/laba1Loco/AbstractStrategy.java @@ -0,0 +1,122 @@ +package laba1Loco; + +public abstract class AbstractStrategy { + /// + /// Перемещаемый объект + /// + private IMoveableObject _moveableObject; + /// + /// Статус перемещения + /// + private Status _state = Status.NotInit; + /// + /// Ширина поля + /// + protected int FieldWidth; + /// + /// Высота поля + /// + protected int FieldHeight; + /// + /// Статус перемещения + /// + public Status GetStatus() { return _state; } + /// + /// Установка данных + /// + /// Перемещаемый объект + /// Ширина поля + /// Высота поля + 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; + } + /// + /// Шаг перемещения + /// + public void MakeStep() + { + if (_state != Status.InProgress) + { + return; + } + if (IsTargetDestinaion()) + { + _state = Status.Finish; + return; + } + MoveToTarget(); + } + /// + /// Перемещение влево + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected boolean MoveLeft() { return MoveTo(Direction.Left);} + /// + /// Перемещение вправо + /// + /// Результат перемещения (true - удалось переместиться,false - неудача) + protected boolean MoveRight() { return MoveTo(Direction.Right);} + /// + /// Перемещение вверх + /// + /// Результат перемещения (true - удалось переместиться,false - неудача) + protected boolean MoveUp() { return MoveTo(Direction.Up);} + /// + /// Перемещение вниз + /// + /// Результат перемещения (true - удалось переместиться,false - неудача) + protected boolean MoveDown() { return MoveTo(Direction.Down);} + /// + /// Параметры объекта + /// + protected ObjectParameters GetObjectParameters() { return _moveableObject.GetObjectPosition(); } + /// + /// Шаг объекта + /// + /// + protected int GetStep() + { + if (_state != Status.InProgress) + { + return 0; + } + return _moveableObject.GetStep(); + } + /// + /// Перемещение к цели + /// + protected abstract void MoveToTarget(); + /// + /// Достигнута ли цель + /// + /// + protected abstract boolean IsTargetDestinaion(); + /// + /// Попытка перемещения в требуемом направлении + /// + /// Направление + /// Результат попытки (true - удалось переместиться, false - неудача) + private boolean MoveTo(Direction Direction) + { + if (_state != Status.InProgress) + { + return false; + } + if (_moveableObject.CheckCanMove(Direction)) + { + _moveableObject.MoveObject(Direction); + return true; + } + return false; + } +} diff --git a/laba1Loco/DrawingLoco.java b/laba1Loco/DrawingLoco.java index 8e4c1be..23d62bb 100644 --- a/laba1Loco/DrawingLoco.java +++ b/laba1Loco/DrawingLoco.java @@ -6,239 +6,122 @@ import javax.swing.*; import javax.swing.Timer; import java.awt.event.*; -public class DrawingLoco{ +public class DrawingLoco extends DrawingTrain{ - private WheelDrawing wheelDrawing; + /// + /// Инициализация свойств + /// + /// Скорость + /// Вес + /// Цвет кузова + /// Дополнительный цвет + /// Признак наличия трубы + /// Признак наличия бака + /// Признак наличия паровозной полосы + /// Ширина картинки + /// Высота картинки + public DrawingLoco(int speed, double weight, Color bodyColor, int _numWheel, Color additionalColor, boolean tube, boolean fuelTank, boolean locoLine, int width, int height) + { + super(speed, weight, bodyColor, _numWheel, width, height); + EntityTrain = new EntityLoco(speed, weight, bodyColor, _numWheel, additionalColor, tube, fuelTank, locoLine); + _locoWidth = ((EntityLoco)EntityTrain).FuelTank ? 169 : 83; + } + /// + /// Установка позиции + /// + /// Координата X + /// Координата Y + public void SetPosition(int x, int y) + { + _startPosX = Math.min(x, _pictureWidth-_locoWidth); + _startPosY = Math.min(y, _pictureHeight-_locoHeight); + } + /// + /// Прорисовка объекта + /// + /// + public void DrawTransport(Graphics2D g2d) + { - /// - /// Класс-сущность - /// - public EntityLoco _EntityLoco; - /// - /// Ширина окна - /// - private int _pictureWidth; - /// - /// Высота окна - /// - private int _pictureHeight; - /// - /// Левая координата прорисовки локомотива - /// - private int _startPosX; - /// - /// Верхняя кооридната прорисовки локомотива - /// - private int _startPosY; - /// - /// Ширина прорисовки локомотива - /// - private int _locoWidth = 83; - /// - /// Высота прорисовки локомотива - /// - private int _locoHeight = 41; - /// - /// Инициализация свойств - /// - /// Скорость - /// Вес - /// Цвет кузова - /// Дополнительный цвет - /// Признак наличия трубы - /// Признак наличия бака - /// Признак наличия паровозной полосы - /// Ширина картинки - /// Высота картинки - /// true - объект создан, false - проверка не пройдена, нельзя создать объект в этих размерах - public boolean Init(int speed, double weight, Color bodyColor, Color additionalColor, boolean tube, boolean fuelTank, boolean locoLine, int numWheel, int width, int height) + if (EntityTrain == null) { - _pictureWidth = width; - _pictureHeight = height; - if (_pictureHeight < _locoHeight || _pictureWidth < _locoWidth) - return false; - _EntityLoco = new EntityLoco(); - _EntityLoco.Init(speed, weight, bodyColor, additionalColor, tube, fuelTank, locoLine, numWheel); - if (fuelTank) - _locoWidth = 169; - wheelDrawing = new WheelDrawing(); - wheelDrawing.setNumWheel(numWheel); - return true; + return; } - /// - /// Установка позиции - /// - /// Координата X - /// Координата Y - public void SetPosition(int x, int y) + + super.DrawTransport(g2d); + + //wheels + wheelDrawing.Draw(_startPosX, _startPosY, ((EntityLoco)EntityTrain).FuelTank, EntityTrain.BodyColor, g2d); + + g2d.setColor(((EntityLoco)EntityTrain).AdditionalColor); + if (((EntityLoco)EntityTrain).Tube) { - _startPosX = Math.min(x, _pictureWidth-_locoWidth); - _startPosY = Math.min(y, _pictureHeight-_locoHeight); - } - /// - /// Изменение направления перемещения - /// - /// Направление - public void MoveTransport(Direction direction) - { - if (_EntityLoco == null){ - return; - } - switch (direction) - { - //влево - case Left: - if (_startPosX - _EntityLoco.Step > 0) - { - _startPosX -= (int)_EntityLoco.Step; - } - break; - //вверх - case Up: - if (_startPosY - _EntityLoco.Step > 0) - { - _startPosY -= (int)_EntityLoco.Step; - } - break; - // вправо - case Right: - if (_startPosX + _locoWidth + _EntityLoco.Step < _pictureWidth) - { - _startPosX += (int)_EntityLoco.Step; - } - break; - //вниз - case Down: - if (_startPosY + _locoHeight + _EntityLoco.Step < _pictureHeight) - { - _startPosY += (int)_EntityLoco.Step; - } - break; - } - } - /// - /// Прорисовка объекта - /// - /// - public void DrawTransport(Graphics2D g2d) - { - - if (_EntityLoco == null) - { - return; - } - - // body - g2d.setColor(_EntityLoco.BodyColor); - g2d.drawPolyline(new int[]{ - _startPosX + 8, _startPosX + 79, _startPosX + 79, _startPosX + 4, _startPosX + 4, _startPosX + 8, - }, new int[]{ - _startPosY+10, _startPosY+10, _startPosY+32, _startPosY+32, _startPosY+20, _startPosY+10 - }, 6); - g2d.drawPolyline(new int[]{ - _startPosX + 4, _startPosX + 29, _startPosX + 29, _startPosX + 37, _startPosX + 37, _startPosX + 79, _startPosX + 37, _startPosX + 37, _startPosX + 29, _startPosX + 29, - }, new int[]{ - _startPosY+21, _startPosY+21, _startPosY+14, _startPosY+14, _startPosY+21, _startPosY+21, _startPosY+21, _startPosY+29, _startPosY+29, _startPosY+21 - }, 10); - - // trucks - g2d.fillPolygon(new int[]{ -_startPosX + 0,_startPosX + 5,_startPosX + 32,_startPosX + 36, - }, new int[]{ -_startPosY+37,_startPosY+33,_startPosY+33,_startPosY+37 - }, 4); - g2d.fillPolygon(new int[]{ -_startPosX + 44,_startPosX + 49,_startPosX + 76,_startPosX + 80, - }, new int[]{ -_startPosY+37,_startPosY+33,_startPosY+33,_startPosY+37 - }, 4); - - //back - g2d.fillPolygon(new int[]{ -_startPosX + 79,_startPosX + 82,_startPosX + 82,_startPosX + 79, - }, new int[]{ -_startPosY+12,_startPosY+12,_startPosY+30,_startPosY+30 - }, 4); - - - //windows - g2d.setColor(Color.BLUE); - g2d.drawRect(_startPosX + 10, _startPosY + 12, 6, 7); - g2d.drawRect(_startPosX + 19, _startPosY + 12, 6, 7); - g2d.drawRect(_startPosX + 72, _startPosY + 12, 6, 7); - - //wheels - wheelDrawing.Draw(_startPosX, _startPosY, _EntityLoco.FuelTank, _EntityLoco.BodyColor, g2d); - - g2d.setColor(_EntityLoco.AdditionalColor); - if (_EntityLoco.Tube) - { - g2d.drawPolyline(new int[] { + g2d.drawPolyline(new int[] { _startPosX + 40,_startPosX + 40,_startPosX + 45,_startPosX + 41,_startPosX + 41,_startPosX + 44,_startPosX + 44,_startPosX + 45,_startPosX + 45, - },new int[] { + },new int[] { _startPosY+9,_startPosY+3,_startPosY+3,_startPosY+3,_startPosY,_startPosY,_startPosY+3,_startPosY+3,_startPosY+9, - },9); - } - if (_EntityLoco.LocoLine) - { - g2d.drawPolyline(new int[] { - _startPosX + 60,_startPosX + 38, - },new int[] { - _startPosY+10,_startPosY+32 - },2); - g2d.drawPolyline(new int[] { - _startPosX + 65,_startPosX + 43, - },new int[] { - _startPosY+10,_startPosY+32 - },2); - g2d.drawPolyline(new int[] { - _startPosX + 70,_startPosX + 48, - },new int[] { - _startPosY+10,_startPosY+32 - },2); - } - if (_EntityLoco.FuelTank) - { - // body - g2d.setColor(_EntityLoco.BodyColor); - g2d.drawPolyline(new int[]{ - _startPosX + 89, _startPosX + 164, _startPosX + 164, _startPosX + 89, _startPosX + 89, - }, new int[]{ - _startPosY+10, _startPosY+10, _startPosY+32, _startPosY+32, _startPosY+10 - }, 5); - g2d.drawPolyline(new int[]{ - _startPosX + 89, _startPosX + 164, - }, new int[]{ - _startPosY+21, _startPosY+21, - }, 2); - - // trucks - g2d.fillPolygon(new int[]{ -_startPosX + 0+85,_startPosX + 5+85,_startPosX + 32+85,_startPosX + 36+85, - }, new int[]{ -_startPosY+37,_startPosY+33,_startPosY+33,_startPosY+37 - }, 4); - g2d.fillPolygon(new int[]{ -_startPosX + 44+85,_startPosX + 49+85,_startPosX + 76+85,_startPosX + 80+85, - }, new int[]{ -_startPosY+37,_startPosY+33,_startPosY+33,_startPosY+37 - }, 4); - - //back - g2d.fillPolygon(new int[]{ -_startPosX + 79+85,_startPosX + 82+85,_startPosX + 82+85,_startPosX + 79+85, - }, new int[]{ -_startPosY+12,_startPosY+12,_startPosY+30,_startPosY+30 - }, 4); - - - //front - g2d.fillPolygon(new int[]{ -_startPosX + 86,_startPosX + 89,_startPosX + 89,_startPosX + 86, - }, new int[]{ -_startPosY+12,_startPosY+12,_startPosY+30,_startPosY+30 - }, 4); - - } + },9); } + if (((EntityLoco)EntityTrain).LocoLine) + { + g2d.drawPolyline(new int[] { + _startPosX + 60,_startPosX + 38, + },new int[] { + _startPosY+10,_startPosY+32 + },2); + g2d.drawPolyline(new int[] { + _startPosX + 65,_startPosX + 43, + },new int[] { + _startPosY+10,_startPosY+32 + },2); + g2d.drawPolyline(new int[] { + _startPosX + 70,_startPosX + 48, + },new int[] { + _startPosY+10,_startPosY+32 + },2); + } + if (((EntityLoco)EntityTrain).FuelTank) + { + // body + g2d.setColor(EntityTrain.BodyColor); + g2d.drawPolyline(new int[]{ + _startPosX + 89, _startPosX + 164, _startPosX + 164, _startPosX + 89, _startPosX + 89, + }, new int[]{ + _startPosY+10, _startPosY+10, _startPosY+32, _startPosY+32, _startPosY+10 + }, 5); + g2d.drawPolyline(new int[]{ + _startPosX + 89, _startPosX + 164, + }, new int[]{ + _startPosY+21, _startPosY+21, + }, 2); + + // trucks + g2d.fillPolygon(new int[]{ +_startPosX + 0+85,_startPosX + 5+85,_startPosX + 32+85,_startPosX + 36+85, + }, new int[]{ +_startPosY+37,_startPosY+33,_startPosY+33,_startPosY+37 + }, 4); + g2d.fillPolygon(new int[]{ +_startPosX + 44+85,_startPosX + 49+85,_startPosX + 76+85,_startPosX + 80+85, + }, new int[]{ +_startPosY+37,_startPosY+33,_startPosY+33,_startPosY+37 + }, 4); + + //back + g2d.fillPolygon(new int[]{ +_startPosX + 79+85,_startPosX + 82+85,_startPosX + 82+85,_startPosX + 79+85, + }, new int[]{ +_startPosY+12,_startPosY+12,_startPosY+30,_startPosY+30 + }, 4); + + + //front + g2d.fillPolygon(new int[]{ +_startPosX + 86,_startPosX + 89,_startPosX + 89,_startPosX + 86, + }, new int[]{ +_startPosY+12,_startPosY+12,_startPosY+30,_startPosY+30 + }, 4); + + } + } } \ No newline at end of file diff --git a/laba1Loco/DrawingTrain.java b/laba1Loco/DrawingTrain.java new file mode 100644 index 0000000..abfbf12 --- /dev/null +++ b/laba1Loco/DrawingTrain.java @@ -0,0 +1,193 @@ +package laba1Loco; + +import java.awt.*; +import java.util.*; +import javax.swing.*; +import javax.swing.Timer; +import java.awt.event.*; + +public class DrawingTrain { + protected WheelDrawing wheelDrawing; + /// + /// Класс-сущность + /// + public EntityTrain EntityTrain; + /// + /// Ширина окна + /// + protected int _pictureWidth; + /// + /// Высота окна + /// + protected int _pictureHeight; + /// + /// Левая координата прорисовки локомотива + /// + protected int _startPosX; + /// + /// Верхняя кооридната прорисовки локомотива + /// + protected int _startPosY; + /// + /// Ширина прорисовки локомотива + /// + protected int _locoWidth = 83; + /// + /// Высота прорисовки локомотива + /// + protected int _locoHeight = 41; + /// + /// Инициализация свойств + /// + /// Скорость + /// Вес + /// Цвет кузова + /// Ширина картинки + /// Высота картинки + public DrawingTrain(int speed, double weight, Color bodyColor, int _numWheel, int width, int height) + { + _pictureWidth = width; + _pictureHeight = height; + if (_pictureHeight < _locoHeight || _pictureWidth < _locoWidth) + return; + EntityTrain = new EntityTrain(speed, weight, bodyColor, _numWheel); + wheelDrawing = new WheelDrawing(); + wheelDrawing.setNumWheel(_numWheel); + } + /// + /// Установка позиции + /// + /// Координата X + /// Координата Y + public void SetPosition(int x, int y) + { + _startPosX = Math.min(x, _pictureWidth - _locoWidth); + _startPosY = Math.min(y, _pictureHeight - _locoHeight); + } + /// + /// Координата X объекта + /// + public int GetPosX (){return _startPosX;} + /// + /// Координата Y объекта + /// + public int GetPosY (){return _startPosY;} + /// + /// Ширина объекта + /// + public int GetWidth (){return _locoWidth;} + /// + /// Высота объекта + /// + public int GetHeight (){return _locoHeight;} + /// + /// Проверка, что объект может переместится по указанному направлению + /// + /// Направление + /// true - можно переместится по указанному направлению + public boolean CanMove(Direction direction) + { + if (EntityTrain == null) + { + return false; + } + switch (direction) + { + case Left: + return _startPosX - EntityTrain.Step > 0; + case Right: + return _startPosX + _locoWidth + EntityTrain.Step < _pictureWidth; + case Up: + return _startPosY - EntityTrain.Step > 0; + case Down: + return _startPosY + _locoHeight + EntityTrain.Step < _pictureHeight; + default: + return false; + } + } + /// + /// Изменение направления перемещения + /// + /// Направление + public void MoveTransport(Direction direction) + { + if (!CanMove(direction) || EntityTrain == null) + { + return; + } + switch (direction) + { + //влево + case Left: + _startPosX -= (int)EntityTrain.Step; + break; + //вверх + case Up: + _startPosY -= (int)EntityTrain.Step; + break; + // вправо + case Right: + _startPosX += (int)EntityTrain.Step; + break; + //вниз + case Down: + _startPosY += (int)EntityTrain.Step; + break; + } + } + + /// + /// Прорисовка объекта + /// + /// + public void DrawTransport(Graphics2D g2d) + { + + if (EntityTrain == null) + { + return; + } + + // body + g2d.setColor(EntityTrain.BodyColor); + g2d.drawPolyline(new int[]{ + _startPosX + 8, _startPosX + 79, _startPosX + 79, _startPosX + 4, _startPosX + 4, _startPosX + 8, + }, new int[]{ + _startPosY+10, _startPosY+10, _startPosY+32, _startPosY+32, _startPosY+20, _startPosY+10 + }, 6); + g2d.drawPolyline(new int[]{ + _startPosX + 4, _startPosX + 29, _startPosX + 29, _startPosX + 37, _startPosX + 37, _startPosX + 79, _startPosX + 37, _startPosX + 37, _startPosX + 29, _startPosX + 29, + }, new int[]{ + _startPosY+21, _startPosY+21, _startPosY+14, _startPosY+14, _startPosY+21, _startPosY+21, _startPosY+21, _startPosY+29, _startPosY+29, _startPosY+21 + }, 10); + + // trucks + g2d.fillPolygon(new int[]{ +_startPosX + 0,_startPosX + 5,_startPosX + 32,_startPosX + 36, + }, new int[]{ +_startPosY+37,_startPosY+33,_startPosY+33,_startPosY+37 + }, 4); + g2d.fillPolygon(new int[]{ +_startPosX + 44,_startPosX + 49,_startPosX + 76,_startPosX + 80, + }, new int[]{ +_startPosY+37,_startPosY+33,_startPosY+33,_startPosY+37 + }, 4); + + //back + g2d.fillPolygon(new int[]{ +_startPosX + 79,_startPosX + 82,_startPosX + 82,_startPosX + 79, + }, new int[]{ +_startPosY+12,_startPosY+12,_startPosY+30,_startPosY+30 + }, 4); + + + //windows + g2d.setColor(Color.BLUE); + g2d.drawRect(_startPosX + 10, _startPosY + 12, 6, 7); + g2d.drawRect(_startPosX + 19, _startPosY + 12, 6, 7); + g2d.drawRect(_startPosX + 72, _startPosY + 12, 6, 7); + + //wheels + wheelDrawing.Draw(_startPosX, _startPosY, false, null, g2d); + } +} diff --git a/laba1Loco/DrawningObjectTrain.java b/laba1Loco/DrawningObjectTrain.java new file mode 100644 index 0000000..79c43ad --- /dev/null +++ b/laba1Loco/DrawningObjectTrain.java @@ -0,0 +1,22 @@ +package laba1Loco; + +public class DrawningObjectTrain implements IMoveableObject { + private DrawingTrain _drawingTrain = null; + public DrawningObjectTrain(DrawingTrain drawingTrain) + { + _drawingTrain = drawingTrain; + } + public ObjectParameters GetObjectPosition(){ + if (_drawingTrain == null || _drawingTrain.EntityTrain == + null) + { + return null; + } + return new ObjectParameters(_drawingTrain.GetPosX(), + _drawingTrain.GetPosY(), _drawingTrain.GetWidth(), _drawingTrain.GetHeight()); + } + public int GetStep(){ return (int)_drawingTrain.EntityTrain.Step; } + public boolean CheckCanMove(Direction direction) { return _drawingTrain.CanMove(direction);} + public void MoveObject(Direction direction) { _drawingTrain.MoveTransport(direction); } + +} diff --git a/laba1Loco/EntityLoco.java b/laba1Loco/EntityLoco.java index fa6f254..27d16d3 100644 --- a/laba1Loco/EntityLoco.java +++ b/laba1Loco/EntityLoco.java @@ -6,64 +6,35 @@ import javax.swing.*; import javax.swing.Timer; import java.awt.event.*; -public class EntityLoco{ +public class EntityLoco extends EntityTrain{ + public Color AdditionalColor; /// - /// Скорость - /// - public int Speed; - /// - /// Вес - /// - public double Weight; - /// - /// Основной цвет - /// - public Color BodyColor; - /// - /// Дополнительный цвет (для опциональных элементов) - /// - public Color AdditionalColor; - /// - /// Признак (опция) наличия трубы - /// - public boolean Tube; - /// - /// Признак (опция) наличия бака - /// - public boolean FuelTank; - /// - /// Признак (опция) наличия паровозной полосы - /// - public boolean LocoLine; - /// - /// Шаг перемещения автомобиля - /// - public double Step; - /// - /// количество колёс [2;4] - /// - public int numWheel; - /// - /// Инициализация полей объекта-класса спортивного автомобиля - /// - /// Скорость - /// Вес автомобиля - /// Основной цвет - /// Дополнительный цвет - /// Признак наличия трубы - /// Признак наличия бака - /// Признак паровозной гоночной полосы - public void Init(int speed, double weight, Color bodyColor, Color - additionalColor, boolean tube, boolean fuelTank, boolean locoLine, int _numWheel) - { - numWheel = _numWheel; - Speed = speed; - Weight = weight; - BodyColor = bodyColor; - AdditionalColor = additionalColor; - Tube = tube; - FuelTank = fuelTank; - LocoLine = locoLine; - Step = (double)Speed * 100 / Weight; - } + /// Признак (опция) наличия трубы + /// + public boolean Tube; + /// Признак (опция) наличия топливного бака + /// + public boolean FuelTank; + /// + /// Признак (опция) наличия паровозной полосы + /// + public boolean LocoLine; + /// + /// Инициализация полей объекта-класса Локомотива + /// + /// Скорость + /// Вес автомобиля + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия трубы + /// Признак наличия бака + /// Признак наличия паровозной полосы + public EntityLoco(int speed, double weight, Color bodyColor, int _numWheel, Color additionalColor, boolean tube, boolean fuelTank, boolean locoLine) + { + super(speed, weight, bodyColor, _numWheel); + AdditionalColor = additionalColor; + Tube = tube; + FuelTank = fuelTank; + LocoLine = locoLine; + } } \ No newline at end of file diff --git a/laba1Loco/EntityTrain.java b/laba1Loco/EntityTrain.java index c884cec..a25d1d2 100644 --- a/laba1Loco/EntityTrain.java +++ b/laba1Loco/EntityTrain.java @@ -24,16 +24,21 @@ public class EntityTrain { /// public double Step; /// + /// количество колёс [2;4] + /// + public int numWheel; + /// /// Инициализация полей объекта-класса Локомотива /// /// Скорость /// Вес автомобиля /// Основной цвет - public EntityTrain(int speed, double weight, Color bodyColor) + public EntityTrain(int speed, double weight, Color bodyColor, int _numWheel) { Speed = speed; Weight = weight; BodyColor = bodyColor; + numWheel = _numWheel; Step = (double)Speed * 100 / Weight; } } diff --git a/laba1Loco/FormTrain.java b/laba1Loco/FormTrain.java index 1e9ad91..dbd54b1 100644 --- a/laba1Loco/FormTrain.java +++ b/laba1Loco/FormTrain.java @@ -7,8 +7,11 @@ import javax.swing.Timer; import java.awt.event.*; public class FormTrain{ - private DrawingLoco _drawingLoco; + private DrawingTrain _drawingTrain; + private AbstractStrategy abstractStrategy; Canvas canv; + static int pictureBoxWidth = 980; + static int pictureBoxHeight = 560; public void Draw(){ canv.repaint(); @@ -17,6 +20,14 @@ public class FormTrain{ public FormTrain(){ JFrame w=new JFrame ("Loco"); JButton buttonCreate = new JButton("create"); + JButton buttonCreateLocomotive = new JButton("createLocomotive"); + JButton buttonStrategysStep = new JButton("strategys step"); + JComboBox comboBoxStrategy = new JComboBox( + new String[]{ + "Элемент списка 1", + "Элемент списка 2", + "Элемент списка 3" + }); JButton up = new JButton(); up.setBorderPainted(false); up.setFocusPainted(false); @@ -41,20 +52,86 @@ public class FormTrain{ right.setContentAreaFilled(false); right.setName("right"); right.setIcon(new ImageIcon("D:\\Coffee\\PIbd-21_Kouvshinoff_T._A._WarmlyLocomotive._Harder\\laba1Loco\\images\\arowR340x259.png")); - + buttonStrategysStep.addActionListener( + new ActionListener() { + public void actionPerformed(ActionEvent e){ + if (_drawingTrain == null) + { + return; + } + if (comboBoxStrategy.isEnabled()) + { + switch (comboBoxStrategy.getSelectedIndex()) + { + case 0: + abstractStrategy = new MoveToCenter(); + break; + case 1: + abstractStrategy = new MoveToBorder(); + break; + default: + abstractStrategy = null; + break; + }; + if (abstractStrategy == null) + { + return; + } + abstractStrategy.SetData(new + DrawningObjectTrain(_drawingTrain), pictureBoxWidth, + pictureBoxHeight); + comboBoxStrategy.setEnabled(false); + } + if (abstractStrategy == null) + { + return; + } + abstractStrategy.MakeStep(); + Draw(); + if (abstractStrategy.GetStatus() == Status.Finish) + { + comboBoxStrategy.setEnabled(true); + abstractStrategy = null; + } + } + } + ); + buttonCreateLocomotive.addActionListener( + new ActionListener() { + public void actionPerformed(ActionEvent e){ + System.out.println(e.getActionCommand()); + Random random = new Random(); + _drawingTrain = new DrawingLoco( + random.nextInt(100, 300), + random.nextInt(1000, 3000), + new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)), + random.nextInt(2, 5), + new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)), + random.nextInt(0, 2) == 1, + random.nextInt(0, 2) == 1, + random.nextInt(0, 2) == 1, + pictureBoxWidth, + pictureBoxHeight); + _drawingTrain.SetPosition(random.nextInt(10, 100), random.nextInt(10, 100)); + canv._drawingTrain = _drawingTrain; + Draw(); + } + } + ); buttonCreate.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e){ System.out.println(e.getActionCommand()); Random random = new Random(); - _drawingLoco = new DrawingLoco(); - _drawingLoco.Init(random.nextInt(100, 300), random.nextInt(1000, 3000), - new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)), - new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)), - random.nextInt(0, 2) == 1, random.nextInt(0, 2) == 1, random.nextInt(0, 2) == 1, - random.nextInt(2, 5), 1000, 560); - _drawingLoco.SetPosition(random.nextInt(10, 100), random.nextInt(10, 100)); - canv._drawingLoco = _drawingLoco; + _drawingTrain = new DrawingTrain( + random.nextInt(100, 300), + random.nextInt(1000, 3000), + new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)), + random.nextInt(2, 5), + 1000, + 560); + _drawingTrain.SetPosition(random.nextInt(10, 100), random.nextInt(10, 100)); + canv._drawingTrain = _drawingTrain; Draw(); } } @@ -62,22 +139,22 @@ public class FormTrain{ ActionListener actioListener = new ActionListener() { public void actionPerformed(ActionEvent e){ System.out.println(((JButton)(e.getSource())).getName()); - if (_drawingLoco == null) + if (_drawingTrain == null) { return; } switch(((JButton)(e.getSource())).getName()){ case "up": - _drawingLoco.MoveTransport(Direction.Up); + _drawingTrain.MoveTransport(Direction.Up); break; case "down": - _drawingLoco.MoveTransport(Direction.Down); + _drawingTrain.MoveTransport(Direction.Down); break; case "left": - _drawingLoco.MoveTransport(Direction.Left); + _drawingTrain.MoveTransport(Direction.Left); break; case "right": - _drawingLoco.MoveTransport(Direction.Right); + _drawingTrain.MoveTransport(Direction.Right); break; } Draw(); @@ -92,33 +169,39 @@ public class FormTrain{ w.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); w.setLayout(null); canv = new Canvas(); - canv.setBounds(0, 0, 1000, 600); + canv.setBounds(0, 0, pictureBoxWidth, pictureBoxHeight); buttonCreate.setBounds(2, 540, 100, 20); + buttonCreateLocomotive.setBounds(105, 540, 150, 20); up.setBounds(900, 480, 40, 40); down.setBounds(900, 520, 40, 40); left.setBounds(860, 520, 40, 40); right.setBounds(940, 520, 40, 40); + comboBoxStrategy.setBounds(pictureBoxWidth - 150, 20, 150, 20); + buttonStrategysStep.setBounds(pictureBoxWidth - 150, 45, 150, 20); w.add(canv); w.add(buttonCreate); + w.add(buttonCreateLocomotive); w.add(up); w.add(down); w.add(left); w.add(right); + w.add(comboBoxStrategy); + w.add(buttonStrategysStep); w.setVisible (true); } } class Canvas extends JComponent{ - public DrawingLoco _drawingLoco; + public DrawingTrain _drawingTrain; public Canvas(){ } public void paintComponent (Graphics g){ - if (_drawingLoco == null){ + if (_drawingTrain == null){ return; } super.paintComponents (g) ; Graphics2D g2d = (Graphics2D)g; - _drawingLoco.DrawTransport(g2d); + _drawingTrain.DrawTransport(g2d); super.repaint(); } } \ No newline at end of file diff --git a/laba1Loco/IMoveableObject.java b/laba1Loco/IMoveableObject.java new file mode 100644 index 0000000..db55062 --- /dev/null +++ b/laba1Loco/IMoveableObject.java @@ -0,0 +1,23 @@ +package laba1Loco; + +public interface IMoveableObject { + /// + /// Получение координаты X объекта + /// + ObjectParameters GetObjectPosition(); + /// + /// Шаг объекта + /// + int GetStep(); + /// + /// Проверка, можно ли переместиться по нужному направлению + /// + /// + /// + boolean CheckCanMove(Direction direction); + /// + /// Изменение направления пермещения объекта + /// + /// Направление + void MoveObject(Direction direction); +} diff --git a/laba1Loco/MoveToBorder.java b/laba1Loco/MoveToBorder.java new file mode 100644 index 0000000..46cd829 --- /dev/null +++ b/laba1Loco/MoveToBorder.java @@ -0,0 +1,48 @@ +package laba1Loco; + +public class MoveToBorder extends AbstractStrategy{ + protected boolean 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 void MoveToTarget() + { + var objParams = GetObjectParameters(); + if (objParams == null) + { + return; + } + var diffX = objParams.RightBorder() - FieldWidth; + if (Math.abs(diffX) > GetStep()) + { + if (diffX > 0) + { + MoveLeft(); + } + else + { + MoveRight(); + } + } + var diffY = objParams.DownBorder() - FieldHeight; + if (Math.abs(diffY) > GetStep()) + { + if (diffY > 0) + { + MoveUp(); + } + else + { + MoveDown(); + } + } + } +} diff --git a/laba1Loco/MoveToCenter.java b/laba1Loco/MoveToCenter.java new file mode 100644 index 0000000..9421036 --- /dev/null +++ b/laba1Loco/MoveToCenter.java @@ -0,0 +1,48 @@ +package laba1Loco; + +public class MoveToCenter extends AbstractStrategy { + protected boolean IsTargetDestinaion() + { + var objParams = GetObjectParameters(); + if (objParams == null) + { + return false; + } + return + Math.abs(objParams.ObjectMiddleHorizontal() - FieldWidth / 2) <= GetStep() + && + Math.abs(objParams.ObjectMiddleVertical() - FieldHeight / 2) <= GetStep(); + } + protected 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(); + } + } + } +} diff --git a/laba1Loco/ObjectParameters.java b/laba1Loco/ObjectParameters.java new file mode 100644 index 0000000..1be0fe9 --- /dev/null +++ b/laba1Loco/ObjectParameters.java @@ -0,0 +1,46 @@ +package laba1Loco; + +public class ObjectParameters { + private int _x; + private int _y; + private int _width; + private int _height; + /// + /// Левая граница + /// + public int LeftBorder() {return _x;} + /// + /// Верхняя граница + /// + public int TopBorder () {return _y;} + /// + /// Правая граница + /// + public int RightBorder () {return _x + _width;} + /// + /// Нижняя граница + /// + public int DownBorder () {return _y + _height;} + /// + /// Середина объекта + /// + public int ObjectMiddleHorizontal () {return _x + _width / 2;} + /// + /// Середина объекта + /// + public int ObjectMiddleVertical () {return _y + _height / 2;} + /// + /// Конструктор + /// + /// Координата X + /// Координата Y + /// Ширина + /// Высота + public ObjectParameters(int x, int y, int width, int height) + { + _x = x; + _y = y; + _width = width; + _height = height; + } +}