From bd3976cc0c5f4a749b051a75db6d2c8f69a75978 Mon Sep 17 00:00:00 2001 From: Kaver Date: Fri, 13 Dec 2024 18:47:14 +0100 Subject: [PATCH] ShipButton hinzugefuegt,Schiffe setzen WIP --- src/BoardDisplay.java | 42 +++++++++++++++---- src/GameBoard.java | 95 ++++++++++++------------------------------- src/Ship.java | 3 ++ src/ShipButton.java | 16 ++++++++ 4 files changed, 78 insertions(+), 78 deletions(-) create mode 100644 src/ShipButton.java diff --git a/src/BoardDisplay.java b/src/BoardDisplay.java index c9760ad..753e7b1 100644 --- a/src/BoardDisplay.java +++ b/src/BoardDisplay.java @@ -12,6 +12,8 @@ public class BoardDisplay extends JPanel { private JButton[][] fields; private int gridSize; private List ships; + private Ship currentShip; + private Player player; /** * Konstruktor der startLocalGame. @@ -20,9 +22,11 @@ public class BoardDisplay extends JPanel { * @param player */ public BoardDisplay(int gridSize, Player player) { - super(new GridLayout(gridSize + 1, gridSize + 1)); // +1 wegen extra Zeile/Splate + super(new GridLayout(gridSize + 1, gridSize + 1)); // +1 wegen extra Zeile/Spalte this.fields = new JButton[gridSize][gridSize]; this.ships = new ArrayList<>(); + this.player = player; + // Erstellung von Spielfeld for (int i = 0; i <= gridSize; i++) { for (int j = 0; j <= gridSize; j++) { @@ -43,7 +47,7 @@ public class BoardDisplay extends JPanel { } else { // Spielfeld (interaktive Zellen) JButton field = new JButton(""); - field.setBackground(Color.LIGHT_GRAY); + field.setBackground(Color.BLUE); field.setOpaque(true); field.setBorderPainted(true); fields[i - 1][j - 1] = field; @@ -68,16 +72,19 @@ public class BoardDisplay extends JPanel { public void mouseClicked(MouseEvent e) { Point o= new Point(finalI, finalJ); System.out.println(o); - handleFieldClick(field, o,player); + handleFieldClick(o); } }); } } } - // this.ships = new ArrayList(); } + public void selectCurrentShip(Ship ship) { + this.currentShip = ship; + } + /** * TODO Funktion beschreiben etc. * @param ship @@ -148,14 +155,31 @@ public class BoardDisplay extends JPanel { /** * TODO Funktion beschreiben etc. - * @param field * @param o - * @param player */ - private void handleFieldClick(JButton field, Point o,Player player) { + private void handleFieldClick(Point o) { + this.currentShip.setPosition(o,player.getBoard().getShips(),gridSize); + paintFields(); // Beispiel: Setze ein Schiff bei einem Klick - if (setShip(new Ship(3, "TestShip"), o, true,player)) { - field.setBackground(Color.BLUE); // Visualisiere Schiff + //if (setShip(new Ship(3, "TestShip"), o, true,player)) { + // field.setBackground(Color.BLUE); // Visualisiere Schiff + //} + } + + public void paintFields() { + for(int i = 0; i <= gridSize; i++) { + for(int j = 0; j <= gridSize; j++) { + if(fields[i][j] == null) { + continue; + } + fields[i][j].setBackground(Color.BLUE); + for(Ship ship: player.getBoard().getShips()) { + if(ship.isShipOnPos(new Point(i,j))) { + fields[i][j].setBackground(Color.LIGHT_GRAY); + break; + } + } + } } } } \ No newline at end of file diff --git a/src/GameBoard.java b/src/GameBoard.java index 3ed0619..994a74e 100644 --- a/src/GameBoard.java +++ b/src/GameBoard.java @@ -37,36 +37,9 @@ public class GameBoard extends JPanel { * @param p2 Zweites Spielerobjekt */ GameBoard(MainFrame frame, int semesterCounter,Player p1, Player p2) { - JToggleButton leftPlayerModul1 = new JToggleButton("Modul 1"); //TODO: Dynamische Namen durch abgleich mit Semester - JToggleButton leftPlayerModul2 = new JToggleButton("Modul 2"); - JToggleButton leftPlayerModul3 = new JToggleButton("Modul 3"); - JToggleButton leftPlayerModul4 = new JToggleButton("Modul 4"); - JToggleButton leftPlayerModul5 = new JToggleButton("Modul 5"); - JToggleButton leftPlayerModul6 = new JToggleButton("Modul 6"); - JToggleButton leftPlayerModul7 = new JToggleButton("Reset"); - - JToggleButton[] leftPlayerButtons=new JToggleButton[]{ - leftPlayerModul1, leftPlayerModul2, leftPlayerModul3, leftPlayerModul4, - leftPlayerModul5, leftPlayerModul6, leftPlayerModul7, - }; - - // Gegnerische ModulButtons - JToggleButton rightPlayerModul1 = new JToggleButton("Modul 1"); - JToggleButton rightPlayerModul2 = new JToggleButton("Modul 2"); - JToggleButton rightPlayerModul3 = new JToggleButton("Modul 3"); - JToggleButton rightPlayerModul4 = new JToggleButton("Modul 4"); - JToggleButton rightPlayerModul5 = new JToggleButton("Modul 5"); - JToggleButton rightPlayerModul6 = new JToggleButton("Modul 6"); - JToggleButton rightPlayerModul7 = new JToggleButton("Bereit"); - - JToggleButton[] rightlayerButtons=new JToggleButton[]{ - rightPlayerModul1, rightPlayerModul2, rightPlayerModul3, rightPlayerModul4, - rightPlayerModul5, rightPlayerModul6, rightPlayerModul7, - }; - - buildPanel(frame, semesterCounter,p1,p2,leftPlayerButtons,rightlayerButtons); + buildPanel(frame, semesterCounter,p1,p2); List shipsP1 =p1.getBoard().getShips(); - updateButtonLabels(shipsP1,leftPlayerButtons); + List shipsP2 =p2.getBoard().getShips(); backButton.addActionListener(e -> frame.showPanel("MainMenu")); } @@ -88,67 +61,52 @@ public class GameBoard extends JPanel { * @param semesterCounter * @param p1 * @param p2 - * @param leftButtons - * @param rightButtons */ - public void buildPanel(MainFrame frame, int semesterCounter,Player p1,Player p2,JToggleButton[] leftButtons,JToggleButton[] rightButtons) { + public void buildPanel(MainFrame frame, int semesterCounter,Player p1,Player p2) { // Hauptlayout - BorderLayout für die Anordnung der Komponenten setLayout(new BorderLayout()); + // Spielfelder erstellen (eigenes und gegnerisches) + // Spielfelder werden in BoardDisplay erstellt + int gridSize = GameController.semesterToBoardSize(semesterCounter); // Größe des Spielfelds + BoardDisplay ownBoardPanel = new BoardDisplay(gridSize,p1); + BoardDisplay opponentBoardPanel = new BoardDisplay(gridSize, p2); + // Panel für das Kontext-Text-Feld JPanel headerPanel = new JPanel(); headerPanel.setLayout(new BorderLayout()); headerPanel.add(kontextText, BorderLayout.WEST); headerPanel.add(backButton, BorderLayout.EAST); - // Panel für die Buttons des linken Spielers (ganz links) JPanel leftButtonsPanel = new JPanel(); leftButtonsPanel.setLayout(new GridLayout(7, 1)); // 6 Buttons untereinander - leftButtonsPanel.add(leftButtons[0]); - leftButtonsPanel.add(leftButtons[1]); - leftButtonsPanel.add(leftButtons[2]); - leftButtonsPanel.add(leftButtons[3]); - leftButtonsPanel.add(leftButtons[4]); - leftButtonsPanel.add(leftButtons[5]); - leftButtonsPanel.add(leftButtons[6]); - // Panel für die Buttons des rechten Spielers (ganz rechts) JPanel rightButtonsPanel = new JPanel(); - rightButtonsPanel.setLayout(new GridLayout(7, 1)); // 6 Buttons untereinander - rightButtonsPanel.add(rightButtons[0]); - rightButtonsPanel.add(rightButtons[1]); - rightButtonsPanel.add(rightButtons[2]); - rightButtonsPanel.add(rightButtons[3]); - rightButtonsPanel.add(rightButtons[4]); - rightButtonsPanel.add(rightButtons[5]); - rightButtonsPanel.add(rightButtons[6]); + rightButtonsPanel.setLayout(new GridLayout(7, 1)); + + // Panel für die Buttons des linken Spielers (ganz links) + for(Ship ship : p1.getBoard().getShips()) { + ShipButton shipButton= new ShipButton(ship,ownBoardPanel); + leftButtonsPanel.add(shipButton); + } + + for(Ship ship : p2.getBoard().getShips()) { + ShipButton shipButton= new ShipButton(ship,ownBoardPanel); + rightButtonsPanel.add(shipButton); + } + JToggleButton rightPlayerModul7 = new JToggleButton("Bereit"); + rightButtonsPanel.add(rightPlayerModul7); + JToggleButton leftPlayerModul7 = new JToggleButton("Reset"); + leftButtonsPanel.add(leftPlayerModul7); + // Panel für die Buttons des rechten Spielers (ganz rechts) - // Spielfelder erstellen (eigenes und gegnerisches) - int gridSize = GameController.semesterToBoardSize(semesterCounter); // Größe des Spielfelds - // Spielfelder werden in BoardDisplay erstellt //JPanel ownBoardPanel = new JPanel(new GridLayout(gridSize, gridSize)); //JPanel opponentBoardPanel = new JPanel(new GridLayout(gridSize, gridSize)); - JPanel ownBoardPanel = new BoardDisplay(gridSize,p1); - JPanel opponentBoardPanel = new BoardDisplay(gridSize, p2); //Buttons in eine Gruppe packen damit diese beim drücken eines anderen Buttons wieder entwählt werden ButtonGroup leftButtonGroup= new ButtonGroup(); - leftButtonGroup.add(leftButtons[0]); - leftButtonGroup.add(leftButtons[1]); - leftButtonGroup.add(leftButtons[2]); - leftButtonGroup.add(leftButtons[3]); - leftButtonGroup.add(leftButtons[4]); - leftButtonGroup.add(leftButtons[5]); - leftButtonGroup.add(leftButtons[6]); ButtonGroup rightButtonGroup= new ButtonGroup(); - rightButtonGroup.add(rightButtons[0]); - rightButtonGroup.add(rightButtons[1]); - rightButtonGroup.add(rightButtons[2]); - rightButtonGroup.add(rightButtons[3]); - rightButtonGroup.add(rightButtons[4]); - rightButtonGroup.add(rightButtons[5]); - rightButtonGroup.add(rightButtons[6]); // Panel für beide Spielfelder (nebeneinander in der Mitte) JPanel centerPanel = new JPanel(); @@ -161,6 +119,5 @@ public class GameBoard extends JPanel { add(rightButtonsPanel, BorderLayout.EAST); add(headerPanel, BorderLayout.NORTH); add(centerPanel, BorderLayout.CENTER); - } } diff --git a/src/Ship.java b/src/Ship.java index 3be924b..971ea87 100644 --- a/src/Ship.java +++ b/src/Ship.java @@ -135,6 +135,9 @@ public class Ship { } public boolean isShipOnPos(Point pos){ + if(this.position == null){ + return false; + } if ((this.horizontal && pos.getY() == this.position.getY() && pos.getX() >= this.position.getX() && pos.getX() < this.position.getX() + size) || (!(this.horizontal) && pos.getX() == this.position.getX() && pos.getY() >= this.position.getY() && pos.getY() < this.position.getY() + size)) { return true; diff --git a/src/ShipButton.java b/src/ShipButton.java new file mode 100644 index 0000000..fbc6667 --- /dev/null +++ b/src/ShipButton.java @@ -0,0 +1,16 @@ +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class ShipButton extends JButton { + Ship ship; + + public ShipButton(Ship ship, BoardDisplay boardDisplay) { + super(ship.getName()); + this.ship = ship; + this.addActionListener((e)->{ + boardDisplay.selectCurrentShip(ship); + }); + } + +}