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;
+ }
+}