From 3b6ffeb82dcdc3924b849a9e18b8ede66c21fb12 Mon Sep 17 00:00:00 2001 From: Joshua Date: Tue, 10 Dec 2024 13:48:55 +0100 Subject: [PATCH 1/5] JoinGame and related functions should now work properly --- src/JoinGame.java | 48 +++++++++++---------- src/MainFrame.java | 7 +-- src/startMultiplayerGame.java | 80 ++++++++++++++++++++++++++++++++++- 3 files changed, 107 insertions(+), 28 deletions(-) diff --git a/src/JoinGame.java b/src/JoinGame.java index 879d48e..a12c083 100644 --- a/src/JoinGame.java +++ b/src/JoinGame.java @@ -5,13 +5,6 @@ import java.awt.event.ActionListener; import java.io.IOException; import java.net.InetSocketAddress; -/* -TODO: evtl an Lucas: die "JoinGame" muss noch informationen erhalten, welche Spieler erstellt wurden und welches Semester -Also die startMultiplayerGame muss JoinGame mit parametern für (HumanPlayer/AiEasy/AiNormal/AiHard, Semesteranzahl, Spielername) (3 Parameter) erhalten - -*/ - - public class JoinGame extends JPanel { ImageIcon backButtonIcon = new ImageIcon("graphics/backButton.png"); @@ -27,12 +20,12 @@ public class JoinGame extends JPanel { Font robotoFont = new Font("Roboto", Font.BOLD, 45); - public JoinGame(MainFrame frame,int g) { + public JoinGame(MainFrame frame,int g,int playerType,String playerName) { setLayout(null); - buildPanel(frame,g); + buildPanel(frame,g,playerType,playerName); } - private void buildPanel(MainFrame frame,int g) { + private void buildPanel(MainFrame frame,int g,int playerType,String playerName) { if(g==1){ spielBeitretenLabel= new JLabel("Spiel beitreten"); }else{ @@ -43,10 +36,12 @@ public class JoinGame extends JPanel { losButton.setBounds(320, 225, 100, 50); backButton.setBounds(1380, 20, 80, 80); - ipLabel.setBounds(50, 125, 200, 30); portLabel.setBounds(50, 200, 200, 30); - ipTextField.setBounds(50, 150, 250, 50); + if(g==1) { //Wenn man Spiel erstellen will werden IP-Felder nicht angezeigt. + ipLabel.setBounds(50, 125, 200, 30); + ipTextField.setBounds(50, 150, 250, 50); + } portTextField.setBounds(50, 225, 250, 50); @@ -61,31 +56,38 @@ public class JoinGame extends JPanel { add(backButton); backButton.addActionListener(e -> frame.showPanel("MultiplayerGame")); - losButton.addActionListener(e -> frame.showPanel("Verbinden")); + //losButton.addActionListener(e -> frame.showPanel("Verbinden")); losButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { + String ipAddress = ipTextField.getText(); + if (ipAddress.equals("")) { + ipAddress = "0.0.0.0"; + } String portText = portTextField.getText(); int port = Integer.parseInt(portText); InetSocketAddress address = new InetSocketAddress(ipAddress, port); frame.showPanel("Verbinden"); - //public static void startOnlineGame(Class localPlayerClass, String localPlayerName, InetSocketAddress - // address, int size) throws IOException { - if(true) { //Beispiel (für playertape wäre z.B. 1 humanPlayer etc.) - try { - GameController.startOnlineGame(HumanPlayer.class, "TollerTest", address,GameController.semesterToBoardSize(2)); // - } catch (IOException ex) { - throw new RuntimeException(ex); - } - } + try { + if(playerType == 0) { + GameController.startOnlineGame(HumanPlayer.class, playerName, address,GameController.semesterToBoardSize(2)); + } else if(playerType == 1) { + GameController.startOnlineGame(SpecificAiPlayerEasy.class, playerName, address,GameController.semesterToBoardSize(2)); + } else if (playerType == 2) { + GameController.startOnlineGame(SpecificAiPlayerMedium.class, playerName, address,GameController.semesterToBoardSize(2)); + } else if (playerType == 3) { + GameController.startOnlineGame(SpecificAiPlayerHard.class, playerName, address,GameController.semesterToBoardSize(2)); + } + } catch (IOException ex) { + throw new RuntimeException(ex); + } } }); - } } \ No newline at end of file diff --git a/src/MainFrame.java b/src/MainFrame.java index 9afa7d2..12982d5 100644 --- a/src/MainFrame.java +++ b/src/MainFrame.java @@ -64,11 +64,11 @@ public class MainFrame extends JFrame { } // --- ShowPanel der startMultiplayerGame Klasse - public void showPanelSMG(String panelName, int num) { + public void showPanelSMG(String panelName, int num, int playerType,String playerName) { this.localMult = num; //if (!isPanelPresent(panelName)) { //TODO potentiell raus - JoinGame joinGame = new JoinGame(this, localMult); + JoinGame joinGame = new JoinGame(this, localMult, playerType, playerName); mainPanel.add(joinGame, panelName); mainPanel.revalidate(); // Refresh mainPanel.repaint(); @@ -128,11 +128,12 @@ public class MainFrame extends JFrame { mainPanel.repaint(); }*/ - + /* Tut wohl gar nicht, weils nicht aufgerufen wird hoppla public static void main(String[] args) { SwingUtilities.invokeLater(() -> { MainFrame frame = new MainFrame(); frame.setVisible(true); }); } + */ } \ No newline at end of file diff --git a/src/startMultiplayerGame.java b/src/startMultiplayerGame.java index e536744..db94f47 100644 --- a/src/startMultiplayerGame.java +++ b/src/startMultiplayerGame.java @@ -1,4 +1,6 @@ import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; // TODO // Evtl. ist Namen selber setzten noch unmöglich @@ -121,8 +123,82 @@ public class startMultiplayerGame extends JPanel { // ActionListener für den "Back" Button, um zum vorherigen Panel zurückzukehren backButton.addActionListener(e -> frame.showPanel("MainMenu")); - joinGameButton.addActionListener(e -> frame.showPanelSMG("JoinGame",1)); - createGameButton.addActionListener(e -> frame.showPanelSMG("JoinGame",0)); + //joinGameButton.addActionListener(e -> frame.showPanelSMG("JoinGame",1)); + //createGameButton.addActionListener(e -> frame.showPanelSMG("JoinGame",0)); + + joinGameButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + //Parameter -> panelName, Spiel erstellen oder beitreten (int), Spielertyp(int 0-3), Spielername + if (PlayerIcon.getIcon() == humanPlayerIcon) { // TODO Wird name wirklich weitergegeben? + frame.showPanelSMG("JoinGame",1,0, PlayerNickname); + } else if ( PlayerIcon.getIcon() == aiPlayerEasyIcon) { + frame.showPanelSMG("JoinGame",1,1, PlayerNickname); + } else if ( PlayerIcon.getIcon() == aiPlayerNormalIcon) { + frame.showPanelSMG("JoinGame",1,2, PlayerNickname); + } else if ( PlayerIcon.getIcon() == aiPlayerHardIcon) { + frame.showPanelSMG("JoinGame",1,3, PlayerNickname); + } + } + }); + + createGameButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + //Parameter -> panelName, Spiel erstellen oder beitreten (int), Spielertyp(int 0-3), Spielername + if (PlayerIcon.getIcon() == humanPlayerIcon) { // TODO Wird name wirklich weitergegeben? + frame.showPanelSMG("JoinGame",0,0, PlayerNickname); + } else if ( PlayerIcon.getIcon() == aiPlayerEasyIcon) { + frame.showPanelSMG("JoinGame",0,1, PlayerNickname); + } else if ( PlayerIcon.getIcon() == aiPlayerNormalIcon) { + frame.showPanelSMG("JoinGame",0,2, PlayerNickname); + } else if ( PlayerIcon.getIcon() == aiPlayerHardIcon) { + frame.showPanelSMG("JoinGame",0,3, PlayerNickname); + } + } + }); + /* + startButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + frame.showPanelSLGLS("startLocalGameLoadingScreen", semesterCounter); //TODO + if (leftPlayerIcon.getIcon() == humanPlayerIcon) {// TODO Wird name wirklich weitergegeben? + if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) { + GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerEasy.class, GameController.semesterToBoardSize(semesterCounter)); + } else if (rightPlayerIcon.getIcon() == aiPlayerNormalIcon) { + GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerMedium.class, GameController.semesterToBoardSize(semesterCounter)); + } else if (rightPlayerIcon.getIcon() == aiPlayerHardIcon) { + GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerHard.class, GameController.semesterToBoardSize(semesterCounter)); + } + } else if (leftPlayerIcon.getIcon() == aiPlayerEasyIcon) { + if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) { + GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerEasy.class, GameController.semesterToBoardSize(semesterCounter)); + } else if (rightPlayerIcon.getIcon() == aiPlayerNormalIcon) { + GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerMedium.class, GameController.semesterToBoardSize(semesterCounter)); + } else if (rightPlayerIcon.getIcon() == aiPlayerHardIcon) { + GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerHard.class, GameController.semesterToBoardSize(semesterCounter)); + } + } else if (rightPlayerIcon.getIcon() == aiPlayerNormalIcon) { + if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) { + GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerEasy.class, GameController.semesterToBoardSize(semesterCounter)); + } else if (rightPlayerIcon.getIcon() == aiPlayerNormalIcon) { + GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerMedium.class, GameController.semesterToBoardSize(semesterCounter)); + } else if (rightPlayerIcon.getIcon() == aiPlayerHardIcon) { + GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerHard.class, GameController.semesterToBoardSize(semesterCounter)); + } + } else if (rightPlayerIcon.getIcon() == aiPlayerHardIcon) { + if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) { + GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerEasy.class, GameController.semesterToBoardSize(semesterCounter)); + } else if (rightPlayerIcon.getIcon() == aiPlayerNormalIcon) { + GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerMedium.class, GameController.semesterToBoardSize(semesterCounter)); + } else if (rightPlayerIcon.getIcon() == aiPlayerHardIcon) { + GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerHard.class, GameController.semesterToBoardSize(semesterCounter)); + } + } + + } + }); + */ } // TOGGLE METHODEN From 8a9e7fb4b28394597cc3e6c816b65c47bc2ca50e Mon Sep 17 00:00:00 2001 From: Kaver Date: Tue, 10 Dec 2024 16:52:10 +0100 Subject: [PATCH 2/5] Implementierung von Schiffe platzieren gestartet(BoardDisplay), Anpassungen an Buttons im GameBoard sowie diverse getter hinzugefeugt(backend) --- src/BoardDisplay.java | 78 ++++++++++++++++++++----- src/GameBoard.java | 131 +++++++++++++++++++++++------------------- src/Player.java | 3 + src/Ship.java | 11 ++++ 4 files changed, 152 insertions(+), 71 deletions(-) diff --git a/src/BoardDisplay.java b/src/BoardDisplay.java index 360184d..c1db6b4 100644 --- a/src/BoardDisplay.java +++ b/src/BoardDisplay.java @@ -2,14 +2,22 @@ import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.List; public class BoardDisplay extends JPanel { - public BoardDisplay(int gridSize, Icon buttonIcon) { - super(new GridLayout(gridSize + 1, gridSize + 1)); // +1 wegen extra Zeile/Splate + private JButton[][] fields; + private int gridSize; + private List ships; + public BoardDisplay(int gridSize, Player player) { + super(new GridLayout(gridSize + 1, gridSize + 1)); // +1 wegen extra Zeile/Splate + this.fields = new JButton[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 if (i == 0 && j == 0) { add(new JLabel(" ")); } else if (i == 0) { @@ -28,27 +36,71 @@ public class BoardDisplay extends JPanel { field.setBackground(Color.LIGHT_GRAY); field.setOpaque(true); field.setBorderPainted(true); + fields[i - 1][j - 1] = field; + add(field); + //field.addMouseListener(new MouseAdapter() { + // @Override + //public void mouseClicked(MouseEvent e) { + // if (SwingUtilities.isRightMouseButton(e)) { + // handleFieldClick(field); + // } + // } + //@Override + //public void mouseExited(MouseEvent e) { + // field.setBackground(Color.LIGHT_GRAY); + // } + // }); + int finalI = i; + int finalJ = j; field.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { - if(SwingUtilities.isRightMouseButton(e)) { - handleFieldClick(field); - } - } - - @Override - public void mouseExited(MouseEvent e) { - // field.setBackground(Color.LIGHT_GRAY); + Point o= new Point(finalI, finalJ); + handleFieldClick(field, o,player); } }); - add(field); } } } + + // this.ships = new ArrayList(); } - private void handleFieldClick(JButton field) { - field.setBackground(Color.RED); + 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)) { + return false; + } + if (!horizontal && (o.getY() + ship.getSize() > gridSize)) { + return false; + } + return true; + } + + private void selectShip(MouseEvent e) { + Ship current = (Ship) e.getSource(); + } + + private void handleFieldClick(JButton field, Point o,Player player) { + // Beispiel: Setze ein Schiff bei einem Klick + if (setShip(new Ship(3, "TestShip"), o, true,player)) { + field.setBackground(Color.BLUE); // Visualisiere Schiff + } } } \ No newline at end of file diff --git a/src/GameBoard.java b/src/GameBoard.java index c53c985..4528693 100644 --- a/src/GameBoard.java +++ b/src/GameBoard.java @@ -4,6 +4,9 @@ import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseAdapter; +import java.util.List; public class GameBoard extends JPanel { // Funktionshilfen @@ -21,24 +24,48 @@ public class GameBoard extends JPanel { JButton backButton = new JButton(backButtonIcon); // Eigene ModulButtons - 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"); - // 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"); + 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"); - public void buildPanel(MainFrame frame, int semesterCounter) { + 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); + List shipsP1 =p1.getBoard().getShips(); + updateButtonLabels(shipsP1,leftPlayerButtons); + backButton.addActionListener(e -> frame.showPanel("MainMenu")); + } + + private void updateButtonLabels(List ships,JToggleButton[] buttons) { + for(int i=0;i frame.showPanel("MainMenu")); } } diff --git a/src/Player.java b/src/Player.java index faf9abb..8b6f6f1 100644 --- a/src/Player.java +++ b/src/Player.java @@ -43,6 +43,9 @@ public abstract class Player { return this.name; } + public Board getBoard() { + return this.board; + } public abstract void receiveCoin(boolean coin); } diff --git a/src/Ship.java b/src/Ship.java index 0c3c7f6..3be924b 100644 --- a/src/Ship.java +++ b/src/Ship.java @@ -159,4 +159,15 @@ public class Ship { public boolean isSunk() { return sunk; } + + public void setHorizontal(boolean horizontal) { + this.horizontal = horizontal; + } + + public int getSize() { + return size; + } + public String getName() { + return name; + } } From bb61a68f245d13bcc11b3c1ea7931a3373400c27 Mon Sep 17 00:00:00 2001 From: Joshua Date: Tue, 10 Dec 2024 17:26:27 +0100 Subject: [PATCH 3/5] Player names will now be passed correctly between classes. Added lots of comments in startLocalGame, startLocalGameLoadingScreen, startMultiplayerGame and JoinGame. --- src/JoinGame.java | 38 ++++++-- src/startLocalGame.java | 80 +++++++++++++---- src/startLocalGameLoadingScreen.java | 18 +++- src/startMultiplayerGame.java | 125 +++++++++++---------------- 4 files changed, 163 insertions(+), 98 deletions(-) diff --git a/src/JoinGame.java b/src/JoinGame.java index a12c083..47986d6 100644 --- a/src/JoinGame.java +++ b/src/JoinGame.java @@ -5,26 +5,49 @@ import java.awt.event.ActionListener; import java.io.IOException; import java.net.InetSocketAddress; +/** + * Das JoinGame Panel dient zum setzten des Ports/IP-Adresse. + * Anschließend kann das Verbinden Panel gezeigt werden. + */ public class JoinGame extends JPanel { + // Grafiken ImageIcon backButtonIcon = new ImageIcon("graphics/backButton.png"); + // Labels JLabel spielBeitretenLabel; JLabel ipLabel = new JLabel("IP-Adresse"); JLabel portLabel = new JLabel("Port"); + // Textfelder JTextField ipTextField = new JTextField(20); JTextField portTextField = new JTextField(20); + // Buttons JButton losButton = new JButton("Los!"); JButton backButton = new JButton(backButtonIcon); + // Font Font robotoFont = new Font("Roboto", Font.BOLD, 45); + /** + * Erstellt mittels Funktionsaufrufen das Panel. + * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. + * @param g int-Anzeige, ob es sich um "spiel erstellen" oder "spiel beitreten" handelt. + * @param playerType int-Anzeige, ob es sich um einen HumanPlayer,AIEasy... handelt. + * @param playerName Name des Spielers + */ public JoinGame(MainFrame frame,int g,int playerType,String playerName) { setLayout(null); buildPanel(frame,g,playerType,playerName); } + /** + * Erstellt das Panel. + * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. + * @param g int-Anzeige, ob es sich um "spiel erstellen" oder "spiel beitreten" handelt. + * @param playerType int-Anzeige, ob es sich um einen HumanPlayer,AIEasy... handelt. + * @param playerName Name des Spielers + */ private void buildPanel(MainFrame frame,int g,int playerType,String playerName) { if(g==1){ spielBeitretenLabel= new JLabel("Spiel beitreten"); @@ -42,8 +65,8 @@ public class JoinGame extends JPanel { ipLabel.setBounds(50, 125, 200, 30); ipTextField.setBounds(50, 150, 250, 50); } - portTextField.setBounds(50, 225, 250, 50); + portTextField.setBounds(50, 225, 250, 50); spielBeitretenLabel.setFont(robotoFont.deriveFont(50f)); @@ -54,11 +77,16 @@ public class JoinGame extends JPanel { add(ipTextField); add(portTextField); add(backButton); + // ActionListener für Buttons + // Um in das MultiplayerGame zurückzuwechseln. + backButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + frame.showPanel("MultiplayerGame"); + } + }); - backButton.addActionListener(e -> frame.showPanel("MultiplayerGame")); - //losButton.addActionListener(e -> frame.showPanel("Verbinden")); - - + // Um das Verbinden Panel anzuzeigen und Daten an Backend weiterzureichen. losButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { diff --git a/src/startLocalGame.java b/src/startLocalGame.java index cf08aa9..1fb6792 100644 --- a/src/startLocalGame.java +++ b/src/startLocalGame.java @@ -2,12 +2,13 @@ import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -// TODO -// Evtl. ist Namen selber setzten noch unmöglich -// - +/** + * Das startLocalGame Panel dient dem Erstellen eines lokalen Spiels. + * Hier kann der Benutzer Spieler inklusive Namen und das Semester, in dem sich der Benutzer befindet, einstellen. + */ public class startLocalGame extends JPanel { // Player + // TODO: entfernen Player p1; Player p2; @@ -23,7 +24,7 @@ public class startLocalGame extends JPanel { ImageIcon aiPlayerNormalIcon = new ImageIcon("graphics/botPlayerNormal.png"); ImageIcon aiPlayerHardIcon = new ImageIcon("graphics/botPlayerHard.png"); - // Labels und Buttons + // Labels JLabel frameTitle = new JLabel("Lokales Spiel"); JLabel semesterLabel = new JLabel("Semester"); JLabel leftPlayerName = new JLabel("Name"); @@ -32,6 +33,7 @@ public class startLocalGame extends JPanel { JLabel rightPlayerIcon = new JLabel(aiPlayerEasyIcon); JLabel semesterCounterLabel = new JLabel(String.valueOf(semesterCounter)); + // Buttons JButton backButton = new JButton(backButtonIcon); JButton leftPlayerLeftButton = new JButton("<-"); JButton leftPlayerRightButton = new JButton("->"); @@ -42,12 +44,20 @@ public class startLocalGame extends JPanel { JButton startButton = new JButton("Start!"); JButton testButton = new JButton("Test"); + // Textfelder JTextField leftPlayerTextField = new JTextField(20); JTextField rightPlayerTextField = new JTextField(20); - // Methode zur Erstellung des Panels + /** + * Konstruktor der startLocalGame. + * Fügt Buttons, Textfelder und Label hinzu. + * Fügt ebenfalls ActionListeners hinzu, damit Buttons etc. ihre gewünschte Funktion haben + * + * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. + */ startLocalGame(MainFrame frame) { - setLayout(null); // Stelle das Layout des Panels ein + // Layout des Panels + setLayout(null); // Setze Komponentenpositionen frameTitle.setBounds(20, 20, 200, 30); @@ -107,8 +117,8 @@ public class startLocalGame extends JPanel { rightPlayerTextField.setText(rightPlayerNickname); add(rightPlayerTextField); - // ActionListener für Buttons + // Um das Semester zu erhöhen. semesterUpButton.addActionListener(e -> { if (semesterCounter < 6) { semesterCounter++; @@ -116,6 +126,7 @@ public class startLocalGame extends JPanel { } }); + // Um das Semester zu senken. semesterDownButton.addActionListener(e -> { if (semesterCounter > 1) { semesterCounter--; @@ -123,6 +134,7 @@ public class startLocalGame extends JPanel { } }); + // Um linken Player nach links zu "rotieren". leftPlayerLeftButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -131,6 +143,7 @@ public class startLocalGame extends JPanel { } }); + // Um linken Player nach rechts zu "rotieren". leftPlayerRightButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -139,6 +152,7 @@ public class startLocalGame extends JPanel { } }); + // Um rechten Player nach links zu "rotieren". rightPlayerLeftButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -147,6 +161,7 @@ public class startLocalGame extends JPanel { } }); + // Um den rechten Player nach rechts zu "rotieren". rightPlayerRightButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -155,9 +170,38 @@ public class startLocalGame extends JPanel { } }); - backButton.addActionListener(e -> frame.showPanel("MainMenu")); - testButton.addActionListener(e -> frame.showPanelSLG("GameBoard",1,p1,p2)); - //startButton.addActionListener(e -> frame.showPanelSLG("GameBoard", semesterCounter,p1, p2)); // TODO ECHTE FUNKTION EINFÜGEN + // Um Namen des linken Spielers zu speichern. + leftPlayerTextField.addActionListener(e -> { + leftPlayerNickname = leftPlayerTextField.getText(); + System.out.println("Linker Spielername geändert zu: " + leftPlayerNickname); // Debugging-Ausgabe + }); + + // Um Namen des linken Spielers zu speichern, auch wenn nicht Enter gedrückt wird. + leftPlayerTextField.addFocusListener(new java.awt.event.FocusAdapter() { + @Override + public void focusLost(java.awt.event.FocusEvent evt) { + leftPlayerNickname = leftPlayerTextField.getText(); + System.out.println("Linker Spielername geändert zu: " + leftPlayerNickname); // Debugging-Ausgabe + } + }); + + // Um zum MainMenu zu wechseln. + backButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + frame.showPanel("MainMenu"); + } + }); + + // Um zum Gameboard zu wechseln. + testButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + frame.showPanelSLG("GameBoard",1,p1,p2); + } + }); + + // Um zum startLocalGameLoadingScreen zu wechseln und Daten an Backend weiterzureichen. startButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -200,7 +244,8 @@ public class startLocalGame extends JPanel { }); } - + // Hilfsfunktionen + // Setzt das jeweils "nächste" Icon, wenn der leftPlayerLeftButton gedrückt wird. private void toggleLeftPlayerIconLeft() { if (leftPlayerIcon.getIcon() == humanPlayerIcon) { leftPlayerIcon.setIcon(aiPlayerHardIcon); @@ -213,6 +258,7 @@ public class startLocalGame extends JPanel { } } + // Setzt das jeweils "nächste" Icon, wenn der leftPlayerRightButton gedrückt wird. private void toggleLeftPlayerIconRight() { if (leftPlayerIcon.getIcon() == humanPlayerIcon) { leftPlayerIcon.setIcon(aiPlayerEasyIcon); @@ -225,6 +271,7 @@ public class startLocalGame extends JPanel { } } + // Setzt das jeweils "nächste" Icon, wenn der RightPlayerLeftButton gedrückt wird. private void toggleRightPlayerIconLeft() { if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) { rightPlayerIcon.setIcon(aiPlayerHardIcon); @@ -235,6 +282,7 @@ public class startLocalGame extends JPanel { } } + // Setzt das jeweils "nächste" Icon, wenn der RightPlayerRightButton gedrückt wird. private void toggleRightPlayerIconRight() { if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) { rightPlayerIcon.setIcon(aiPlayerNormalIcon); @@ -245,11 +293,11 @@ public class startLocalGame extends JPanel { } } - // Methode zum Aktualisieren der Textfelder basierend auf den ausgewählten Icons + // Aktualisiert die Textfelder basierend auf den Icons private void updateTextFields() { - // Linker Spieler + // Für Linken Spieler if (leftPlayerIcon.getIcon() == humanPlayerIcon) { - leftPlayerTextField.setText("Spieler 1"); + leftPlayerTextField.setText(leftPlayerNickname); } else if (leftPlayerIcon.getIcon() == aiPlayerEasyIcon){ leftPlayerTextField.setText("Einfach"); } else if (leftPlayerIcon.getIcon() == aiPlayerNormalIcon) { @@ -258,7 +306,7 @@ public class startLocalGame extends JPanel { leftPlayerTextField.setText("Schwer"); } - // Rechter Spieler + // Für Rechten Spieler if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon){ rightPlayerTextField.setText("Einfach"); } else if (rightPlayerIcon.getIcon() == aiPlayerNormalIcon) { diff --git a/src/startLocalGameLoadingScreen.java b/src/startLocalGameLoadingScreen.java index c8f180a..a704f6b 100644 --- a/src/startLocalGameLoadingScreen.java +++ b/src/startLocalGameLoadingScreen.java @@ -1,9 +1,19 @@ import javax.swing.*; import java.awt.*; -//Kann evtl. als genereller LoadingScreen verwendet werden und nicht "nur" für localGame + +/** + * Das startLocalGameLoadingScreen Panel dient als "Überblende", während im Backend das Spiel erstellt wird. + * Hier wird lediglich Text angezeigt + */ public class startLocalGameLoadingScreen extends JPanel{ + /** + * Konstruktor der startLocalGameLoadingScreen. + * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. + * @param semesterCounter Ein Zähler, der das gewählte Semester speichert (hier unbenutzt) + */ startLocalGameLoadingScreen(MainFrame frame, int semesterCounter) { - // Layout setzen + + // Layout des Panels setLayout(new BorderLayout()); // Label mit dem Text erstellen @@ -11,8 +21,8 @@ public class startLocalGameLoadingScreen extends JPanel{ loadingLabel.setHorizontalAlignment(SwingConstants.CENTER); // Horizontal zentrieren loadingLabel.setVerticalAlignment(SwingConstants.CENTER); // Vertikal zentrieren - // Schriftgröße anpassen (optional) - loadingLabel.setFont(new Font("Arial", Font.PLAIN, 18)); + // Schriftgröße anpassen + loadingLabel.setFont(new Font("Roboto", Font.BOLD, 45)); // Label zum Panel hinzufügen add(loadingLabel, BorderLayout.CENTER); diff --git a/src/startMultiplayerGame.java b/src/startMultiplayerGame.java index db94f47..5d5ef9b 100644 --- a/src/startMultiplayerGame.java +++ b/src/startMultiplayerGame.java @@ -2,14 +2,16 @@ import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -// TODO -// Evtl. ist Namen selber setzten noch unmöglich -// - +/** + * Das startMultiplayerGame Panel dient dem Erstellen eines Online Spiels. + * Hier kann der Benutzer Spieler inklusive Namen und das Semester, in dem sich der Benutzer befindet, einstellen. + */ public class startMultiplayerGame extends JPanel { + // Funktionshilfen - int semesterCounter = 1; // Semester Counter Label + int semesterCounter = 1; String PlayerNickname = "Spieler 1"; + // Grafiken ImageIcon backButtonIcon = new ImageIcon("graphics/backButton.png"); ImageIcon humanPlayerIcon = new ImageIcon("graphics/humanPlayer.png"); @@ -36,11 +38,18 @@ public class startMultiplayerGame extends JPanel { // Textfelder JTextField PlayerTextField = new JTextField(20); - // Konstruktor + /** + * Konstruktor der startLocalGame. + * Fügt Buttons, Textfelder und Label hinzu. + * Fügt ebenfalls ActionListeners hinzu, damit Buttons etc. ihre gewünschte Funktion haben + * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. + */ startMultiplayerGame(MainFrame frame) { - setLayout(null); // Setze das Layout für das Panel auf null - // Setze Komponentenpositionen und füge sie dem Panel hinzu + // Layout des Panels + setLayout(null); + + // Setze Komponentenpositionen frameTitle.setBounds(20, 20, 200, 30); add(frameTitle); @@ -57,7 +66,6 @@ public class startMultiplayerGame extends JPanel { semesterCounterLabel.setHorizontalAlignment(SwingConstants.CENTER); add(semesterCounterLabel); - // Füge Buttons hinzu und setze ihre Positionen backButton.setBounds(1380, 20, 80, 80); add(backButton); @@ -79,22 +87,12 @@ public class startMultiplayerGame extends JPanel { createGameButton.setBounds(1100, 550, 200, 50); add(createGameButton); - // Füge das Textfeld hinzu PlayerTextField.setBounds(50, 650, 250, 50); PlayerTextField.setText(PlayerNickname); add(PlayerTextField); - /* TODO: Muss in Lucas klasse rein. - public static void startOnlineGame(Class localPlayerClass, String localPlayerName, InetSocketAddress - address, int size) throws IOException { - */ - - //GameController.startOnlineGame(...); - - - - // ActionListener für Buttons - // SEMESTERBUTTONS + // ActionListener für Buttons + // Um das Semester zu erhöhen. semesterUpButton.addActionListener(e -> { if (semesterCounter < 6) { semesterCounter++; @@ -102,6 +100,7 @@ public class startMultiplayerGame extends JPanel { } }); + // Um das Semester zu senken. semesterDownButton.addActionListener(e -> { if (semesterCounter > 1) { semesterCounter--; @@ -109,28 +108,46 @@ public class startMultiplayerGame extends JPanel { } }); - // PLAYERTOGGLEBUTTONS + // Um Player nach links zu "rotieren". PlayerLeftButton.addActionListener(e -> { togglePlayerIconLeft(); updateTextFields(); }); + // Um Player nach rechts zu "rotieren". PlayerRightButton.addActionListener(e -> { togglePlayerIconRight(); updateTextFields(); }); - // ActionListener für den "Back" Button, um zum vorherigen Panel zurückzukehren + // Um Namen des linken Spielers zu speichern. + PlayerTextField.addActionListener(e -> { + PlayerNickname = PlayerTextField.getText(); + System.out.println("Linker Spielername geändert zu: " + PlayerNickname); // Debugging-Ausgabe + }); - backButton.addActionListener(e -> frame.showPanel("MainMenu")); - //joinGameButton.addActionListener(e -> frame.showPanelSMG("JoinGame",1)); - //createGameButton.addActionListener(e -> frame.showPanelSMG("JoinGame",0)); + // Um Namen des linken Spielers zu speichern, auch wenn nicht Enter gedrückt wird. + PlayerTextField.addFocusListener(new java.awt.event.FocusAdapter() { + @Override + public void focusLost(java.awt.event.FocusEvent evt) { + PlayerNickname = PlayerTextField.getText(); + System.out.println("Linker Spielername geändert zu: " + PlayerNickname); // Debugging-Ausgabe + } + }); + // Um zum MainMenu zu wechseln. + backButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + frame.showPanel("MainMenu"); + } + }); + + // Um zu JoinGame mit richtigen Parametern zu wechseln. joinGameButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - //Parameter -> panelName, Spiel erstellen oder beitreten (int), Spielertyp(int 0-3), Spielername - if (PlayerIcon.getIcon() == humanPlayerIcon) { // TODO Wird name wirklich weitergegeben? + if (PlayerIcon.getIcon() == humanPlayerIcon) { frame.showPanelSMG("JoinGame",1,0, PlayerNickname); } else if ( PlayerIcon.getIcon() == aiPlayerEasyIcon) { frame.showPanelSMG("JoinGame",1,1, PlayerNickname); @@ -142,6 +159,7 @@ public class startMultiplayerGame extends JPanel { } }); + // Um zu JoinGame mit richtigen Parametern zu wechseln. createGameButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -157,51 +175,10 @@ public class startMultiplayerGame extends JPanel { } } }); - /* - startButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - frame.showPanelSLGLS("startLocalGameLoadingScreen", semesterCounter); //TODO - if (leftPlayerIcon.getIcon() == humanPlayerIcon) {// TODO Wird name wirklich weitergegeben? - if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerEasy.class, GameController.semesterToBoardSize(semesterCounter)); - } else if (rightPlayerIcon.getIcon() == aiPlayerNormalIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerMedium.class, GameController.semesterToBoardSize(semesterCounter)); - } else if (rightPlayerIcon.getIcon() == aiPlayerHardIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerHard.class, GameController.semesterToBoardSize(semesterCounter)); - } - } else if (leftPlayerIcon.getIcon() == aiPlayerEasyIcon) { - if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerEasy.class, GameController.semesterToBoardSize(semesterCounter)); - } else if (rightPlayerIcon.getIcon() == aiPlayerNormalIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerMedium.class, GameController.semesterToBoardSize(semesterCounter)); - } else if (rightPlayerIcon.getIcon() == aiPlayerHardIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerHard.class, GameController.semesterToBoardSize(semesterCounter)); - } - } else if (rightPlayerIcon.getIcon() == aiPlayerNormalIcon) { - if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerEasy.class, GameController.semesterToBoardSize(semesterCounter)); - } else if (rightPlayerIcon.getIcon() == aiPlayerNormalIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerMedium.class, GameController.semesterToBoardSize(semesterCounter)); - } else if (rightPlayerIcon.getIcon() == aiPlayerHardIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerHard.class, GameController.semesterToBoardSize(semesterCounter)); - } - } else if (rightPlayerIcon.getIcon() == aiPlayerHardIcon) { - if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerEasy.class, GameController.semesterToBoardSize(semesterCounter)); - } else if (rightPlayerIcon.getIcon() == aiPlayerNormalIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerMedium.class, GameController.semesterToBoardSize(semesterCounter)); - } else if (rightPlayerIcon.getIcon() == aiPlayerHardIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerHard.class, GameController.semesterToBoardSize(semesterCounter)); - } - } - - } - }); - */ } - // TOGGLE METHODEN + // Hilfsfunktionen + // Setzt das jeweils "nächste" Icon, wenn der PlayerLeftButton gedrückt wird. private void togglePlayerIconLeft() { if (PlayerIcon.getIcon() == humanPlayerIcon) { PlayerIcon.setIcon(aiPlayerHardIcon); @@ -214,6 +191,7 @@ public class startMultiplayerGame extends JPanel { } } + // Setzt das jeweils "nächste" Icon, wenn der PlayerRightButton gedrückt wird. private void togglePlayerIconRight() { if (PlayerIcon.getIcon() == humanPlayerIcon) { PlayerIcon.setIcon(aiPlayerEasyIcon); @@ -226,9 +204,10 @@ public class startMultiplayerGame extends JPanel { } } + // Aktualisiert die Textfelder basierend auf den Icons private void updateTextFields() { if (PlayerIcon.getIcon() == humanPlayerIcon) { - PlayerTextField.setText("Spieler 1"); + PlayerTextField.setText(PlayerNickname); } else if (PlayerIcon.getIcon() == aiPlayerEasyIcon){ PlayerTextField.setText("Einfach"); } else if (PlayerIcon.getIcon() == aiPlayerNormalIcon) { @@ -237,4 +216,4 @@ public class startMultiplayerGame extends JPanel { PlayerTextField.setText("Schwer"); } } -} +} \ No newline at end of file From 84865e5468fc8b310b3d70cebb58be42590ff37d Mon Sep 17 00:00:00 2001 From: Joshua Date: Thu, 12 Dec 2024 17:19:35 +0100 Subject: [PATCH 4/5] Added comments (Javadoc etc.) to most GUI classes und deleted old code and comments etc. (in general cleanup) --- src/BoardDisplay.java | 30 +++++++++ src/GameBoard.java | 26 ++++++++ src/JoinGame.java | 2 +- src/MainFrame.java | 113 +++++++++++++--------------------- src/Verbinden.java | 15 ++++- src/startLocalGame.java | 21 +++++-- src/startMultiplayerGame.java | 13 +++- 7 files changed, 140 insertions(+), 80 deletions(-) diff --git a/src/BoardDisplay.java b/src/BoardDisplay.java index c1db6b4..c946eaf 100644 --- a/src/BoardDisplay.java +++ b/src/BoardDisplay.java @@ -5,11 +5,20 @@ import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; +/** + * TODO Klassenbeschreibung + */ public class BoardDisplay extends JPanel { private JButton[][] fields; private int gridSize; private List ships; + /** + * Konstruktor der startLocalGame. + * TODO fertig schreiben + * @param gridSize + * @param player + */ public BoardDisplay(int gridSize, Player player) { super(new GridLayout(gridSize + 1, gridSize + 1)); // +1 wegen extra Zeile/Splate this.fields = new JButton[gridSize][gridSize]; @@ -67,6 +76,14 @@ public class BoardDisplay extends JPanel { // this.ships = new ArrayList(); } + /** + * TODO Funktion beschreiben etc. + * @param ship + * @param o + * @param horizontal + * @param player + * @return + */ private boolean setShip(Ship ship, Point o, boolean horizontal,Player player) { //boolean a = true; if (placeable(ship, ship.getPosition(), horizontal)) { @@ -83,6 +100,13 @@ public class BoardDisplay extends JPanel { } } + /** + * TODO Funktion beschreiben etc. + * @param ship + * @param o + * @param horizontal + * @return + */ private boolean placeable(Ship ship,Point o, boolean horizontal) { if (horizontal && (o.getX() + ship.getSize() > gridSize)) { return false; @@ -97,6 +121,12 @@ public class BoardDisplay extends JPanel { Ship current = (Ship) e.getSource(); } + /** + * TODO Funktion beschreiben etc. + * @param field + * @param o + * @param player + */ private void handleFieldClick(JButton field, Point o,Player player) { // Beispiel: Setze ein Schiff bei einem Klick if (setShip(new Ship(3, "TestShip"), o, true,player)) { diff --git a/src/GameBoard.java b/src/GameBoard.java index 4528693..8948f62 100644 --- a/src/GameBoard.java +++ b/src/GameBoard.java @@ -8,6 +8,10 @@ import java.awt.event.MouseEvent; import java.awt.event.MouseAdapter; import java.util.List; +/** + * Das GameBoard dient als Panel, in dem das tatsächliche Spiel stattfindet. + * Der Benutzer kann hier seine Schiffe platzieren, das Spiel starten etc. + */ public class GameBoard extends JPanel { // Funktionshilfen //int semesterCounter = 1; //TODO: ersetzen durch param von vorpanel @@ -25,6 +29,13 @@ public class GameBoard extends JPanel { JButton backButton = new JButton(backButtonIcon); // Eigene ModulButtons + /** + * Konstruktor von GameBoard. + * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. + * @param semesterCounter Ausgewähltes Semester + * @param p1 Erstes Spielerobjekt + * @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"); @@ -38,6 +49,7 @@ public class GameBoard extends JPanel { leftPlayerModul1, leftPlayerModul2, leftPlayerModul3, leftPlayerModul4, leftPlayerModul5, leftPlayerModul6, leftPlayerModul7, }; + // Gegnerische ModulButtons JToggleButton rightPlayerModul1 = new JToggleButton("Modul 1"); JToggleButton rightPlayerModul2 = new JToggleButton("Modul 2"); @@ -58,6 +70,11 @@ public class GameBoard extends JPanel { backButton.addActionListener(e -> frame.showPanel("MainMenu")); } + /** + * TODO Funktion beschreiben etc. + * @param ships + * @param buttons + */ private void updateButtonLabels(List ships,JToggleButton[] buttons) { for(int i=0;i { - MainFrame frame = new MainFrame(); - frame.setVisible(true); - }); - } - */ } \ No newline at end of file diff --git a/src/Verbinden.java b/src/Verbinden.java index ca4feb7..aeb086d 100644 --- a/src/Verbinden.java +++ b/src/Verbinden.java @@ -1,6 +1,9 @@ import javax.swing.*; import java.awt.*; +/** + * Das Verbinden Panel dient als "Überblende", während im Backend das Spiel erstellt/ eine Verbindung hergestellt wird. + */ public class Verbinden extends JPanel{ ImageIcon backButtonIcon = new ImageIcon("graphics/backButton.png"); @@ -9,12 +12,20 @@ public class Verbinden extends JPanel{ Font robotoFont = new Font("Roboto", Font.BOLD, 45); - public Verbinden(MainFrame frame) { + /** + * Konstruktor der startLocalGame. + * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. + */ + public Verbinden(MainFrame frame) { setLayout(null); buildPanel(frame); } - private void buildPanel(MainFrame frame) { + /** + * Baut Panel auf. + * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. + */ + private void buildPanel(MainFrame frame) { setLayout(new BorderLayout()); verbindenLabel.setFont(robotoFont.deriveFont(50f)); add(verbindenLabel, BorderLayout.CENTER); diff --git a/src/startLocalGame.java b/src/startLocalGame.java index 1fb6792..c9e5d55 100644 --- a/src/startLocalGame.java +++ b/src/startLocalGame.java @@ -245,7 +245,10 @@ public class startLocalGame extends JPanel { } // Hilfsfunktionen - // Setzt das jeweils "nächste" Icon, wenn der leftPlayerLeftButton gedrückt wird. + + /** + * Setzt das jeweils "nächste" Icon, wenn der leftPlayerLeftButton gedrückt wird. + */ private void toggleLeftPlayerIconLeft() { if (leftPlayerIcon.getIcon() == humanPlayerIcon) { leftPlayerIcon.setIcon(aiPlayerHardIcon); @@ -258,7 +261,9 @@ public class startLocalGame extends JPanel { } } - // Setzt das jeweils "nächste" Icon, wenn der leftPlayerRightButton gedrückt wird. + /** + * Setzt das jeweils "nächste" Icon, wenn der leftPlayerRightButton gedrückt wird. + */ private void toggleLeftPlayerIconRight() { if (leftPlayerIcon.getIcon() == humanPlayerIcon) { leftPlayerIcon.setIcon(aiPlayerEasyIcon); @@ -271,7 +276,9 @@ public class startLocalGame extends JPanel { } } - // Setzt das jeweils "nächste" Icon, wenn der RightPlayerLeftButton gedrückt wird. + /** + * Setzt das jeweils "nächste" Icon, wenn der RightPlayerLeftButton gedrückt wird. + */ private void toggleRightPlayerIconLeft() { if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) { rightPlayerIcon.setIcon(aiPlayerHardIcon); @@ -282,7 +289,9 @@ public class startLocalGame extends JPanel { } } - // Setzt das jeweils "nächste" Icon, wenn der RightPlayerRightButton gedrückt wird. + /** + * Setzt das jeweils "nächste" Icon, wenn der RightPlayerRightButton gedrückt wird. + */ private void toggleRightPlayerIconRight() { if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) { rightPlayerIcon.setIcon(aiPlayerNormalIcon); @@ -293,7 +302,9 @@ public class startLocalGame extends JPanel { } } - // Aktualisiert die Textfelder basierend auf den Icons + /** + * Aktualisiert die Textfelder basierend auf den Icons + */ private void updateTextFields() { // Für Linken Spieler if (leftPlayerIcon.getIcon() == humanPlayerIcon) { diff --git a/src/startMultiplayerGame.java b/src/startMultiplayerGame.java index 5d5ef9b..c9b748a 100644 --- a/src/startMultiplayerGame.java +++ b/src/startMultiplayerGame.java @@ -178,7 +178,10 @@ public class startMultiplayerGame extends JPanel { } // Hilfsfunktionen - // Setzt das jeweils "nächste" Icon, wenn der PlayerLeftButton gedrückt wird. + + /** + * Setzt das jeweils "nächste" Icon, wenn der PlayerLeftButton gedrückt wird. + */ private void togglePlayerIconLeft() { if (PlayerIcon.getIcon() == humanPlayerIcon) { PlayerIcon.setIcon(aiPlayerHardIcon); @@ -191,7 +194,9 @@ public class startMultiplayerGame extends JPanel { } } - // Setzt das jeweils "nächste" Icon, wenn der PlayerRightButton gedrückt wird. + /** + * Setzt das jeweils "nächste" Icon, wenn der PlayerRightButton gedrückt wird. + */ private void togglePlayerIconRight() { if (PlayerIcon.getIcon() == humanPlayerIcon) { PlayerIcon.setIcon(aiPlayerEasyIcon); @@ -204,7 +209,9 @@ public class startMultiplayerGame extends JPanel { } } - // Aktualisiert die Textfelder basierend auf den Icons + /** + * Aktualisiert die Textfelder basierend auf den Icons + */ private void updateTextFields() { if (PlayerIcon.getIcon() == humanPlayerIcon) { PlayerTextField.setText(PlayerNickname); From f397803b64c22140d14da1c0febb253311237928 Mon Sep 17 00:00:00 2001 From: Kaver Date: Fri, 13 Dec 2024 17:00:51 +0100 Subject: [PATCH 5/5] Kleine Anpassung von BoardDisplay --- src/BoardDisplay.java | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/src/BoardDisplay.java b/src/BoardDisplay.java index c1db6b4..99f24c1 100644 --- a/src/BoardDisplay.java +++ b/src/BoardDisplay.java @@ -13,11 +13,12 @@ public class BoardDisplay extends JPanel { public BoardDisplay(int gridSize, Player player) { super(new GridLayout(gridSize + 1, gridSize + 1)); // +1 wegen extra Zeile/Splate this.fields = new JButton[gridSize][gridSize]; + this.ships = new ArrayList<>(); // 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; // Temporäre Variable + // final int y = j; // Temporäre Variable if (i == 0 && j == 0) { add(new JLabel(" ")); } else if (i == 0) { @@ -57,6 +58,7 @@ public class BoardDisplay extends JPanel { @Override public void mouseClicked(MouseEvent e) { Point o= new Point(finalI, finalJ); + System.out.println(o); handleFieldClick(field, o,player); } }); @@ -70,12 +72,15 @@ public class BoardDisplay extends JPanel { 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.setPosition(new Point(o.getX(), o.getY()), player.getBoard().getShips(), gridSize); + ship.setPosition(o, 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); + fields[(int) p.getX()][(int)p.getY()].setBackground(Color.LIGHT_GRAY); } return true; }else{ @@ -83,16 +88,39 @@ public class BoardDisplay extends JPanel { } } - private boolean placeable(Ship ship,Point o, boolean horizontal) { - if (horizontal && (o.getX() + ship.getSize() > gridSize)) { + /*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; + }*/ + + 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; } + private void selectShip(MouseEvent e) { Ship current = (Ship) e.getSource(); }