Готовая 2 лаба

This commit is contained in:
ekallin 2023-11-06 18:54:22 +04:00
parent c6d45987cc
commit b6dfcc81a0
20 changed files with 737 additions and 240 deletions

View File

@ -0,0 +1,84 @@
package ProjectElectroLocomotive;
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();
}
protected boolean MoveLeft(){
return MoveTo(DyrectionType.Left);
}
protected boolean MoveRight(){
return MoveTo(DyrectionType.Right);
}
protected boolean MoveUp(){
return MoveTo(DyrectionType.Up);
}
protected boolean MoveDown(){
return MoveTo(DyrectionType.Down);
}
/// Параметры объекта
protected ObjectParameters GetObjectParameters(){
if(_moveableObject == null) return null;
return _moveableObject.GetObjectPosition();
}
protected int GetStep()
{
if (_state != Status.InProgress)
{
return -1;
}
if(_moveableObject == null) return -1;
return _moveableObject.GetStep();
}
protected abstract void MoveToTarget();
protected abstract boolean IsTargetDestinaion();
private boolean MoveTo(DyrectionType directionType)
{
if (_state != Status.InProgress)
{
return false;
}
if (_moveableObject.CheckCanMove(directionType) == false) return false;
{
_moveableObject.MoveObject(directionType);
return true;
}
}
}

View File

@ -1,173 +1,37 @@
package ProjectElectroLocomotive;
import java.awt.*;
public class DrawingElectricLocomotive {
public EntityElectricLocomotive EntityElectricLocomotive;
private DrawingWheel _drawingWheel;
private int _pictureWidth;
private int _pictureHeight;
private int _startPosX;
private int _startPosY;
private final int _locoWidth = 150;
private final int _locoHeight = 50;
public boolean Init(int speed, double weight, Color bodyColor, Color additionalColor,
boolean horns, boolean seifbatteries, int width, int height)
public class DrawingElectricLocomotive extends DrawingLocomotive {
public DrawingElectricLocomotive(int speed, double weight, Color bodyColor, Color additionalColor,
boolean horns, boolean seifBatteries, int width, int height)
{
if (width < _locoWidth || height < _locoHeight)
super(speed, weight, bodyColor, width, height, 150, 50);
if (EntityLocomotive != null)
{
return false;
EntityLocomotive = new EntityElectricLocomotive(speed, width, bodyColor, additionalColor, horns, seifBatteries);
}
_pictureWidth = width;
_pictureHeight = height;
EntityElectricLocomotive = new EntityElectricLocomotive();
_drawingWheel = new DrawingWheel();
EntityElectricLocomotive.Init(speed, weight, bodyColor, additionalColor, horns, seifbatteries);
return true;
}
public void SetWheelsCount(int weelsCount) {
_drawingWheel.SetWheelsCount(weelsCount);
}
public void SetPosition(int x, int y)
@Override
public void DrawTransport(Graphics g)
{
if (x < 0 || x + _locoWidth > _pictureWidth)
if (EntityLocomotive instanceof EntityElectricLocomotive electricLocomotive) ///////// WARNING INSTANCEOF
{
x = 20;
}
if (y < 0 || y + _locoHeight > _pictureHeight)
{
y = 20;
}
_startPosX = x;
_startPosY = y;
Color colorBlack = Color.BLACK;
if (electricLocomotive.Horns) {
//horns
g.setColor(colorBlack);
g.fillRect(_startPosX + 30, _startPosY + 15, 20, 5);
g.drawLine(_startPosX + 40, _startPosY + 15, _startPosX + 50, _startPosY + 10);
g.drawLine(_startPosX + 50, _startPosY + 10, _startPosX + 45, _startPosY);
g.drawLine(_startPosX + 45, _startPosY + 15, _startPosX + 50, _startPosY + 10);
g.drawLine(_startPosX + 50, _startPosY + 10, _startPosX + 40, _startPosY);
}
public void MoveTransport(DyrectionType direction){
if(EntityElectricLocomotive == null) return;
switch(direction)
{
case Up -> {
if(_startPosY - EntityElectricLocomotive.Step() >= 0)
_startPosY -= (int) EntityElectricLocomotive.Step();
if (electricLocomotive.SeifBatteries) {
g.setColor(colorBlack);
g.fillRect(_startPosX + 80, _startPosY + 30, 5, 10);
}
case Down -> {
if(_startPosY + EntityElectricLocomotive.Step() + _locoHeight <= _pictureHeight)
_startPosY += (int) EntityElectricLocomotive.Step();
super.DrawTransport(g);
}
case Left -> {
if(_startPosX - EntityElectricLocomotive.Step() >= 0)
_startPosX -= (int) EntityElectricLocomotive.Step();
}
case Right -> {
if(_startPosX + EntityElectricLocomotive.Step() + _locoWidth <= _pictureWidth)
_startPosX += (int) EntityElectricLocomotive.Step();
}
}
}
public void DrawTransport(Graphics g) {
if (EntityElectricLocomotive == null) {
return;
}
Graphics2D g2d = (Graphics2D) g;
Color bodyColor = EntityElectricLocomotive.BodyColor;
Color additionalColor = EntityElectricLocomotive.AdditionalColor;
Color blackBrush = Color.BLACK;
Color windowsColor = Color.BLUE;
_drawingWheel.DrawWheels(g, additionalColor, _startPosX, _startPosY, 5, 5);
if(EntityElectricLocomotive.Horns)
{
g2d.fillRect(_startPosX + 30, _startPosY + 15, 20, 5);
g2d.drawLine(_startPosX + 40, _startPosY + 15, _startPosX + 50, _startPosY + 10);
g2d.drawLine(_startPosX + 50, _startPosY + 10, _startPosX + 45, _startPosY);
g2d.drawLine(_startPosX + 45, _startPosY + 15, _startPosX + 50, _startPosY + 10);
g2d.drawLine(_startPosX + 50, _startPosY + 10, _startPosX + 40, _startPosY);
g2d.setColor(blackBrush);
}
//locomotive
Polygon loco = new Polygon();
loco.addPoint(_startPosX, _startPosY + 40);
loco.addPoint(_startPosX, _startPosY + 30);
loco.addPoint(_startPosX + 20, _startPosY + 20);
loco.addPoint(_startPosX + 70, _startPosY + 20);
loco.addPoint(_startPosX +80, _startPosY + 30);
loco.addPoint(_startPosX +80, _startPosY + 40);
loco.addPoint(_startPosX +75, _startPosY + 45);
loco.addPoint(_startPosX +5, _startPosY + 45);
loco.addPoint(_startPosX, _startPosY + 40);
g2d.setColor(blackBrush);
g2d.drawPolygon(loco);
g2d.setColor(bodyColor);
g2d.fillPolygon(loco);
// windows
Polygon window = new Polygon();
window.addPoint(_startPosX + 10, _startPosY + 30);
window.addPoint(_startPosX +15, _startPosY + 25);
window.addPoint(_startPosX + 20, _startPosY + 25);
window.addPoint(_startPosX + 20, _startPosY + 30);
window.addPoint(_startPosX +10, _startPosY + 30);
g2d.setColor(blackBrush);
g2d.drawPolygon(window);
g2d.setColor(windowsColor);
g2d.fillPolygon(window);
g2d.fillRect(_startPosX + 25, _startPosY + 25, 10, 5);
g2d.setColor(windowsColor);
g2d.drawRect(_startPosX + 25, _startPosY + 25, 10, 5);
g2d.setColor(blackBrush);
//locomotive
if(EntityElectricLocomotive.SeifBatteries)
{
g2d.drawRect(_startPosX + 50, _startPosY + 25, 20, 10);
g2d.setColor(blackBrush);
}
//обязательные колеса
//loco
g2d.fillOval(_startPosX + 10, _startPosY + 45, 5, 5);
g2d.fillOval(_startPosX + 25, _startPosY + 45, 5, 5);
g2d.fillOval(_startPosX + 50, _startPosY + 45, 5, 5);
g2d.fillOval(_startPosX + 65, _startPosY + 45, 5, 5);
//telega
g2d.setColor(blackBrush);
g2d.fillOval(_startPosX + 95, _startPosY + 45, 5, 5);
g2d.fillOval(_startPosX + 140, _startPosY + 45, 5, 5);
//telejka
Polygon telega = new Polygon();
telega.addPoint(_startPosX + 90, _startPosY + 25);
telega.addPoint(_startPosX + 95, _startPosY + 20);
telega.addPoint(_startPosX + 145, _startPosY + 20);
telega.addPoint(_startPosX + 150, _startPosY + 25);
telega.addPoint(_startPosX + 150, _startPosY + 45);
telega.addPoint(_startPosX + 90, _startPosY + 45);
telega.addPoint(_startPosX + 90, _startPosY + 25);
g2d.setColor(additionalColor);
g2d.fillPolygon(telega);
g2d.setColor(blackBrush);
g2d.drawPolygon(telega);
//telejka
//телега окна
g2d.setColor(blackBrush);
g.drawLine(_startPosX + 80, _startPosY + 40, _startPosX + 90, _startPosY + 40);
g2d.setColor(windowsColor); g.fillRect(_startPosX + 95, _startPosY + 30, 10, 5);
g.fillRect(_startPosX + 115, _startPosY + 30, 10, 5);
g.fillRect(_startPosX + 135, _startPosY + 30, 10, 5);
}
}

View File

@ -0,0 +1,28 @@
package ProjectElectroLocomotive;
import java.awt.*;
public class DrawingEmptyWheels implements IDrawingWheels{
private WheelsCount _wheelsCount;
@Override
public void SetWheelsCount(int wheelsCount) {
for (WheelsCount val : WheelsCount.values()) {
if (val.count == wheelsCount) {
_wheelsCount = val;
return;
}
}
this._wheelsCount = WheelsCount.Three;
}
@Override
public WheelsCount GetWheelsCount() {
return _wheelsCount;
}
@Override
public void DrawWheel(Graphics2D g2d, Color color, int x, int y, int w, int h) {
g2d.setColor(Color.BLACK);
g2d.drawOval(x, y, w, h);
}
}

View File

@ -0,0 +1,205 @@
package ProjectElectroLocomotive;
import java.awt.*;
import java.security.cert.PolicyNode;
import java.util.Random;
public class DrawingLocomotive {
public EntityLocomotive EntityLocomotive;
protected IDrawingWheels _drawingWheels;
private int _pictureWidth;
private int _pictureHeight;
public int _startPosX;
public int _startPosY;
private int _locoWidth = 150;
private int _locoHeight = 50;
public int GetPosX(){
return _startPosX;
}
public int GetPosY(){
return _startPosY;
}
public int GetWidth(){
return _locoWidth;
}
public int GetHeight(){
return _locoHeight;
}
public DrawingLocomotive(int speed, double weight, Color bodyColor, int width, int heigth)
{
if (width < _locoWidth || heigth < _locoHeight)
{
return;
}
_pictureWidth = width;
_pictureHeight = heigth;
EntityLocomotive = new EntityLocomotive(speed, weight, bodyColor);
Random rnd = new Random();
int WhatWheels = rnd.nextInt(0, 3);
if(WhatWheels == 0) _drawingWheels = new DrawingWheel();
if(WhatWheels == 1) _drawingWheels = new DrawingEmptyWheels();
if(WhatWheels == 2) _drawingWheels = new DrawingWheelsBlueCrom();
}
protected DrawingLocomotive(int speed, double weight, Color bodyColor, int width,
int height, int locoWidth, int locoHeight)
{
this(speed,weight, bodyColor, width, height);
if (width < _locoWidth || height < _locoHeight)
{
return;
}
_pictureWidth = width;
_pictureHeight = height;
_locoWidth = locoWidth;
_locoHeight = locoHeight;
}
public void SetWheelsCount(int wheelsCount){
_drawingWheels.SetWheelsCount(wheelsCount);
}
//Установка позиции
public void SetPosition(int x, int y)
{
if (x < 0 || x + _locoWidth > _pictureWidth)
{
x = _pictureWidth - _locoWidth;
}
if (y < 0 || y + _locoHeight > _pictureHeight)
{
y = _pictureHeight - _locoHeight;
}
_startPosX = x;
_startPosY = y;
}
public void MoveTransport(DyrectionType direction) {
if (EntityLocomotive == null) {
return;
}
switch (direction) {
case Left:
if (_startPosX - EntityLocomotive.Step() > 0) {
_startPosX -= (int) EntityLocomotive.Step();
}
break;
case Up:
if (_startPosY - EntityLocomotive.Step() > 0) {
_startPosY -= (int) EntityLocomotive.Step();
}
break;
case Right:
if (_startPosX + EntityLocomotive.Step() + _locoWidth < _pictureWidth) {
_startPosX += (int) EntityLocomotive.Step();
}
break;
case Down:
if (_startPosY + EntityLocomotive.Step() + _locoHeight < _pictureHeight) {
_startPosY += (int) EntityLocomotive.Step();
}
break;
}
}
public void DrawTransport(Graphics g)
{
{
if (EntityLocomotive == null) return;
}
Color colorBlack = Color.BLACK;
Color windows = Color.BLUE;
Color bodyColor = EntityLocomotive.BodyColor;
//локомотив
g.setColor(bodyColor);
Polygon locoP = new Polygon();
locoP.addPoint(_startPosX, _startPosY + 40);
locoP.addPoint(_startPosX, _startPosY + 30);
locoP.addPoint(_startPosX + 20, _startPosY + 20);
locoP.addPoint(_startPosX + 70, _startPosY + 20);
locoP.addPoint(_startPosX +80, _startPosY + 30);
locoP.addPoint(_startPosX +80, _startPosY + 40);
locoP.addPoint(_startPosX +75, _startPosY + 45);
locoP.addPoint(_startPosX +5, _startPosY + 45);
locoP.addPoint(_startPosX, _startPosY + 40);
g.fillPolygon(locoP);
g.setColor(colorBlack);
g.drawPolygon(locoP);
//окошки
Polygon window = new Polygon();
window.addPoint(_startPosX + 10, _startPosY + 30);
window.addPoint(_startPosX +15, _startPosY + 25);
window.addPoint(_startPosX + 20, _startPosY + 25);
window.addPoint(_startPosX + 20, _startPosY + 30);
window.addPoint(_startPosX +10, _startPosY + 30);
g.setColor(windows);
g.fillPolygon(window);
g.fillRect(_startPosX + 25, _startPosY + 25, 10, 5);
g.setColor(Color.black);
g.drawPolygon(window);
g.drawRect(_startPosX + 25, _startPosY + 25, 10, 5);
//обязательные колеса
//loco
g.fillOval(_startPosX + 10, _startPosY + 45, 9, 9);
g.fillOval(_startPosX + 25, _startPosY + 45, 9, 9);
g.fillOval(_startPosX + 50, _startPosY + 45, 9, 9);
g.fillOval(_startPosX + 65, _startPosY + 45, 9, 9);
//telejka
Polygon telega = new Polygon();
telega.addPoint(_startPosX + 90, _startPosY + 25);
telega.addPoint(_startPosX + 95, _startPosY + 20);
telega.addPoint(_startPosX + 145, _startPosY + 20);
telega.addPoint(_startPosX + 150, _startPosY + 25);
telega.addPoint(_startPosX + 150, _startPosY + 45);
telega.addPoint(_startPosX + 90, _startPosY + 45);
telega.addPoint(_startPosX + 90, _startPosY + 25);
g.setColor(bodyColor);
g.fillPolygon(telega);
g.setColor(colorBlack);
g.drawPolygon(telega);
//телега окна
g.setColor(colorBlack);
g.drawLine(_startPosX + 80, _startPosY + 40, _startPosX + 90, _startPosY + 40);
g.setColor(windows); g.fillRect(_startPosX + 95, _startPosY + 30, 10, 5);
g.fillRect(_startPosX + 115, _startPosY + 30, 10, 5);
g.fillRect(_startPosX + 135, _startPosY + 30, 10, 5);
_drawingWheels.DrawWheels(g, colorBlack, _startPosX, _startPosY, 9,9);
}
public boolean CanMove(DyrectionType direction)
{
if (EntityLocomotive == null)
{
return false;
}
switch(direction) {
//влево
case Left:
if (_startPosX - EntityLocomotive.Step() > 0) return true;
break;
case Up:
if (_startPosY - EntityLocomotive.Step() > 0) return true;
break;
case Right:
if (_startPosX + EntityLocomotive.Step() < _pictureWidth) return true;
break;
case Down:
if (_startPosY + EntityLocomotive.Step() < _pictureHeight) return true;
break;
}
return false;
}
}

View File

@ -0,0 +1,30 @@
package ProjectElectroLocomotive;
public class DrawingObjectLocomotive implements IMoveableObject {
private DrawingLocomotive _drawningLocomotive = null;
public DrawingObjectLocomotive(DrawingLocomotive drawningLocomotive)
{
_drawningLocomotive = drawningLocomotive;
}
public ObjectParameters GetObjectPosition()
{
if (_drawningLocomotive == null || _drawningLocomotive.EntityLocomotive == null)
{
return null;
}
return new ObjectParameters(_drawningLocomotive.GetPosX(), _drawningLocomotive.GetPosY(),
_drawningLocomotive.GetWidth(), _drawningLocomotive.GetHeight());
}
public int GetStep(){
if(_drawningLocomotive == null) return -1;
return (int)(_drawningLocomotive.EntityLocomotive.Step());
}
public boolean CheckCanMove(DyrectionType direction){
if(_drawningLocomotive == null) return false;
return _drawningLocomotive.CanMove(direction);
}
public void MoveObject(DyrectionType direction){
if(_drawningLocomotive == null) return;
_drawningLocomotive.MoveTransport(direction);
}
}

View File

@ -2,41 +2,25 @@ package ProjectElectroLocomotive;
import java.awt.*;
public class DrawingWheel {
public class DrawingWheel implements IDrawingWheels {
private WheelsCount _wheelsCount;
public void SetWheelsCount(int enginesCount) {
public void SetWheelsCount(int wheelsCount) {
for (WheelsCount val : WheelsCount.values()) {
if (val.count == enginesCount) {
this._wheelsCount = val;
if (val.count == wheelsCount) {
_wheelsCount = val;
return;
}
}
this._wheelsCount = WheelsCount.Three;
}
private void DrawWheel(Graphics2D g2d, Color color, int x, int y, int w, int h) {
@Override
public WheelsCount GetWheelsCount() {
return _wheelsCount;
}
public void DrawWheel(Graphics2D g2d, Color color, int x, int y, int w, int h) {
g2d.setColor(Color.BLACK);
g2d.fillOval(x, y, w, h);
}
public void DrawWheels(Graphics g, Color color, int startPosX, int startPosY, int drawingWidth, int drawingHeight) {
if (_wheelsCount == null) {
return;
}
Graphics2D g2d = (Graphics2D) g;
int wheelWidth = 5;
int wheelHeight = 5;
if (_wheelsCount.count >= _wheelsCount.Three.count) {
DrawWheel(g2d, color, startPosX + 105, startPosY + 45, wheelWidth, wheelHeight
);
}
if (_wheelsCount.count >= _wheelsCount.Four.count) {
DrawWheel(g2d, color, startPosX + 105, startPosY + 45, wheelWidth, wheelHeight
);
DrawWheel(g2d, color, startPosX + 130, startPosY + 45, wheelWidth, wheelHeight
);
}
}
}

View File

@ -0,0 +1,35 @@
package ProjectElectroLocomotive;
import java.awt.*;
public class DrawingWheelsBlueCrom implements IDrawingWheels{
private WheelsCount _wheelsCount;
@Override
public void SetWheelsCount(int wheelsCount) {
for (WheelsCount val : WheelsCount.values()) {
if (val.count == wheelsCount) {
_wheelsCount = val;
return;
}
}
this._wheelsCount = WheelsCount.Three;
}
@Override
public WheelsCount GetWheelsCount() {
return _wheelsCount;
}
@Override
public void DrawWheel(Graphics2D g2d, Color color, int x, int y, int w, int h) {
g2d.setColor(Color.BLUE);
g2d.drawOval(x, y + 3, w + 2, h + 2);
g2d.setColor(Color.RED);
g2d.drawOval(x - 2, y - 2, w + 2, h + 2);
g2d.setColor(Color.MAGENTA);
g2d.drawOval(x + 3, y, w + 3, h + 3);
g2d.setColor(Color.BLACK);
g2d.drawOval(x, y, w, h);
}
}

View File

@ -1,5 +1,5 @@
package ProjectElectroLocomotive;
public enum DyrectionType {
Up, Down, Left, Right
Up, Down, Left, Right;
}

View File

@ -2,25 +2,16 @@ package ProjectElectroLocomotive;
import java.awt.*;
public class EntityElectricLocomotive {
public int Speed;
public double Weight;
public Color BodyColor;
public class EntityElectricLocomotive extends EntityLocomotive {
public Color AdditionalColor;
public boolean Horns;
public boolean SeifBatteries;
public double Step()
public EntityElectricLocomotive(int speed, double weight, Color bodyColor, Color additionalColor, boolean horns, boolean seifBatteries)
{
return (double) Speed * 100 / Weight;
}
public void Init(int speed, double weight, Color bodyColor, Color additionalColor,
boolean horns, boolean seifBatteries)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
super(speed, weight, bodyColor);
AdditionalColor = additionalColor;
Horns = horns;
SeifBatteries = seifBatteries;
}
}

View File

@ -0,0 +1,23 @@
package ProjectElectroLocomotive;
import java.awt.*;
public class EntityLocomotive {
public int Speed;
public double Weight;
public Color BodyColor;
public EntityLocomotive(int speed, double weight, Color bodyColor) {
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
}
public double Step()
{
return (double) Speed * 100 / Weight;
}
public void Init(int speed, double weight, Color bodyColor, Color additionalColor, boolean horns, boolean seifbatteries) {
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
}
}

View File

@ -1,38 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="ProjectElectroLocomotive.FormElectricLocomotive">
<grid id="27dc6" binding="pictureBox" layout-manager="GridLayoutManager" row-count="3" column-count="5" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<grid id="27dc6" binding="pictureBox" layout-manager="GridLayoutManager" row-count="5" column-count="6" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="20" y="20" width="701" height="435"/>
<xy x="20" y="20" width="700" height="400"/>
</constraints>
<properties>
<maximumSize width="500" height="400"/>
<minimumSize width="500" height="400"/>
<preferredSize width="500" height="400"/>
<maximumSize width="700" height="400"/>
<minimumSize width="700" height="400"/>
<preferredSize width="700" height="400"/>
</properties>
<border type="none"/>
<children>
<component id="c802b" class="javax.swing.JButton" binding="buttonCreate">
<component id="c802b" class="javax.swing.JButton" binding="buttonCreateLocomotive">
<constraints>
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
<grid row="4" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Создать"/>
<text value="Создать Локо"/>
</properties>
</component>
<hspacer id="c3e7a">
<constraints>
<grid row="2" column="1" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
</hspacer>
<vspacer id="a4368">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
</constraints>
</vspacer>
<component id="1039d" class="javax.swing.JButton" binding="buttonDown">
<constraints>
<grid row="2" column="3" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false">
<grid row="4" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false">
<minimum-size width="30" height="30"/>
<preferred-size width="30" height="30"/>
<maximum-size width="30" height="30"/>
@ -46,7 +41,7 @@
</component>
<component id="26400" class="javax.swing.JButton" binding="buttonUp">
<constraints>
<grid row="1" column="3" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false">
<grid row="3" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false">
<minimum-size width="30" height="30"/>
<preferred-size width="30" height="30"/>
<maximum-size width="30" height="30"/>
@ -60,7 +55,7 @@
</component>
<component id="bb492" class="javax.swing.JButton" binding="buttonRight">
<constraints>
<grid row="2" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false">
<grid row="4" column="5" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false">
<minimum-size width="30" height="30"/>
<preferred-size width="30" height="30"/>
<maximum-size width="30" height="30"/>
@ -74,7 +69,7 @@
</component>
<component id="2f7af" class="javax.swing.JButton" binding="buttonLeft">
<constraints>
<grid row="2" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false">
<grid row="4" column="3" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false">
<minimum-size width="30" height="30"/>
<preferred-size width="30" height="30"/>
<maximum-size width="30" height="30"/>
@ -86,6 +81,35 @@
<text value=""/>
</properties>
</component>
<component id="953f3" class="javax.swing.JButton" binding="buttonCreateElectricLocomotive">
<constraints>
<grid row="4" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Создать ЭлектроЛоко"/>
</properties>
</component>
<component id="18267" class="javax.swing.JComboBox" binding="comboBoxStrategy">
<constraints>
<grid row="0" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<inheritsPopupMenu value="false"/>
<model>
<item value="MoveToCenter"/>
<item value="MoveToRightCorner"/>
</model>
<toolTipText value=""/>
</properties>
</component>
<component id="f30de" class="javax.swing.JButton" binding="buttonStep">
<constraints>
<grid row="1" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Шаг"/>
</properties>
</component>
</children>
</grid>
</form>

View File

@ -1,17 +1,22 @@
package ProjectElectroLocomotive;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
public class FormElectricLocomotive {
DrawingElectricLocomotive _drawingElectricLocomotive = new DrawingElectricLocomotive();
private JButton buttonCreate;
DrawingLocomotive _drawingLocomotive;
AbstractStrategy _abstractStrategy;
private JButton buttonCreateElectricLocomotive;
private JPanel pictureBox;
private JButton buttonUp;
private JButton buttonDown;
private JButton buttonLeft;
private JButton buttonRight;
public JComboBox comboBoxStrategy;
private JButton buttonStep;
private JButton buttonCreateLocomotive;
public JPanel getPictureBox() {
return pictureBox;
@ -23,56 +28,112 @@ public class FormElectricLocomotive {
buttonLeft.setName("buttonLeft");
buttonRight.setName("buttonRight");
buttonCreate.addActionListener(e -> {
_drawingElectricLocomotive = new DrawingElectricLocomotive();
Random random = new Random();
pictureBox.setPreferredSize(new Dimension(600, 400));
_drawingElectricLocomotive.Init(
buttonCreateLocomotive.addActionListener(e -> {
Random rnd = new Random();
_drawingLocomotive = new DrawingLocomotive(rnd.nextInt(100, 300),
rnd.nextInt(1000, 3000),
new Color(rnd.nextInt(0, 256),
rnd.nextInt(0, 256),
rnd.nextInt(0, 256)),
pictureBox.getWidth(),
pictureBox.getHeight());
_drawingLocomotive.SetWheelsCount(rnd.nextInt(2, 5));
_drawingLocomotive.SetPosition(rnd.nextInt(10, 100), rnd.nextInt(10, 100));
Draw();
});
buttonCreateElectricLocomotive.addActionListener(e -> {
Random random = new Random();
_drawingLocomotive = new DrawingElectricLocomotive(
random.nextInt(100, 300),
random.nextInt(1000, 3000),
new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)),
new Color(random.nextInt(256), random.nextInt(256), random.nextInt(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.nextBoolean(),
random.nextBoolean(),
pictureBox.getWidth(),
pictureBox.getHeight()
);
_drawingElectricLocomotive.SetWheelsCount(random.nextInt(2, 5));
_drawingElectricLocomotive.SetPosition(random.nextInt(10, 100), random.nextInt(10, 100));
_drawingLocomotive.SetWheelsCount(random.nextInt(2, 5));
_drawingLocomotive.SetPosition(random.nextInt(10, 100), random.nextInt(10, 100));
Draw();
});
buttonStep.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (_drawingLocomotive == null) {
return;
}
if (comboBoxStrategy.isEnabled()) {
switch(comboBoxStrategy.getSelectedIndex())
{
case 0:
_abstractStrategy = new MoveToCenter();
break;
case 1:
_abstractStrategy = new MoveToRigthCorner();
break;
default:
_abstractStrategy = null;
break;
} ;
if (_abstractStrategy == null) {
return;
}
_abstractStrategy.SetData(new
DrawingObjectLocomotive(_drawingLocomotive), pictureBox.getWidth(),
pictureBox.getHeight());
comboBoxStrategy.setEnabled(false);
}
if (_abstractStrategy == null) {
return;
}
_abstractStrategy.MakeStep();
Draw();
if (_abstractStrategy.GetStatus() == Status.Finish) {
comboBoxStrategy.setEnabled(true);
_abstractStrategy = null;
}
}
});
ActionListener buttonMoveClickedListener = e -> {
String buttonName = ((JButton) e.getSource()).getName();
switch (buttonName) {
case ("buttonUp") -> {
_drawingElectricLocomotive.MoveTransport(DyrectionType.Up);
_drawingLocomotive.MoveTransport(DyrectionType.Up);
}
case ("buttonDown") -> {
_drawingElectricLocomotive.MoveTransport(DyrectionType.Down);
_drawingLocomotive.MoveTransport(DyrectionType.Down);
}
case ("buttonLeft") -> {
_drawingElectricLocomotive.MoveTransport(DyrectionType.Left);
_drawingLocomotive.MoveTransport(DyrectionType.Left);
}
case ("buttonRight") -> {
_drawingElectricLocomotive.MoveTransport(DyrectionType.Right);
_drawingLocomotive.MoveTransport(DyrectionType.Right);
}
}
Draw();
};
buttonUp.addActionListener(buttonMoveClickedListener);
buttonDown.addActionListener(buttonMoveClickedListener);
buttonLeft.addActionListener(buttonMoveClickedListener); buttonRight.addActionListener(buttonMoveClickedListener);
buttonLeft.addActionListener(buttonMoveClickedListener);
buttonRight.addActionListener(buttonMoveClickedListener);
}
public void Draw() {
if (_drawingElectricLocomotive.EntityElectricLocomotive == null) {
if (_drawingLocomotive.EntityLocomotive == null) {
return;
}
Graphics g = pictureBox.getGraphics();
pictureBox.paint(g);
_drawingElectricLocomotive.DrawTransport(g);
_drawingLocomotive.DrawTransport(g);
}
}

View File

@ -0,0 +1,38 @@
package ProjectElectroLocomotive;
import java.awt.*;
public interface IDrawingWheels {
void SetWheelsCount(int wheelsCount);
WheelsCount GetWheelsCount();
void DrawWheel(Graphics2D g2d, Color color, int x, int y, int w, int h);
default void DrawWheels(Graphics g, Color color, int startPosX, int startPosY, int drawingWidth, int drawingHeight){
WheelsCount wheelsCount = GetWheelsCount();
if(wheelsCount == null) return;
Graphics2D g2d = (Graphics2D) g;
int wheelWidth = 9;
int wheelHeight = 9;
if(wheelsCount.count <= wheelsCount.Two.count){
DrawWheel(g2d, color, startPosX + 95, startPosY + 45, 9, 9);
DrawWheel(g2d, color, startPosX + 140, startPosY + 45, 9, 9);
}
if (wheelsCount.count == wheelsCount.Three.count) {
DrawWheel(g2d, color, startPosX + 95, startPosY + 45, 9, 9);
DrawWheel(g2d, color, startPosX + 140, startPosY + 45, 9, 9);
DrawWheel(g2d, color, startPosX + 105, startPosY + 45, wheelWidth, wheelHeight);
}
if (wheelsCount.count == wheelsCount.Four.count) {
DrawWheel(g2d, color, startPosX + 95, startPosY + 45, 9, 9);
DrawWheel(g2d, color, startPosX + 140, startPosY + 45, 9, 9);
DrawWheel(g2d, color, startPosX + 105, startPosY + 45, wheelWidth, wheelHeight);
DrawWheel(g2d, color, startPosX + 130, startPosY + 45, wheelWidth, wheelHeight);
}
}
}

View File

@ -0,0 +1,9 @@
package ProjectElectroLocomotive;
import java.awt.*;
public interface IMoveableObject {
ObjectParameters GetObjectPosition();
int GetStep();
boolean CheckCanMove(DyrectionType direction);
void MoveObject(DyrectionType direction);
}

View File

@ -3,9 +3,6 @@ package ProjectElectroLocomotive;
public class Main {
public static void main(String[] args)
{
MainFrameElectricLocomotive mainFrame = new MainFrameElectricLocomotive();
mainFrame.setVisible(true);
// создание 2 лабы
MainFrameElectricLocomotive mainFrameElectricLocomotive = new MainFrameElectricLocomotive();
}
}

View File

@ -12,7 +12,7 @@ public class MainFrameElectricLocomotive extends JFrame {
_formElectricLocomotive = new FormElectricLocomotive();
setContentPane(_formElectricLocomotive.getPictureBox());
setDefaultLookAndFeelDecorated(false);
setLocation(500, 50);
setLocation(500, 200);
pack();
setVisible(true);
}

View File

@ -0,0 +1,45 @@
package ProjectElectroLocomotive;
public class MoveToCenter extends AbstractStrategy{
@Override
protected boolean IsTargetDestinaion()
{
var objParams = GetObjectParameters();
if (objParams == null) return false;
return objParams.ObjectMiddleHorizontal() <= FieldWidth / 2 && objParams.ObjectMiddleHorizontal() + GetStep()
>= FieldWidth / 2 && objParams.ObjectMiddleVertical() <= FieldHeight / 2 && objParams.ObjectMiddleVertical()
+ GetStep() >= FieldHeight / 2;
}
@Override
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,21 @@
package ProjectElectroLocomotive;
public class MoveToRigthCorner extends AbstractStrategy {
@Override
protected boolean IsTargetDestinaion()
{
var objParams = GetObjectParameters();
if (objParams == null) return false;
return objParams.RightBorder() >= FieldWidth - GetStep() && objParams.DownBorder() >= FieldHeight - GetStep();
}
@Override
protected void MoveToTarget()
{
var objParams = GetObjectParameters();
if (objParams == null) return;
if (objParams.RightBorder() < FieldWidth - GetStep()) MoveRight();
if (objParams.DownBorder() < FieldHeight - GetStep()) MoveDown();
}
}

View File

@ -0,0 +1,51 @@
package ProjectElectroLocomotive;
public class ObjectParameters {
private final int _x;
private final int _y;
private final int _width;
private final 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;
}
public ObjectParameters(int x, int y, int width, int height)
{
_x = x;
_y = y;
_width = width;
_height = height;
}
}

View File

@ -0,0 +1,7 @@
package ProjectElectroLocomotive;
public enum Status {
NotInit,
InProgress,
Finish
}