This commit is contained in:
Timourka 2023-10-08 01:10:54 +04:00
parent 2b2b700c59
commit 567a87a848
11 changed files with 750 additions and 306 deletions

View File

@ -0,0 +1,122 @@
package laba1Loco;
public abstract class AbstractStrategy {
/// <summary>
/// Перемещаемый объект
/// </summary>
private IMoveableObject _moveableObject;
/// <summary>
/// Статус перемещения
/// </summary>
private Status _state = Status.NotInit;
/// <summary>
/// Ширина поля
/// </summary>
protected int FieldWidth;
/// <summary>
/// Высота поля
/// </summary>
protected int FieldHeight;
/// <summary>
/// Статус перемещения
/// </summary>
public Status GetStatus() { return _state; }
/// <summary>
/// Установка данных
/// </summary>
/// <param name="moveableObject">Перемещаемый объект</param>
/// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param>
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;
}
/// <summary>
/// Шаг перемещения
/// </summary>
public void MakeStep()
{
if (_state != Status.InProgress)
{
return;
}
if (IsTargetDestinaion())
{
_state = Status.Finish;
return;
}
MoveToTarget();
}
/// <summary>
/// Перемещение влево
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected boolean MoveLeft() { return MoveTo(Direction.Left);}
/// <summary>
/// Перемещение вправо
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться,false - неудача)</returns>
protected boolean MoveRight() { return MoveTo(Direction.Right);}
/// <summary>
/// Перемещение вверх
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться,false - неудача)</returns>
protected boolean MoveUp() { return MoveTo(Direction.Up);}
/// <summary>
/// Перемещение вниз
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться,false - неудача)</returns>
protected boolean MoveDown() { return MoveTo(Direction.Down);}
/// <summary>
/// Параметры объекта
/// </summary>
protected ObjectParameters GetObjectParameters() { return _moveableObject.GetObjectPosition(); }
/// <summary>
/// Шаг объекта
/// </summary>
/// <returns></returns>
protected int GetStep()
{
if (_state != Status.InProgress)
{
return 0;
}
return _moveableObject.GetStep();
}
/// <summary>
/// Перемещение к цели
/// </summary>
protected abstract void MoveToTarget();
/// <summary>
/// Достигнута ли цель
/// </summary>
/// <returns></returns>
protected abstract boolean IsTargetDestinaion();
/// <summary>
/// Попытка перемещения в требуемом направлении
/// </summary>
/// <param name="Direction">Направление</param>
/// <returns>Результат попытки (true - удалось переместиться, false - неудача)</returns>
private boolean MoveTo(Direction Direction)
{
if (_state != Status.InProgress)
{
return false;
}
if (_moveableObject.CheckCanMove(Direction))
{
_moveableObject.MoveObject(Direction);
return true;
}
return false;
}
}

View File

@ -6,38 +6,8 @@ import javax.swing.*;
import javax.swing.Timer; import javax.swing.Timer;
import java.awt.event.*; import java.awt.event.*;
public class DrawingLoco{ public class DrawingLoco extends DrawingTrain{
private WheelDrawing wheelDrawing;
/// <summary>
/// Класс-сущность
/// </summary>
public EntityLoco _EntityLoco;
/// <summary>
/// Ширина окна
/// </summary>
private int _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int _pictureHeight;
/// <summary>
/// Левая координата прорисовки локомотива
/// </summary>
private int _startPosX;
/// <summary>
/// Верхняя кооридната прорисовки локомотива
/// </summary>
private int _startPosY;
/// <summary>
/// Ширина прорисовки локомотива
/// </summary>
private int _locoWidth = 83;
/// <summary>
/// Высота прорисовки локомотива
/// </summary>
private int _locoHeight = 41;
/// <summary> /// <summary>
/// Инициализация свойств /// Инициализация свойств
/// </summary> /// </summary>
@ -50,20 +20,11 @@ public class DrawingLoco{
/// <param name="locoLine">Признак наличия паровозной полосы</param> /// <param name="locoLine">Признак наличия паровозной полосы</param>
/// <param name="width">Ширина картинки</param> /// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param> /// <param name="height">Высота картинки</param>
/// <returns>true - объект создан, false - проверка не пройдена, нельзя создать объект в этих размерах</returns> public DrawingLoco(int speed, double weight, Color bodyColor, int _numWheel, Color additionalColor, boolean tube, boolean fuelTank, boolean locoLine, int width, int height)
public boolean Init(int speed, double weight, Color bodyColor, Color additionalColor, boolean tube, boolean fuelTank, boolean locoLine, int numWheel, int width, int height)
{ {
_pictureWidth = width; super(speed, weight, bodyColor, _numWheel, width, height);
_pictureHeight = height; EntityTrain = new EntityLoco(speed, weight, bodyColor, _numWheel, additionalColor, tube, fuelTank, locoLine);
if (_pictureHeight < _locoHeight || _pictureWidth < _locoWidth) _locoWidth = ((EntityLoco)EntityTrain).FuelTank ? 169 : 83;
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;
} }
/// <summary> /// <summary>
/// Установка позиции /// Установка позиции
@ -76,102 +37,24 @@ public class DrawingLoco{
_startPosY = Math.min(y, _pictureHeight-_locoHeight); _startPosY = Math.min(y, _pictureHeight-_locoHeight);
} }
/// <summary> /// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
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;
}
}
/// <summary>
/// Прорисовка объекта /// Прорисовка объекта
/// </summary> /// </summary>
/// <param name="g"></param> /// <param name="g"></param>
public void DrawTransport(Graphics2D g2d) public void DrawTransport(Graphics2D g2d)
{ {
if (_EntityLoco == null) if (EntityTrain == null)
{ {
return; return;
} }
// body super.DrawTransport(g2d);
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 //wheels
wheelDrawing.Draw(_startPosX, _startPosY, _EntityLoco.FuelTank, _EntityLoco.BodyColor, g2d); wheelDrawing.Draw(_startPosX, _startPosY, ((EntityLoco)EntityTrain).FuelTank, EntityTrain.BodyColor, g2d);
g2d.setColor(_EntityLoco.AdditionalColor); g2d.setColor(((EntityLoco)EntityTrain).AdditionalColor);
if (_EntityLoco.Tube) if (((EntityLoco)EntityTrain).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, _startPosX + 40,_startPosX + 40,_startPosX + 45,_startPosX + 41,_startPosX + 41,_startPosX + 44,_startPosX + 44,_startPosX + 45,_startPosX + 45,
@ -179,7 +62,7 @@ _startPosX + 40,_startPosX + 40,_startPosX + 45,_startPosX + 41,_startPosX + 41,
_startPosY+9,_startPosY+3,_startPosY+3,_startPosY+3,_startPosY,_startPosY,_startPosY+3,_startPosY+3,_startPosY+9, _startPosY+9,_startPosY+3,_startPosY+3,_startPosY+3,_startPosY,_startPosY,_startPosY+3,_startPosY+3,_startPosY+9,
},9); },9);
} }
if (_EntityLoco.LocoLine) if (((EntityLoco)EntityTrain).LocoLine)
{ {
g2d.drawPolyline(new int[] { g2d.drawPolyline(new int[] {
_startPosX + 60,_startPosX + 38, _startPosX + 60,_startPosX + 38,
@ -197,10 +80,10 @@ _startPosY+9,_startPosY+3,_startPosY+3,_startPosY+3,_startPosY,_startPosY,_start
_startPosY+10,_startPosY+32 _startPosY+10,_startPosY+32
},2); },2);
} }
if (_EntityLoco.FuelTank) if (((EntityLoco)EntityTrain).FuelTank)
{ {
// body // body
g2d.setColor(_EntityLoco.BodyColor); g2d.setColor(EntityTrain.BodyColor);
g2d.drawPolyline(new int[]{ g2d.drawPolyline(new int[]{
_startPosX + 89, _startPosX + 164, _startPosX + 164, _startPosX + 89, _startPosX + 89, _startPosX + 89, _startPosX + 164, _startPosX + 164, _startPosX + 89, _startPosX + 89,
}, new int[]{ }, new int[]{

193
laba1Loco/DrawingTrain.java Normal file
View File

@ -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;
/// <summary>
/// Класс-сущность
/// </summary>
public EntityTrain EntityTrain;
/// <summary>
/// Ширина окна
/// </summary>
protected int _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
protected int _pictureHeight;
/// <summary>
/// Левая координата прорисовки локомотива
/// </summary>
protected int _startPosX;
/// <summary>
/// Верхняя кооридната прорисовки локомотива
/// </summary>
protected int _startPosY;
/// <summary>
/// Ширина прорисовки локомотива
/// </summary>
protected int _locoWidth = 83;
/// <summary>
/// Высота прорисовки локомотива
/// </summary>
protected int _locoHeight = 41;
/// <summary>
/// Инициализация свойств
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Цвет кузова</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
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);
}
/// <summary>
/// Установка позиции
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
public void SetPosition(int x, int y)
{
_startPosX = Math.min(x, _pictureWidth - _locoWidth);
_startPosY = Math.min(y, _pictureHeight - _locoHeight);
}
/// <summary>
/// Координата X объекта
/// </summary>
public int GetPosX (){return _startPosX;}
/// <summary>
/// Координата Y объекта
/// </summary>
public int GetPosY (){return _startPosY;}
/// <summary>
/// Ширина объекта
/// </summary>
public int GetWidth (){return _locoWidth;}
/// <summary>
/// Высота объекта
/// </summary>
public int GetHeight (){return _locoHeight;}
/// <summary>
/// Проверка, что объект может переместится по указанному направлению
/// </summary>
/// <param name="direction">Направление</param>
/// <returns>true - можно переместится по указанному направлению</returns>
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;
}
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
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;
}
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
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);
}
}

View File

@ -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); }
}

View File

@ -6,29 +6,13 @@ import javax.swing.*;
import javax.swing.Timer; import javax.swing.Timer;
import java.awt.event.*; import java.awt.event.*;
public class EntityLoco{ public class EntityLoco extends EntityTrain{
/// <summary>
/// Скорость
/// </summary>
public int Speed;
/// <summary>
/// Вес
/// </summary>
public double Weight;
/// <summary>
/// Основной цвет
/// </summary>
public Color BodyColor;
/// <summary>
/// Дополнительный цвет (для опциональных элементов)
/// </summary>
public Color AdditionalColor; public Color AdditionalColor;
/// <summary> /// <summary>
/// Признак (опция) наличия трубы /// Признак (опция) наличия трубы
/// </summary> /// </summary>
public boolean Tube; public boolean Tube;
/// <summary> /// Признак (опция) наличия топливного бака
/// Признак (опция) наличия бака
/// </summary> /// </summary>
public boolean FuelTank; public boolean FuelTank;
/// <summary> /// <summary>
@ -36,15 +20,7 @@ public class EntityLoco{
/// </summary> /// </summary>
public boolean LocoLine; public boolean LocoLine;
/// <summary> /// <summary>
/// Шаг перемещения автомобиля /// Инициализация полей объекта-класса Локомотива
/// </summary>
public double Step;
/// <summary>
/// количество колёс [2;4]
/// </summary>
public int numWheel;
/// <summary>
/// Инициализация полей объекта-класса спортивного автомобиля
/// </summary> /// </summary>
/// <param name="speed">Скорость</param> /// <param name="speed">Скорость</param>
/// <param name="weight">Вес автомобиля</param> /// <param name="weight">Вес автомобиля</param>
@ -52,18 +28,13 @@ public class EntityLoco{
/// <param name="additionalColor">Дополнительный цвет</param> /// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="tube">Признак наличия трубы</param> /// <param name="tube">Признак наличия трубы</param>
/// <param name="fuelTank">Признак наличия бака</param> /// <param name="fuelTank">Признак наличия бака</param>
/// <param name="locoLine">Признак паровозной гоночной полосы</param> /// <param name="locoLine">Признак наличия паровозной полосы</param>
public void Init(int speed, double weight, Color bodyColor, Color public EntityLoco(int speed, double weight, Color bodyColor, int _numWheel, Color additionalColor, boolean tube, boolean fuelTank, boolean locoLine)
additionalColor, boolean tube, boolean fuelTank, boolean locoLine, int _numWheel)
{ {
numWheel = _numWheel; super(speed, weight, bodyColor, _numWheel);
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
AdditionalColor = additionalColor; AdditionalColor = additionalColor;
Tube = tube; Tube = tube;
FuelTank = fuelTank; FuelTank = fuelTank;
LocoLine = locoLine; LocoLine = locoLine;
Step = (double)Speed * 100 / Weight;
} }
} }

View File

@ -24,16 +24,21 @@ public class EntityTrain {
/// </summary> /// </summary>
public double Step; public double Step;
/// <summary> /// <summary>
/// количество колёс [2;4]
/// </summary>
public int numWheel;
/// <summary>
/// Инициализация полей объекта-класса Локомотива /// Инициализация полей объекта-класса Локомотива
/// </summary> /// </summary>
/// <param name="speed">Скорость</param> /// <param name="speed">Скорость</param>
/// <param name="weight">Вес автомобиля</param> /// <param name="weight">Вес автомобиля</param>
/// <param name="bodyColor">Основной цвет</param> /// <param name="bodyColor">Основной цвет</param>
public EntityTrain(int speed, double weight, Color bodyColor) public EntityTrain(int speed, double weight, Color bodyColor, int _numWheel)
{ {
Speed = speed; Speed = speed;
Weight = weight; Weight = weight;
BodyColor = bodyColor; BodyColor = bodyColor;
numWheel = _numWheel;
Step = (double)Speed * 100 / Weight; Step = (double)Speed * 100 / Weight;
} }
} }

View File

@ -7,8 +7,11 @@ import javax.swing.Timer;
import java.awt.event.*; import java.awt.event.*;
public class FormTrain{ public class FormTrain{
private DrawingLoco _drawingLoco; private DrawingTrain _drawingTrain;
private AbstractStrategy abstractStrategy;
Canvas canv; Canvas canv;
static int pictureBoxWidth = 980;
static int pictureBoxHeight = 560;
public void Draw(){ public void Draw(){
canv.repaint(); canv.repaint();
@ -17,6 +20,14 @@ public class FormTrain{
public FormTrain(){ public FormTrain(){
JFrame w=new JFrame ("Loco"); JFrame w=new JFrame ("Loco");
JButton buttonCreate = new JButton("create"); 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(); JButton up = new JButton();
up.setBorderPainted(false); up.setBorderPainted(false);
up.setFocusPainted(false); up.setFocusPainted(false);
@ -41,20 +52,86 @@ public class FormTrain{
right.setContentAreaFilled(false); right.setContentAreaFilled(false);
right.setName("right"); right.setName("right");
right.setIcon(new ImageIcon("D:\\Coffee\\PIbd-21_Kouvshinoff_T._A._WarmlyLocomotive._Harder\\laba1Loco\\images\\arowR340x259.png")); 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( buttonCreate.addActionListener(
new ActionListener() { new ActionListener() {
public void actionPerformed(ActionEvent e){ public void actionPerformed(ActionEvent e){
System.out.println(e.getActionCommand()); System.out.println(e.getActionCommand());
Random random = new Random(); Random random = new Random();
_drawingLoco = new DrawingLoco(); _drawingTrain = new DrawingTrain(
_drawingLoco.Init(random.nextInt(100, 300), random.nextInt(1000, 3000), 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)),
new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)), random.nextInt(2, 5),
random.nextInt(0, 2) == 1, random.nextInt(0, 2) == 1, random.nextInt(0, 2) == 1, 1000,
random.nextInt(2, 5), 1000, 560); 560);
_drawingLoco.SetPosition(random.nextInt(10, 100), random.nextInt(10, 100)); _drawingTrain.SetPosition(random.nextInt(10, 100), random.nextInt(10, 100));
canv._drawingLoco = _drawingLoco; canv._drawingTrain = _drawingTrain;
Draw(); Draw();
} }
} }
@ -62,22 +139,22 @@ public class FormTrain{
ActionListener actioListener = new ActionListener() { ActionListener actioListener = new ActionListener() {
public void actionPerformed(ActionEvent e){ public void actionPerformed(ActionEvent e){
System.out.println(((JButton)(e.getSource())).getName()); System.out.println(((JButton)(e.getSource())).getName());
if (_drawingLoco == null) if (_drawingTrain == null)
{ {
return; return;
} }
switch(((JButton)(e.getSource())).getName()){ switch(((JButton)(e.getSource())).getName()){
case "up": case "up":
_drawingLoco.MoveTransport(Direction.Up); _drawingTrain.MoveTransport(Direction.Up);
break; break;
case "down": case "down":
_drawingLoco.MoveTransport(Direction.Down); _drawingTrain.MoveTransport(Direction.Down);
break; break;
case "left": case "left":
_drawingLoco.MoveTransport(Direction.Left); _drawingTrain.MoveTransport(Direction.Left);
break; break;
case "right": case "right":
_drawingLoco.MoveTransport(Direction.Right); _drawingTrain.MoveTransport(Direction.Right);
break; break;
} }
Draw(); Draw();
@ -92,33 +169,39 @@ public class FormTrain{
w.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); w.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
w.setLayout(null); w.setLayout(null);
canv = new Canvas(); canv = new Canvas();
canv.setBounds(0, 0, 1000, 600); canv.setBounds(0, 0, pictureBoxWidth, pictureBoxHeight);
buttonCreate.setBounds(2, 540, 100, 20); buttonCreate.setBounds(2, 540, 100, 20);
buttonCreateLocomotive.setBounds(105, 540, 150, 20);
up.setBounds(900, 480, 40, 40); up.setBounds(900, 480, 40, 40);
down.setBounds(900, 520, 40, 40); down.setBounds(900, 520, 40, 40);
left.setBounds(860, 520, 40, 40); left.setBounds(860, 520, 40, 40);
right.setBounds(940, 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(canv);
w.add(buttonCreate); w.add(buttonCreate);
w.add(buttonCreateLocomotive);
w.add(up); w.add(up);
w.add(down); w.add(down);
w.add(left); w.add(left);
w.add(right); w.add(right);
w.add(comboBoxStrategy);
w.add(buttonStrategysStep);
w.setVisible (true); w.setVisible (true);
} }
} }
class Canvas extends JComponent{ class Canvas extends JComponent{
public DrawingLoco _drawingLoco; public DrawingTrain _drawingTrain;
public Canvas(){ public Canvas(){
} }
public void paintComponent (Graphics g){ public void paintComponent (Graphics g){
if (_drawingLoco == null){ if (_drawingTrain == null){
return; return;
} }
super.paintComponents (g) ; super.paintComponents (g) ;
Graphics2D g2d = (Graphics2D)g; Graphics2D g2d = (Graphics2D)g;
_drawingLoco.DrawTransport(g2d); _drawingTrain.DrawTransport(g2d);
super.repaint(); super.repaint();
} }
} }

View File

@ -0,0 +1,23 @@
package laba1Loco;
public interface IMoveableObject {
/// <summary>
/// Получение координаты X объекта
/// </summary>
ObjectParameters GetObjectPosition();
/// <summary>
/// Шаг объекта
/// </summary>
int GetStep();
/// <summary>
/// Проверка, можно ли переместиться по нужному направлению
/// </summary>
/// <param name="direction"></param>
/// <returns></returns>
boolean CheckCanMove(Direction direction);
/// <summary>
/// Изменение направления пермещения объекта
/// </summary>
/// <param name="direction">Направление</param>
void MoveObject(Direction direction);
}

View File

@ -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();
}
}
}
}

View File

@ -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();
}
}
}
}

View File

@ -0,0 +1,46 @@
package laba1Loco;
public class ObjectParameters {
private int _x;
private int _y;
private int _width;
private int _height;
/// <summary>
/// Левая граница
/// </summary>
public int LeftBorder() {return _x;}
/// <summary>
/// Верхняя граница
/// </summary>
public int TopBorder () {return _y;}
/// <summary>
/// Правая граница
/// </summary>
public int RightBorder () {return _x + _width;}
/// <summary>
/// Нижняя граница
/// </summary>
public int DownBorder () {return _y + _height;}
/// <summary>
/// Середина объекта
/// </summary>
public int ObjectMiddleHorizontal () {return _x + _width / 2;}
/// <summary>
/// Середина объекта
/// </summary>
public int ObjectMiddleVertical () {return _y + _height / 2;}
/// <summary>
/// Конструктор
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
/// <param name="width">Ширина</param>
/// <param name="height">Высота</param>
public ObjectParameters(int x, int y, int width, int height)
{
_x = x;
_y = y;
_width = width;
_height = height;
}
}