diff --git a/src/Main.java b/src/Main.java index df6f25c..9c10cb0 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,7 +1,8 @@ import frames.FrameBattleship; +import frames.FrameShipsCollection; import java.io.IOException; public class Main { - public static void main(String[] args) throws IOException { new FrameBattleship(); } + public static void main(String[] args) throws IOException { new FrameShipsCollection(); } } diff --git a/src/drawing_objects/DrawingShip.java b/src/drawing_objects/DrawingShip.java index 990c77a..40f2b59 100644 --- a/src/drawing_objects/DrawingShip.java +++ b/src/drawing_objects/DrawingShip.java @@ -1,6 +1,7 @@ package drawing_objects; import entities.EntityShip; +import movement_strategy.*; import java.awt.*; @@ -18,6 +19,7 @@ public class DrawingShip { public int getWidth() {return shipWidth;} private int shipHeight = 50; public int getHeight() {return shipHeight;} + public IMoveableObject getMoveableObject() {return new DrawingObjectShip(this);} public DrawingShip(int speed, double weight, Color bodyColor, int width, int height, int blocksType, int blocksNumber) { if (width < shipWidth || height < shipHeight) return; diff --git a/src/frames/FrameBattleship.java b/src/frames/FrameBattleship.java index 46c2170..d285489 100644 --- a/src/frames/FrameBattleship.java +++ b/src/frames/FrameBattleship.java @@ -20,6 +20,9 @@ import java.util.Random; public class FrameBattleship extends JFrame { private DrawingShip drawingShip; private AbstractStrategy abstractStrategy; + public JButton selectShipButton; + private DrawingShip selectedShip; + public DrawingShip getSelectedShip() {return selectedShip;} private JComboBox comboBoxStrategy; private JComponent pictureBoxBattleship; public FrameBattleship() throws IOException { @@ -40,6 +43,7 @@ public class FrameBattleship extends JFrame { JButton stepButton = new JButton("Шаг"); JButton createShipButton = new JButton("Создать корабль"); JButton createBattleshipButton = new JButton("Создать линкор"); + selectShipButton = new JButton("Выбрать корабль"); JButton rightButton = new JButton(new ImageIcon(ImageIO.read(new File("images/right.png")))); rightButton.setPreferredSize(new Dimension(30,30)); JButton leftButton = new JButton(new ImageIcon(ImageIO.read(new File("images/left.png")))); @@ -75,6 +79,9 @@ public class FrameBattleship extends JFrame { constraints.gridx = 1; constraints.gridy = 0; createPanel.add(createBattleshipButton, constraints); + constraints.gridx = 2; + constraints.gridy = 0; + createPanel.add(selectShipButton, constraints); //addition to movementPanel constraints.gridx = 2; constraints.gridy = 1; @@ -110,16 +117,19 @@ public class FrameBattleship extends JFrame { private void buttonCreateBattleshipClick() { Random random = new Random(); pictureBoxBattleship.setBounds(0,0,getContentPane().getWidth(),getContentPane().getHeight()); - drawingShip = new DrawingBattleship(random.nextInt(200) + 100, random.nextInt(2000) + 1000, 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(), pictureBoxBattleship.getWidth(), pictureBoxBattleship.getHeight(), random.nextInt(3),(random.nextInt(3)+1)*2); + Color bodyColor = JColorChooser.showDialog(this,"Выбор базового цвета", null); + Color additColor = JColorChooser.showDialog(this,"Выбор дополнительного цвета", null); + drawingShip = new DrawingBattleship(random.nextInt(200) + 100, random.nextInt(2000) + 1000, bodyColor, additColor, random.nextBoolean(), + random.nextBoolean(), pictureBoxBattleship.getWidth(), pictureBoxBattleship.getHeight(), random.nextInt(3),(random.nextInt(3)+1)*2); drawingShip.setPosition(random.nextInt(90) + 10, random.nextInt(90) + 10); draw(); } private void buttonCreateShipClick(){ Random random = new Random(); pictureBoxBattleship.setBounds(0,0,getContentPane().getWidth(),getContentPane().getHeight()); - drawingShip = new DrawingShip(random.nextInt(200) + 100, random.nextInt(2000) + 1000, new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)), - pictureBoxBattleship.getWidth(), pictureBoxBattleship.getHeight(), random.nextInt(3),(random.nextInt(3)+1)*2); + Color bodyColor = JColorChooser.showDialog(this,"Выбор цвета", null); + drawingShip = new DrawingShip(random.nextInt(200) + 100, random.nextInt(2000) + 1000, bodyColor, pictureBoxBattleship.getWidth(), + pictureBoxBattleship.getHeight(), random.nextInt(3),(random.nextInt(3)+1)*2); drawingShip.setPosition(random.nextInt(90) + 10, random.nextInt(90) + 10); draw(); } @@ -168,4 +178,10 @@ public class FrameBattleship extends JFrame { } pictureBoxBattleship.repaint(); } + public void select(){ + if (drawingShip == null) { + return; + } + selectedShip = drawingShip; + } } \ No newline at end of file diff --git a/src/frames/FrameShipsCollection.java b/src/frames/FrameShipsCollection.java new file mode 100644 index 0000000..f5efa69 --- /dev/null +++ b/src/frames/FrameShipsCollection.java @@ -0,0 +1,95 @@ +package frames; + +import javax.swing.*; +import java.awt.*; +import java.io.IOException; + +import drawing_objects.DrawingShip; +import generics.ShipsGenericCollection; +import movement_strategy.DrawingObjectShip; + +public class FrameShipsCollection extends JFrame { + private ShipsGenericCollection ships; + JComponent pictureBoxCollection; + TextField textFieldNumber; + public FrameShipsCollection(){ + super("Набор кораблей"); + setSize(new Dimension(900,500)); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + createGui(); + ships = new ShipsGenericCollection<>(pictureBoxCollection.getWidth(), pictureBoxCollection.getHeight()); + setVisible(true); + } + private void createGui(){ + //components initialisation + pictureBoxCollection = new JComponent(){ + public void paintComponent(Graphics graphics){ + super.paintComponent(graphics); + Graphics2D graphics2D = (Graphics2D) graphics; + if (ships != null) ships.showShips(graphics2D); + super.repaint(); + } + }; + pictureBoxCollection.setSize(new Dimension(700, 450)); + JButton buttonAddShip = new JButton("Добавить корабль"); + textFieldNumber = new TextField(); + JButton buttonRemoveShip = new JButton("Удалить корабль"); + JButton buttonRefreshCollection = new JButton("Обновить коллекцию"); + //ActionListeners and ActionCommand addition + buttonAddShip.addActionListener(e -> buttonAddShipClick()); + buttonRemoveShip.addActionListener(e -> buttonRemoveShipClick()); + buttonRefreshCollection.addActionListener(e -> buttonRefreshCollectionClick()); + //addition to frame + JPanel panelCollection = new JPanel(new GridBagLayout()); + GridBagConstraints constraints = new GridBagConstraints(); + constraints.insets.left = constraints.insets.right = 2; + constraints.insets.top = constraints.insets.bottom = 25; + constraints.fill = GridBagConstraints.BOTH; + constraints.gridx = 0; + constraints.gridy = 0; + panelCollection.add(buttonAddShip, constraints); + constraints.gridx = 0; + constraints.gridy = 1; + panelCollection.add(textFieldNumber, constraints); + constraints.gridx = 0; + constraints.gridy = 2; + panelCollection.add(buttonRemoveShip, constraints); + constraints.gridx = 0; + constraints.gridy = 3; + panelCollection.add(buttonRefreshCollection, constraints); + setLayout(new BorderLayout()); + add(panelCollection, BorderLayout.EAST); + add(pictureBoxCollection, BorderLayout.CENTER); + } + private void buttonAddShipClick() { + FrameBattleship form; + try { + form = new FrameBattleship(); + } catch (IOException e) { + throw new RuntimeException(e); + } + form.selectShipButton.addActionListener(e->{ + form.select(); + DrawingShip ship = form.getSelectedShip(); + form.dispose(); + if (ships.insert(ship)) { + JOptionPane.showMessageDialog(this, "Объект добавлен"); + pictureBoxCollection.repaint(); + } + else { + JOptionPane.showMessageDialog(this, "Не удалось добавить объект"); + } + }); + } + private void buttonRemoveShipClick(){ + int pos = Integer.parseInt(textFieldNumber.getText()); + if (ships.remove(pos)){ + JOptionPane.showMessageDialog(this, "Объект удален"); + pictureBoxCollection.repaint(); + } + else{ + JOptionPane.showMessageDialog(this, "Не удалось удалить объект"); + } + } + private void buttonRefreshCollectionClick(){pictureBoxCollection.repaint();} +} diff --git a/src/generics/SetGeneric.java b/src/generics/SetGeneric.java new file mode 100644 index 0000000..9976170 --- /dev/null +++ b/src/generics/SetGeneric.java @@ -0,0 +1,41 @@ +package generics; + +import java.lang.reflect.Array; + +public class SetGeneric{ + private final T[] places; + public int getCount() {return places.length;} + public SetGeneric(int count, Class type){ + places = (T[]) Array.newInstance(type, count); + } + public boolean insert(T ship){ + return insert(ship, 0); + } + public boolean insert(T ship, int position){ + if (!(position >= 0 && position < places.length)) + return false; + if (places[position] != null) + { + int ind = position; + while (ind < places.length && places[ind] != null) + ind++; + if (ind == places.length) + return false; + for (int i = ind - 1; i >= position; i--) + places[i + 1] = places[i]; + } + places[position] = ship; + return true; + } + public boolean remove(int position){ + if(!(position >= 0 && position < getCount())) + return false; + places[position] = null; + return true; + } + public T get(int position){ + if(!(position >= 0 && position < getCount())) + return null; + return places[position]; + } +} \ No newline at end of file diff --git a/src/generics/ShipsGenericCollection.java b/src/generics/ShipsGenericCollection.java new file mode 100644 index 0000000..a4cda0f --- /dev/null +++ b/src/generics/ShipsGenericCollection.java @@ -0,0 +1,64 @@ +package generics; + +import drawing_objects.*; +import movement_strategy.*; + +import java.awt.*; + +public class ShipsGenericCollection{ + private int pictureWidth; + private int pictureHeight; + private final int placeSizeWidth = 220; + private final int placeSizeHeight = 60; + private SetGeneric collection; + public ShipsGenericCollection(int picWidth, int picHeight){ + int width = picWidth / placeSizeWidth; + int height = picHeight / placeSizeHeight; + pictureWidth = picWidth; + pictureHeight = picHeight; + collection = new SetGeneric(width * height, (Class) DrawingShip.class); + } + public boolean insert ( T obj) { + if (obj != null) + return collection.insert(obj); + return false; + } + public boolean remove (int pos){ + T obj = collection.get(pos); + if (obj != null) + return collection.remove(pos); + return false; + } + public U getU(int pos){ + if(collection.get(pos) == null) + return null; + return (U)collection.get(pos).getMoveableObject(); + } + public void showShips(Graphics2D graphics2D){ + DrawBackground(graphics2D); + DrawObjects(graphics2D); + } + private void DrawBackground(Graphics2D g){ + BasicStroke stroke = new BasicStroke(3); + g.setStroke(stroke); + 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(Graphics2D g){ + for (int i = 0; i < collection.getCount(); i++){ + DrawingShip ship = collection.get(i); + if (ship != null) + { + int inRow = pictureWidth / placeSizeWidth; + ship.setPosition(i % inRow * placeSizeWidth, (collection.getCount() / inRow - 1 - i / inRow) * placeSizeHeight + 5); + ship.drawTransport(g); + } + } + } +}