diff --git a/src/Main.java b/src/Main.java index 9c10cb0..da3b21a 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,8 +1,9 @@ import frames.FrameBattleship; import frames.FrameShipsCollection; +import frames.HardFrame; import java.io.IOException; public class Main { - public static void main(String[] args) throws IOException { new FrameShipsCollection(); } + public static void main(String[] args) throws IOException { new HardFrame(); } } diff --git a/src/drawing_objects/DrawingBlocks.java b/src/drawing_objects/DrawingBlocks.java index a98a1a2..88cfa56 100644 --- a/src/drawing_objects/DrawingBlocks.java +++ b/src/drawing_objects/DrawingBlocks.java @@ -5,6 +5,17 @@ import java.awt.*; public class DrawingBlocks implements IDrawBlocks{ private BlocksNumber number; @Override + public int getNumber() { + int x = 0; + if(number == BlocksNumber.TWO) + x = 2; + else if(number == BlocksNumber.FOUR) + x = 4; + else if(number == BlocksNumber.SIX) + x = 6; + return x; + } + @Override public void setNumber(int x){ if(x <= 2) number = BlocksNumber.TWO; @@ -14,6 +25,10 @@ public class DrawingBlocks implements IDrawBlocks{ number = BlocksNumber.SIX; } @Override + public int getType() { + return 0; + } + @Override public void drawBlocks(Graphics2D graphics2D, int _startX, int _startY){ graphics2D.fillRect(_startX+52, _startY+12, 6, 6); graphics2D.fillRect(_startX+52, _startY+32, 6, 6); diff --git a/src/drawing_objects/DrawingCrossBlocks.java b/src/drawing_objects/DrawingCrossBlocks.java index 183359f..ef11ddf 100644 --- a/src/drawing_objects/DrawingCrossBlocks.java +++ b/src/drawing_objects/DrawingCrossBlocks.java @@ -5,6 +5,17 @@ import java.awt.*; public class DrawingCrossBlocks implements IDrawBlocks{ private BlocksNumber number; @Override + public int getNumber() { + int x = 0; + if(number == BlocksNumber.TWO) + x = 2; + else if(number == BlocksNumber.FOUR) + x = 4; + else if(number == BlocksNumber.SIX) + x = 6; + return x; + } + @Override public void setNumber(int x){ if(x <= 2) number = BlocksNumber.TWO; @@ -14,6 +25,8 @@ public class DrawingCrossBlocks implements IDrawBlocks{ number = BlocksNumber.SIX; } @Override + public int getType() {return 2;} + @Override public void drawBlocks(Graphics2D graphics2D, int _startX, int _startY){ graphics2D.fillRect(_startX+54, _startY+12, 2, 6); graphics2D.fillRect(_startX+52, _startY+14, 6, 2); diff --git a/src/drawing_objects/DrawingRoundBlocks.java b/src/drawing_objects/DrawingRoundBlocks.java index b872ee4..c0cd748 100644 --- a/src/drawing_objects/DrawingRoundBlocks.java +++ b/src/drawing_objects/DrawingRoundBlocks.java @@ -5,6 +5,17 @@ import java.awt.*; public class DrawingRoundBlocks implements IDrawBlocks{ private BlocksNumber number; @Override + public int getNumber() { + int x = 0; + if(number == BlocksNumber.TWO) + x = 2; + else if(number == BlocksNumber.FOUR) + x = 4; + else if(number == BlocksNumber.SIX) + x = 6; + return x; + } + @Override public void setNumber(int x){ if(x <= 2) number = BlocksNumber.TWO; @@ -14,6 +25,10 @@ public class DrawingRoundBlocks implements IDrawBlocks{ number = BlocksNumber.SIX; } @Override + public int getType() { + return 1; + } + @Override public void drawBlocks(Graphics2D graphics2D, int _startX, int _startY){ graphics2D.fillOval(_startX+50, _startY+11, 8, 8); graphics2D.fillOval(_startX+50, _startY+31, 8, 8); diff --git a/src/drawing_objects/IDrawBlocks.java b/src/drawing_objects/IDrawBlocks.java index 51f4815..2db3fb4 100644 --- a/src/drawing_objects/IDrawBlocks.java +++ b/src/drawing_objects/IDrawBlocks.java @@ -3,6 +3,8 @@ package drawing_objects; import java.awt.*; public interface IDrawBlocks { + int getNumber(); void setNumber(int x); + int getType(); void drawBlocks(Graphics2D graphics2D, int _startX, int _startY); } diff --git a/src/frames/FrameShipsCollection.java b/src/frames/FrameShipsCollection.java index f5efa69..93fa372 100644 --- a/src/frames/FrameShipsCollection.java +++ b/src/frames/FrameShipsCollection.java @@ -14,7 +14,6 @@ public class FrameShipsCollection extends JFrame { TextField textFieldNumber; public FrameShipsCollection(){ super("Набор кораблей"); - setSize(new Dimension(900,500)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); createGui(); ships = new ShipsGenericCollection<>(pictureBoxCollection.getWidth(), pictureBoxCollection.getHeight()); @@ -30,7 +29,7 @@ public class FrameShipsCollection extends JFrame { super.repaint(); } }; - pictureBoxCollection.setSize(new Dimension(700, 450)); + pictureBoxCollection.setPreferredSize(new Dimension(700, 450)); JButton buttonAddShip = new JButton("Добавить корабль"); textFieldNumber = new TextField(); JButton buttonRemoveShip = new JButton("Удалить корабль"); @@ -60,6 +59,7 @@ public class FrameShipsCollection extends JFrame { setLayout(new BorderLayout()); add(panelCollection, BorderLayout.EAST); add(pictureBoxCollection, BorderLayout.CENTER); + pack(); } private void buttonAddShipClick() { FrameBattleship form; diff --git a/src/frames/HardFrame.java b/src/frames/HardFrame.java new file mode 100644 index 0000000..7e37d71 --- /dev/null +++ b/src/frames/HardFrame.java @@ -0,0 +1,75 @@ +package frames; + +import drawing_objects.*; +import entities.EntityBattleship; +import entities.EntityShip; +import generics.HardGeneric; + +import javax.swing.*; +import java.awt.*; +import java.util.Random; + +public class HardFrame extends JFrame { + HardGeneric generic; + DrawingShip drawing; + private JComponent pictureBox; + private final int pictureBoxWidth = 200; + private final int pictureBoxHeight = 100; + public HardFrame(){ + setLocationRelativeTo(null); + setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + pictureBox = new JComponent(){ + public void paintComponent(Graphics graphics){ + super.paintComponent(graphics); + Graphics2D graphics2D = (Graphics2D) graphics; + if (drawing != null) drawing.drawTransport(graphics2D); + super.repaint(); + } + }; + pictureBox.setPreferredSize(new Dimension(pictureBoxWidth, pictureBoxHeight)); + JButton buttonMakeObject = new JButton("Создать новый объект"); + Random rand = new Random(); + int size = rand.nextInt(1, 10); + generic = new HardGeneric<>(size, size, pictureBoxWidth, pictureBoxHeight); + for(int i = 0; i < size; i++){ + generic.insertShip(makeRandomShip()); + generic.insertBlock(makeRandomBlock()); + } + buttonMakeObject.addActionListener(e -> { + DrawingShip drawingShip = generic.makeObject(); + drawingShip.setPosition(pictureBoxWidth / 2 - drawingShip.getWidth()/2, pictureBoxHeight / 2 - drawingShip.getHeight()/2); + drawing = drawingShip; + draw(); + }); + setLayout(new BorderLayout()); + add(pictureBox, BorderLayout.CENTER); + add(buttonMakeObject, BorderLayout.SOUTH); + pack(); + setVisible(true); + } + public EntityShip makeRandomShip(){ + Random random = new Random(); + EntityShip ship; + switch (random.nextInt(2)){ + case 0 -> ship = new EntityShip(random.nextInt(100, 300), random.nextDouble(1000,3000), + new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))); + default -> ship = new EntityBattleship(random.nextInt(100, 300), random.nextDouble(1000,3000), + new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)), + new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)), + random.nextBoolean(), random.nextBoolean()); + } + return ship; + } + public IDrawBlocks makeRandomBlock(){ + Random random = new Random(); + IDrawBlocks block; + switch (random.nextInt(3)){ + case 1 -> block = new DrawingRoundBlocks(); + case 2 -> block = new DrawingCrossBlocks(); + default -> block = new DrawingBlocks(); + } + block.setNumber((random.nextInt(3) + 1) * 2); + return block; + } + void draw(){pictureBox.repaint();} +} \ No newline at end of file diff --git a/src/generics/HardGeneric.java b/src/generics/HardGeneric.java new file mode 100644 index 0000000..f18ba18 --- /dev/null +++ b/src/generics/HardGeneric.java @@ -0,0 +1,55 @@ +package generics; + +import drawing_objects.DrawingBattleship; +import drawing_objects.DrawingShip; +import drawing_objects.IDrawBlocks; +import entities.EntityBattleship; +import entities.EntityShip; + +import java.util.Random; + +public class HardGeneric{ + T[] ships; + U[] blocks; + private int shipsNumber; + private int blocksNumber; + private int pictureBoxWidth; + private int pictureBoxHeight; + public HardGeneric(int shipsCount, int blocksCount, int width, int height){ + shipsNumber = 0; + blocksNumber = 0; + ships = (T[]) new EntityShip[shipsCount]; + blocks = (U[]) new IDrawBlocks[blocksCount]; + pictureBoxHeight = height; + pictureBoxWidth = width; + } + public int insertShip(T entityShip){ + if(ships[ships.length-1] != null) + return -1; + for(int i = shipsNumber -1; i>= 0; i--) { + ships[i + 1] = ships[i]; + } + shipsNumber++; + ships[0] = entityShip; + return 0; + } + public int insertBlock(U block){ + if(blocks[blocks.length-1] != null) + return -1; + for(int i = blocksNumber -1; i>= 0; i--) { + blocks[i + 1] = blocks[i]; + } + blocksNumber++; + blocks[0] = block; + return 0; + } + public DrawingShip makeObject(){ + Random rand = new Random(); + EntityShip entity = ships[rand.nextInt(0, shipsNumber)]; + IDrawBlocks block = blocks[rand.nextInt(0, blocksNumber)]; + if (entity instanceof EntityBattleship) + return new DrawingBattleship(entity.getSpeed(), entity.getWeight(), entity.getBodyColor(), ((EntityBattleship) entity).getAdditionalColor(), + ((EntityBattleship) entity).getTurret(), ((EntityBattleship) entity).getRocketLauncher(), pictureBoxWidth, pictureBoxHeight, block.getType(), block.getNumber()); + return new DrawingShip(entity.getSpeed(), entity.getWeight(), entity.getBodyColor(), pictureBoxWidth, pictureBoxHeight, block.getType(), block.getNumber()); + } +}