Готовая 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; package ProjectElectroLocomotive;
import java.awt.*; import java.awt.*;
public class DrawingElectricLocomotive { public class DrawingElectricLocomotive extends DrawingLocomotive {
public EntityElectricLocomotive EntityElectricLocomotive; public DrawingElectricLocomotive(int speed, double weight, Color bodyColor, Color additionalColor,
private DrawingWheel _drawingWheel; boolean horns, boolean seifBatteries, int width, int height)
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)
{ {
super(speed, weight, bodyColor, width, height, 150, 50);
if (width < _locoWidth || height < _locoHeight) 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;
} }
@Override
public void SetWheelsCount(int weelsCount) { public void DrawTransport(Graphics g)
_drawingWheel.SetWheelsCount(weelsCount);
}
public void SetPosition(int x, int y)
{ {
if (x < 0 || x + _locoWidth > _pictureWidth) if (EntityLocomotive instanceof EntityElectricLocomotive electricLocomotive) ///////// WARNING INSTANCEOF
{ {
x = 20; Color colorBlack = Color.BLACK;
}
if (y < 0 || y + _locoHeight > _pictureHeight)
{
y = 20;
}
_startPosX = x;
_startPosY = y;
}
public void MoveTransport(DyrectionType direction){ if (electricLocomotive.Horns) {
if(EntityElectricLocomotive == null) return; //horns
switch(direction) g.setColor(colorBlack);
{ g.fillRect(_startPosX + 30, _startPosY + 15, 20, 5);
case Up -> { g.drawLine(_startPosX + 40, _startPosY + 15, _startPosX + 50, _startPosY + 10);
if(_startPosY - EntityElectricLocomotive.Step() >= 0) g.drawLine(_startPosX + 50, _startPosY + 10, _startPosX + 45, _startPosY);
_startPosY -= (int) EntityElectricLocomotive.Step(); g.drawLine(_startPosX + 45, _startPosY + 15, _startPosX + 50, _startPosY + 10);
g.drawLine(_startPosX + 50, _startPosY + 10, _startPosX + 40, _startPosY);
} }
case Down -> {
if(_startPosY + EntityElectricLocomotive.Step() + _locoHeight <= _pictureHeight) if (electricLocomotive.SeifBatteries) {
_startPosY += (int) EntityElectricLocomotive.Step(); g.setColor(colorBlack);
} g.fillRect(_startPosX + 80, _startPosY + 30, 5, 10);
case Left -> {
if(_startPosX - EntityElectricLocomotive.Step() >= 0)
_startPosX -= (int) EntityElectricLocomotive.Step();
}
case Right -> {
if(_startPosX + EntityElectricLocomotive.Step() + _locoWidth <= _pictureWidth)
_startPosX += (int) EntityElectricLocomotive.Step();
} }
super.DrawTransport(g);
} }
} }
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.*; import java.awt.*;
public class DrawingWheel { public class DrawingWheel implements IDrawingWheels {
private WheelsCount _wheelsCount; private WheelsCount _wheelsCount;
public void SetWheelsCount(int enginesCount) { public void SetWheelsCount(int wheelsCount) {
for (WheelsCount val : WheelsCount.values()) { for (WheelsCount val : WheelsCount.values()) {
if (val.count == enginesCount) { if (val.count == wheelsCount) {
this._wheelsCount = val; _wheelsCount = val;
return; 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.setColor(Color.BLACK);
g2d.fillOval(x, y, w, h); 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; package ProjectElectroLocomotive;
public enum DyrectionType { public enum DyrectionType {
Up, Down, Left, Right Up, Down, Left, Right;
} }

View File

@ -2,25 +2,16 @@ package ProjectElectroLocomotive;
import java.awt.*; import java.awt.*;
public class EntityElectricLocomotive { public class EntityElectricLocomotive extends EntityLocomotive {
public int Speed;
public double Weight;
public Color BodyColor;
public Color AdditionalColor; public Color AdditionalColor;
public boolean Horns; public boolean Horns;
public boolean SeifBatteries; 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; super(speed, weight, bodyColor);
}
public void Init(int speed, double weight, Color bodyColor, Color additionalColor,
boolean horns, boolean seifBatteries)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
AdditionalColor = additionalColor; AdditionalColor = additionalColor;
Horns = horns; Horns = horns;
SeifBatteries = seifBatteries; 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"?> <?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="ProjectElectroLocomotive.FormElectricLocomotive"> <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"/> <margin top="0" left="0" bottom="0" right="0"/>
<constraints> <constraints>
<xy x="20" y="20" width="701" height="435"/> <xy x="20" y="20" width="700" height="400"/>
</constraints> </constraints>
<properties> <properties>
<maximumSize width="500" height="400"/> <maximumSize width="700" height="400"/>
<minimumSize width="500" height="400"/> <minimumSize width="700" height="400"/>
<preferredSize width="500" height="400"/> <preferredSize width="700" height="400"/>
</properties> </properties>
<border type="none"/> <border type="none"/>
<children> <children>
<component id="c802b" class="javax.swing.JButton" binding="buttonCreate"> <component id="c802b" class="javax.swing.JButton" binding="buttonCreateLocomotive">
<constraints> <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> </constraints>
<properties> <properties>
<text value="Создать"/> <text value="Создать Локо"/>
</properties> </properties>
</component> </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"> <vspacer id="a4368">
<constraints> <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> </constraints>
</vspacer> </vspacer>
<component id="1039d" class="javax.swing.JButton" binding="buttonDown"> <component id="1039d" class="javax.swing.JButton" binding="buttonDown">
<constraints> <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"/> <minimum-size width="30" height="30"/>
<preferred-size width="30" height="30"/> <preferred-size width="30" height="30"/>
<maximum-size width="30" height="30"/> <maximum-size width="30" height="30"/>
@ -46,7 +41,7 @@
</component> </component>
<component id="26400" class="javax.swing.JButton" binding="buttonUp"> <component id="26400" class="javax.swing.JButton" binding="buttonUp">
<constraints> <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"/> <minimum-size width="30" height="30"/>
<preferred-size width="30" height="30"/> <preferred-size width="30" height="30"/>
<maximum-size width="30" height="30"/> <maximum-size width="30" height="30"/>
@ -60,7 +55,7 @@
</component> </component>
<component id="bb492" class="javax.swing.JButton" binding="buttonRight"> <component id="bb492" class="javax.swing.JButton" binding="buttonRight">
<constraints> <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"/> <minimum-size width="30" height="30"/>
<preferred-size width="30" height="30"/> <preferred-size width="30" height="30"/>
<maximum-size width="30" height="30"/> <maximum-size width="30" height="30"/>
@ -74,7 +69,7 @@
</component> </component>
<component id="2f7af" class="javax.swing.JButton" binding="buttonLeft"> <component id="2f7af" class="javax.swing.JButton" binding="buttonLeft">
<constraints> <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"/> <minimum-size width="30" height="30"/>
<preferred-size width="30" height="30"/> <preferred-size width="30" height="30"/>
<maximum-size width="30" height="30"/> <maximum-size width="30" height="30"/>
@ -86,6 +81,35 @@
<text value=""/> <text value=""/>
</properties> </properties>
</component> </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> </children>
</grid> </grid>
</form> </form>

View File

@ -1,17 +1,22 @@
package ProjectElectroLocomotive; package ProjectElectroLocomotive;
import javax.swing.*; import javax.swing.*;
import java.awt.*; import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.util.Random; import java.util.Random;
public class FormElectricLocomotive { public class FormElectricLocomotive {
DrawingElectricLocomotive _drawingElectricLocomotive = new DrawingElectricLocomotive(); DrawingLocomotive _drawingLocomotive;
private JButton buttonCreate; AbstractStrategy _abstractStrategy;
private JButton buttonCreateElectricLocomotive;
private JPanel pictureBox; private JPanel pictureBox;
private JButton buttonUp; private JButton buttonUp;
private JButton buttonDown; private JButton buttonDown;
private JButton buttonLeft; private JButton buttonLeft;
private JButton buttonRight; private JButton buttonRight;
public JComboBox comboBoxStrategy;
private JButton buttonStep;
private JButton buttonCreateLocomotive;
public JPanel getPictureBox() { public JPanel getPictureBox() {
return pictureBox; return pictureBox;
@ -23,56 +28,112 @@ public class FormElectricLocomotive {
buttonLeft.setName("buttonLeft"); buttonLeft.setName("buttonLeft");
buttonRight.setName("buttonRight"); buttonRight.setName("buttonRight");
buttonCreate.addActionListener(e -> { pictureBox.setPreferredSize(new Dimension(600, 400));
_drawingElectricLocomotive = new DrawingElectricLocomotive();
Random random = new Random();
_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(100, 300),
random.nextInt(1000, 3000), random.nextInt(1000, 3000),
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(256), random.nextInt(256), random.nextInt(256)), new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)),
random.nextBoolean(), random.nextBoolean(),
random.nextBoolean(), random.nextBoolean(),
pictureBox.getWidth(), pictureBox.getWidth(),
pictureBox.getHeight() pictureBox.getHeight()
); );
_drawingElectricLocomotive.SetWheelsCount(random.nextInt(2, 5)); _drawingLocomotive.SetWheelsCount(random.nextInt(2, 5));
_drawingElectricLocomotive.SetPosition(random.nextInt(10, 100), random.nextInt(10, 100)); _drawingLocomotive.SetPosition(random.nextInt(10, 100), random.nextInt(10, 100));
Draw(); 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 -> { ActionListener buttonMoveClickedListener = e -> {
String buttonName = ((JButton) e.getSource()).getName(); String buttonName = ((JButton) e.getSource()).getName();
switch (buttonName) { switch (buttonName) {
case ("buttonUp") -> { case ("buttonUp") -> {
_drawingElectricLocomotive.MoveTransport(DyrectionType.Up); _drawingLocomotive.MoveTransport(DyrectionType.Up);
} }
case ("buttonDown") -> { case ("buttonDown") -> {
_drawingElectricLocomotive.MoveTransport(DyrectionType.Down); _drawingLocomotive.MoveTransport(DyrectionType.Down);
} }
case ("buttonLeft") -> { case ("buttonLeft") -> {
_drawingElectricLocomotive.MoveTransport(DyrectionType.Left); _drawingLocomotive.MoveTransport(DyrectionType.Left);
} }
case ("buttonRight") -> { case ("buttonRight") -> {
_drawingElectricLocomotive.MoveTransport(DyrectionType.Right); _drawingLocomotive.MoveTransport(DyrectionType.Right);
} }
} }
Draw(); Draw();
}; };
buttonUp.addActionListener(buttonMoveClickedListener); buttonUp.addActionListener(buttonMoveClickedListener);
buttonDown.addActionListener(buttonMoveClickedListener); buttonDown.addActionListener(buttonMoveClickedListener);
buttonLeft.addActionListener(buttonMoveClickedListener); buttonRight.addActionListener(buttonMoveClickedListener); buttonLeft.addActionListener(buttonMoveClickedListener);
buttonRight.addActionListener(buttonMoveClickedListener);
} }
public void Draw() { public void Draw() {
if (_drawingElectricLocomotive.EntityElectricLocomotive == null) { if (_drawingLocomotive.EntityLocomotive == null) {
return; return;
} }
Graphics g = pictureBox.getGraphics(); Graphics g = pictureBox.getGraphics();
pictureBox.paint(g); 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 class Main {
public static void main(String[] args) public static void main(String[] args)
{ {
MainFrameElectricLocomotive mainFrame = new MainFrameElectricLocomotive(); MainFrameElectricLocomotive mainFrameElectricLocomotive = new MainFrameElectricLocomotive();
mainFrame.setVisible(true);
// создание 2 лабы
} }
} }

View File

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