diff --git a/DrawingMotorShip.java b/DrawingMotorShip.java
index 869d257..2d1f417 100644
--- a/DrawingMotorShip.java
+++ b/DrawingMotorShip.java
@@ -17,12 +17,18 @@ public class DrawingMotorShip extends DrawingShip {
}
g.setColor(motorShip.getDopColor());
- if (motorShip.getPipes()) {
- g.setStroke(new BasicStroke(8));
- }
g.setStroke(new BasicStroke(6));
- if (motorShip.getFuelTank()) {
+ if (motorShip.getPipes()) {
+ g.fillRect((int)_startPosX + 20, (int)_startPosY - 5, 5, 20);
+ g.fillRect((int)_startPosX + 30, (int)_startPosY - 10, 5, 25);
+ g.fillRect((int)_startPosX + 40, (int)_startPosY - 5, 5, 20);
}
+
+ g.setColor(motorShip.getBodyColor());
super.drawTransport(g);
+ g.setColor(motorShip.getDopColor());
+ if (motorShip.getFuelTank()) {
+ g.fillOval((int)_startPosX + 30, (int)_startPosY + 20, 25, 10);
+ }
}
}
\ No newline at end of file
diff --git a/DrawingRoundDecks.java b/DrawingRoundDecks.java
index 5d784c3..04f2f4b 100644
--- a/DrawingRoundDecks.java
+++ b/DrawingRoundDecks.java
@@ -24,12 +24,10 @@ public class DrawingRoundDecks implements IDrawingDecks {
g.setColor(color != null ? color : Color.BLACK);
switch (decksCount) {
case Two: {
- g.fillRect(x, y + 5, 15, 5);
- g.fillPolygon(new int[] {x, x, x + 5}, new int[] {y + 5, y + 10, y + 10}, 3);
+ g.fillOval(x, y, 20, 20);
}
case Three: {
- g.fillRect(x + shipWidth - 20, y, 20, 10);
- g.fillPolygon(new int[] {x + shipWidth - 20, x + shipWidth - 20, x + shipWidth - 25}, new int[] {y, y + 10, y + 10}, 3);
+ g.fillOval(x + shipWidth - 20, y, 20, 20);
}
}
}
diff --git a/DrawingTriDecks.java b/DrawingTriDecks.java
index 90cbca2..edbd45d 100644
--- a/DrawingTriDecks.java
+++ b/DrawingTriDecks.java
@@ -24,12 +24,10 @@ public class DrawingTriDecks implements IDrawingDecks {
g.setColor(color != null ? color : Color.BLACK);
switch (decksCount) {
case Two: {
- g.fillRect(x, y + 5, 15, 5);
g.fillPolygon(new int[] {x, x, x + 5}, new int[] {y + 5, y + 10, y + 10}, 3);
}
case Three: {
- g.fillRect(x + shipWidth - 20, y, 20, 10);
- g.fillPolygon(new int[] {x + shipWidth - 20, x + shipWidth - 20, x + shipWidth - 25}, new int[] {y, y + 10, y + 10}, 3);
+ g.fillPolygon(new int[] {x + shipWidth - 20, x + shipWidth - 20, x + shipWidth}, new int[] {y, y + 10, y + 10}, 3);
}
}
}
diff --git a/FormMap.java b/FormMap.java
deleted file mode 100644
index b2c39f7..0000000
--- a/FormMap.java
+++ /dev/null
@@ -1,110 +0,0 @@
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.util.Random;
-
-public class FormMap extends JFrame {
- private JPanel shipPane;
- private JLabel speedLabel;
- private JLabel weightLabel;
- private JLabel colorLabel;
- private JPanel pictureBox;
- private JButton buttonUp;
- private JButton buttonDown;
- private JButton buttonLeft;
- private JButton buttonRight;
- private JButton createButton;
- private JButton createAdvancedButton;
- private JComboBox comboBoxSelectorMap;
-
- private AbstractMap _abstractMap;
- private Image bufferedImage;
-
- public FormMap() {
- this.setTitle("Ship");
- this.setContentPane(shipPane);
-
- _abstractMap = new SimpleMap();
-
- createButton.addActionListener(e -> {
- Random rnd = new Random();
- var ship = new DrawingShip(
- rnd.nextInt(100, 300),
- rnd.nextInt(1000, 2000),
- new Color(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)),
- rnd.nextInt(1, 4)
- );
- setData(ship);
- });
- buttonLeft.setForeground(new Color(0, 0, 0, 0));
- buttonRight.setForeground(new Color(0, 0, 0, 0));
- buttonUp.setForeground(new Color(0, 0, 0, 0));
- buttonDown.setForeground(new Color(0, 0, 0, 0));
- buttonLeft.addActionListener(e -> {
- if (_abstractMap != null) {
- bufferedImage = _abstractMap.moveObject(Direction.Left);
- repaint();
- }
- });
- buttonRight.addActionListener(e -> {
- if (_abstractMap != null) {
- bufferedImage = _abstractMap.moveObject(Direction.Right);
- repaint();
- }
- });
- buttonUp.addActionListener(e -> {
- if (_abstractMap != null) {
- bufferedImage = _abstractMap.moveObject(Direction.Up);
- repaint();
- }
- });
- buttonDown.addActionListener(e -> {
- if (_abstractMap != null) {
- bufferedImage = _abstractMap.moveObject(Direction.Down);
- repaint();
- }
- });
- createAdvancedButton.addActionListener(e -> {
- Random rnd = new Random();
- var ship = new DrawingMotorShip(
- rnd.nextInt(100, 300),
- rnd.nextInt(1000, 2000),
- new Color(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)),
- rnd.nextInt(1, 4),
- new Color(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)),
- rnd.nextBoolean(),
- rnd.nextBoolean()
- );
- setData(ship);
- });
- comboBoxSelectorMap.addItemListener(e -> {
- if (e.getStateChange() == ItemEvent.SELECTED) {
- switch (e.getItem().toString()) {
- case "Простая карта" -> _abstractMap = new SimpleMap();
- case "Лесная карта" -> _abstractMap = new WaterMap();
- }
- }
- });
- }
-
- private void setData(DrawingShip ship) {
- Random rnd = new Random();
- ship.SetPosition(rnd.nextInt(10, 100), rnd.nextInt(10, 100), pictureBox.getWidth(), pictureBox.getHeight());
- speedLabel.setText(String.format("Скорость: %d", ship.ship.getSpeed()));
- weightLabel.setText(String.format("Вес: %f", ship.ship.getWeight()));
- colorLabel.setText(String.format("Цвет: %x", ship.getShip().getBodyColor().getRGB()));
- bufferedImage = _abstractMap.createMap(pictureBox.getWidth(), pictureBox.getHeight(), new DrawingObjectShip(ship));
- repaint();
- }
-
- @Override
- public void paint(Graphics g) {
- super.paint(g);
-
- if (bufferedImage != null) {
- pictureBox.paintComponents(bufferedImage.getGraphics());
- pictureBox.getGraphics().drawImage(bufferedImage, 0, 0, null);
- }
- }
-}
\ No newline at end of file
diff --git a/FormMap.form b/FormMapWithSetShips.form
similarity index 60%
rename from FormMap.form
rename to FormMapWithSetShips.form
index a89f94f..63c4355 100644
--- a/FormMap.form
+++ b/FormMapWithSetShips.form
@@ -1,61 +1,103 @@
-
diff --git a/FormMapWithSetShips.java b/FormMapWithSetShips.java
new file mode 100644
index 0000000..a8f2b22
--- /dev/null
+++ b/FormMapWithSetShips.java
@@ -0,0 +1,150 @@
+import javax.swing.*;
+import javax.swing.text.DefaultFormatterFactory;
+import javax.swing.text.MaskFormatter;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.text.ParseException;
+
+public class FormMapWithSetShips extends JFrame {
+ private JPanel pictureBox;
+ private JPanel toolsGroup;
+ private JLabel toolsLabel;
+ private JComboBox comboBoxMapSelector;
+ private JButton buttonAddShip;
+ private JPanel paneShips;
+ private JFormattedTextField textBoxPosition;
+ private JButton buttonRemoveShip;
+ private JButton buttonShowStorage;
+ private JButton buttonUp;
+ private JButton buttonDown;
+ private JButton buttonLeft;
+ private JButton buttonRight;
+ private JButton buttonShowOnMap;
+
+ private Image bufferedImage;
+ private MapWithSetShipsGeneric _mapShipsCollectionGeneric;
+
+ public FormMapWithSetShips() {
+ this.setTitle("Ship");
+ this.setContentPane(paneShips);
+
+ try {
+ textBoxPosition.setFormatterFactory(new DefaultFormatterFactory(new MaskFormatter("##")));
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+
+ comboBoxMapSelector.addActionListener(e -> {
+ AbstractMap map = switch (((JComboBox) e.getSource()).getSelectedItem().toString()) {
+ case "Простая карта" -> new SimpleMap();
+ case "Водная карта" -> new WaterMap();
+ default -> null;
+ };
+
+ if (map != null) {
+ _mapShipsCollectionGeneric = new MapWithSetShipsGeneric<>(pictureBox.getWidth(), pictureBox.getHeight(), map);
+ } else {
+ _mapShipsCollectionGeneric = null;
+ }
+ });
+
+ buttonAddShip.addActionListener(e -> {
+ if (_mapShipsCollectionGeneric == null) {
+ return;
+ }
+
+ FormShip dialog = new FormShip();
+ dialog.setSize(800, 500);
+ dialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
+ dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+
+ dialog.setVisible(true);
+
+ if (dialog.getSelectedShip() != null) {
+ DrawingObjectShip ship = new DrawingObjectShip(dialog.getSelectedShip());
+ if (_mapShipsCollectionGeneric.addShip(ship) != -1)
+ {
+ JOptionPane.showMessageDialog(this, "Объект добавлен", "Успех", JOptionPane.INFORMATION_MESSAGE);
+ bufferedImage = _mapShipsCollectionGeneric.showSet();
+ repaint();
+ }
+ else
+ {
+ JOptionPane.showMessageDialog(this, "Не удалось добавить объект", "Провал", JOptionPane.INFORMATION_MESSAGE);
+ }
+ }
+ });
+
+ buttonRemoveShip.addActionListener(e -> {
+ String text = textBoxPosition.getText();
+ if (text == null || text.isEmpty()) {
+ return;
+ }
+
+ if (JOptionPane.showConfirmDialog(this, "Удалить объект?", "Удаление", JOptionPane.YES_NO_OPTION) == JOptionPane.NO_OPTION) {
+ return;
+ }
+
+ int position = Integer.parseInt(text);
+
+ if (_mapShipsCollectionGeneric.removeShipAt(position) != null) {
+ JOptionPane.showMessageDialog(this, "Объект удалён", "Успех", JOptionPane.INFORMATION_MESSAGE);
+ bufferedImage = _mapShipsCollectionGeneric.showSet();
+ repaint();
+ } else {
+ JOptionPane.showMessageDialog(this, "Не удалось удалить объект", "Провал", JOptionPane.INFORMATION_MESSAGE);
+ }
+ });
+
+ buttonShowStorage.addActionListener(e -> {
+ if (_mapShipsCollectionGeneric == null) {
+ return;
+ }
+ bufferedImage = _mapShipsCollectionGeneric.showSet();
+ repaint();
+ });
+
+ buttonShowOnMap.addActionListener(e -> {
+ if (_mapShipsCollectionGeneric == null) {
+ return;
+ }
+ bufferedImage = _mapShipsCollectionGeneric.showOnMap();
+ repaint();
+ });
+
+ buttonLeft.addActionListener(e -> {
+ if (_mapShipsCollectionGeneric != null) {
+ bufferedImage = _mapShipsCollectionGeneric.moveObject(Direction.Left);
+ repaint();
+ }
+ });
+ buttonRight.addActionListener(e -> {
+ if (_mapShipsCollectionGeneric != null) {
+ bufferedImage = _mapShipsCollectionGeneric.moveObject(Direction.Right);
+ repaint();
+ }
+ });
+ buttonUp.addActionListener(e -> {
+ if (_mapShipsCollectionGeneric != null) {
+ bufferedImage = _mapShipsCollectionGeneric.moveObject(Direction.Up);
+ repaint();
+ }
+ });
+ buttonDown.addActionListener(e -> {
+ if (_mapShipsCollectionGeneric != null) {
+ bufferedImage = _mapShipsCollectionGeneric.moveObject(Direction.Down);
+ repaint();
+ }
+ });
+ }
+
+ @Override
+ public void paint(Graphics g) {
+ super.paint(g);
+
+ if (bufferedImage != null) {
+ pictureBox.paintComponents(bufferedImage.getGraphics());
+ pictureBox.getGraphics().drawImage(bufferedImage, 0, 0, null);
+ }
+ }
+}
\ No newline at end of file
diff --git a/FormShipDisplay.java b/FormShipDisplay.java
index 9a733a5..8a58a4f 100644
--- a/FormShipDisplay.java
+++ b/FormShipDisplay.java
@@ -20,12 +20,14 @@ public class FormShipDisplay extends JFrame {
storage = new EntityWithDecks<>(20);
for(int i = 0; i < 20; i++) {
+ var base_color = new Color(rnd.nextInt(0, 256), rnd.nextInt(0, 256), rnd.nextInt(0, 256));
+ var dop_color = new Color(rnd.nextInt(0, 256), rnd.nextInt(0, 256), rnd.nextInt(0, 256));
if (rnd.nextBoolean()) {
storage.add(new EntityMotorShip(
rnd.nextInt(100, 300),
rnd.nextInt(1000, 2000),
- new Color(rnd.nextInt(0, 256), rnd.nextInt(0, 256), rnd.nextInt(0, 256)),
- new Color(rnd.nextInt(0, 256), rnd.nextInt(0, 256), rnd.nextInt(0, 256)),
+ base_color,
+ dop_color,
rnd.nextBoolean(),
rnd.nextBoolean()
));
@@ -33,10 +35,10 @@ public class FormShipDisplay extends JFrame {
storage.add(new EntityShip(
rnd.nextInt(100, 300),
rnd.nextInt(1000, 2000),
- new Color(rnd.nextInt(0, 256), rnd.nextInt(0, 256), rnd.nextInt(0, 256))
+ base_color
));
}
- storage.add(DecksType.random(rnd.nextInt(0, 3), new Color(rnd.nextInt(0, 256), rnd.nextInt(0, 256), rnd.nextInt(0, 256))));
+ storage.add(DecksType.random(rnd.nextInt(0, 3), base_color));
}
buttonRefresh.addActionListener(e -> {
diff --git a/MapWithSetShipsGeneric.java b/MapWithSetShipsGeneric.java
new file mode 100644
index 0000000..375ade4
--- /dev/null
+++ b/MapWithSetShipsGeneric.java
@@ -0,0 +1,111 @@
+import java.awt.*;
+import java.awt.image.BufferedImage;
+
+public class MapWithSetShipsGeneric {
+ public final int _pictureWidth;
+ public final int _pictureHeight;
+ public final int _placeSizeWidth = 210;
+ public final int _placeSizeHeight = 90;
+ private final SetShipsGeneric _setShips;
+ private final U _map;
+
+ public MapWithSetShipsGeneric(int picWidth, int picHeight, U map) {
+ int width = picWidth / _placeSizeWidth;
+ int height = picHeight / _placeSizeHeight;
+ _setShips = new SetShipsGeneric(width * height);
+ _pictureWidth = picWidth;
+ _pictureHeight = picHeight;
+ _map = map;
+ }
+
+ public int addShip(T ship) {
+ return _setShips.insert(ship);
+ }
+
+ public T removeShipAt(int position) {
+ return _setShips.remove(position);
+ }
+
+ public Image showSet() {
+ BufferedImage img = new BufferedImage(_pictureWidth, _pictureHeight, BufferedImage.TYPE_INT_ARGB);
+ Graphics2D g2d = (Graphics2D) img.getGraphics();
+ drawBackground(g2d);
+ drawShips(g2d);
+ return img;
+ }
+
+ public Image showOnMap() {
+ shaking();
+ for (int i = 0; i < _setShips.getCount(); i++)
+ {
+ var ship = _setShips.get(i);
+ if (ship != null)
+ {
+ return _map.createMap(_pictureWidth, _pictureHeight, ship);
+ }
+ }
+ return new BufferedImage(_pictureWidth, _pictureHeight, BufferedImage.TYPE_INT_ARGB);
+ }
+
+ public Image moveObject(Direction direction) {
+ if (_map != null) {
+ return _map.moveObject(direction);
+ }
+ return new BufferedImage(_pictureWidth, _pictureHeight, BufferedImage.TYPE_INT_ARGB);
+ }
+
+ private void shaking() {
+ int j = _setShips.getCount() - 1;
+ for (int i = 0; i < _setShips.getCount(); i++)
+ {
+ if (_setShips.get(i) == null)
+ {
+ for (; j > i; j--)
+ {
+ var ship = _setShips.get(j);
+ if (ship != null)
+ {
+ _setShips.insert(ship, i);
+ _setShips.remove(j);
+ break;
+ }
+ }
+ if (j <= i)
+ {
+ return;
+ }
+ }
+ }
+ }
+
+ private void drawBackground(Graphics2D g) {
+ Color pen = Color.black;
+ Color box = new Color(0, 100, 0, 255);
+ Color flag = Color.red;
+ Stroke normalStroke = new BasicStroke(1);
+ Stroke penStroke = new BasicStroke(3);
+ Stroke thinPenStroke = new BasicStroke(2);
+
+ for (int i = 0; i < _pictureWidth / _placeSizeWidth; i++)
+ {
+ for (int j = 0; j < _pictureHeight / _placeSizeHeight + 1; ++j) {
+ }
+ }
+ g.setStroke(normalStroke);
+ }
+
+ private void drawShips(Graphics2D g) {
+ int width = _pictureWidth / _placeSizeWidth;
+ int height = _pictureHeight / _placeSizeHeight;
+
+ for (int i = 0; i < _setShips.getCount(); i++)
+ {
+ var ship = _setShips.get(i);
+ if (ship != null)
+ {
+ ship.setObject(i % width * _placeSizeWidth + 10, (height - 1 - i / width) * _placeSizeHeight + 10, _pictureWidth, _pictureHeight);
+ ship.drawingObject(g);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Program.java b/Program.java
index e5b9eb9..2f9f0d2 100644
--- a/Program.java
+++ b/Program.java
@@ -2,7 +2,7 @@ import javax.swing.*;
public class Program {
public static void main(String[] args) {
- FormMap form = new FormMap();
+ FormShipDisplay form = new FormShipDisplay();
form.setSize(640, 480);
form.setVisible(true);
form.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
diff --git a/SetShipsGeneric.java b/SetShipsGeneric.java
new file mode 100644
index 0000000..14f5161
--- /dev/null
+++ b/SetShipsGeneric.java
@@ -0,0 +1,70 @@
+public class SetShipsGeneric {
+ private final Object[] _places;
+
+ public int getCount() {
+ return _places.length;
+ }
+
+ public SetShipsGeneric(int count) {
+ _places = new Object[count];
+ }
+
+ public int insert(T ship) {
+ return insert(ship, 0);
+ }
+
+ public int insert(T ship, int position) {
+ if (position < 0 || position >= getCount()) {
+ return -1;
+ }
+
+ if (_places[position] == null) {
+ _places[position] = ship;
+ return position;
+ }
+
+ int firstNull = -1;
+
+ for (int i = position + 1; i < getCount(); i++)
+ {
+ if (_places[i] == null)
+ {
+ firstNull = i;
+ break;
+ }
+ }
+
+ if (firstNull == -1)
+ {
+ return -1;
+ }
+
+ System.arraycopy(_places, position, _places, position + 1, firstNull - position);
+
+ _places[position] = ship;
+ return position;
+ }
+
+ @SuppressWarnings("unchecked")
+ public T remove(int position) {
+ if (position < 0 || position >= getCount())
+ {
+ return null;
+ }
+
+ var result = _places[position];
+
+ _places[position] = null;
+
+ return (T) result;
+ }
+
+ @SuppressWarnings("unchecked")
+ public T get(int position) {
+ if (position < 0 || position >= getCount()) {
+ return null;
+ }
+
+ return (T) _places[position];
+ }
+}
\ No newline at end of file