From 9ff0958fbc3b9dd8ee1c5bfea086c31c4afe8977 Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Tue, 10 Dec 2024 12:39:41 +0100 Subject: [PATCH 01/18] start game in frontend --- src/GameController.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/GameController.java b/src/GameController.java index 1c5e392..f4b7eca 100644 --- a/src/GameController.java +++ b/src/GameController.java @@ -25,6 +25,9 @@ public class GameController { public static int semesterToBoardSize(int semester) { return semester + 13; } + public static int boardSizeToSemester(int size) { + return size - 13; + } public static HashMap> supportedVersions = new HashMap<>(Map.of( "1.1.0", OnlinePlayer_1_1_0.class @@ -93,7 +96,7 @@ public class GameController { localPlayer.isServer = localPlayerIsServer; onlinePlayer.isServer = !localPlayerIsServer; - startGameWithInstancedPlayers(localPlayer, onlinePlayer); + startGameWithInstancedPlayers(localPlayer, onlinePlayer, size); } else { throw new RuntimeException("Unexpected Package received before game initialisation"); @@ -178,13 +181,15 @@ public class GameController { localPlayer.createBoard(size); aiPlayer.createBoard(size); - startGameWithInstancedPlayers(localPlayer, aiPlayer); + startGameWithInstancedPlayers(localPlayer, aiPlayer, size); } - private static void startGameWithInstancedPlayers(LocalPlayer p1, Player p2) { + private static void startGameWithInstancedPlayers(LocalPlayer p1, Player p2, int boardSize) { p1.setEnemy(p2); p2.setEnemy(p1); + mainFrame.showPanelSLG("GameBoard", boardSizeToSemester(boardSize), p1, p2); + // TODO: frontend configuration } -- 2.40.1 From 6a57a6e1ff6a61df0c39bf41f203a5ac2f795ab5 Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Tue, 10 Dec 2024 12:44:01 +0100 Subject: [PATCH 02/18] remove unused import --- src/GameBoard.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/GameBoard.java b/src/GameBoard.java index 32d43c3..75fc017 100644 --- a/src/GameBoard.java +++ b/src/GameBoard.java @@ -1,4 +1,4 @@ -import javafx.scene.control.ToggleGroup; +// import javafx.scene.control.ToggleGroup; import javax.swing.*; import java.awt.*; -- 2.40.1 From b958ffd6b9a9f0efb4a458d5a1d7b0dce8130826 Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Tue, 10 Dec 2024 12:44:34 +0100 Subject: [PATCH 03/18] initialise board arrays correctly --- src/Board.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Board.java b/src/Board.java index eaf8d41..f0ca737 100644 --- a/src/Board.java +++ b/src/Board.java @@ -1,4 +1,5 @@ +import java.util.ArrayList; import java.util.List; public class Board { @@ -10,6 +11,8 @@ public class Board { public Board(int size) { this.size = size; + this.ships = new ArrayList<>(); + this.hits = new ArrayList<>(); this.createShip(size - 13); } -- 2.40.1 From c55a62663ee3df386b873ed79978bd8f1008f1c5 Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Tue, 10 Dec 2024 12:50:19 +0100 Subject: [PATCH 04/18] pass main frame to game controller --- src/MainFrame.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/MainFrame.java b/src/MainFrame.java index 9afa7d2..1d8e018 100644 --- a/src/MainFrame.java +++ b/src/MainFrame.java @@ -18,6 +18,9 @@ public class MainFrame extends JFrame { public MainFrame() { + + GameController.setMainFrame(this); + setTitle("Studium Versenken"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(1500, 1000); -- 2.40.1 From f151a89ea466e5abb7f3f17a38959d0ec164f981 Mon Sep 17 00:00:00 2001 From: Joshua Date: Tue, 10 Dec 2024 12:50:26 +0100 Subject: [PATCH 05/18] Added function to JoinGame. --- src/GameBoard.java | 2 +- src/JoinGame.java | 23 ++++++++++++++++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/GameBoard.java b/src/GameBoard.java index 32d43c3..c53c985 100644 --- a/src/GameBoard.java +++ b/src/GameBoard.java @@ -1,4 +1,4 @@ -import javafx.scene.control.ToggleGroup; +//import javafx.scene.control.ToggleGroup; import javax.swing.*; import java.awt.*; diff --git a/src/JoinGame.java b/src/JoinGame.java index 3251d2d..879d48e 100644 --- a/src/JoinGame.java +++ b/src/JoinGame.java @@ -2,12 +2,14 @@ import java.awt.*; import javax.swing.*; import java.awt.event.ActionEvent; 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 { @@ -60,19 +62,30 @@ public class JoinGame extends JPanel { backButton.addActionListener(e -> frame.showPanel("MultiplayerGame")); losButton.addActionListener(e -> frame.showPanel("Verbinden")); - /* + + losButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { + String ipAddress = ipTextField.getText(); + 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(playerType == 1) { //Beispiel (für playertape wäre z.B. 1 humanPlayer etc.) - GameController.startOnlineGame(HumanPlayer.class, playerName, adress); // + 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); + } } } }); - */ + } } \ No newline at end of file -- 2.40.1 From 3b6ffeb82dcdc3924b849a9e18b8ede66c21fb12 Mon Sep 17 00:00:00 2001 From: Joshua Date: Tue, 10 Dec 2024 13:48:55 +0100 Subject: [PATCH 06/18] 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 -- 2.40.1 From 44f2b0f0f151b80421b8036537abad45221ac3d5 Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Tue, 10 Dec 2024 14:07:16 +0100 Subject: [PATCH 07/18] move socket connection into thread within AsyncSocket --- src/AsyncSocket.java | 118 ++++++++++++++++++++++++++++++++++++---- src/GameController.java | 25 +-------- 2 files changed, 109 insertions(+), 34 deletions(-) diff --git a/src/AsyncSocket.java b/src/AsyncSocket.java index 0201e4e..a5aa22e 100644 --- a/src/AsyncSocket.java +++ b/src/AsyncSocket.java @@ -1,27 +1,86 @@ import java.io.BufferedReader; +import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; -import java.io.PrintWriter; +import java.net.InetSocketAddress; +import java.net.ServerSocket; import java.net.Socket; public class AsyncSocket { private Socket socket; private Thread checkerThread; + private Thread connectorThread; private AsyncSocketListener handler; private boolean shouldStop = false; + private String sendBuffer = ""; + private BufferedReader in; - private PrintWriter out; + private BufferedWriter out; + + public AsyncSocket(int port, AsyncSocketListener handler) { + this.setHandler(handler); + + // start server in new thread + this.connectorThread = new Thread(() -> { + try { + ServerSocket serverSocket = new ServerSocket(port); + + System.out.println("Waiting for client connection on port " + port); + + Socket socket = serverSocket.accept(); + + System.out.println("Socket connected."); + + serverSocket.close(); + + this.initSocket(socket); + + } catch (IOException e) { + e.printStackTrace(); + // TODO: proper error handling + } + }); + this.connectorThread.start(); + } + + public AsyncSocket(InetSocketAddress address, AsyncSocketListener handler) { + this.setHandler(handler); + + // start client in new thread + this.connectorThread = new Thread(() -> { + System.out.println("Connecting to " + address.toString()); + + Socket socket = new Socket(); + try { + socket.connect(address, 10); + System.out.println("Socket connected."); + + this.initSocket(socket); + + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException("Connection timed out"); + } + + }); + this.connectorThread.start(); + } public AsyncSocket(Socket socket, AsyncSocketListener handler) throws IOException { + this.setHandler(handler); + this.initSocket(socket); + } + + private void initSocket(Socket socket) throws IOException { + System.out.println("Initialising sockets"); this.socket = socket; this.in = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); - this.out = new PrintWriter(new OutputStreamWriter(this.socket.getOutputStream())); - - this.handler = handler; + this.out = new BufferedWriter(new OutputStreamWriter(this.socket.getOutputStream())); + this.shouldStop = false; this.checkerThread = new Thread(() -> { while (!this.shouldStop) { try { @@ -29,21 +88,38 @@ public class AsyncSocket { } catch (InterruptedException e) { e.printStackTrace(); } + + if (!this.connectorThread.isAlive()) { + try { + this.connectorThread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + try { - if (!this.in.ready()) continue; - if (this.handler == null) continue; + if (!this.in.ready()) { + continue; + } + if (this.handler == null) { + continue; + } String message = this.in.readLine(); if (message.length() <= 0) continue; + message = message.strip(); + System.out.println("RECEIVED - " + message); this.handler.receive(message); } catch (IOException e) { e.printStackTrace(); } } }); + System.out.println("starting checker thread"); this.checkerThread.start(); + this.flushBuffer(); } public void setHandler(AsyncSocketListener handler) { @@ -51,21 +127,36 @@ public class AsyncSocket { } - public void send(SocketPackage socketPackage) { + public synchronized void send(SocketPackage socketPackage) { this.sendLine(socketPackage.toString()); } - public void send(String packageName) { + public synchronized void send(String packageName) { this.send(packageName, ""); } - public void send(String packageName, String packageContent) { + public synchronized void send(String packageName, String packageContent) { if (packageContent.length() > 0) { packageContent = " " + packageContent; } this.sendLine(packageName + packageContent); } - public void sendLine(String message) { - this.out.print(message + "\r\n"); + public synchronized void sendLine(String message) { + sendBuffer = sendBuffer + message + "\r\n"; + this.flushBuffer(); + } + + private synchronized void flushBuffer() { + if (!this.sendBuffer.isEmpty() && this.out != null) { + try { + this.out.write(sendBuffer); + System.out.println("SENT - " + sendBuffer); + sendBuffer = ""; + this.out.flush(); + } catch (IOException e) { + e.printStackTrace(); + // TODO: handle writing error + } + } } public void close() { @@ -73,8 +164,11 @@ public class AsyncSocket { try { this.socket.close(); + this.checkerThread.join(); } catch (IOException e) { e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); } } } \ No newline at end of file diff --git a/src/GameController.java b/src/GameController.java index f4b7eca..f96ba52 100644 --- a/src/GameController.java +++ b/src/GameController.java @@ -36,34 +36,15 @@ public class GameController { public static void startOnlineGame(Class localPlayerClass, String localPlayerName, InetSocketAddress address, int size) throws IOException { AsyncSocket clientSocket; - boolean localPlayerIsServer = address.getHostName() == null; + boolean localPlayerIsServer = address.getHostName() == null || address.getHostName().isEmpty() || address.getHostName().equals("0.0.0.0"); if (localPlayerIsServer) { // SERVER MODE + clientSocket = new AsyncSocket(address.getPort(), null); - ServerSocket serverSocket = new ServerSocket(address.getPort()); - - System.out.println("Waiting for client connection..."); - - clientSocket = new AsyncSocket(serverSocket.accept(), null); - - serverSocket.close(); } else { // CLIENT MODE - - Socket socket = new Socket(); - - try { - socket.connect(address, CONNECTION_TIMEOUT); - - clientSocket = new AsyncSocket(socket, null); - } catch (SocketTimeoutException e) { - e.printStackTrace(); - throw new RuntimeException("Connection timed out"); - } finally { - socket.close(); - } - + clientSocket = new AsyncSocket(address, null); } clientSocket.send("VERSION", "Gruppe03 " + String.join(" ", supportedVersions.keySet())); -- 2.40.1 From 7f5e03157472787f3d36a1f77079ecd745168815 Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Tue, 10 Dec 2024 14:07:39 +0100 Subject: [PATCH 08/18] find correct constructor --- src/GameController.java | 2 +- src/OnlinePlayer.java | 2 +- src/OnlinePlayer_1_1_0.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/GameController.java b/src/GameController.java index f96ba52..d623b48 100644 --- a/src/GameController.java +++ b/src/GameController.java @@ -68,7 +68,7 @@ public class GameController { OnlinePlayer onlinePlayer; try { localPlayer = localPlayerClass.getDeclaredConstructor().newInstance(); - onlinePlayer = onlinePlayerClass.getDeclaredConstructor().newInstance((Integer)size, clientSocket); + onlinePlayer = onlinePlayerClass.getDeclaredConstructor(Integer.class, AsyncSocket.class).newInstance((Integer)size, clientSocket); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("Unable to instantiate players"); diff --git a/src/OnlinePlayer.java b/src/OnlinePlayer.java index 88ac476..78488bb 100644 --- a/src/OnlinePlayer.java +++ b/src/OnlinePlayer.java @@ -4,7 +4,7 @@ public abstract class OnlinePlayer extends Player implements AsyncSocketListener protected boolean hasReceivedCoinPackage; - public OnlinePlayer(int size, AsyncSocket socket) { + public OnlinePlayer(Integer size, AsyncSocket socket) { this.socket = socket; this.wantedBoardSize = size; socket.setHandler(this); diff --git a/src/OnlinePlayer_1_1_0.java b/src/OnlinePlayer_1_1_0.java index 6c2a784..482229f 100644 --- a/src/OnlinePlayer_1_1_0.java +++ b/src/OnlinePlayer_1_1_0.java @@ -1,7 +1,7 @@ import java.util.List; public class OnlinePlayer_1_1_0 extends OnlinePlayer { - public OnlinePlayer_1_1_0(int size, AsyncSocket socket) { + public OnlinePlayer_1_1_0(Integer size, AsyncSocket socket) { super(size, socket); } -- 2.40.1 From 21563dd4694c478e4d73fb3c830fd876f85b82dc Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Tue, 10 Dec 2024 14:07:45 +0100 Subject: [PATCH 09/18] remove unused imports --- src/GameController.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/GameController.java b/src/GameController.java index d623b48..bb49d26 100644 --- a/src/GameController.java +++ b/src/GameController.java @@ -1,8 +1,5 @@ import java.io.IOException; import java.net.InetSocketAddress; -import java.net.ServerSocket; -import java.net.Socket; -import java.net.SocketTimeoutException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -- 2.40.1 From ffa04a50cbdff188a9c7d7e09cb7f201d9f9ee16 Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Tue, 10 Dec 2024 14:07:56 +0100 Subject: [PATCH 10/18] set IP to 0.0.0.0 in server mode --- src/JoinGame.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/JoinGame.java b/src/JoinGame.java index 879d48e..c61c810 100644 --- a/src/JoinGame.java +++ b/src/JoinGame.java @@ -61,13 +61,18 @@ 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); -- 2.40.1 From 5cf8befdc19561a7c970ad3070da801c1bd29e81 Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Tue, 10 Dec 2024 14:08:00 +0100 Subject: [PATCH 11/18] add todo --- src/SoundHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SoundHandler.java b/src/SoundHandler.java index f9d04a3..29af73b 100644 --- a/src/SoundHandler.java +++ b/src/SoundHandler.java @@ -28,7 +28,7 @@ public class SoundHandler { } } }).start(); - + // TODO: kill zombies } } -- 2.40.1 From 60e6ed12777dc29f53c5954c8dce64eaa20e9d79 Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Tue, 10 Dec 2024 14:42:15 +0100 Subject: [PATCH 12/18] kill the zombies --- src/SoundHandler.java | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/SoundHandler.java b/src/SoundHandler.java index 29af73b..ade013e 100644 --- a/src/SoundHandler.java +++ b/src/SoundHandler.java @@ -1,8 +1,10 @@ import javazoom.jl.decoder.JavaLayerException; import javazoom.jl.player.Player; +import java.awt.List; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -10,6 +12,8 @@ public class SoundHandler { private static boolean soundOn = true; + private static ArrayList runningThreads = new ArrayList(); + // Wenn fehler beim erstellen von .jar mit sound hier gucken private static HashMap sounds = new HashMap(Map.of( "hit", "./Sound/water-drip.mp3" @@ -17,7 +21,7 @@ public class SoundHandler { public static void playSound(String soundName) { if (soundOn) { - new Thread(new Runnable() { + Thread thread = new Thread(new Runnable() { @Override public void run() { try { @@ -27,9 +31,23 @@ public class SoundHandler { e.printStackTrace(); } } - }).start(); - // TODO: kill zombies + }); + thread.start(); + runningThreads.add(thread); } + for (Thread oldThread : runningThreads) { + if (!oldThread.isAlive()) { + + try { + oldThread.join(); + runningThreads.remove(oldThread); + System.out.println("cleared thread"); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + } + } } -- 2.40.1 From 8a9e7fb4b28394597cc3e6c816b65c47bc2ca50e Mon Sep 17 00:00:00 2001 From: Kaver Date: Tue, 10 Dec 2024 16:52:10 +0100 Subject: [PATCH 13/18] 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; + } } -- 2.40.1 From bb61a68f245d13bcc11b3c1ea7931a3373400c27 Mon Sep 17 00:00:00 2001 From: Joshua Date: Tue, 10 Dec 2024 17:26:27 +0100 Subject: [PATCH 14/18] 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 -- 2.40.1 From 84865e5468fc8b310b3d70cebb58be42590ff37d Mon Sep 17 00:00:00 2001 From: Joshua Date: Thu, 12 Dec 2024 17:19:35 +0100 Subject: [PATCH 15/18] 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); -- 2.40.1 From fd82e64814b04cf9276d89f1ea58678318fa9f60 Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Fri, 13 Dec 2024 16:59:02 +0100 Subject: [PATCH 16/18] remove connection timeout --- src/GameController.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/GameController.java b/src/GameController.java index bb49d26..f724c2a 100644 --- a/src/GameController.java +++ b/src/GameController.java @@ -16,9 +16,6 @@ public class GameController { GameController.mainFrame = mainFrame; } - // Connection timeout for client sockets in milliseconds - public static final int CONNECTION_TIMEOUT = 10 * 1000; - public static int semesterToBoardSize(int semester) { return semester + 13; } -- 2.40.1 From f397803b64c22140d14da1c0febb253311237928 Mon Sep 17 00:00:00 2001 From: Kaver Date: Fri, 13 Dec 2024 17:00:51 +0100 Subject: [PATCH 17/18] 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(); } -- 2.40.1 From dfbe4b3c53d1b3759d249b96197b05c36b07f69f Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Fri, 13 Dec 2024 17:26:18 +0100 Subject: [PATCH 18/18] fix online game start --- src/GameController.java | 17 ++++++++++++----- src/OnlinePlayer.java | 2 ++ src/OnlinePlayer_1_1_0.java | 9 ++++++++- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/GameController.java b/src/GameController.java index f724c2a..5353fdd 100644 --- a/src/GameController.java +++ b/src/GameController.java @@ -68,11 +68,18 @@ public class GameController { throw new RuntimeException("Unable to instantiate players"); } + localPlayer.isServer = localPlayerIsServer; onlinePlayer.isServer = !localPlayerIsServer; + + localPlayer.setName(localPlayerName); - startGameWithInstancedPlayers(localPlayer, onlinePlayer, size); + localPlayer.setEnemy(onlinePlayer); + onlinePlayer.setEnemy(localPlayer); + onlinePlayer.sendIAM(); + + // Start game only after IAM Package was exchanged } else { throw new RuntimeException("Unexpected Package received before game initialisation"); } @@ -156,13 +163,13 @@ public class GameController { localPlayer.createBoard(size); aiPlayer.createBoard(size); + localPlayer.setEnemy(aiPlayer); + aiPlayer.setEnemy(localPlayer); + startGameWithInstancedPlayers(localPlayer, aiPlayer, size); } - private static void startGameWithInstancedPlayers(LocalPlayer p1, Player p2, int boardSize) { - p1.setEnemy(p2); - p2.setEnemy(p1); - + public static void startGameWithInstancedPlayers(LocalPlayer p1, Player p2, int boardSize) { mainFrame.showPanelSLG("GameBoard", boardSizeToSemester(boardSize), p1, p2); // TODO: frontend configuration diff --git a/src/OnlinePlayer.java b/src/OnlinePlayer.java index 78488bb..3634c1f 100644 --- a/src/OnlinePlayer.java +++ b/src/OnlinePlayer.java @@ -11,6 +11,8 @@ public abstract class OnlinePlayer extends Player implements AsyncSocketListener //TODO Auto-generated constructor stub } + public abstract void sendIAM(); + public abstract void receive(String message); @Override diff --git a/src/OnlinePlayer_1_1_0.java b/src/OnlinePlayer_1_1_0.java index 482229f..31fe50d 100644 --- a/src/OnlinePlayer_1_1_0.java +++ b/src/OnlinePlayer_1_1_0.java @@ -6,7 +6,6 @@ public class OnlinePlayer_1_1_0 extends OnlinePlayer { } - @Override public void receive(String message) { SocketPackage p = new SocketPackage(message); @@ -26,6 +25,8 @@ public class OnlinePlayer_1_1_0 extends OnlinePlayer { this.createBoard(usedBoardSize); this.enemy.createBoard(usedBoardSize); + GameController.startGameWithInstancedPlayers((LocalPlayer)this.enemy, (Player)this, usedBoardSize); + break; // TODO: IAMU @@ -66,6 +67,12 @@ public class OnlinePlayer_1_1_0 extends OnlinePlayer { } } + @Override + public synchronized void sendIAM() { + if (this.enemy == null) throw new RuntimeException("enemy has not yet been defined"); + socket.send(new SocketPackage("IAM", GameController.boardSizeToSemester(this.wantedBoardSize) + " " + this.enemy.name)); + } + @Override public synchronized void receiveShoot(Point point){ super.socket.send(new SocketPackage("SHOOT",point.toString())); -- 2.40.1