PIbd-21 Sagirov M.M. LinerHard Lab2 #2

Closed
Marselchii wants to merge 1 commits from lab2 into lab1
22 changed files with 763 additions and 243 deletions

View File

@ -1,98 +0,0 @@
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.util.*;
public class DrawingLiner {
private EntityLiner EntityLiner; //Класс-сущность
public EntityLiner GetLiner(){return EntityLiner;}
public int _startPosX; //Координаты отрисовки по оси x
public int _startPosY; //Координаты отрисовки по оси y
private Integer _pictureWidth = null; //Ширина окна
private Integer _pictureHeight = null; //Высота окна
private final int _linerWidth = 120; //Ширина отрисовки лайнера
private int _linerHeight = 60; //Высота отрисовки лайнера
private DrawingDeck drawingDeck = new DrawingDeck();
//Инициализация
public void Init(int speed, float weight, Color bottomColor, boolean swimmingPool, boolean deck)
{
EntityLiner = new EntityLiner();
EntityLiner.Init(speed,weight,bottomColor, swimmingPool, deck);
Random random = new Random();
int rd = random.nextInt(0, 3);
_linerHeight += rd*20;
drawingDeck.SetAddEnum(rd);
}
//Начальные коордитанты
public void SetPosition(int x, int y, int width, int height)
{
if (width < _linerWidth || height < _linerHeight) return;
Random random = new Random();
_startPosX = x < 0 || x + _linerWidth > width ? random.nextInt(0, width - _linerWidth) : x;
_startPosY = y < 0 || y + _linerHeight > height ? random.nextInt(0, height - _linerHeight) : y;
_pictureWidth = width;
_pictureHeight = height;
}
//Движение транспорта по координатам
public void MoveTransport(Direction direction)
{
if (GetLiner() == null) {
return;
}
switch (direction.GetDirect()) {
case 1:
if (_startPosY - EntityLiner.GetStep() > 0) {
_startPosY -= EntityLiner.GetStep();
}
break;
case 2:
if (_startPosY + _linerHeight + EntityLiner.GetStep() < _pictureHeight) {
_startPosY += EntityLiner.GetStep();
}
break;
case 3:
if (_startPosX - EntityLiner.GetStep() > 0) {
_startPosX -= EntityLiner.GetStep();
}
break;
case 4:
if (_startPosX + _linerWidth + EntityLiner.GetStep() < _pictureWidth) {
_startPosX += EntityLiner.GetStep();
}
break;
}
}
//Отрисовка транспорта
public void DrawLiner(Graphics g) {
if (GetLiner() == null) {
return;
}
if (_startPosX < 0 || _startPosY < 0) {
return;
}
int yDiff = drawingDeck.DrawDeck(Color.YELLOW, g, _startPosX, _startPosY)+20;//+1 основная палуба, желтая по умолчанию для обычног ообьекта
Graphics2D g2d = (Graphics2D) g;
g2d.setPaint(EntityLiner.GetBottomColor());
//корпус
int[] xBottom = {_startPosX, _startPosX + 100, _startPosX + 80, _startPosX + 20};
int[] yBottom = {_startPosY + yDiff, _startPosY + yDiff, _startPosY + 40 + yDiff, _startPosY + 40 + yDiff};
g2d.fillPolygon(xBottom, yBottom, 4);
g2d.setPaint(Color.BLACK);
g2d.drawPolygon(xBottom, yBottom, 4);
}
public boolean CanMove(Direction direction) {
if (EntityLiner == null) {
return false;
}
return switch (direction) {
case Left -> _startPosX - EntityLiner.GetStep() > 0;
case Up -> _startPosY - EntityLiner.GetStep() > 0;
case Right -> _startPosX + _linerWidth + EntityLiner.GetStep() < _pictureWidth;
case Down -> _startPosY + _linerHeight + EntityLiner.GetStep() < _pictureHeight;
};
}
}

View File

@ -1,31 +0,0 @@
import java.awt.*;
import java.util.*;
public class EntityLiner {
private int Speed; //Скорость
private float Weight; //Вес
private Color BottomColor; //Цвет
private float Step; //Шаг при перемещении
private boolean Deck; //Наличие доп палубы
private boolean SwimmingPool; //Наличие бассейна
//Инициализация
public void Init(int speed, float weight, Color bodyColor, boolean swimmingPool, boolean deck)
{
Random random = new Random();
Speed = speed <= 0 ? random.nextInt(50, 150) : speed;
Weight = weight <= 0 ? random.nextInt(50, 150) : weight;
BottomColor = bodyColor;
SwimmingPool = swimmingPool;
Deck = deck;
Step = Speed * 100 / Weight;
}
public boolean GetDeck() {return Deck;}
public boolean GetSwimmingPool() {return SwimmingPool;}
public Color GetBottomColor(){
return BottomColor;
}
public float GetStep(){
return Step;
}
}

View File

@ -1,110 +0,0 @@
import javax.swing.*;
import java.awt.*;
import java.awt.Graphics;
import java.awt.event.ActionListener;
import java.util.*;
public class FormLiner{
private DrawingLiner _drawingLiner;
Canvas canv;
public void Draw(){
canv.repaint();
}
public FormLiner(){
JFrame frame = new JFrame("Liner");
JButton buttonCreate = new JButton("Создать");
buttonCreate.setFocusPainted(false);
buttonCreate.setContentAreaFilled(false);
JButton buttonUp = new JButton();
buttonUp.setFocusPainted(false);
buttonUp.setContentAreaFilled(false);
buttonUp.setName("up");
buttonUp.setIcon(new ImageIcon(((new ImageIcon("src/Images/arrowUp.png")).getImage()).getScaledInstance(35, 35, java.awt.Image.SCALE_SMOOTH)));
JButton buttonDown = new JButton();
buttonDown.setFocusPainted(false);
buttonDown.setContentAreaFilled(false);
buttonDown.setName("down");
buttonDown.setIcon(new ImageIcon(((new ImageIcon("src/Images/arrowDown.png")).getImage()).getScaledInstance(35, 35, java.awt.Image.SCALE_SMOOTH)));
JButton buttonLeft = new JButton();
buttonLeft.setFocusPainted(false);
buttonLeft.setContentAreaFilled(false);
buttonLeft.setName("left");
buttonLeft.setIcon(new ImageIcon(((new ImageIcon("src/Images/arrowLeft.png")).getImage()).getScaledInstance(35, 35, java.awt.Image.SCALE_SMOOTH)));
JButton buttonRight = new JButton();
buttonRight.setFocusPainted(false);
buttonRight.setContentAreaFilled(false);
buttonRight.setName("right");
buttonRight.setIcon(new ImageIcon(((new ImageIcon("src/Images/arrowRight.png")).getImage()).getScaledInstance(35, 35, java.awt.Image.SCALE_SMOOTH)));
buttonCreate.addActionListener(
e -> {
Random random = new Random();
_drawingLiner = new DrawingLiner();
_drawingLiner.Init(
random.nextInt(200) + 100,
random.nextInt(2000) + 1000,
new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)),
random.nextBoolean(), random.nextBoolean());
_drawingLiner.SetPosition(random.nextInt(100-30+1)+30, //начальные и конечные значения для рандома
random.nextInt(90-20+1)+20 //начальные и конечные значения для рандома
,this.canv.getWidth(), this.canv.getHeight());
canv._drawingLiner = _drawingLiner;
Draw();
}
);
ActionListener actionListener = e -> {
if (_drawingLiner == null){
return;
}
switch ((((JButton)(e.getSource())).getName())){
case "up":
_drawingLiner.MoveTransport(Direction.Up);
break;
case "down":
_drawingLiner.MoveTransport(Direction.Down);
break;
case "left":
_drawingLiner.MoveTransport(Direction.Left);
break;
case "right":
_drawingLiner.MoveTransport(Direction.Right);
break;
}
Draw();
};
buttonUp.addActionListener(actionListener);
buttonDown.addActionListener(actionListener);
buttonLeft.addActionListener(actionListener);
buttonRight.addActionListener(actionListener);
frame.setSize(910, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(null);
canv = new Canvas();
canv.setBounds(0, 0, 895, 500 - 40); // 40 - const, высота панели сверху
buttonCreate.setBounds(20, 420, 100, 40);
buttonUp.setBounds(800, 380, 40, 40);
buttonDown.setBounds(800, 420, 40, 40);
buttonLeft.setBounds(760, 420, 40, 40);
buttonRight.setBounds(840, 420, 40, 40);
frame.add(canv);
frame.add(buttonCreate);
frame.add(buttonUp);
frame.add(buttonDown);
frame.add(buttonLeft);
frame.add(buttonRight);
frame.setVisible(true);
}
class Canvas extends JComponent{
public DrawingLiner _drawingLiner;
public Canvas(){}
public void paintComponent(Graphics g){
if (_drawingLiner == null){
return;
}
super.paintComponents(g);
Graphics2D g2d = (Graphics2D)g;
_drawingLiner.DrawLiner(g2d);
super.repaint();
}
}
}

View File

@ -1,3 +1,5 @@
package LinerHard;
public enum Direction {
Up(1),
Down(2),
@ -11,4 +13,4 @@ public enum Direction {
public int GetDirect() {
return Direct;
}
}
}

View File

@ -0,0 +1,47 @@
package LinerHard.DrawingObjects;
import LinerHard.ExtraThings.AdditionalEnum;
import LinerHard.Entities.*;
import LinerHard.ExtraThings.*;
import java.awt.*;
import java.util.Random;
public class DrawingBigLiner extends DrawingLiner {
public DrawingBigLiner(int speed, float weight, Color bottomColor, int width, int height,Color bodyColor, boolean swimmingPool, boolean deck,int deckNum) {
super(speed,weight,bottomColor,width,height,deckNum);
if (width < _linerWidth || height < _linerHeight) {
return;
}
if(EntityLiner != null) {
EntityLiner = new EntityBigLiner(speed, weight, bottomColor, bodyColor, swimmingPool, deck);
}
}
@Override
public void DrawLiner(Graphics g) {
if (GetLiner() == null || !(GetLiner() instanceof EntityBigLiner)) {
return;
}
if (_startPosX < 0 || _startPosY < 0) {
return;
}
EntityBigLiner liner = (EntityBigLiner)EntityLiner;
int yDiff = Deck.DrawDeck(liner.GetBodyColor(), g, _startPosX, _startPosY) + 20;//+1 основная палуба
Graphics2D g2d = (Graphics2D) g;
g2d.setPaint(liner.GetBottomColor());
//корпус
int[] xBottom = {_startPosX,_startPosX + 100, _startPosX + 80, _startPosX + 20};
int[] yBottom = {_startPosY + yDiff,_startPosY + yDiff,_startPosY + 40 + yDiff, _startPosY + 40 + yDiff};
//бассейн
int[] xPool = {_startPosX + 10, _startPosX + 30, _startPosX + 30, _startPosX + 10};
int[] yPool = {_startPosY + yDiff,_startPosY + yDiff,_startPosY + 10 + yDiff,_startPosY + 10 + yDiff};
g2d.fillPolygon(xBottom,yBottom,4);
g2d.setPaint(Color.BLACK);
g2d.drawPolygon(xBottom,yBottom,4);
if(liner.GetSwimmingPool()) {
g2d.setPaint(Color.BLUE);
g2d.fillPolygon(xPool, yPool, 4);
g2d.setPaint(Color.BLACK);
g2d.drawPolygon(xPool, yPool, 4);
}
}
}

View File

@ -0,0 +1,106 @@
package LinerHard.DrawingObjects;
import LinerHard.ExtraThings.*;
import LinerHard.Direction;
import LinerHard.Entities.EntityLiner;
import java.awt.*;
import java.util.Random;
public class DrawingLiner{
public EntityLiner EntityLiner;
public IDrawingDeck Deck;
public EntityLiner GetLiner() {
return EntityLiner;
}
protected int _startPosX;
protected int _startPosY;
protected Integer _pictureWidth = null;
protected Integer _pictureHeight = null;
protected final int _linerWidth = 100;
protected int _linerHeight = 60;
public int GetWidth(){return _linerWidth;}
public int GetHeight(){return _linerHeight;}
public int GetPosX(){return _startPosX;}
public int GetPosY(){return _startPosY;}
public DrawingLiner(int speed, float weight, Color bottomColor,int width,int height,int deckNumber) {
if (width < _linerWidth || height < _linerHeight) {
return;
}
EntityLiner = new EntityLiner(speed,weight,bottomColor);
_pictureWidth = width;
_pictureHeight = height;
Random rand = new Random();
Deck = switch (rand.nextInt(0, 3)) {
case 0 -> new DrawingDeck();
case 1 -> new DrawingOvalDeck();
case 2 -> new DrawingTriangleDeck();
default -> new DrawingDeck();
};
Deck.SetAddEnum(deckNumber);
}
public void SetPosition(int x, int y) {
if(x < 0 || y < 0 || x > _pictureWidth - _linerWidth || y > _pictureHeight - _linerHeight){
_startPosX = 0;
_startPosY = 0;
return;
}
_startPosX = x;
_startPosY = y;
}
public void MoveTransport(Direction direction) {
if (GetLiner() == null) {
return;
}
switch (direction.GetDirect()) {
case 1:
if (_startPosY - EntityLiner.GetStep() > 0) {
_startPosY -= EntityLiner.GetStep();
}
break;
case 2:
if (_startPosY + _linerHeight + EntityLiner.GetStep() < _pictureHeight) {
_startPosY += EntityLiner.GetStep();
}
break;
case 3:
if (_startPosX - EntityLiner.GetStep() > 0) {
_startPosX -= EntityLiner.GetStep();
}
break;
case 4:
if (_startPosX + _linerWidth + EntityLiner.GetStep() < _pictureWidth) {
_startPosX += EntityLiner.GetStep();
}
break;
}
}
public void DrawLiner(Graphics g) {
if (GetLiner() == null) {
return;
}
if (_startPosX < 0 || _startPosY < 0) {
return;
}
int yDiff = Deck.DrawDeck(Color.YELLOW, g, _startPosX, _startPosY)+20;//+1 основная палуба, желтая по умолчанию для обычног ообьекта
Graphics2D g2d = (Graphics2D) g;
g2d.setPaint(EntityLiner.GetBottomColor());
//корпус
int[] xBottom = {_startPosX, _startPosX + 100, _startPosX + 80, _startPosX + 20};
int[] yBottom = {_startPosY + yDiff, _startPosY + yDiff, _startPosY + 40 + yDiff, _startPosY + 40 + yDiff};
g2d.fillPolygon(xBottom, yBottom, 4);
g2d.setPaint(Color.BLACK);
g2d.drawPolygon(xBottom, yBottom, 4);
}
public boolean CanMove(Direction direction) {
if (EntityLiner == null) {
return false;
}
return switch (direction) {
case Left -> _startPosX - EntityLiner.GetStep() > 0;
case Up -> _startPosY - EntityLiner.GetStep() > 0;
case Right -> _startPosX + _linerWidth + EntityLiner.GetStep() < _pictureWidth;
case Down -> _startPosY + _linerHeight + EntityLiner.GetStep() < _pictureHeight;
};
}
}

View File

@ -0,0 +1,33 @@
package LinerHard.Entities;
import java.awt.*;
public class EntityBigLiner extends EntityLiner
{
public Color BodyColor;
public Color GetBodyColor(){
return BodyColor;
}
/// <summary>
/// Признак (опция) наличия бассейна
/// </summary>
public boolean SwimmingPool;
public boolean GetSwimmingPool(){
return SwimmingPool;
}
/// <summary>
/// Признак (опция) наличия доп палубы
/// </summary>
public boolean Deck;
public boolean GetDeck(){
return Deck;
}
public EntityBigLiner(int speed, float weight, Color bodyColor, Color bottomColor, boolean swimmingPool, boolean deck)
{
super(speed,weight,bottomColor);
BodyColor = bodyColor;
SwimmingPool = swimmingPool;
Deck = deck;
}
}

View File

@ -0,0 +1,46 @@
package LinerHard.Entities;
import java.awt.*;
public class EntityLiner
{
/// <summary>
/// Скорость
/// </summary>
private int Speed;
public int GetSpeed(){
return Speed;
}
/// <summary>
/// Вес
/// </summary>
private float Weight;
public float GetWeight(){
return Weight;
}
/// <summary>
/// Основной цвет
/// </summary>
private Color BottomColor;
public Color GetBottomColor(){
return BottomColor;
}
/// <summary>
/// Шаг
/// </summary>
public float GetStep(){
return (float)Speed*100 / Weight;
}
/// <summary>
/// Инициализация полей объекта-класса лайнера
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес лайнера</param>
/// <param name="bodyColor">Основной цвет</param>
public EntityLiner(int speed, float weight, Color bottomColor)
{
Speed = speed;
Weight = weight;
BottomColor = bottomColor;
}
}

View File

@ -1,3 +1,5 @@
package LinerHard.ExtraThings;
public enum AdditionalEnum {
One(1),
Two(2),

View File

@ -1,6 +1,9 @@
package LinerHard.ExtraThings;
import java.awt.*;
public class DrawingDeck {
public class DrawingDeck implements IDrawingDeck{
private AdditionalEnum deckNumber;
@Override
public void SetAddEnum(int num){
switch (num){
case 1:
@ -13,9 +16,11 @@ public class DrawingDeck {
deckNumber = AdditionalEnum.Three;
}
};
@Override
public AdditionalEnum GetDeckNumber() {
return deckNumber;
}
@Override
public int DrawDeck(Color colorDeck, Graphics g, int _startPosX, int _startPosY) {
Graphics2D g2d = (Graphics2D) g;
//Переделана логика вариативной отрисовки для снижения повторяющегося кода
@ -38,4 +43,4 @@ public class DrawingDeck {
DrawNumDeck(g2d,numOfDecks-1,_startPosX,_startPosY,colorDeck);
}
}
}
}

View File

@ -0,0 +1,44 @@
package LinerHard.ExtraThings;
import java.awt.*;
public class DrawingOvalDeck implements IDrawingDeck{
private AdditionalEnum deckNumber;
@Override
public void SetAddEnum(int num){
switch (num){
case 1:
deckNumber = AdditionalEnum.One;
break;
case 2:
deckNumber = AdditionalEnum.Two;
break;
default:
deckNumber = AdditionalEnum.Three;
}
};
@Override
public AdditionalEnum GetDeckNumber() {
return deckNumber;
}
@Override
public int DrawDeck(Color colorDeck, Graphics g, int _startPosX, int _startPosY) {
Graphics2D g2d = (Graphics2D) g;
//Переделана логика вариативной отрисовки для снижения повторяющегося кода
int k = deckNumber.GetAddEnum();
if(k > 0){
DrawNumDeck(g2d,k-1,_startPosX,_startPosY,colorDeck);
return (k-1)*20; //20-высота одной палубы
}
return 0;
}
public void DrawNumDeck(Graphics2D g2d, int numOfDecks,int _startPosX,int _startPosY,Color colorDeck){
int yDiff = numOfDecks * 20;
g2d.setPaint(colorDeck);
g2d.fillOval(_startPosX+10,_startPosY+yDiff,90,20);
g2d.setPaint(Color.BLACK);
g2d.drawOval(_startPosX+10,_startPosY+yDiff,90,20);
if(numOfDecks > 0){
DrawNumDeck(g2d,numOfDecks-1,_startPosX,_startPosY,colorDeck);
}
}
}

View File

@ -0,0 +1,46 @@
package LinerHard.ExtraThings;
import java.awt.*;
public class DrawingTriangleDeck implements IDrawingDeck{
private AdditionalEnum deckNumber;
@Override
public void SetAddEnum(int num){
switch (num){
case 1:
deckNumber = AdditionalEnum.One;
break;
case 2:
deckNumber = AdditionalEnum.Two;
break;
default:
deckNumber = AdditionalEnum.Three;
}
};
@Override
public AdditionalEnum GetDeckNumber() {
return deckNumber;
}
@Override
public int DrawDeck(Color colorDeck, Graphics g, int _startPosX, int _startPosY) {
Graphics2D g2d = (Graphics2D) g;
//Переделана логика вариативной отрисовки для снижения повторяющегося кода
int k = deckNumber.GetAddEnum();
if(k > 0){
DrawNumDeck(g2d,k-1,_startPosX,_startPosY,colorDeck);
return (k-1)*20; //20-высота одной палубы
}
return 0;
}
public void DrawNumDeck(Graphics2D g2d, int numOfDecks,int _startPosX,int _startPosY,Color colorDeck){
int yDiff = numOfDecks * 20;
int[] xDeck = {_startPosX+30,_startPosX+60,_startPosX + 30 + 60};
int[] yDeck = {_startPosY + 20 + yDiff,_startPosY+ yDiff,_startPosY + 20 + yDiff};
g2d.setPaint(colorDeck);
g2d.fillPolygon(xDeck,yDeck,3);
g2d.setPaint(Color.BLACK);
g2d.drawPolygon(xDeck,yDeck,3);
if(numOfDecks > 0){
DrawNumDeck(g2d,numOfDecks-1,_startPosX,_startPosY,colorDeck);
}
}
}

View File

@ -0,0 +1,7 @@
package LinerHard.ExtraThings;
import java.awt.*;
public interface IDrawingDeck {
void SetAddEnum(int num);
AdditionalEnum GetDeckNumber();
int DrawDeck(Color color, Graphics g,int startPosX, int startPosY);
}

View File

@ -0,0 +1,171 @@
package LinerHard;
import javax.swing.*;
import java.awt.*;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
import LinerHard.DrawingObjects.*;
import LinerHard.Entities.*;
import LinerHard.MovementStrategies.*;
public class FormLiner{
private DrawingLiner _drawingLiner;
private AbstractStrategy _abstractStrategy;
Canvas canv;
public void Draw(){
canv.repaint();
}
public FormLiner(){
JFrame frame = new JFrame("LinerHard");
JButton buttonCreateLiner = new JButton("Создать Лайнер");
buttonCreateLiner.setFocusPainted(false);
buttonCreateLiner.setContentAreaFilled(false);
JButton buttonCreateBigLiner = new JButton("Создать Большой Лайнер");
buttonCreateBigLiner.setFocusPainted(false);
buttonCreateBigLiner.setContentAreaFilled(false);
String[] items = {
"Form center",
"Form border"
};
JComboBox comboBoxStrategy = new JComboBox(items);
JButton buttonStep = new JButton("Шаг");
buttonStep.setFocusPainted(false);
buttonStep.setContentAreaFilled(false);
JButton buttonUp = new JButton();
buttonUp.setFocusPainted(false);
buttonUp.setContentAreaFilled(false);
buttonUp.setName("up");
buttonUp.setIcon(new ImageIcon(((new ImageIcon("src/Images/arrowUp.png")).getImage()).getScaledInstance(35, 35, java.awt.Image.SCALE_SMOOTH)));
JButton buttonDown = new JButton();
buttonDown.setFocusPainted(false);
buttonDown.setContentAreaFilled(false);
buttonDown.setName("down");
buttonDown.setIcon(new ImageIcon(((new ImageIcon("src/Images/arrowDown.png")).getImage()).getScaledInstance(35, 35, java.awt.Image.SCALE_SMOOTH)));
JButton buttonLeft = new JButton();
buttonLeft.setFocusPainted(false);
buttonLeft.setContentAreaFilled(false);
buttonLeft.setName("left");
buttonLeft.setIcon(new ImageIcon(((new ImageIcon("src/Images/arrowLeft.png")).getImage()).getScaledInstance(35, 35, java.awt.Image.SCALE_SMOOTH)));
JButton buttonRight = new JButton();
buttonRight.setFocusPainted(false);
buttonRight.setContentAreaFilled(false);
buttonRight.setName("right");
buttonRight.setIcon(new ImageIcon(((new ImageIcon("src/Images/arrowRight.png")).getImage()).getScaledInstance(35, 35, java.awt.Image.SCALE_SMOOTH)));
buttonCreateLiner.addActionListener(
e -> {
Random random = new Random();
_drawingLiner = new DrawingLiner(random.nextInt(20) + 10,//для удобства скорость больше
random.nextInt(200)+50,
new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)),
this.canv.getWidth(), this.canv.getHeight(), 1);// 1 палуба у обычного лайнера
_drawingLiner.SetPosition(random.nextInt(100), random.nextInt(90));
canv._drawingLiner = _drawingLiner;
Draw();
}
);
buttonCreateBigLiner.addActionListener(
e -> {
Random random = new Random();
_drawingLiner= new DrawingBigLiner(random.nextInt(20) + 10,//для удобства скорость больше
random.nextInt(200)+50,
new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)),
this.canv.getWidth(), this.canv.getHeight(),
new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)),
random.nextBoolean(),random.nextBoolean(), random.nextInt(0,3));
_drawingLiner.SetPosition(random.nextInt(100), random.nextInt(90));
canv._drawingLiner = _drawingLiner;
Draw();
}
);
ActionListener actionListener = e -> {
if (_drawingLiner == null){
return;
}
switch ((((JButton)(e.getSource())).getName())){
case "up":
_drawingLiner.MoveTransport(Direction.Up);
break;
case "down":
_drawingLiner.MoveTransport(Direction.Down);
break;
case "left":
_drawingLiner.MoveTransport(Direction.Left);
break;
case "right":
_drawingLiner.MoveTransport(Direction.Right);
break;
}
Draw();
};
buttonUp.addActionListener(actionListener);
buttonDown.addActionListener(actionListener);
buttonLeft.addActionListener(actionListener);
buttonRight.addActionListener(actionListener);
buttonStep.addActionListener(e -> {
if (_drawingLiner == 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 DrawingObjectLiner(_drawingLiner), this.canv.getWidth(), this.canv.getHeight());
}
if (_abstractStrategy == null)
{
return;
}
comboBoxStrategy.setEnabled(false);
_abstractStrategy.MakeStep();
Draw();
if (_abstractStrategy.GetStatus() == Status.Finish)
{
comboBoxStrategy.setEnabled(true);
_abstractStrategy = null;
}
});
frame.setSize(910, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(null);
buttonCreateLiner.setBounds(20, 420, 100, 40);
buttonCreateBigLiner.setBounds(140, 420, 100, 40);
buttonUp.setBounds(800, 380, 40, 40);
buttonDown.setBounds(800, 420, 40, 40);
buttonLeft.setBounds(760, 420, 40, 40);
buttonRight.setBounds(840, 420, 40, 40);
comboBoxStrategy.setBounds(800,10,100,50);
buttonStep.setBounds(800,80,100,40);
canv = new Canvas();
canv.setBounds(0, 0, frame.getWidth()-15,frame.getHeight()-38);//отнимаем высоту доп частей фрейма (число выведенно опытным путем)
frame.add(canv);
frame.add(buttonCreateLiner);
frame.add(buttonCreateBigLiner);
frame.add(buttonUp);
frame.add(buttonDown);
frame.add(buttonLeft);
frame.add(buttonRight);
frame.add(comboBoxStrategy);
frame.add(buttonStep);
frame.setVisible(true);
}
class Canvas extends JComponent{
public DrawingLiner _drawingLiner;
public Canvas(){}
public void paintComponent(Graphics g){
if (_drawingLiner == null){
return;
}
super.paintComponents(g);
Graphics2D g2d = (Graphics2D)g;
_drawingLiner.DrawLiner(g2d);
super.repaint();
}
}
}

View File

@ -1,5 +1,6 @@
package LinerHard;
public class Main {
public static void main(String[] args) {
FormLiner fm = new FormLiner();
}
}
}

View File

@ -0,0 +1,80 @@
package LinerHard.MovementStrategies;
import LinerHard.Direction;
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(Direction.Left);
}
protected boolean MoveRight() {
return MoveTo(Direction.Right);
}
protected boolean MoveUp() {
return MoveTo(Direction.Up);
}
protected boolean MoveDown() {
return MoveTo(Direction.Down);
}
protected ObjectParameters GetObjectParameters() {
if (moveableObject == null) {
return null;
}
return moveableObject.GetObjectPosition();
}
protected Integer GetStep() {
if (state != Status.InProgress) {
return null;
}
return moveableObject.GetStep();
}
protected abstract void MoveToTarget();
protected abstract boolean isTargetDestination();
private boolean MoveTo(Direction direction) {
if (state != Status.InProgress) {
return false;
}
if (moveableObject == null) {
return false;
}
if (moveableObject.CheckCanMove(direction)) {
moveableObject.MoveObject(direction);
return true;
}
return false;
}
}

View File

@ -0,0 +1,37 @@
package LinerHard.MovementStrategies;
import LinerHard.Direction;
import LinerHard.DrawingObjects.*;
public class DrawingObjectLiner implements IMoveableObject{
private DrawingLiner _drawingLiner = null;
public DrawingObjectLiner (DrawingLiner drawingLiner)
{
_drawingLiner = drawingLiner;
}
@Override
public ObjectParameters GetObjectPosition() {
if (_drawingLiner == null || _drawingLiner.EntityLiner == null) {
return null;
}
return new ObjectParameters(_drawingLiner.GetPosX(), _drawingLiner.GetPosY(),
_drawingLiner.GetWidth(), _drawingLiner.GetHeight());
}
@Override
public int GetStep() {
if (_drawingLiner != null && _drawingLiner.EntityLiner!=null)
return (int)(_drawingLiner.EntityLiner.GetStep());
return 0;
}
@Override
public boolean CheckCanMove(Direction direction) {
if (_drawingLiner != null)
return _drawingLiner.CanMove(direction);
return false;
}
@Override
public void MoveObject(Direction direction) {
if (_drawingLiner != null)
_drawingLiner.MoveTransport(direction);
}
}

View File

@ -0,0 +1,11 @@
package LinerHard.MovementStrategies;
import LinerHard.Direction;
public interface IMoveableObject{
ObjectParameters GetObjectPosition();
int GetStep();
boolean CheckCanMove(Direction direction);
void MoveObject(Direction direction);
}

View File

@ -0,0 +1,34 @@
package LinerHard.MovementStrategies;
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,38 @@
package LinerHard.MovementStrategies;
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,42 @@
package LinerHard.MovementStrategies;
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 LinerHard.MovementStrategies;
public enum Status {
NotInit,
InProgress,
Finish
}