2 Commits
lab1 ... lab3

Author SHA1 Message Date
fd07441ba6 Готовая 3 лабораторная 2023-12-01 17:39:43 +04:00
fe0677e216 Готовая 2 лабораторная 2023-11-24 22:04:43 +04:00
28 changed files with 1227 additions and 206 deletions

View File

@@ -1,110 +0,0 @@
package DumpTruck;
import java.awt.*;
public class DrawingDumpTruck {
private EntityDumpTruck entityDumpTruck;
public EntityDumpTruck getEntityDumpTruck() {
return entityDumpTruck;
}
private DrawingWheels drawingWheels;
private int _pictureWidth;
private int _pictureHeight;
private int _startPosX;
private int _startPosY;
private int _truckWidth = 160;
private int _truckHeight = 90;
public boolean Init(int speed, double weight, Color bodyColor, boolean tent, boolean dumpBox, Color tentColor, Color dumpBoxColor, int width, int height, int wheelNumber)
{
if (height < _truckHeight || width < _truckWidth) {
return false;
}
_pictureWidth = width;
_pictureHeight = height;
entityDumpTruck = new EntityDumpTruck();
entityDumpTruck.Init(speed, weight, bodyColor, tent, dumpBox, tentColor, dumpBoxColor);
drawingWheels = new DrawingWheels();
drawingWheels.setWheelNumber(wheelNumber);
return true;
}
public void SetPosition(int x, int y)
{
if (x < 0 || x + _truckWidth > _pictureWidth) { x = 0; }
if (y < 0 || y + _truckHeight > _pictureHeight) { y = 0; }
_startPosX = x;
_startPosY = y;
}
public void MoveTransport(DirectionType direction) {
if (entityDumpTruck == null) return;
switch (direction) {
//влево
case Left:
if (_startPosX - entityDumpTruck.getStep() > 0)
{
_startPosX -= (int)entityDumpTruck.getStep();
}
break;
//вверх
case Up:
if (_startPosY - entityDumpTruck.getStep() > 0)
{
_startPosY -= (int)entityDumpTruck.getStep();
}
break;
//вправо
case Right:
if (_startPosX + _truckWidth + entityDumpTruck.getStep() < _pictureWidth)
{
_startPosX += (int)entityDumpTruck.getStep();
}
break;
//вниз
case Down:
if (_startPosY + _truckHeight + entityDumpTruck.getStep() < _pictureHeight)
{
_startPosY += (int)entityDumpTruck.getStep();
}
break;
}
}
public void DrawTransport(Graphics2D g2D)
{
if (entityDumpTruck == null) {
return;
}
g2D.setStroke(new BasicStroke(3));
g2D.setPaint(entityDumpTruck.getBodyColor());
g2D.fillRect(_startPosX, _startPosY + 40, 160, 10);
g2D.fillRect(_startPosX + 120, _startPosY, 40, 40);
drawingWheels.drawWheels(g2D, Color.BLACK, _startPosX, _startPosY);
if (entityDumpTruck.getDumpBox())
{
g2D.setPaint(entityDumpTruck.getDumpBoxColor());
Polygon dumpBoxPolygon = new Polygon();
dumpBoxPolygon.addPoint(_startPosX + 20, _startPosY);
dumpBoxPolygon.addPoint(_startPosX + 120, _startPosY);
dumpBoxPolygon.addPoint(_startPosX + 100, _startPosY + 39);
dumpBoxPolygon.addPoint(_startPosX, _startPosY + 39);
g2D.fillPolygon(dumpBoxPolygon);
}
if (entityDumpTruck.getDumpBox() && entityDumpTruck.getTent())
{
g2D.setPaint(entityDumpTruck.getTentColor());
Polygon tentPolygon = new Polygon();
tentPolygon.addPoint(_startPosX + 15, _startPosY);
tentPolygon.addPoint(_startPosX + 120, _startPosY);
tentPolygon.addPoint(_startPosX + 115, _startPosY + 10);
tentPolygon.addPoint(_startPosX + 10, _startPosY + 10);
g2D.fillPolygon(tentPolygon);
}
}
}

View File

@@ -0,0 +1,52 @@
package DumpTruck.DrawingObjects;
import DumpTruck.Entities.*;
import DumpTruck.Wheels.IDrawingWheels;
import java.awt.*;
public class DrawingDumpTruck extends DrawingTruck {
public DrawingDumpTruck(int speed, double weight, Color bodyColor, boolean tent, boolean dumpBox, Color tentColor, Color dumpBoxColor, int width, int height, int wheelNumber)
{
super(speed, weight, bodyColor, width, height, 160, 90, wheelNumber);
if (getEntityTruck() != null)
{
setEntityTruck(new EntityDumpTruck(speed, weight, bodyColor, tent, dumpBox, tentColor, dumpBoxColor));
}
}
public DrawingDumpTruck(EntityDumpTruck entityDumpTruck, int width, int height, int wheelNumber, IDrawingWheels iDrawingWheels)
{
super(entityDumpTruck, width, height, wheelNumber, iDrawingWheels);
if (getEntityTruck() != null)
{
setEntityTruck(entityDumpTruck);
}
}
@Override
public void DrawTransport(Graphics2D g2D) {
if (!(getEntityTruck() instanceof EntityDumpTruck dumpTruck)) {
return;
}
super.DrawTransport(g2D);
if (dumpTruck.getDumpBox())
{
g2D.setPaint(dumpTruck.getDumpBoxColor());
Polygon dumpBoxPolygon = new Polygon();
dumpBoxPolygon.addPoint(_startPosX + 20, _startPosY);
dumpBoxPolygon.addPoint(_startPosX + 120, _startPosY);
dumpBoxPolygon.addPoint(_startPosX + 100, _startPosY + 39);
dumpBoxPolygon.addPoint(_startPosX, _startPosY + 39);
g2D.fillPolygon(dumpBoxPolygon);
}
if (dumpTruck.getDumpBox() && dumpTruck.getTent())
{
g2D.setPaint(dumpTruck.getTentColor());
Polygon tentPolygon = new Polygon();
tentPolygon.addPoint(_startPosX + 15, _startPosY);
tentPolygon.addPoint(_startPosX + 120, _startPosY);
tentPolygon.addPoint(_startPosX + 115, _startPosY + 10);
tentPolygon.addPoint(_startPosX + 10, _startPosY + 10);
g2D.fillPolygon(tentPolygon);
}
}
}

View File

@@ -0,0 +1,166 @@
package DumpTruck.DrawingObjects;
import java.awt.*;
import java.util.Random;
import DumpTruck.Entities.*;
import DumpTruck.DirectionType;
import DumpTruck.MovementStrategy.*;
import DumpTruck.Wheels.*;
public class DrawingTruck {
private EntityTruck entityTruck;
public EntityTruck getEntityTruck() {
return entityTruck;
}
protected void setEntityTruck(EntityTruck entityTruck) {
this.entityTruck = entityTruck;
}
private IDrawingWheels drawingWheels;
private int _pictureWidth;
private int _pictureHeight;
protected int _startPosX;
protected int _startPosY;
protected int _truckWidth = 160;
protected int _truckHeight = 90;
public int getPosX() {
return _startPosX;
}
public int getPosY() {
return _startPosY;
}
public int getWidth() {
return _truckWidth;
}
public int getHeight() {
return _truckHeight;
}
public IMoveableObject GetMoveableObject() {
return new DrawingObjectTruck(this);
}
public DrawingTruck(int speed, double weight, Color bodyColor, int width, int height, int wheelNumber)
{
if (height < _truckHeight || width < _truckWidth) {
return;
}
_pictureWidth = width;
_pictureHeight = height;
entityTruck = new EntityTruck(speed, weight, bodyColor);
Random random = new Random();
drawingWheels = switch (random.nextInt(0, 3)) {
case 0 -> new DrawingWheels();
case 1 -> new DrawingWheelsStar();
case 2 -> new DrawingWheelsCircles();
default -> new DrawingWheels();
};
drawingWheels.setWheelNumber(wheelNumber);
}
protected DrawingTruck(int speed, double weight, Color bodyColor, int width, int height, int truckWidth, int truckHeight, int wheelNumber)
{
if (width < truckWidth || height < truckHeight) return;
_pictureWidth = width;
_pictureHeight = height;
_truckWidth = truckWidth;
_truckHeight = truckHeight;
entityTruck = new EntityTruck(speed, weight, bodyColor);
Random random = new Random();
drawingWheels = switch (random.nextInt(0, 3)) {
case 0 -> new DrawingWheels();
case 1 -> new DrawingWheelsStar();
case 2 -> new DrawingWheelsCircles();
default -> new DrawingWheels();
};
drawingWheels.setWheelNumber(wheelNumber);
}
public DrawingTruck(EntityTruck entityTruck, int width, int height, int wheelNumber, IDrawingWheels iDrawingWheels)
{
if (height < _truckHeight || width < _truckWidth) {
return;
}
_pictureWidth = width;
_pictureHeight = height;
this.entityTruck = entityTruck;
Random random = new Random();
drawingWheels = iDrawingWheels;
drawingWheels.setWheelNumber(wheelNumber);
}
public void SetPosition(int x, int y)
{
if (x < 0 || x + _truckWidth > _pictureWidth) { x = 0; }
if (y < 0 || y + _truckHeight > _pictureHeight) { y = 0; }
_startPosX = x;
_startPosY = y;
}
public boolean CanMove(DirectionType direction) {
if (entityTruck == null) {
return false;
}
return switch (direction) {
case Left -> _startPosX - entityTruck.getStep() > 0;
case Up -> _startPosY - entityTruck.getStep() > 0;
case Right -> _startPosX + _truckWidth + entityTruck.getStep() < _pictureWidth;
case Down -> _startPosY + _truckHeight + entityTruck.getStep() < _pictureHeight;
default -> false;
};
}
public void MoveTransport(DirectionType direction) {
if (!CanMove(direction) || entityTruck == null) return;
switch (direction) {
//влево
case Left:
if (_startPosX - entityTruck.getStep() > 0)
{
_startPosX -= (int)entityTruck.getStep();
}
break;
//вверх
case Up:
if (_startPosY - entityTruck.getStep() > 0)
{
_startPosY -= (int)entityTruck.getStep();
}
break;
//вправо
case Right:
if (_startPosX + _truckWidth + entityTruck.getStep() < _pictureWidth)
{
_startPosX += (int)entityTruck.getStep();
}
break;
//вниз
case Down:
if (_startPosY + _truckHeight + entityTruck.getStep() < _pictureHeight)
{
_startPosY += (int)entityTruck.getStep();
}
break;
}
}
public void DrawTransport(Graphics2D g2D)
{
if (entityTruck == null) {
return;
}
g2D.setStroke(new BasicStroke(3));
g2D.setPaint(entityTruck.getBodyColor());
g2D.fillRect(_startPosX, _startPosY + 40, 160, 10);
g2D.fillRect(_startPosX + 120, _startPosY, 40, 40);
drawingWheels.drawWheels(g2D, Color.BLACK, _startPosX, _startPosY);
}
}

View File

@@ -0,0 +1,37 @@
package DumpTruck.Entities;
import java.awt.*;
public class EntityDumpTruck extends EntityTruck {
private boolean Tent;
public boolean getTent() {
return Tent;
}
private boolean DumpBox;
public boolean getDumpBox() {
return DumpBox;
}
private Color DumpBoxColor;
public Color getDumpBoxColor() {
return DumpBoxColor;
}
private Color TentColor;
public Color getTentColor() {
return TentColor;
}
public EntityDumpTruck(int speed, double weight, Color bodyColor, boolean tent, boolean dumpBox, Color tentColor, Color dumpBoxColor) {
super(speed, weight, bodyColor);
Tent = tent;
DumpBox = dumpBox;
DumpBoxColor = dumpBoxColor;
TentColor = tentColor;
}
}

View File

@@ -0,0 +1,34 @@
package DumpTruck.Entities;
import java.awt.*;
public class EntityTruck
{
private int Speed;
public int getSpeed() {
return Speed;
}
private double Weight;
public double getWeight() {
return Weight;
}
private Color BodyColor;
public Color getBodyColor() {
return BodyColor;
}
public double getStep() {
return (double)Speed * 100 / Weight;
}
public EntityTruck(int speed, double weight, Color bodyColor) {
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
}
}

View File

@@ -1,61 +0,0 @@
package DumpTruck;
import java.awt.*;
public class EntityDumpTruck {
private int Speed;
public int getSpeed() {
return Speed;
}
private double Weight;
public double getWeight() {
return Weight;
}
private Color BodyColor;
public Color getBodyColor() {
return BodyColor;
}
private boolean Tent;
public boolean getTent() {
return Tent;
}
private boolean DumpBox;
public boolean getDumpBox() {
return DumpBox;
}
private Color DumpBoxColor;
public Color getDumpBoxColor() {
return DumpBoxColor;
}
private Color TentColor;
public Color getTentColor() {
return TentColor;
}
public double getStep() {
return (double)Speed * 100 / Weight;
}
public void Init(int speed, double weight, Color bodyColor, boolean tent, boolean dumpBox, Color tentColor, Color dumpBoxColor) {
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
Tent = tent;
DumpBox = dumpBox;
DumpBoxColor = dumpBoxColor;
TentColor = tentColor;
}
}

View File

@@ -0,0 +1,22 @@
package DumpTruck;
import DumpTruck.Entities.*;
import DumpTruck.Generics.*;
import DumpTruck.Wheels.*;
import javax.swing.*;
import java.awt.*;
public class FrameDop extends JFrame {
private PictureBoxDop pictureBoxDop;
public FrameDop() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pictureBoxDop = new PictureBoxDop();
add(pictureBoxDop);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
}

View File

@@ -4,7 +4,7 @@ import javax.swing.*;
public class FrameDumpTruck extends JFrame { public class FrameDumpTruck extends JFrame {
private PictureBoxDumpTruck pictureBoxDumpTruck; public PictureBoxDumpTruck pictureBoxDumpTruck;
public FrameDumpTruck() { public FrameDumpTruck() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

View File

@@ -0,0 +1,17 @@
package DumpTruck;
import javax.swing.*;
public class FrameTruckCollection extends JFrame {
private PictureBoxCollection pictureBoxCollection;
public FrameTruckCollection() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pictureBoxCollection = new PictureBoxCollection();
add(pictureBoxCollection);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
}

View File

@@ -0,0 +1,61 @@
package DumpTruck.Generics;
import DumpTruck.Entities.*;
import DumpTruck.Wheels.*;
import DumpTruck.DrawingObjects.*;
import java.util.Random;
public class GenericDop<T extends EntityTruck, U extends IDrawingWheels> {
private T[] Trucks;
private U[] Wheels;
private int maxTruckAmount;
private int truckAmount;
private int maxWheelAmount ;
private int wheelAmount;
private Random random;
private int _pictureWidth;
private int _pictureHeight;
public GenericDop(int maxTruckAmount, int maxWheelAmount, int pictureWidth, int pictureHeight){
this.maxTruckAmount = maxTruckAmount;
this.maxWheelAmount = maxWheelAmount;
Trucks = (T[]) new EntityTruck[maxTruckAmount];
Wheels = (U[]) new IDrawingWheels[maxWheelAmount];
truckAmount = 0;
wheelAmount = 0;
_pictureWidth = pictureWidth;
_pictureHeight = pictureHeight;
random = new Random();
}
public boolean add(T truck){
if (truck == null || truckAmount > maxTruckAmount)
return false;
Trucks[truckAmount] = truck;
truckAmount++;
return true;
}
public boolean add(U wheel){
if (wheel == null || wheelAmount > maxWheelAmount)
return false;
Wheels[wheelAmount] = wheel;
wheelAmount++;
return true;
}
public DrawingTruck DrawingTruckDop(){
if (truckAmount == 0 || wheelAmount == 0)
return null;
T truck = Trucks[random.nextInt(truckAmount)];
DrawingTruck drawingTruck;
if (truck instanceof EntityDumpTruck){
drawingTruck = new DrawingDumpTruck((EntityDumpTruck)truck, _pictureWidth, _pictureHeight, random.nextInt(2, 5), Wheels[random.nextInt(wheelAmount)]);
}
else{
drawingTruck = new DrawingTruck(truck, _pictureWidth, _pictureHeight, random.nextInt(2, 5), Wheels[random.nextInt(wheelAmount)]);
}
return drawingTruck;
}
}

View File

@@ -0,0 +1,54 @@
package DumpTruck.Generics;
public class SetGeneric<T extends Object> {
private Object[] _places;
public int Count() {return _places.length;}
public SetGeneric(int count) {
_places = new Object[count];
}
public int Insert(T truck) {
return Insert(truck, 0);
}
public int Insert(T truck, int position) {
if (position < 0 || position >= Count())
return -1;
if (_places[position] == null)
{
_places[position] = truck;
return position;
}
int index = -1;
for (int i = position; i < Count(); i++)
{
if (_places[i] == null)
{
index = i;
break;
}
}
if (index < 0) return -1;
for (int i = index; i > position; i--)
{
_places[i] = _places[i - 1];
}
_places[position] = truck;
return position;
}
public boolean Remove(int position) {
if (position < 0 || position >= Count())
return false;
_places[position] = null;
return true;
}
public T Get(int position) {
if (position < 0 || position >= Count())
return null;
return (T) _places[position];
}
}

View File

@@ -0,0 +1,70 @@
package DumpTruck.Generics;
import DumpTruck.DrawingObjects.*;
import DumpTruck.MovementStrategy.*;
import java.awt.*;
import java.awt.image.BufferedImage;
public class TrucksGenericCollection<T extends DrawingTruck, U extends IMoveableObject>{
private int _pictureWidth;
private int _pictureHeight;
private int _placeSizeWidth = 180;
private int _placeSizeHeight = 100;
private SetGeneric<T> _collection;
public TrucksGenericCollection(int pictureWidth, int pictureHeight) {
int width = pictureWidth / _placeSizeWidth;
int height = pictureHeight / _placeSizeHeight;
_pictureWidth = pictureWidth;
_pictureHeight = pictureHeight;
_collection = new SetGeneric<T>(width * height);
}
public int Add(T obj) {
if (obj == null) {
return -1;
}
return _collection.Insert(obj);
}
public boolean remove(int pos) {
T obj = _collection.Get(pos);
if (obj != null) {
_collection.Remove(pos);
}
return false;
}
public U GetU(int pos) {
return (U) _collection.Get(pos).GetMoveableObject();
}
public BufferedImage ShowTrucks() {
BufferedImage bitmap = new BufferedImage(_pictureWidth, _pictureHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = bitmap.createGraphics();
DrawBackground(g);
DrawObjects(g);
g.dispose();
return bitmap;
}
private void DrawBackground(Graphics g) {
g.setColor(Color.BLACK);
for (int i = 0; i < _pictureWidth / _placeSizeWidth; i++)
{
for (int j = 0; j < _pictureHeight / _placeSizeHeight + 1; ++j)
{
g.drawLine(i * _placeSizeWidth, j * _placeSizeHeight, i * _placeSizeWidth + _placeSizeWidth / 2, j * _placeSizeHeight);
}
g.drawLine(i * _placeSizeWidth, 0, i * _placeSizeWidth, _pictureHeight / _placeSizeHeight * _placeSizeHeight);
}
}
private void DrawObjects(Graphics g) {
for (int i = 0; i < _collection.Count(); i++)
{
T obj = _collection.Get(i);
if (obj != null)
{
obj.SetPosition(i % (_pictureWidth / _placeSizeWidth) * _placeSizeWidth, i / (_pictureWidth / _placeSizeWidth) * _placeSizeHeight);
obj.DrawTransport((Graphics2D) g);
}
}
}
}

View File

@@ -2,6 +2,6 @@ package DumpTruck;
public class Main { public class Main {
public static void main(String[] args) { public static void main(String[] args) {
new FrameDumpTruck(); new FrameTruckCollection();
} }
} }

View File

@@ -0,0 +1,99 @@
package DumpTruck.MovementStrategy;
import DumpTruck.DirectionType;
public abstract class AbstractStrategy {
private IMoveableObject moveableObject;
private Status state = Status.NotInit;
private int fieldWidth;
protected int getFieldWidth() {
return fieldWidth;
}
private int fieldHeight;
protected int getFieldHeight() {
return 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;
this.moveableObject = moveableObject;
fieldWidth = width;
fieldHeight = height;
}
public void makeStep() {
if (state != Status.InProgress) {
return;
}
if (isTargetDestination()) {
state = Status.Finish;
return;
}
moveToTarget();
}
protected boolean moveLeft() {
return moveTo(DirectionType.Left);
}
protected boolean moveRight() {
return moveTo(DirectionType.Right);
}
protected boolean moveUp() {
return moveTo(DirectionType.Up);
}
protected boolean moveDown() {
return moveTo(DirectionType.Down);
}
protected ObjectParameters getObjectParameters() {
if (moveableObject == null) {
return null;
}
return moveableObject.getObjectsPosition();
}
protected Integer getStep() {
if (state != Status.InProgress) {
return null;
}
if (moveableObject == null) {
return null;
}
return moveableObject.getStep();
}
protected abstract void moveToTarget();
protected abstract boolean isTargetDestination();
private boolean moveTo(DirectionType directionType) {
if (state != Status.InProgress) {
return false;
}
if (moveableObject == null) {
return false;
}
if (moveableObject.checkCanMove(directionType)) {
moveableObject.moveObject(directionType);
return true;
}
return false;
}
}

View File

@@ -0,0 +1,42 @@
package DumpTruck.MovementStrategy;
import DumpTruck.DirectionType;
import DumpTruck.DrawingObjects.DrawingTruck;
public class DrawingObjectTruck implements IMoveableObject {
private DrawingTruck drawingTruck = null;
public DrawingObjectTruck(DrawingTruck drawingTruck) {
this.drawingTruck = drawingTruck;
}
@Override
public ObjectParameters getObjectsPosition() {
if (drawingTruck == null || drawingTruck.getEntityTruck() == null) {
return null;
}
return new ObjectParameters(drawingTruck.getPosX(), drawingTruck.getPosY(),
drawingTruck.getWidth(), drawingTruck.getHeight());
}
@Override
public int getStep() {
if (drawingTruck == null)
return 0;
return (int) ((drawingTruck.getEntityTruck() != null) ? drawingTruck.getEntityTruck().getStep() : 0);
}
@Override
public boolean checkCanMove(DirectionType direction) {
if (drawingTruck == null)
return false;
return drawingTruck.CanMove(direction);
}
@Override
public void moveObject(DirectionType direction) {
if (drawingTruck != null)
drawingTruck.MoveTransport(direction);
}
}

View File

@@ -0,0 +1,13 @@
package DumpTruck.MovementStrategy;
import DumpTruck.DirectionType;
public interface IMoveableObject {
ObjectParameters getObjectsPosition();
int getStep();
boolean checkCanMove(DirectionType direction);
void moveObject(DirectionType direction);
}

View File

@@ -0,0 +1,36 @@
package DumpTruck.MovementStrategy;
public class MoveToBorder extends AbstractStrategy {
@Override
protected boolean isTargetDestination() {
var objParams = getObjectParameters();
if (objParams == null) {
return false;
}
return objParams.rightBorder() <= getFieldWidth() &&
objParams.rightBorder() + getStep() >= getFieldWidth() &&
objParams.downBorder() <= getFieldHeight() &&
objParams.downBorder() + getStep() >= getFieldHeight();
}
@Override
protected void moveToTarget() {
var objParams = getObjectParameters();
if (objParams == null) {
return;
}
var diffX = objParams.objectMiddleHorizontal() - getFieldWidth();
if (Math.abs(diffX) > getStep()) {
if (diffX < 0) {
moveRight();
}
}
var diffY = objParams.objectMiddleVertical() - getFieldHeight();
if (Math.abs(diffY) > getStep()) {
if (diffY < 0) {
moveDown();
}
}
}
}

View File

@@ -0,0 +1,40 @@
package DumpTruck.MovementStrategy;
public class MoveToCenter extends AbstractStrategy {
@Override
protected boolean isTargetDestination() {
var objParams = getObjectParameters();
if (objParams == null) {
return false;
}
return objParams.objectMiddleHorizontal() <= getFieldWidth() / 2 &&
objParams.objectMiddleHorizontal() + getStep() >= getFieldWidth() / 2 &&
objParams.objectMiddleVertical() <= getFieldHeight() / 2 &&
objParams.objectMiddleVertical() + getStep() >= getFieldHeight() / 2;
}
@Override
protected void moveToTarget() {
var objParams = getObjectParameters();
if (objParams == null) {
return;
}
var diffX = objParams.objectMiddleHorizontal() - getFieldWidth() / 2;
if (Math.abs(diffX) > getStep()) {
if (diffX > 0) {
moveLeft();
} else {
moveRight();
}
}
var diffY = objParams.objectMiddleVertical() - getFieldHeight() / 2;
if (Math.abs(diffY) > getStep()) {
if (diffY > 0) {
moveUp();
} else {
moveDown();
}
}
}
}

View File

@@ -0,0 +1,43 @@
package DumpTruck.MovementStrategy;
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) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
}

View File

@@ -0,0 +1,9 @@
package DumpTruck.MovementStrategy;
public enum Status {
NotInit,
InProgress,
Finish
}

View File

@@ -0,0 +1,94 @@
package DumpTruck;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.util.Random;
import DumpTruck.DrawingObjects.*;
import DumpTruck.Generics.*;
import DumpTruck.MovementStrategy.*;
public class PictureBoxCollection extends JPanel {
public TrucksGenericCollection<DrawingTruck, DrawingObjectTruck> _trucks;
private JLabel labelTools;
private JButton buttonAddTruck, buttonDeleteTruck, buttonRefreshCollection, buttonShowDop;
private JTextField textFieldNumber;
public PictureBoxCollection() {
setLayout(null);
setBounds(0, 0, 800, 450);
_trucks = new TrucksGenericCollection<>(this.getWidth() - 200, this.getHeight());
labelTools = new JLabel("Инструменты");
labelTools.setBounds(660, 10, 150, 30);
add(labelTools);
buttonAddTruck = new JButton("Добавить грузовик");
buttonAddTruck.setFocusable(false);
buttonAddTruck.setBounds(620, 50, 150, 30);
buttonAddTruck.addActionListener(e -> {
FrameDumpTruck frameDumpTruck = new FrameDumpTruck();
frameDumpTruck.pictureBoxDumpTruck.buttonSelectTruck.addActionListener(e1 -> {
if (_trucks.Add(frameDumpTruck.pictureBoxDumpTruck.drawingTruck) != -1) {
JOptionPane.showMessageDialog(null, "Объект добавлен", "Информация", JOptionPane.INFORMATION_MESSAGE);
} else {
JOptionPane.showMessageDialog(null, "Не удалось добавить объект", "Информация", JOptionPane.INFORMATION_MESSAGE);
}
frameDumpTruck.dispose();
repaint();
}
);
});
add(buttonAddTruck);
textFieldNumber = new JTextField();
textFieldNumber.setBounds(620, 100, 150, 30);
add(textFieldNumber);
buttonDeleteTruck = new JButton("Удалить грузовик");
buttonDeleteTruck.setFocusable(false);
buttonDeleteTruck.setBounds(620, 150, 150, 30);
buttonDeleteTruck.addActionListener(e -> {
if (JOptionPane.showConfirmDialog(null, "Удалить объект?", "Удаление", JOptionPane.YES_NO_OPTION) == JOptionPane.NO_OPTION) {
return;
}
for (char it : textFieldNumber.getText().toCharArray())
if (it < '0' || it > '9') {
JOptionPane.showMessageDialog(null, "Не удалось удалить объект", "Информация", JOptionPane.INFORMATION_MESSAGE);
return;
}
if (textFieldNumber.getText().length() == 0) {
JOptionPane.showMessageDialog(null, "Не удалось удалить объект", "Информация", JOptionPane.INFORMATION_MESSAGE);
return;
}
int pos = Integer.parseInt(textFieldNumber.getText());
if (_trucks.remove(pos)) {
JOptionPane.showMessageDialog(null, "Объект удален", "Информация", JOptionPane.INFORMATION_MESSAGE);
} else {
JOptionPane.showMessageDialog(null, "Не удалось удалить объект", "Информация", JOptionPane.INFORMATION_MESSAGE);
}
repaint();
});
add(buttonDeleteTruck);
buttonRefreshCollection = new JButton("Обновить коллекцию");
buttonRefreshCollection.setFocusable(false);
buttonRefreshCollection.setBounds(620, 200, 150, 30);
buttonRefreshCollection.addActionListener(e -> repaint());
add(buttonRefreshCollection);
buttonShowDop = new JButton("Показать доп");
buttonShowDop.setFocusable(false);
buttonShowDop.setBounds(620, 250, 150, 30);
buttonShowDop.addActionListener(e -> new FrameDop());
add(buttonShowDop);
setPreferredSize(new Dimension(800, 450));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(_trucks.ShowTrucks(), 0, 0, null);
}
}

View File

@@ -0,0 +1,50 @@
package DumpTruck;
import DumpTruck.DrawingObjects.DrawingTruck;
import DumpTruck.Entities.*;
import DumpTruck.Generics.*;
import DumpTruck.Wheels.*;
import javax.swing.*;
import java.awt.*;
import java.util.Random;
public class PictureBoxDop extends JPanel {
GenericDop<EntityTruck, IDrawingWheels> genericDop;
private JButton buttonCreate;
public DrawingTruck drawingTruck;
public PictureBoxDop(){
setLayout(null);
setBounds(0, 0, 800, 450);
genericDop = new GenericDop<>(100, 100, this.getWidth(), this.getHeight());
genericDop.add(new EntityTruck(100, 100, Color.BLUE));
genericDop.add(new EntityTruck(100, 100, Color.RED));
genericDop.add(new EntityTruck(100, 100, Color.GREEN));
genericDop.add(new EntityDumpTruck(100, 100, Color.BLUE, true, true, Color.BLACK, Color.RED));
genericDop.add(new EntityDumpTruck(100, 100, Color.GREEN, true, true, Color.MAGENTA, Color.YELLOW));
genericDop.add(new DrawingWheels());
genericDop.add(new DrawingWheelsCircles());
genericDop.add(new DrawingWheelsStar());
buttonCreate = new JButton("Создать грузовик");
buttonCreate.setFocusable(false);
buttonCreate.setBounds(12, 415, 150, 30);
buttonCreate.addActionListener(e -> {
drawingTruck = genericDop.DrawingTruckDop();
repaint();
});
add(buttonCreate);
setPreferredSize(new Dimension(800, 450));
}
@Override
protected void paintComponent(Graphics g) {
if (drawingTruck == null) {
return;
}
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
drawingTruck.SetPosition(100, 100);
drawingTruck.DrawTransport(g2d);
}
}

View File

@@ -4,9 +4,13 @@ import javax.swing.*;
import java.awt.*; import java.awt.*;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.util.Random; import java.util.Random;
import DumpTruck.DrawingObjects.*;
import DumpTruck.MovementStrategy.*;
public class PictureBoxDumpTruck extends JPanel { public class PictureBoxDumpTruck extends JPanel {
private DrawingDumpTruck drawingDumpTruck; public DrawingTruck drawingTruck;
private AbstractStrategy abstractStrategy;
private JButton buttonLeft; private JButton buttonLeft;
@@ -17,34 +21,77 @@ public class PictureBoxDumpTruck extends JPanel {
private JButton buttonDown; private JButton buttonDown;
private JButton buttonCreateDumpTruck; private JButton buttonCreateDumpTruck;
private JButton buttonCreateTruck;
private JComboBox comboBoxStrategy;
private JButton buttonStep;
public JButton buttonSelectTruck;
public PictureBoxDumpTruck() { public PictureBoxDumpTruck() {
setLayout(null); setLayout(null);
setBounds(0, 0, 800, 450); setBounds(0, 0, 800, 450);
buttonCreateDumpTruck = new JButton("Создать"); buttonCreateTruck = new JButton("Создать грузовик");
buttonCreateTruck.setFocusable(false);
buttonCreateTruck.setBounds(12, 415, 150, 30);
add(buttonCreateTruck);
buttonCreateTruck.addActionListener(e -> {
Random random = new Random();
Color bodyColor = new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256));
Color selectedColor = JColorChooser.showDialog(this, "Выберите цвет", Color.WHITE);
if (selectedColor != null)
{
bodyColor = selectedColor;
}
drawingTruck = new DrawingTruck((random.nextInt(200, 300)),
random.nextInt(1000, 3000),
bodyColor,
this.getWidth(), this.getHeight(), random.nextInt(2, 5));
drawingTruck.SetPosition(random.nextInt(10, 100), random.nextInt(10, 100));
repaint();
});
buttonCreateDumpTruck = new JButton("Создать самосвал");
buttonCreateDumpTruck.setFocusable(false); buttonCreateDumpTruck.setFocusable(false);
buttonCreateDumpTruck.setBounds(12, 415, 100, 30); buttonCreateDumpTruck.setBounds(180, 415, 150, 30);
add(buttonCreateDumpTruck); add(buttonCreateDumpTruck);
buttonCreateDumpTruck.addActionListener(e -> { buttonCreateDumpTruck.addActionListener(e -> {
Random random = new Random(); Random random = new Random();
drawingDumpTruck = new DrawingDumpTruck(); Color bodyColor = new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256));
drawingDumpTruck.Init(random.nextInt(200, 300), Color selectedColor = JColorChooser.showDialog(this, "Выберите цвет", Color.WHITE);
if (selectedColor != null)
{
bodyColor = selectedColor;
}
Color dumpBoxColor = new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256));
selectedColor = JColorChooser.showDialog(this, "Выберите цвет", Color.WHITE);
if (selectedColor != null)
{
dumpBoxColor = selectedColor;
}
Color tentColor = new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256));
selectedColor = JColorChooser.showDialog(this, "Выберите цвет", Color.WHITE);
if (selectedColor != null)
{
tentColor = selectedColor;
}
drawingTruck = new DrawingDumpTruck((random.nextInt(200, 300)),
random.nextInt(1000, 3000), random.nextInt(1000, 3000),
new Color(random.nextInt(0, 256), random.nextInt(0, 256), bodyColor,
random.nextInt(0, 256)), random.nextBoolean(), true,
random.nextBoolean(), random.nextBoolean(), tentColor, dumpBoxColor,
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)),
this.getWidth(), this.getHeight(), random.nextInt(2, 5)); this.getWidth(), this.getHeight(), random.nextInt(2, 5));
drawingDumpTruck.SetPosition(random.nextInt(10, 100), random.nextInt(10, 100)); drawingTruck.SetPosition(random.nextInt(10, 100), random.nextInt(10, 100));
repaint(); repaint();
}); });
buttonSelectTruck = new JButton("Выбрать");
buttonSelectTruck.setFocusable(false);
buttonSelectTruck.setBounds(350, 415, 150, 30);
add(buttonSelectTruck);
ActionListener buttonMoveListener = e -> { ActionListener buttonMoveListener = e -> {
if (drawingDumpTruck == null) if (drawingTruck == null)
{ {
return; return;
} }
@@ -53,16 +100,16 @@ public class PictureBoxDumpTruck extends JPanel {
switch (buttonName) { switch (buttonName) {
case ("buttonUp"): case ("buttonUp"):
drawingDumpTruck.MoveTransport(DirectionType.Up); drawingTruck.MoveTransport(DirectionType.Up);
break; break;
case ("buttonDown"): case ("buttonDown"):
drawingDumpTruck.MoveTransport(DirectionType.Down); drawingTruck.MoveTransport(DirectionType.Down);
break; break;
case ("buttonLeft"): case ("buttonLeft"):
drawingDumpTruck.MoveTransport(DirectionType.Left); drawingTruck.MoveTransport(DirectionType.Left);
break; break;
case ("buttonRight"): case ("buttonRight"):
drawingDumpTruck.MoveTransport(DirectionType.Right); drawingTruck.MoveTransport(DirectionType.Right);
break; break;
} }
repaint(); repaint();
@@ -106,17 +153,60 @@ public class PictureBoxDumpTruck extends JPanel {
buttonUp.setBounds(722, 372, 30, 30); buttonUp.setBounds(722, 372, 30, 30);
add(buttonUp); add(buttonUp);
setPreferredSize(new Dimension(800, 450));
String[] items = {
"0",
"1"
};
comboBoxStrategy = new JComboBox(items);
comboBoxStrategy.setBounds(667, 10, 120, 25);
buttonStep = new JButton("Шаг");
buttonStep.setFocusable(false);
buttonStep.setBounds(710, 40, 75, 30);
buttonStep.addActionListener(e -> {
if (drawingTruck == null) {
return;
}
if (comboBoxStrategy.isEnabled()) {
abstractStrategy = switch (comboBoxStrategy.getSelectedIndex()) {
case 0 -> new MoveToCenter();
case 1 -> new MoveToBorder();
default -> null;
};
if (abstractStrategy == null)
{
return;
}
abstractStrategy.setData(new DrawingObjectTruck(drawingTruck), this.getWidth(), this.getHeight());
}
if (abstractStrategy == null)
{
return;
}
comboBoxStrategy.setEnabled(false);
abstractStrategy.makeStep();
repaint();
if (abstractStrategy.getStatus() == Status.Finish)
{
comboBoxStrategy.setEnabled(true);
abstractStrategy = null;
}
});
add(comboBoxStrategy);
add(buttonStep);
setPreferredSize(new Dimension(800, 450));
} }
@Override @Override
protected void paintComponent(Graphics g) { protected void paintComponent(Graphics g) {
if (drawingDumpTruck == null) { if (drawingTruck == null) {
return; return;
} }
super.paintComponent(g); super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g; Graphics2D g2d = (Graphics2D) g;
drawingDumpTruck.DrawTransport(g2d); drawingTruck.DrawTransport(g2d);
} }
} }

View File

@@ -1,36 +1,42 @@
package DumpTruck; package DumpTruck.Wheels;
import java.awt.*; import java.awt.*;
public class DrawingWheels { public class DrawingWheels implements IDrawingWheels {
private WheelNumber wheelNumber; private WheelNumber wheelNumber;
@Override
public WheelNumber getWheelNumber() {
return wheelNumber;
}
@Override
public void setWheelNumber(int number) { public void setWheelNumber(int number) {
switch (number) { switch (number) {
case 2: case 2:
wheelNumber = wheelNumber.Two; wheelNumber = WheelNumber.Two;
break; break;
case 3: case 3:
wheelNumber = wheelNumber.Three; wheelNumber = WheelNumber.Three;
break; break;
case 4: case 4:
wheelNumber = wheelNumber.Four; wheelNumber = WheelNumber.Four;
break; break;
default: wheelNumber = wheelNumber.Two; default:
wheelNumber = WheelNumber.Two;
} }
} }
public void drawWheels(Graphics2D g2D, Color color, int _startPosX, int _startPosY) { @Override
public void drawWheels(Graphics2D g2d, Color color, int startPosX, int startPosY) {
switch (wheelNumber) { switch (wheelNumber) {
case Two: case Two:
drawTwoWheels(g2D, color, _startPosX, _startPosY); drawTwoWheels(g2d, color, startPosX, startPosY);
break; break;
case Three: case Three:
drawThreeWheels(g2D, color, _startPosX, _startPosY); drawThreeWheels(g2d, color, startPosX, startPosY);
break; break;
case Four: case Four:
drawFourWheels(g2D, color, _startPosX, _startPosY); drawFourWheels(g2d, color, startPosX, startPosY);
break; break;
} }
} }

View File

@@ -0,0 +1,72 @@
package DumpTruck.Wheels;
import java.awt.*;
public class DrawingWheelsCircles implements IDrawingWheels {
private WheelNumber wheelNumber;
@Override
public WheelNumber getWheelNumber() {
return wheelNumber;
}
@Override
public void setWheelNumber(int number) {
switch (number) {
case 2:
wheelNumber = WheelNumber.Two;
break;
case 3:
wheelNumber = WheelNumber.Three;
break;
case 4:
wheelNumber = WheelNumber.Four;
break;
default:
wheelNumber = WheelNumber.Two;
}
}
@Override
public void drawWheels(Graphics2D g2d, Color color, int startPosX, int startPosY) {
switch (wheelNumber) {
case Two:
drawTwoWheels(g2d, color, startPosX, startPosY);
break;
case Three:
drawThreeWheels(g2d, color, startPosX, startPosY);
break;
case Four:
drawFourWheels(g2d, color, startPosX, startPosY);
break;
}
}
private void drawTwoWheels(Graphics2D g2D, Color color, int _startPosX, int _startPosY) {
g2D.setColor(color);
g2D.fillOval(_startPosX, _startPosY + 50, 40, 40);
drawPattern(g2D, _startPosX, _startPosY + 50);
g2D.fillOval(_startPosX + 120, _startPosY + 50, 40, 40);
drawPattern(g2D, _startPosX + 120, _startPosY + 50);
}
private void drawThreeWheels(Graphics2D g2D, Color color, int _startPosX, int _startPosY) {
g2D.setColor(color);
drawTwoWheels(g2D, color, _startPosX, _startPosY);
g2D.fillOval(_startPosX + 40, _startPosY + 50, 40, 40);
drawPattern(g2D, _startPosX + 40, _startPosY + 50);
}
private void drawFourWheels(Graphics2D g2D, Color color, int _startPosX, int _startPosY) {
g2D.setColor(color);
drawThreeWheels(g2D, color, _startPosX, _startPosY);
g2D.fillOval(_startPosX + 80, _startPosY + 50, 40, 40);
drawPattern(g2D, _startPosX + 80, _startPosY + 50);
}
private void drawPattern(Graphics2D g2D, int x, int y){
g2D.setColor(Color.WHITE);
g2D.drawOval(x + 15, y + 15, 10, 10);
g2D.drawOval(x + 5, y + 5, 30, 30);
g2D.setColor(Color.BLACK);
}
}

View File

@@ -0,0 +1,74 @@
package DumpTruck.Wheels;
import java.awt.*;
public class DrawingWheelsStar implements IDrawingWheels {
private WheelNumber wheelNumber;
@Override
public WheelNumber getWheelNumber() {
return wheelNumber;
}
@Override
public void setWheelNumber(int number) {
switch (number) {
case 2:
wheelNumber = WheelNumber.Two;
break;
case 3:
wheelNumber = WheelNumber.Three;
break;
case 4:
wheelNumber = WheelNumber.Four;
break;
default:
wheelNumber = WheelNumber.Two;
}
}
@Override
public void drawWheels(Graphics2D g2d, Color color, int startPosX, int startPosY) {
switch (wheelNumber) {
case Two:
drawTwoWheels(g2d, color, startPosX, startPosY);
break;
case Three:
drawThreeWheels(g2d, color, startPosX, startPosY);
break;
case Four:
drawFourWheels(g2d, color, startPosX, startPosY);
break;
}
}
private void drawTwoWheels(Graphics2D g2D, Color color, int _startPosX, int _startPosY) {
g2D.setColor(color);
g2D.fillOval(_startPosX, _startPosY + 50, 40, 40);
drawPattern(g2D, _startPosX, _startPosY + 50);
g2D.fillOval(_startPosX + 120, _startPosY + 50, 40, 40);
drawPattern(g2D, _startPosX + 120, _startPosY + 50);
}
private void drawThreeWheels(Graphics2D g2D, Color color, int _startPosX, int _startPosY) {
g2D.setColor(color);
drawTwoWheels(g2D, color, _startPosX, _startPosY);
g2D.fillOval(_startPosX + 40, _startPosY + 50, 40, 40);
drawPattern(g2D, _startPosX + 40, _startPosY + 50);
}
private void drawFourWheels(Graphics2D g2D, Color color, int _startPosX, int _startPosY) {
g2D.setColor(color);
drawThreeWheels(g2D, color, _startPosX, _startPosY);
g2D.fillOval(_startPosX + 80, _startPosY + 50, 40, 40);
drawPattern(g2D, _startPosX + 80, _startPosY + 50);
}
private void drawPattern(Graphics2D g2D, int x, int y){
g2D.setColor(Color.WHITE);
g2D.drawLine(x + 20, y, x + 20, y + 40);
g2D.drawLine(x, y + 20, x + 40, y + 20);
g2D.drawLine(x + 10, y + 10, x + 30, y + 30);
g2D.drawLine(x + 30, y + 10, x + 10, y + 30);
g2D.setColor(Color.BLACK);
}
}

View File

@@ -0,0 +1,11 @@
package DumpTruck.Wheels;
import java.awt.*;
public interface IDrawingWheels {
void setWheelNumber(int number);
WheelNumber getWheelNumber();
void drawWheels(Graphics2D g2d, Color color, int startPosX, int startPosY);
}

View File

@@ -1,4 +1,4 @@
package DumpTruck; package DumpTruck.Wheels;
public enum WheelNumber { public enum WheelNumber {
Two, Two,