From bd3976cc0c5f4a749b051a75db6d2c8f69a75978 Mon Sep 17 00:00:00 2001 From: Kaver Date: Fri, 13 Dec 2024 18:47:14 +0100 Subject: [PATCH 01/13] 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); + }); + } + +} From 88ec23c5e52390ec960509cd6784b60749cdfa4d Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Fri, 13 Dec 2024 19:12:26 +0100 Subject: [PATCH 02/13] fix ship placing :) --- src/BoardDisplay.java | 22 ++++++++-------------- src/Point.java | 14 ++++++++++++++ src/Ship.java | 7 +++---- src/ShipButton.java | 4 +--- 4 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/BoardDisplay.java b/src/BoardDisplay.java index 753e7b1..a58ef7a 100644 --- a/src/BoardDisplay.java +++ b/src/BoardDisplay.java @@ -26,12 +26,13 @@ public class BoardDisplay extends JPanel { this.fields = new JButton[gridSize][gridSize]; this.ships = new ArrayList<>(); this.player = player; + this.gridSize = gridSize; // Erstellung von Spielfeld for (int i = 0; i <= gridSize; i++) { for (int j = 0; j <= gridSize; j++) { - final int x = i; // Temporäre Variable - final int y = j; // Temporäre Variable + final int x = i - 1; // Temporäre Variable + final int y = j - 1; // Temporäre Variable if (i == 0 && j == 0) { add(new JLabel(" ")); } else if (i == 0) { @@ -65,13 +66,10 @@ public class BoardDisplay extends JPanel { // field.setBackground(Color.LIGHT_GRAY); // } // }); - int finalI = i; - int finalJ = j; field.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { - Point o= new Point(finalI, finalJ); - System.out.println(o); + Point o= new Point(x, y); handleFieldClick(o); } }); @@ -148,17 +146,13 @@ public class BoardDisplay extends JPanel { return true; } - - private void selectShip(MouseEvent e) { - Ship current = (Ship) e.getSource(); - } - /** * TODO Funktion beschreiben etc. * @param o */ private void handleFieldClick(Point o) { - this.currentShip.setPosition(o,player.getBoard().getShips(),gridSize); + if (!this.currentShip.setPosition(o,player.getBoard().getShips(),this.gridSize)) { + } paintFields(); // Beispiel: Setze ein Schiff bei einem Klick //if (setShip(new Ship(3, "TestShip"), o, true,player)) { @@ -167,8 +161,8 @@ public class BoardDisplay extends JPanel { } public void paintFields() { - for(int i = 0; i <= gridSize; i++) { - for(int j = 0; j <= gridSize; j++) { + for(int i = 0; i < gridSize; i++) { + for(int j = 0; j < gridSize; j++) { if(fields[i][j] == null) { continue; } diff --git a/src/Point.java b/src/Point.java index bf2b127..d47d401 100644 --- a/src/Point.java +++ b/src/Point.java @@ -42,4 +42,18 @@ public class Point { public static boolean isValidSyntax(String str) { return str.matches("^[A-Z]\\d+$"); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || this.getClass() != o.getClass()) return false; + + Point p = (Point)o; + return p.getX() == this.getX() && p.getY() == this.getY(); + } + + public boolean neighbours(Point other) { + if (other == null) return false; + return (int)Math.abs(this.getX() - other.getX()) <= 1 && (int)Math.abs(this.getY() - other.getY()) <= 1; + } } diff --git a/src/Ship.java b/src/Ship.java index 971ea87..bc074bd 100644 --- a/src/Ship.java +++ b/src/Ship.java @@ -105,10 +105,9 @@ public class Ship { List otherShipPoints = otherShip.getOccupiedPoints(); // ueberlappen checken for (Point p : shipPoints) { - if (otherShipPoints.contains(p)) { - // ueberlappen entdeckt - return false; - } + for (Point otherPoint : otherShipPoints) { + if (otherPoint.neighbours(p)) return false; + } } } diff --git a/src/ShipButton.java b/src/ShipButton.java index fbc6667..d8414ed 100644 --- a/src/ShipButton.java +++ b/src/ShipButton.java @@ -1,6 +1,4 @@ import javax.swing.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; public class ShipButton extends JButton { Ship ship; @@ -9,7 +7,7 @@ public class ShipButton extends JButton { super(ship.getName()); this.ship = ship; this.addActionListener((e)->{ - boardDisplay.selectCurrentShip(ship); + boardDisplay.selectCurrentShip(this.ship); }); } From a7e7d75c62f059b105985f8c09f0b6a11128fc14 Mon Sep 17 00:00:00 2001 From: Kaver Date: Fri, 13 Dec 2024 20:30:15 +0100 Subject: [PATCH 03/13] Button ausschalten wenn Schiff gesetzt wurde, nicht komplett richtige Funktion --- src/BoardDisplay.java | 4 ++++ src/GameBoard.java | 16 ++++++++++------ src/Ship.java | 7 +++++++ src/ShipButton.java | 5 +++++ 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/BoardDisplay.java b/src/BoardDisplay.java index a58ef7a..f09a416 100644 --- a/src/BoardDisplay.java +++ b/src/BoardDisplay.java @@ -154,12 +154,16 @@ public class BoardDisplay extends JPanel { if (!this.currentShip.setPosition(o,player.getBoard().getShips(),this.gridSize)) { } paintFields(); + //if(this.currentShip.isPlaced()){ + // this.currentShip. + // }; // Beispiel: Setze ein Schiff bei einem Klick //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++) { diff --git a/src/GameBoard.java b/src/GameBoard.java index 994a74e..b3b9aa1 100644 --- a/src/GameBoard.java +++ b/src/GameBoard.java @@ -84,18 +84,27 @@ public class GameBoard extends JPanel { JPanel rightButtonsPanel = new JPanel(); rightButtonsPanel.setLayout(new GridLayout(7, 1)); + //Buttons in eine Gruppe packen damit diese beim drücken eines anderen Buttons wieder entwählt werden + ButtonGroup leftButtonGroup= new ButtonGroup(); + + ButtonGroup rightButtonGroup= new ButtonGroup(); + // 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); + leftButtonGroup.add(shipButton); } for(Ship ship : p2.getBoard().getShips()) { - ShipButton shipButton= new ShipButton(ship,ownBoardPanel); + ShipButton shipButton= new ShipButton(ship,opponentBoardPanel); rightButtonsPanel.add(shipButton); + rightButtonGroup.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) @@ -103,11 +112,6 @@ public class GameBoard extends JPanel { //JPanel ownBoardPanel = new JPanel(new GridLayout(gridSize, gridSize)); //JPanel opponentBoardPanel = new JPanel(new GridLayout(gridSize, gridSize)); - //Buttons in eine Gruppe packen damit diese beim drücken eines anderen Buttons wieder entwählt werden - ButtonGroup leftButtonGroup= new ButtonGroup(); - - ButtonGroup rightButtonGroup= new ButtonGroup(); - // Panel für beide Spielfelder (nebeneinander in der Mitte) JPanel centerPanel = new JPanel(); centerPanel.setLayout(new GridLayout(1, 2, 20, 0)); // 2 Spielfelder nebeneinander, mit Abstand von 20 Pixeln diff --git a/src/Ship.java b/src/Ship.java index bc074bd..7a30693 100644 --- a/src/Ship.java +++ b/src/Ship.java @@ -51,6 +51,7 @@ public class Ship { private String name; private int hitsOnMe; private boolean sunk; + private boolean isPlaced; public Ship (int size, String name) { this.size = size; @@ -59,6 +60,7 @@ public class Ship { this.position = null; this.hitsOnMe = 0; this.sunk = false; + this.isPlaced = false; } public boolean setPosition(Point pos, List shipsList, int boardSize) { @@ -172,4 +174,9 @@ public class Ship { public String getName() { return name; } + + //potentiell falsch neu + public boolean isPlaced(){ + return this.position != null; + } } diff --git a/src/ShipButton.java b/src/ShipButton.java index d8414ed..36e47f3 100644 --- a/src/ShipButton.java +++ b/src/ShipButton.java @@ -8,7 +8,12 @@ public class ShipButton extends JButton { this.ship = ship; this.addActionListener((e)->{ boardDisplay.selectCurrentShip(this.ship); + this.setEnabled(false); }); } + public void buttonPressed() { + this.setEnabled(!ship.isPlaced()); + } + } From bf78db9404dee1bbf1567f6113fe869a475d59a9 Mon Sep 17 00:00:00 2001 From: Joshua Date: Fri, 13 Dec 2024 20:46:38 +0100 Subject: [PATCH 04/13] Added (currently not working) ship rotation method, colored Ready and Reset button, added (currently not working) Player name Labels etc. to GameBoard --- src/BoardDisplay.java | 24 ++++++++++++++++++++---- src/GameBoard.java | 24 ++++++++++++++++++++++++ src/MainFrame.java | 2 ++ src/ShipButton.java | 1 - 4 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/BoardDisplay.java b/src/BoardDisplay.java index f09a416..c20347e 100644 --- a/src/BoardDisplay.java +++ b/src/BoardDisplay.java @@ -14,6 +14,7 @@ public class BoardDisplay extends JPanel { private List ships; private Ship currentShip; private Player player; + private boolean horizontal = true; /** * Konstruktor der startLocalGame. @@ -69,8 +70,12 @@ public class BoardDisplay extends JPanel { field.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { - Point o= new Point(x, y); - handleFieldClick(o); + if (SwingUtilities.isRightMouseButton(e)) { + togglePlacementDirection(); // Ausrichtung ändern + } else if (SwingUtilities.isLeftMouseButton(e)) { + Point o = new Point(x, y); + handleFieldClick(o); // Linksklick -> Schiff platzieren + } } }); } @@ -79,6 +84,8 @@ public class BoardDisplay extends JPanel { // this.ships = new ArrayList(); } + + public void selectCurrentShip(Ship ship) { this.currentShip = ship; } @@ -147,8 +154,17 @@ public class BoardDisplay extends JPanel { } /** - * TODO Funktion beschreiben etc. - * @param o + * Wechselt die Platzierungsrichtung zwischen horizontal und vertikal. + */ + private void togglePlacementDirection() { + horizontal = !horizontal; + String direction = horizontal ? "horizontal" : "vertikal"; + System.out.println("Platzierungsrichtung geändert zu: " + direction); + } + + /** + * Handhabt das Platzieren eines Schiffs auf dem Spielfeld. + * @param o Die Koordinaten des Klicks. */ private void handleFieldClick(Point o) { if (!this.currentShip.setPosition(o,player.getBoard().getShips(),this.gridSize)) { diff --git a/src/GameBoard.java b/src/GameBoard.java index b3b9aa1..e9e65c7 100644 --- a/src/GameBoard.java +++ b/src/GameBoard.java @@ -8,6 +8,8 @@ import java.awt.event.MouseEvent; import java.awt.event.MouseAdapter; import java.util.List; + +// TODO wenn rechtklick auf board dann schiff rotation ändern UND Readybutton farbe Readybutton kontexttext und Spielernamen anzeigen /** * Das GameBoard dient als Panel, in dem das tatsächliche Spiel stattfindet. * Der Benutzer kann hier seine Schiffe platzieren, das Spiel starten etc. @@ -103,9 +105,11 @@ public class GameBoard extends JPanel { } JToggleButton rightPlayerModul7 = new JToggleButton("Bereit"); + rightPlayerModul7.setBackground(Color.GREEN); rightButtonsPanel.add(rightPlayerModul7); JToggleButton leftPlayerModul7 = new JToggleButton("Reset"); + leftPlayerModul7.setBackground(Color.RED); leftButtonsPanel.add(leftPlayerModul7); // Panel für die Buttons des rechten Spielers (ganz rechts) @@ -118,6 +122,26 @@ public class GameBoard extends JPanel { centerPanel.add(ownBoardPanel); centerPanel.add(opponentBoardPanel); + // Spieler-Namen über den Spielfeldern hinzufügen + JPanel playerNamesPanel = new JPanel(); + playerNamesPanel.setLayout(new GridLayout(1, 2)); // Zwei Labels nebeneinander + JLabel player1NameLabel = new JLabel(p1.getName(), SwingConstants.CENTER); + JLabel player2NameLabel = new JLabel(p2.getName(), SwingConstants.CENTER); + System.out.println(player2NameLabel.getText()); + + // Schrift und Formatierung der Labels + player1NameLabel.setFont(new Font("Roboto", Font.BOLD, 18)); + player2NameLabel.setFont(new Font("Roboto", Font.BOLD, 18)); + + // Spieler-Labels zum Panel hinzufügen + playerNamesPanel.add(player1NameLabel); + playerNamesPanel.add(player2NameLabel); + + // Spieler-Namen-Panel oberhalb der Spielfelder hinzufügen + JPanel namesAndBoardsPanel = new JPanel(new BorderLayout()); + namesAndBoardsPanel.add(playerNamesPanel, BorderLayout.NORTH); + namesAndBoardsPanel.add(centerPanel, BorderLayout.CENTER); + // Panels dem Hauptlayout hinzufügen add(leftButtonsPanel, BorderLayout.WEST); add(rightButtonsPanel, BorderLayout.EAST); diff --git a/src/MainFrame.java b/src/MainFrame.java index 75b27ba..7b3f76b 100644 --- a/src/MainFrame.java +++ b/src/MainFrame.java @@ -1,6 +1,8 @@ import javax.swing.*; import java.awt.*; +//TODO Generell Buttons in GameBoard anpassen + /** * Der MainFrame dient als Hub und Übergreifendes Fenster auf dem alle weiteren Panel angezeigt werden. * Dadurch werden keine weiteren Fenster geöffnet. diff --git a/src/ShipButton.java b/src/ShipButton.java index 36e47f3..4b11bce 100644 --- a/src/ShipButton.java +++ b/src/ShipButton.java @@ -15,5 +15,4 @@ public class ShipButton extends JButton { public void buttonPressed() { this.setEnabled(!ship.isPlaced()); } - } From decef526da748eccd380a48b50a347b370b0bc96 Mon Sep 17 00:00:00 2001 From: Joshua Date: Sat, 14 Dec 2024 15:29:45 +0100 Subject: [PATCH 05/13] Fixed ship rotation method. Added pulsating Effect for "kontextText" --- src/BoardDisplay.java | 8 +++++--- src/GameBoard.java | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/BoardDisplay.java b/src/BoardDisplay.java index c20347e..4941f7f 100644 --- a/src/BoardDisplay.java +++ b/src/BoardDisplay.java @@ -14,7 +14,7 @@ public class BoardDisplay extends JPanel { private List ships; private Ship currentShip; private Player player; - private boolean horizontal = true; + private boolean vertical = false; /** * Konstruktor der startLocalGame. @@ -74,7 +74,9 @@ public class BoardDisplay extends JPanel { togglePlacementDirection(); // Ausrichtung ändern } else if (SwingUtilities.isLeftMouseButton(e)) { Point o = new Point(x, y); + currentShip.setHorizontal(vertical); handleFieldClick(o); // Linksklick -> Schiff platzieren + vertical = false; // TODO nur nach auswahl von neuem Modul wieder auf false setzten } } }); @@ -157,8 +159,8 @@ public class BoardDisplay extends JPanel { * Wechselt die Platzierungsrichtung zwischen horizontal und vertikal. */ private void togglePlacementDirection() { - horizontal = !horizontal; - String direction = horizontal ? "horizontal" : "vertikal"; + vertical = !vertical; + String direction = vertical ? "vertikal" : "horizontal"; System.out.println("Platzierungsrichtung geändert zu: " + direction); } diff --git a/src/GameBoard.java b/src/GameBoard.java index e9e65c7..3e90032 100644 --- a/src/GameBoard.java +++ b/src/GameBoard.java @@ -9,7 +9,7 @@ import java.awt.event.MouseAdapter; import java.util.List; -// TODO wenn rechtklick auf board dann schiff rotation ändern UND Readybutton farbe Readybutton kontexttext und Spielernamen anzeigen +// TODO Readybutton farbe Readybutton kontexttext und Spielernamen anzeigen /** * Das GameBoard dient als Panel, in dem das tatsächliche Spiel stattfindet. * Der Benutzer kann hier seine Schiffe platzieren, das Spiel starten etc. @@ -25,8 +25,7 @@ public class GameBoard extends JPanel { // Labels JLabel frameTitle = new JLabel("GameBoard"); - JLabel kontextText = new JLabel("Beispielhafter Kontext-Text"); - //kontextText.setFont(new Font("Roboto", Font.BOLD, 24)); //TODO setFont fixen + JLabel kontextText = new JLabel("Bitte Schiffe setzten"); JButton backButton = new JButton(backButtonIcon); // Eigene ModulButtons @@ -57,6 +56,31 @@ public class GameBoard extends JPanel { } } + // Timer für pulsierenden Effekt + Timer timer = new Timer(10, new ActionListener() { + private int grayValue = 50; // Start-Grauwert (0 = Schwarz, 255 = Weiß) + private boolean increasing = false; // Richtung des Pulsierens + + @Override + public void actionPerformed(ActionEvent e) { + // Grauwert aktualisieren + kontextText.setForeground(new Color(grayValue, grayValue, grayValue)); + + // Grauwert erhöhen oder verringern + if (increasing) { + grayValue++; + if (grayValue >= 90) { + increasing = false; // Richtung ändern + } + } else { + grayValue--; + if (grayValue <= 0) { + increasing = true; // Richtung ändern + } + } + } + }); + /** * TODO Funktion beschreiben etc. * @param frame @@ -78,6 +102,7 @@ public class GameBoard extends JPanel { JPanel headerPanel = new JPanel(); headerPanel.setLayout(new BorderLayout()); headerPanel.add(kontextText, BorderLayout.WEST); + kontextText.setFont(new Font("Roboto", Font.BOLD, 30)); //TODO setFont fixen headerPanel.add(backButton, BorderLayout.EAST); JPanel leftButtonsPanel = new JPanel(); @@ -147,5 +172,7 @@ public class GameBoard extends JPanel { add(rightButtonsPanel, BorderLayout.EAST); add(headerPanel, BorderLayout.NORTH); add(centerPanel, BorderLayout.CENTER); + + timer.start(); } } From 587d88f764b72f0255d10c0227a81f2a46169ebd Mon Sep 17 00:00:00 2001 From: Kaver Date: Sat, 14 Dec 2024 16:47:12 +0100 Subject: [PATCH 06/13] =?UTF-8?q?Reset=20Button=20Funktionalit=C3=A4t=20hi?= =?UTF-8?q?nzugefuegt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BoardDisplay.java | 9 +++++++++ src/GameBoard.java | 7 +++++++ 2 files changed, 16 insertions(+) diff --git a/src/BoardDisplay.java b/src/BoardDisplay.java index 4941f7f..af7975b 100644 --- a/src/BoardDisplay.java +++ b/src/BoardDisplay.java @@ -92,6 +92,15 @@ public class BoardDisplay extends JPanel { this.currentShip = ship; } + public void resetAllShips() { + ships.clear(); + this.currentShip = null; + for(int i = 0; i < gridSize; i++) { + for(int j = 0; j < gridSize; j++) { + fields[i][j].setBackground(Color.BLUE); + } + } + } /** * TODO Funktion beschreiben etc. * @param ship diff --git a/src/GameBoard.java b/src/GameBoard.java index 3e90032..f65b101 100644 --- a/src/GameBoard.java +++ b/src/GameBoard.java @@ -136,6 +136,13 @@ public class GameBoard extends JPanel { JToggleButton leftPlayerModul7 = new JToggleButton("Reset"); leftPlayerModul7.setBackground(Color.RED); leftButtonsPanel.add(leftPlayerModul7); + + leftPlayerModul7.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + ownBoardPanel.resetAllShips(); + } + }); // Panel für die Buttons des rechten Spielers (ganz rechts) //JPanel ownBoardPanel = new JPanel(new GridLayout(gridSize, gridSize)); From d3f5421808d1502d336bc6bc6746f7f6acdddb68 Mon Sep 17 00:00:00 2001 From: Joshua Date: Sat, 14 Dec 2024 17:26:46 +0100 Subject: [PATCH 07/13] Added kontextText variations. Added functionality to "Ready" Button. --- src/BoardDisplay.java | 2 +- src/GameBoard.java | 22 ++++++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/BoardDisplay.java b/src/BoardDisplay.java index af7975b..d1db8b2 100644 --- a/src/BoardDisplay.java +++ b/src/BoardDisplay.java @@ -28,7 +28,7 @@ public class BoardDisplay extends JPanel { this.ships = new ArrayList<>(); this.player = player; this.gridSize = gridSize; - + System.out.println("Name in Boarddisplay: " + player.getName());//Testausgabe // Erstellung von Spielfeld for (int i = 0; i <= gridSize; i++) { for (int j = 0; j <= gridSize; j++) { diff --git a/src/GameBoard.java b/src/GameBoard.java index f65b101..69e252b 100644 --- a/src/GameBoard.java +++ b/src/GameBoard.java @@ -23,9 +23,19 @@ public class GameBoard extends JPanel { ImageIcon gameBoardEmtpy = new ImageIcon("graphics/gameboardempty.png"); ImageIcon gameBoardX = new ImageIcon("graphics/gameboardx.png"); + // kontextText Text-Strings + String kT1 = "Bitte Schiffe setzten"; + String kT2 = "Warte auf Gegner"; + String kT3 = "Du fängst an"; + String kT4 = "Dein Gegner fängt an"; + String kT5 = "Du bist am Zug"; + String kT6 = "Dein Gegner ist am Zug"; + String kT7 = "Du hast das Spiel gewonnen"; + String kT8 = "Du hast das Spiel verloren"; + // Labels JLabel frameTitle = new JLabel("GameBoard"); - JLabel kontextText = new JLabel("Bitte Schiffe setzten"); + JLabel kontextText = new JLabel(kT1); JButton backButton = new JButton(backButtonIcon); // Eigene ModulButtons @@ -143,6 +153,14 @@ public class GameBoard extends JPanel { ownBoardPanel.resetAllShips(); } }); + + rightPlayerModul7.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + //TODO richtige funktion einfügen + kontextText.setText(kT2); + } + }); // Panel für die Buttons des rechten Spielers (ganz rechts) //JPanel ownBoardPanel = new JPanel(new GridLayout(gridSize, gridSize)); @@ -159,7 +177,7 @@ public class GameBoard extends JPanel { playerNamesPanel.setLayout(new GridLayout(1, 2)); // Zwei Labels nebeneinander JLabel player1NameLabel = new JLabel(p1.getName(), SwingConstants.CENTER); JLabel player2NameLabel = new JLabel(p2.getName(), SwingConstants.CENTER); - System.out.println(player2NameLabel.getText()); + System.out.println("Name in Gameboard: " + player1NameLabel.getText()); // Schrift und Formatierung der Labels player1NameLabel.setFont(new Font("Roboto", Font.BOLD, 18)); From 80b5d8e701f23f5fa15c50e66ee799c22f045cb5 Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Sun, 15 Dec 2024 12:40:12 +0100 Subject: [PATCH 08/13] set player names --- src/AiPlayer.java | 4 +++- src/GameController.java | 2 ++ src/Player.java | 3 +-- src/SpecificAiPlayerMedium.java | 4 ++++ 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/AiPlayer.java b/src/AiPlayer.java index 2d3ba33..0f75c90 100644 --- a/src/AiPlayer.java +++ b/src/AiPlayer.java @@ -2,7 +2,9 @@ import java.util.Random; public abstract class AiPlayer extends LocalPlayer { - public AiPlayer() {} + public AiPlayer() { + this.setName("AI Player"); + } public Point RandomPoint() { Random random = new Random(); // Pseudo Random für zufallszahlen int posx = random.nextInt(super.board.getSize()); // Generiert 0 - 13 diff --git a/src/GameController.java b/src/GameController.java index 5353fdd..f76b7f7 100644 --- a/src/GameController.java +++ b/src/GameController.java @@ -166,6 +166,8 @@ public class GameController { localPlayer.setEnemy(aiPlayer); aiPlayer.setEnemy(localPlayer); + localPlayer.setName(localPlayerName); + startGameWithInstancedPlayers(localPlayer, aiPlayer, size); } diff --git a/src/Player.java b/src/Player.java index 8b6f6f1..36aff0a 100644 --- a/src/Player.java +++ b/src/Player.java @@ -1,5 +1,3 @@ -import java.util.Random; - public abstract class Player { protected boolean myTurn; protected boolean isServer; @@ -14,6 +12,7 @@ public abstract class Player { protected boolean haseReceivedCoin; public Player() { + this.setName("Player"); this.haseReceivedCoin = false; this.sendCoin = false; } diff --git a/src/SpecificAiPlayerMedium.java b/src/SpecificAiPlayerMedium.java index 81561b2..ea1ddfb 100644 --- a/src/SpecificAiPlayerMedium.java +++ b/src/SpecificAiPlayerMedium.java @@ -5,6 +5,10 @@ public class SpecificAiPlayerMedium extends AiPlayer{ private List hitsQueue = new ArrayList<>(); + public SpecificAiPlayerMedium() { + this.setName("AI Player Medium"); + } + @Override public void AiShoot() { Point nextShot = ComputeNextShot(); From 256d769ccf97d299ce4f8a76572c9629f26f8e6d Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Sun, 15 Dec 2024 12:53:44 +0100 Subject: [PATCH 09/13] add ship reset position --- src/Ship.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Ship.java b/src/Ship.java index 7a30693..2613ac1 100644 --- a/src/Ship.java +++ b/src/Ship.java @@ -51,7 +51,6 @@ public class Ship { private String name; private int hitsOnMe; private boolean sunk; - private boolean isPlaced; public Ship (int size, String name) { this.size = size; @@ -63,6 +62,10 @@ public class Ship { this.isPlaced = false; } + public void resetPosition() { + this.position = null; + } + public boolean setPosition(Point pos, List shipsList, int boardSize) { // ueberpruefe boundaries if (pos.getX() < 0 || pos.getY() < 0 || pos.getX() >= boardSize || pos.getY() >= boardSize) { From d1dbcfe603a73b0f8f0392d0e407bd6a590c0964 Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Sun, 15 Dec 2024 12:54:36 +0100 Subject: [PATCH 10/13] remove isPlaced field --- src/Ship.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Ship.java b/src/Ship.java index 2613ac1..22a205d 100644 --- a/src/Ship.java +++ b/src/Ship.java @@ -59,7 +59,6 @@ public class Ship { this.position = null; this.hitsOnMe = 0; this.sunk = false; - this.isPlaced = false; } public void resetPosition() { From 970550308b354927cd4a5ecb67d40535b430914a Mon Sep 17 00:00:00 2001 From: Joshua Date: Sun, 15 Dec 2024 13:48:01 +0100 Subject: [PATCH 11/13] Fixed showing Player names in GameBoard. Added functionality to Button coloring (when selected, placed etc.) --- src/BoardDisplay.java | 88 ++++++++++++++++--------------------------- src/GameBoard.java | 26 ++++++------- src/MainFrame.java | 2 +- src/ShipButton.java | 18 ++++++--- 4 files changed, 59 insertions(+), 75 deletions(-) diff --git a/src/BoardDisplay.java b/src/BoardDisplay.java index d1db8b2..7072467 100644 --- a/src/BoardDisplay.java +++ b/src/BoardDisplay.java @@ -7,14 +7,25 @@ import java.util.List; /** * TODO Klassenbeschreibung + * reines im frontend zeichnen für preview */ public class BoardDisplay extends JPanel { private JButton[][] fields; private int gridSize; - private List ships; + //private List ships;//brauchen wir nicht mehr private Ship currentShip; private Player player; private boolean vertical = false; + private List shipButtonList; + + public void addShipButton(ShipButton button) { + shipButtonList.add(button); + paintFields(); + } + + public Ship getCurrentShip() { + return currentShip; + } /** * Konstruktor der startLocalGame. @@ -25,7 +36,8 @@ public class BoardDisplay extends JPanel { public BoardDisplay(int gridSize, Player player) { super(new GridLayout(gridSize + 1, gridSize + 1)); // +1 wegen extra Zeile/Spalte this.fields = new JButton[gridSize][gridSize]; - this.ships = new ArrayList<>(); + //this.ships = new ArrayList<>(); + this.shipButtonList = new ArrayList<>(); this.player = player; this.gridSize = gridSize; System.out.println("Name in Boarddisplay: " + player.getName());//Testausgabe @@ -84,22 +96,21 @@ public class BoardDisplay extends JPanel { } } // this.ships = new ArrayList(); + } - - public void selectCurrentShip(Ship ship) { this.currentShip = ship; + paintFields(); } public void resetAllShips() { - ships.clear(); + //ships.clear(); this.currentShip = null; - for(int i = 0; i < gridSize; i++) { - for(int j = 0; j < gridSize; j++) { - fields[i][j].setBackground(Color.BLUE); - } + for (Ship ship : player.getBoard().getShips()) { + ship.resetPosition(); } + paintFields(); } /** * TODO Funktion beschreiben etc. @@ -109,31 +120,6 @@ public class BoardDisplay extends JPanel { * @param player * @return */ - private boolean setShip(Ship ship, Point o, boolean horizontal,Player player) { - //boolean a = true; - if (placeable(ship, ship.getPosition(), horizontal)) { - ship.setPosition(new Point(o.getX(),o.getY()),player.getBoard().getShips(),gridSize); - ship.setHorizontal(horizontal); - ships.add(ship); - List occupied = ship.getOccupiedPoints(); - for(Point p: occupied) { - fields[p.getX()][p.getY()].setBackground(Color.LIGHT_GRAY); - } - return true; - }else{ - return false; - } - } - - /*private boolean placeable(Ship ship,Point o, boolean horizontal) { - if (horizontal && (o.getX() + ship.getSize() > gridSize)) { // Fehler - return false; - } - if (!horizontal && (o.getY() + ship.getSize() > gridSize)) { - return false; - } - return true; - }*/ /** * TODO Funktion beschreiben etc. @@ -142,27 +128,6 @@ public class BoardDisplay extends JPanel { * @param horizontal * @return */ - private boolean placeable(Ship ship, Point o, boolean horizontal) { - if (horizontal && (o.getX() + ship.getSize() > gridSize)) { - return false; - } - if (!horizontal && (o.getY() + ship.getSize() > gridSize)) { - return false; - } - - // Prüfen auf Kollision mit bestehenden Schiffen - for (Ship other : ships) { - for (Point p : other.getOccupiedPoints()) { - for (Point newP : ship.getOccupiedPoints()) { - if (p.equals(newP)) { - return false; // Überschneidung gefunden - } - } - } - } - - return true; - } /** * Wechselt die Platzierungsrichtung zwischen horizontal und vertikal. @@ -190,7 +155,6 @@ public class BoardDisplay extends JPanel { //} } - public void paintFields() { for(int i = 0; i < gridSize; i++) { for(int j = 0; j < gridSize; j++) { @@ -206,5 +170,17 @@ public class BoardDisplay extends JPanel { } } } + for( ShipButton shipButton: shipButtonList) { + shipButton.refreshButtonState(); + } } + + private void previewShipPlacement(int startX, int startY, boolean vertical) { + //TODO schreiben + } + + private void clearPreview() { + + } + } \ No newline at end of file diff --git a/src/GameBoard.java b/src/GameBoard.java index 69e252b..0018745 100644 --- a/src/GameBoard.java +++ b/src/GameBoard.java @@ -8,8 +8,6 @@ import java.awt.event.MouseEvent; import java.awt.event.MouseAdapter; import java.util.List; - -// TODO Readybutton farbe Readybutton kontexttext und Spielernamen anzeigen /** * Das GameBoard dient als Panel, in dem das tatsächliche Spiel stattfindet. * Der Benutzer kann hier seine Schiffe platzieren, das Spiel starten etc. @@ -131,33 +129,35 @@ public class GameBoard extends JPanel { ShipButton shipButton= new ShipButton(ship,ownBoardPanel); leftButtonsPanel.add(shipButton); leftButtonGroup.add(shipButton); + ownBoardPanel.addShipButton(shipButton); } for(Ship ship : p2.getBoard().getShips()) { ShipButton shipButton= new ShipButton(ship,opponentBoardPanel); rightButtonsPanel.add(shipButton); rightButtonGroup.add(shipButton); + opponentBoardPanel.addShipButton(shipButton); } - JToggleButton rightPlayerModul7 = new JToggleButton("Bereit"); - rightPlayerModul7.setBackground(Color.GREEN); - rightButtonsPanel.add(rightPlayerModul7); + JToggleButton readyButton = new JToggleButton("Bereit"); + readyButton.setBackground(Color.GREEN); + rightButtonsPanel.add(readyButton); - JToggleButton leftPlayerModul7 = new JToggleButton("Reset"); - leftPlayerModul7.setBackground(Color.RED); - leftButtonsPanel.add(leftPlayerModul7); + JToggleButton resetButton = new JToggleButton("Reset"); + resetButton.setBackground(Color.RED); + leftButtonsPanel.add(resetButton); - leftPlayerModul7.addActionListener(new ActionListener() { + resetButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ownBoardPanel.resetAllShips(); } }); - rightPlayerModul7.addActionListener(new ActionListener() { + readyButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - //TODO richtige funktion einfügen + kontextText.setText(kT2); } }); @@ -196,8 +196,8 @@ public class GameBoard extends JPanel { add(leftButtonsPanel, BorderLayout.WEST); add(rightButtonsPanel, BorderLayout.EAST); add(headerPanel, BorderLayout.NORTH); - add(centerPanel, BorderLayout.CENTER); - + //add(centerPanel, BorderLayout.CENTER); + add(namesAndBoardsPanel, BorderLayout.CENTER); timer.start(); } } diff --git a/src/MainFrame.java b/src/MainFrame.java index 7b3f76b..16981ad 100644 --- a/src/MainFrame.java +++ b/src/MainFrame.java @@ -1,7 +1,7 @@ import javax.swing.*; import java.awt.*; -//TODO Generell Buttons in GameBoard anpassen +//TODO Generell button ausblenden anpassen /** * Der MainFrame dient als Hub und Übergreifendes Fenster auf dem alle weiteren Panel angezeigt werden. diff --git a/src/ShipButton.java b/src/ShipButton.java index 4b11bce..e282676 100644 --- a/src/ShipButton.java +++ b/src/ShipButton.java @@ -1,18 +1,26 @@ import javax.swing.*; +import java.awt.*; public class ShipButton extends JButton { - Ship ship; - + private Ship ship; + private BoardDisplay boardDisplay; public ShipButton(Ship ship, BoardDisplay boardDisplay) { super(ship.getName()); this.ship = ship; + this.boardDisplay = boardDisplay; this.addActionListener((e)->{ boardDisplay.selectCurrentShip(this.ship); - this.setEnabled(false); }); } - public void buttonPressed() { - this.setEnabled(!ship.isPlaced()); + public void refreshButtonState() { + if(ship.isPlaced()) { + setBackground(Color.LIGHT_GRAY); + } else { + setBackground(Color.WHITE); + } + if(boardDisplay.getCurrentShip() == ship) { + setBackground(Color.CYAN); + } } } From f5657084612a24226c751f2f13e338d054b776fc Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Sun, 15 Dec 2024 14:21:17 +0100 Subject: [PATCH 12/13] implement ready for players and board refresh method --- src/BoardDisplay.java | 5 ++++- src/GameBoard.java | 33 ++++++++++++++++++++++++++------- src/LocalPlayer.java | 19 +++++++++++-------- src/MainFrame.java | 7 ++++++- src/OnlinePlayer.java | 1 + src/OnlinePlayer_1_1_0.java | 9 +++++---- src/Player.java | 35 +++++++++++++++++++++++++++-------- 7 files changed, 80 insertions(+), 29 deletions(-) diff --git a/src/BoardDisplay.java b/src/BoardDisplay.java index 7072467..d7f12c6 100644 --- a/src/BoardDisplay.java +++ b/src/BoardDisplay.java @@ -88,7 +88,6 @@ public class BoardDisplay extends JPanel { Point o = new Point(x, y); currentShip.setHorizontal(vertical); handleFieldClick(o); // Linksklick -> Schiff platzieren - vertical = false; // TODO nur nach auswahl von neuem Modul wieder auf false setzten } } }); @@ -183,4 +182,8 @@ public class BoardDisplay extends JPanel { } + public void refresh() { + paintFields(); + } + } \ No newline at end of file diff --git a/src/GameBoard.java b/src/GameBoard.java index 0018745..0f22fa7 100644 --- a/src/GameBoard.java +++ b/src/GameBoard.java @@ -13,6 +13,14 @@ import java.util.List; * Der Benutzer kann hier seine Schiffe platzieren, das Spiel starten etc. */ public class GameBoard extends JPanel { + + private BoardDisplay ownBoardPanel; + private BoardDisplay opponentBoardPanel; + + private Player p1; + private Player p2; + + // Funktionshilfen //int semesterCounter = 1; //TODO: ersetzen durch param von vorpanel @@ -46,7 +54,9 @@ public class GameBoard extends JPanel { * @param p2 Zweites Spielerobjekt */ GameBoard(MainFrame frame, int semesterCounter,Player p1, Player p2) { - buildPanel(frame, semesterCounter,p1,p2); + this.p1 = p1; + this.p2 = p2; + buildPanel(frame, semesterCounter); List shipsP1 =p1.getBoard().getShips(); List shipsP2 =p2.getBoard().getShips(); backButton.addActionListener(e -> frame.showPanel("MainMenu")); @@ -93,18 +103,16 @@ public class GameBoard extends JPanel { * TODO Funktion beschreiben etc. * @param frame * @param semesterCounter - * @param p1 - * @param p2 */ - public void buildPanel(MainFrame frame, int semesterCounter,Player p1,Player p2) { + public void buildPanel(MainFrame frame, int semesterCounter) { // 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); + this.ownBoardPanel = new BoardDisplay(gridSize,p1); + this.opponentBoardPanel = new BoardDisplay(gridSize, p2); // Panel für das Kontext-Text-Feld JPanel headerPanel = new JPanel(); @@ -137,6 +145,7 @@ public class GameBoard extends JPanel { rightButtonsPanel.add(shipButton); rightButtonGroup.add(shipButton); opponentBoardPanel.addShipButton(shipButton); + shipButton.setEnabled(false); } JToggleButton readyButton = new JToggleButton("Bereit"); @@ -157,8 +166,8 @@ public class GameBoard extends JPanel { readyButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - kontextText.setText(kT2); + p1.ready(); } }); // Panel für die Buttons des rechten Spielers (ganz rechts) @@ -200,4 +209,14 @@ public class GameBoard extends JPanel { add(namesAndBoardsPanel, BorderLayout.CENTER); timer.start(); } + + public void refresh() { + if (this.p1.myTurn) { + this.kontextText.setText(kT5); + } else { + this.kontextText.setText(kT6); + } + this.ownBoardPanel.refresh(); + this.opponentBoardPanel.refresh(); + } } diff --git a/src/LocalPlayer.java b/src/LocalPlayer.java index 5bc6dd9..2b67b44 100644 --- a/src/LocalPlayer.java +++ b/src/LocalPlayer.java @@ -38,21 +38,24 @@ public class LocalPlayer extends Player { @Override public synchronized void receiveCoin(boolean coin) { - if (!this.haseReceivedCoin) { - boolean result = coin ^ this.myCoin; // XOR - this.myTurn = result == this.isServer; - this.haseReceivedCoin = true; + if (!this.hasReceivedCoin) { + this.hasReceivedCoin = true; + this.determineCoinToss(); } } - public void sendCoin() { - enemy.receiveCoin(this.myCoin); - } - @Override public void shoot(Point point){ this.myTurn = false; enemy.receiveShoot(point); } + + @Override + public synchronized void ready() { + for (Ship ship : this.board.getShips()) { + if (!ship.isPlaced()) return; + } + super.ready(); + } } \ No newline at end of file diff --git a/src/MainFrame.java b/src/MainFrame.java index 16981ad..02db6b1 100644 --- a/src/MainFrame.java +++ b/src/MainFrame.java @@ -21,6 +21,7 @@ public class MainFrame extends JFrame { // Von startLocalGameLoadingScreen an GameBoard int semesterCounter; // ---------- // + private GameBoard gameBoard; /** * Konstruktor von MainFrame. @@ -95,7 +96,7 @@ public class MainFrame extends JFrame { public void showPanelSLG(String panelName,int semesterCounter, Player p1, Player p2) { this.semesterCounter = semesterCounter; - GameBoard gameBoard = new GameBoard(this, semesterCounter, p1, p2); + this.gameBoard = new GameBoard(this, semesterCounter, p1, p2); mainPanel.add(gameBoard, panelName); mainPanel.revalidate(); mainPanel.repaint(); @@ -116,4 +117,8 @@ public class MainFrame extends JFrame { mainPanel.repaint(); cardLayout.show(mainPanel, panelName); // Show the panel } + + public void refreshGameBoard() { + this.gameBoard.refresh(); + } } \ No newline at end of file diff --git a/src/OnlinePlayer.java b/src/OnlinePlayer.java index 3634c1f..14f3edb 100644 --- a/src/OnlinePlayer.java +++ b/src/OnlinePlayer.java @@ -7,6 +7,7 @@ public abstract class OnlinePlayer extends Player implements AsyncSocketListener public OnlinePlayer(Integer size, AsyncSocket socket) { this.socket = socket; this.wantedBoardSize = size; + this.myCoin = null; socket.setHandler(this); //TODO Auto-generated constructor stub } diff --git a/src/OnlinePlayer_1_1_0.java b/src/OnlinePlayer_1_1_0.java index 31fe50d..a9b513d 100644 --- a/src/OnlinePlayer_1_1_0.java +++ b/src/OnlinePlayer_1_1_0.java @@ -33,8 +33,8 @@ public class OnlinePlayer_1_1_0 extends OnlinePlayer { case "COIN": if(!this.hasReceivedCoinPackage && (p.getData().equals("1") || p.getData().equals("0"))){ - this.myCoin = p.getData().equals("1"); - enemy.receiveCoin(this.myCoin); + this.myCoin = p.getData().equals("1"); + this.ready(); this.hasReceivedCoinPackage = true; } break; @@ -85,9 +85,10 @@ public class OnlinePlayer_1_1_0 extends OnlinePlayer { @Override public synchronized void receiveCoin(boolean coin) { - if (!this.haseReceivedCoin) { + if (!this.hasReceivedCoin) { super.socket.send(new SocketPackage("COIN", String.valueOf(coin ? 1 : 0))); - this.haseReceivedCoin = true; + this.hasReceivedCoin = true; + this.determineCoinToss(); } } diff --git a/src/Player.java b/src/Player.java index 36aff0a..7595594 100644 --- a/src/Player.java +++ b/src/Player.java @@ -2,19 +2,20 @@ public abstract class Player { protected boolean myTurn; protected boolean isServer; protected boolean waitingForResponse; - protected Player enemy; + protected Player enemy; protected String name; protected Board board; - protected boolean myCoin; + protected Boolean myCoin; - protected boolean sendCoin; + protected boolean sentCoin; - protected boolean haseReceivedCoin; + protected boolean hasReceivedCoin; public Player() { this.setName("Player"); - this.haseReceivedCoin = false; - this.sendCoin = false; + this.hasReceivedCoin = false; + this.sentCoin = false; + this.myTurn = false; } public void createBoard(int size) { @@ -27,8 +28,8 @@ public abstract class Player { public abstract void shoot(Point point); - public void beginTrun() { - + public void beginTurn() { + System.out.println("issa my turn-a"); } public void setEnemy(Player enemy) { @@ -46,5 +47,23 @@ public abstract class Player { return this.board; } + public void ready() { + this.enemy.receiveCoin(this.myCoin); + this.sentCoin = true; + if (hasReceivedCoin) { + this.determineCoinToss(); + } + }; + + protected void determineCoinToss() { + if (!this.sentCoin || this.myCoin == null || !this.hasReceivedCoin || this.enemy.myCoin == null) return; + boolean result = this.enemy.myCoin ^ this.myCoin; // XOR + this.myTurn = result == this.isServer; + if (this.myTurn) { + this.beginTurn(); + } + GameController.getMainFrame().refreshGameBoard(); + } + public abstract void receiveCoin(boolean coin); } From b5f1151a4f46ee44954611e0110b6d2fe7e45822 Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Sun, 15 Dec 2024 14:26:42 +0100 Subject: [PATCH 13/13] add checkValidShipPlacement and set horizontal in setPosition --- src/Ship.java | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/Ship.java b/src/Ship.java index 22a205d..5dfac8c 100644 --- a/src/Ship.java +++ b/src/Ship.java @@ -65,8 +65,17 @@ public class Ship { this.position = null; } - public boolean setPosition(Point pos, List shipsList, int boardSize) { - // ueberpruefe boundaries + public boolean setPosition(Point pos, boolean horizontal, List shipsList, int boardSize) { + if (!this.checkValidPlacement(pos, horizontal, shipsList, boardSize)) return false; + + // kein ueberlappen also setze das Schiff + this.position = pos; + this.horizontal = horizontal; + return true; + } + + public boolean checkValidPlacement(Point pos, boolean horizontal, List shipsList, int boardSize) { + // ueberpruefe boundaries if (pos.getX() < 0 || pos.getY() < 0 || pos.getX() >= boardSize || pos.getY() >= boardSize) { return false; } @@ -75,7 +84,7 @@ public class Ship { int endX = pos.getX(); int endY = pos.getY(); - if (this.horizontal) { // rechts links + if (horizontal) { // rechts links endX = pos.getX() + this.size - 1; if (endX >= boardSize) { return false; @@ -90,8 +99,8 @@ public class Ship { // Liste an Punkten die das Schiff einnehmen wuerde List shipPoints = new ArrayList<>(); for (int i = 0; i < this.size; i++) { - int x = this.horizontal ? pos.getX() + i : pos.getX(); //falls horizontal dann pos.x + i ansonsten pos.x - int y = this.horizontal ? pos.getY() : pos.getY() + i; + int x = horizontal ? pos.getX() + i : pos.getX(); //falls horizontal dann pos.x + i ansonsten pos.x + int y = horizontal ? pos.getY() : pos.getY() + i; shipPoints.add(new Point(x, y)); } @@ -114,9 +123,6 @@ public class Ship { } } } - - // kein ueberlappen also setze das Schiff - this.position = pos; return true; }