From 8ae51f6316034fef380d2335c6cf75094ad8199c Mon Sep 17 00:00:00 2001 From: eyFlorian <45431375+eyFlorian@users.noreply.github.com> Date: Sun, 3 Nov 2024 12:39:19 +0100 Subject: [PATCH 01/20] Locales Spiel Initialisierung MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Florian und Florian Haben 3 Stunden an diesem kack gearbeitet. Player, AiPlayer und jeweils die Boards wurden erstellt und Initialisiert. Erweiterung zu Hitresponse /- type für die Board. --- src/AiPlayer.java | 7 ++++++ src/Board.java | 43 +++++++++++++++++++++++++++++++++- src/GameController.java | 31 ++++++++++++++++++++++++ src/HalloSchiffeVersenken.java | 12 +++++++--- src/HitResponse.java | 14 +++++++++++ src/HitResponseType.java | 2 +- src/HumanPlayer.java | 34 +++++++++++++++++++++++++++ src/LocalPlayer.java | 4 ++++ src/Ship.java | 24 +++++++++++++++++++ src/SpecificAiPlayer1.java | 21 +++++++++++++++++ 10 files changed, 187 insertions(+), 5 deletions(-) create mode 100644 src/AiPlayer.java create mode 100644 src/GameController.java create mode 100644 src/HumanPlayer.java create mode 100644 src/LocalPlayer.java create mode 100644 src/Ship.java create mode 100644 src/SpecificAiPlayer1.java diff --git a/src/AiPlayer.java b/src/AiPlayer.java new file mode 100644 index 0000000..f95b6d1 --- /dev/null +++ b/src/AiPlayer.java @@ -0,0 +1,7 @@ + +public abstract class AiPlayer { + + public void setBoardSize(int s) { + // raum für schmerzen + } +} diff --git a/src/Board.java b/src/Board.java index edb598b..73564c9 100644 --- a/src/Board.java +++ b/src/Board.java @@ -1,2 +1,43 @@ +import java.util.List; + public class Board { -} +/* + - hits : List + - ships : List + - size : int + - display : BoardDisplay +*/ + /* + * + hit(HitResponse) + * + click(Point) : void + */ + + List hits; + List ships; + int size; + + public Board() { + // MISS,SHIP, HIT + // MISS bedeutet nichts auf der Position vorhanden + // SHIP bedeutet ungetroffenes Schiff auf der Position vorhanden + // HIT bedeutet getroffenes Schiff auf der Position vorhanden + + + } + + public void setSize(int s) { + this.size = s; + } + + public void initBoard() { + + for (int i=0;size>i;i++) { + for (int j=0;size>j;j++) { + HitResponse missPos = new HitResponse(); + missPos.setHitResponse(HitResponseType.MISS); + missPos.setPoint(i,j); + hits.add(missPos); + } + } + } +} \ No newline at end of file diff --git a/src/GameController.java b/src/GameController.java new file mode 100644 index 0000000..a452755 --- /dev/null +++ b/src/GameController.java @@ -0,0 +1,31 @@ +public class GameController { + + + public void startOnlineGame() { + // fuck you Luca and Ole von Florian und nicht von Florian + } + + public void startLocalGame(HumanPlayer player, AiPlayer enemy, int size) { + //Player initialisieren Board + player.setBoardSize(size); + enemy.setBoardSize(size); + + // Schiffe setzen + // für player durch UI + + /* + * Todo + * enemy.setships(); + */ + + boolean condition = true; + while(condition) { + //Gameloop bis Sieger + //WIP + break; + + } + + } + +} \ No newline at end of file diff --git a/src/HalloSchiffeVersenken.java b/src/HalloSchiffeVersenken.java index b84600f..6d8f05e 100644 --- a/src/HalloSchiffeVersenken.java +++ b/src/HalloSchiffeVersenken.java @@ -1,10 +1,16 @@ public class HalloSchiffeVersenken { public static void main(String[] args) throws InterruptedException { + int default_size = 14; + + HumanPlayer player = new HumanPlayer(); + AiPlayer enemy = new SpecificAiPlayer1(); // auswählen hehe. mal gucken und viel spaßßß + GameController game_controller = new GameController(); + game_controller.startLocalGame(player, enemy, default_size); // default_size oder auswählen, viel spaß + + /* System.out.println("HelloSchiffeVersenekn"); - - System.out.println("sound"); SoundHandler.playSound("hit"); Thread.sleep(3000); @@ -13,7 +19,7 @@ public class HalloSchiffeVersenken { SoundHandler.setSoundOn(false); System.out.println("sound off"); SoundHandler.playSound("hit"); - + */ } } diff --git a/src/HitResponse.java b/src/HitResponse.java index f5c3913..b913c3c 100644 --- a/src/HitResponse.java +++ b/src/HitResponse.java @@ -3,4 +3,18 @@ import java.awt.*; public class HitResponse { private HitResponseType type; private Point point; + + public HitResponseType getHitResponse() { + return this.type; + } + public void setHitResponse(HitResponseType a) { + this.type = a; + } + + public Point getPoint() { + return this.point; + } + public void setPoint(int x, int y) { + this.point = new Point(x,y); + } } diff --git a/src/HitResponseType.java b/src/HitResponseType.java index 4b1237c..51c82a4 100644 --- a/src/HitResponseType.java +++ b/src/HitResponseType.java @@ -1,3 +1,3 @@ public enum HitResponseType { - MISS, HIT, SUNK, VICTORY + MISS, SHIP, HIT, SUNK, VICTORY } diff --git a/src/HumanPlayer.java b/src/HumanPlayer.java new file mode 100644 index 0000000..582d864 --- /dev/null +++ b/src/HumanPlayer.java @@ -0,0 +1,34 @@ + +public class HumanPlayer extends LocalPlayer { + /* + - myTurn : bool + - isServer : bool + - waitingForResponse : bool + - enemy : Player + - name : String + - board : Board + + receiveShoot(Point) : void + + receiveHit(HitResponse) : void + + click(Point) : void + + beginTurn() : void + + */ + + private boolean myTurn; + private boolean isServer; + private boolean waitingForResponse; + private Player enemy; + private String name; + private Board board; + + + public HumanPlayer() { + Board board = new Board(); + this.board = board; + } + + public void setBoardSize(int s) { + this.board.setSize(s); + this.board.initBoard(); + } +} diff --git a/src/LocalPlayer.java b/src/LocalPlayer.java new file mode 100644 index 0000000..686b874 --- /dev/null +++ b/src/LocalPlayer.java @@ -0,0 +1,4 @@ +public class LocalPlayer extends Player { + + +} \ No newline at end of file diff --git a/src/Ship.java b/src/Ship.java new file mode 100644 index 0000000..2a5155a --- /dev/null +++ b/src/Ship.java @@ -0,0 +1,24 @@ +import java.awt.Point; + +public class Ship { + /* + - size : int + - horizontal : bool + - position : Point + - name : String + - button : ShipButton + + + + setPosition(Point) : void + + */ + int size; + boolean horizontal; + Point position; + String name; + + public void setPosition(Point pos) { + // raum für gedanken und die Methode + } + +} diff --git a/src/SpecificAiPlayer1.java b/src/SpecificAiPlayer1.java new file mode 100644 index 0000000..7a85970 --- /dev/null +++ b/src/SpecificAiPlayer1.java @@ -0,0 +1,21 @@ + +public class SpecificAiPlayer1 extends AiPlayer{ + + private boolean myTurn; + private boolean isServer; + private boolean waitingForResponse; + private Player enemy; + private String name; + private Board board; + + + public SpecificAiPlayer1() { + Board board = new Board(); + this.board = board; + } + + public void setBoardSize(int s) { + this.board.setSize(s); + this.board.initBoard(); + } +} From b9a0a21503b42dc2f6e43e96ac739eb751cb7f5b Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Tue, 12 Nov 2024 15:18:16 +0100 Subject: [PATCH 02/20] fix some player stuff --- src/AiPlayer.java | 2 +- src/HitResponseType.java | 2 +- src/HumanPlayer.java | 8 -------- src/Player.java | 12 ++++++------ src/SpecificAiPlayer1.java | 8 -------- 5 files changed, 8 insertions(+), 24 deletions(-) diff --git a/src/AiPlayer.java b/src/AiPlayer.java index f95b6d1..6343dcd 100644 --- a/src/AiPlayer.java +++ b/src/AiPlayer.java @@ -1,5 +1,5 @@ -public abstract class AiPlayer { +public abstract class AiPlayer extends Player { public void setBoardSize(int s) { // raum für schmerzen diff --git a/src/HitResponseType.java b/src/HitResponseType.java index 51c82a4..4b1237c 100644 --- a/src/HitResponseType.java +++ b/src/HitResponseType.java @@ -1,3 +1,3 @@ public enum HitResponseType { - MISS, SHIP, HIT, SUNK, VICTORY + MISS, HIT, SUNK, VICTORY } diff --git a/src/HumanPlayer.java b/src/HumanPlayer.java index 582d864..eb2e466 100644 --- a/src/HumanPlayer.java +++ b/src/HumanPlayer.java @@ -14,14 +14,6 @@ public class HumanPlayer extends LocalPlayer { */ - private boolean myTurn; - private boolean isServer; - private boolean waitingForResponse; - private Player enemy; - private String name; - private Board board; - - public HumanPlayer() { Board board = new Board(); this.board = board; diff --git a/src/Player.java b/src/Player.java index b298c07..3dbf7c8 100644 --- a/src/Player.java +++ b/src/Player.java @@ -1,12 +1,12 @@ import java.awt.*; public abstract class Player { - private boolean myTurn; - private boolean isServer; - private boolean waitingForResponse; - private Player enemy; - private String name; - private Board board; + protected boolean myTurn; + protected boolean isServer; + protected boolean waitingForResponse; + protected Player enemy; + protected String name; + protected Board board; public void receiveShoot(Point point) { diff --git a/src/SpecificAiPlayer1.java b/src/SpecificAiPlayer1.java index 7a85970..93d8aae 100644 --- a/src/SpecificAiPlayer1.java +++ b/src/SpecificAiPlayer1.java @@ -1,13 +1,5 @@ public class SpecificAiPlayer1 extends AiPlayer{ - - private boolean myTurn; - private boolean isServer; - private boolean waitingForResponse; - private Player enemy; - private String name; - private Board board; - public SpecificAiPlayer1() { Board board = new Board(); From 95a9efa7727197415db961cb3e39344d614da87e Mon Sep 17 00:00:00 2001 From: Joshua Date: Thu, 14 Nov 2024 17:58:52 +0100 Subject: [PATCH 03/20] Seperated code (comments) --- src/HalloSchiffeVersenken.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/HalloSchiffeVersenken.java b/src/HalloSchiffeVersenken.java index eaa1be8..1b35740 100644 --- a/src/HalloSchiffeVersenken.java +++ b/src/HalloSchiffeVersenken.java @@ -1,12 +1,13 @@ public class HalloSchiffeVersenken { public static void main(String[] args) throws InterruptedException { - /*Luccas Methoden - MainMenuModel model = new MainMenuModel(); - MainMenuView view = new MainMenuView(); - MainMenuController controller = new MainMenuController(model, view); -*/ - System.out.println("HelloSchiffeVersenekn"); + //LUCAS CODE + MainMenuModel model = new MainMenuModel(); + MainMenuView view = new MainMenuView(); + MainMenuController controller = new MainMenuController(model, view); + + + //System.out.println("HelloSchiffeVersenekn"); /* System.out.println("sound"); @@ -18,6 +19,8 @@ public class HalloSchiffeVersenken { System.out.println("sound off"); SoundHandler.playSound("hit"); */ + + //JOSHUA CODE startLocalGame huso = new startLocalGame(); } } From 393984343cb30a1a82dca39efa5fe0d48dd21592 Mon Sep 17 00:00:00 2001 From: Kaver Date: Fri, 15 Nov 2024 16:24:38 +0100 Subject: [PATCH 04/20] Grafiken in graphics Ordner verschoben --- {Grafik => graphics}/mainmenubackground.png | Bin {Grafik => graphics}/sound button muted.png | Bin {Grafik => graphics}/sound button.png | Bin src/MainMenuController.java | 2 +- src/MainMenuView.java | 9 +++++---- src/MultiMenuView.java | 6 +++--- 6 files changed, 9 insertions(+), 8 deletions(-) rename {Grafik => graphics}/mainmenubackground.png (100%) rename {Grafik => graphics}/sound button muted.png (100%) rename {Grafik => graphics}/sound button.png (100%) diff --git a/Grafik/mainmenubackground.png b/graphics/mainmenubackground.png similarity index 100% rename from Grafik/mainmenubackground.png rename to graphics/mainmenubackground.png diff --git a/Grafik/sound button muted.png b/graphics/sound button muted.png similarity index 100% rename from Grafik/sound button muted.png rename to graphics/sound button muted.png diff --git a/Grafik/sound button.png b/graphics/sound button.png similarity index 100% rename from Grafik/sound button.png rename to graphics/sound button.png diff --git a/src/MainMenuController.java b/src/MainMenuController.java index 4abc54b..1a58814 100644 --- a/src/MainMenuController.java +++ b/src/MainMenuController.java @@ -17,7 +17,7 @@ public class MainMenuController implements ActionListener { @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == view.getMultiButton()) { - view.closeWindOw(); + view.closeWindow(); MultiMenuModel model = new MultiMenuModel(); MultiMenuView view = new MultiMenuView(); MultiMenuController controller2 = new MultiMenuController(model, view); diff --git a/src/MainMenuView.java b/src/MainMenuView.java index a79fafc..f638bfa 100644 --- a/src/MainMenuView.java +++ b/src/MainMenuView.java @@ -3,13 +3,14 @@ import javax.swing.JFrame; import javax.swing.*; public class MainMenuView { - ImageIcon SoundIcon = new ImageIcon("Grafik/sound button.png"); + ImageIcon SoundIcon = new ImageIcon("graphics/sound button.png"); private JFrame frame = new JFrame(); private JLabel titelLabel = new JLabel("Studium versenken"); private JButton lokalButton = new JButton("Lokal"); private JButton multiButton= new JButton("Multiplayer"); private JButton soundButton = new JButton(SoundIcon); Font robotoFont = new Font("Roboto", Font.BOLD, 45); + public MainMenuView() { buildFrame(); buildComponents(); @@ -33,7 +34,7 @@ public class MainMenuView { frame.setSize(1500,1000); frame.setVisible(true); frame.getContentPane().setBackground( Color.decode("#98F5FF")); - JLabel backgroundLabel = new JLabel(new ImageIcon("Grafik/mainmenubackground.png")); + JLabel backgroundLabel = new JLabel(new ImageIcon("graphics/mainmenubackground.png")); frame.setContentPane(backgroundLabel); frame.add(titelLabel); frame.add(lokalButton); @@ -43,7 +44,7 @@ public class MainMenuView { } public void toggleMute(){ - ImageIcon MuteIcon = new ImageIcon("Grafik/sound button muted.png"); + ImageIcon MuteIcon = new ImageIcon("graphics/sound button muted.png"); if(soundButton.getIcon()==SoundIcon) { soundButton.setIcon(MuteIcon); }else{ @@ -51,7 +52,7 @@ public class MainMenuView { } } - public void closeWindOw(){ + public void closeWindow(){ frame.dispose(); } public JFrame getFrame() { diff --git a/src/MultiMenuView.java b/src/MultiMenuView.java index 6b1b6b0..fa57e2f 100644 --- a/src/MultiMenuView.java +++ b/src/MultiMenuView.java @@ -3,7 +3,7 @@ import javax.swing.JFrame; import javax.swing.*; public class MultiMenuView { - ImageIcon SoundIcon = new ImageIcon("Grafik/sound button.png"); + ImageIcon SoundIcon = new ImageIcon("graphics/sound button.png"); private JFrame frame = new JFrame(); private JButton soundButton = new JButton(SoundIcon); Font robotoFont = new Font("Roboto", Font.BOLD, 45); @@ -24,14 +24,14 @@ public class MultiMenuView { frame.setSize(1500,1000); frame.setVisible(true); frame.getContentPane().setBackground( Color.decode("#98F5FF")); - JLabel backgroundLabel = new JLabel(new ImageIcon("Grafik/mainmenubackground.png")); + JLabel backgroundLabel = new JLabel(new ImageIcon("graphics/mainmenubackground.png")); frame.setContentPane(backgroundLabel); frame.add(soundButton); frame.setLocationRelativeTo(null); } public void toggleMute(){ - ImageIcon MuteIcon = new ImageIcon("Grafik/sound button muted.png"); + ImageIcon MuteIcon = new ImageIcon("graphics/sound button muted.png"); if(soundButton.getIcon()==SoundIcon) { soundButton.setIcon(MuteIcon); }else{ From 016ef2a317ecdb9e326c430fab8d8e9393d2e1a0 Mon Sep 17 00:00:00 2001 From: Joshua Date: Fri, 15 Nov 2024 16:26:30 +0100 Subject: [PATCH 05/20] Test --- src/startLocalGame.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/startLocalGame.java b/src/startLocalGame.java index 66212b4..c3c63b0 100644 --- a/src/startLocalGame.java +++ b/src/startLocalGame.java @@ -10,6 +10,8 @@ public class startLocalGame { ImageIcon backButtonIcon = new ImageIcon("graphics/backButton.png"); ImageIcon humanPlayerIcon = new ImageIcon("graphics/humanPlayer.png"); ImageIcon aiPlayerIcon = new ImageIcon("graphics/aiPlayer.png"); + //Lustiger Test + //System.out.println("!"); // Frame JFrame frame = new JFrame("Lokales Spiel"); From ce4995fb94e3fe8ed3c5e5e75b4991f1056aa9ce Mon Sep 17 00:00:00 2001 From: ole Date: Fri, 15 Nov 2024 17:35:35 +0100 Subject: [PATCH 06/20] add Shoot logik and Structure for backend --- src/AiPlayer.java | 4 +- src/Board.java | 99 ++++++++++++++++++----------- src/GameController.java | 27 ++------ src/HalloSchiffeVersenken.java | 6 -- src/HitResponse.java | 15 +++-- src/HumanPlayer.java | 23 +------ src/LocalPlayer.java | 4 ++ src/Player.java | 18 +++++- src/Ship.java | 110 ++++++++++++++++++++++++++++----- src/SpecificAiPlayer1.java | 10 +-- 10 files changed, 198 insertions(+), 118 deletions(-) diff --git a/src/AiPlayer.java b/src/AiPlayer.java index 6343dcd..06db3f0 100644 --- a/src/AiPlayer.java +++ b/src/AiPlayer.java @@ -1,7 +1,7 @@ public abstract class AiPlayer extends Player { - public void setBoardSize(int s) { - // raum für schmerzen + public AiPlayer(int size) { + super(size); } } diff --git a/src/Board.java b/src/Board.java index 73564c9..c2c1112 100644 --- a/src/Board.java +++ b/src/Board.java @@ -1,43 +1,72 @@ +import java.awt.*; import java.util.List; public class Board { -/* - - hits : List - - ships : List - - size : int - - display : BoardDisplay -*/ - /* - * + hit(HitResponse) - * + click(Point) : void - */ - - List hits; - List ships; - int size; - - public Board() { - // MISS,SHIP, HIT - // MISS bedeutet nichts auf der Position vorhanden - // SHIP bedeutet ungetroffenes Schiff auf der Position vorhanden - // HIT bedeutet getroffenes Schiff auf der Position vorhanden - - } - - public void setSize(int s) { - this.size = s; - } - - public void initBoard() { + private List hits; + private List ships; + private final int size; - for (int i=0;size>i;i++) { - for (int j=0;size>j;j++) { - HitResponse missPos = new HitResponse(); - missPos.setHitResponse(HitResponseType.MISS); - missPos.setPoint(i,j); - hits.add(missPos); + + public Board(int size) { + this.size = size; + this.createShip(size - 13); + } + + public HitResponse hit (Point point){ + HitResponse response = new HitResponse(HitResponseType.MISS,point); + for (int i = 0; i < this.ships.size(); i++) { + HitResponseType type = this.ships.get(i).shootOnShip(point); + if ( type == HitResponseType.SUNK) { + for (int ii = 0; i < this.ships.size(); ii++) { + if (!this.ships.get(ii).isSunk()) { + response.setType(type); + this.addHits(response); + return response; + } + } + response.setType(HitResponseType.VICTORY); + this.addHits(response); + return response; + } else if (type == HitResponseType.HIT) { + response.setType(type); + this.addHits(response); + return response; } } + + this.addHits(response); + return response; } -} \ No newline at end of file + + private void createShip(int semester){ + List shipData = Ship.semeterList.get(semester -1); + for (int i = 0; i < shipData.size(); i++) { + this.ships.add(new Ship(shipData.get(i).size(), shipData.get(i).name())); + } + } + + public List getShips() { + return ships; + } + + public boolean addHits(HitResponse hitResponse) { + if (this.getHitResponsOnPoint(hitResponse.getPoint()) == null){ + this.hits.add(hitResponse); + return true; + } + return false; + } + + public HitResponse getHitResponsOnPoint(Point point) { + for (int i = 0; i < this.hits.size(); i++){ + if (this.hits.get(i).getPoint().equals(point)){ + return this.hits.get(i); + } + } + return null; + } + + +} + diff --git a/src/GameController.java b/src/GameController.java index a452755..797def8 100644 --- a/src/GameController.java +++ b/src/GameController.java @@ -5,27 +5,12 @@ public class GameController { // fuck you Luca and Ole von Florian und nicht von Florian } - public void startLocalGame(HumanPlayer player, AiPlayer enemy, int size) { - //Player initialisieren Board - player.setBoardSize(size); - enemy.setBoardSize(size); - - // Schiffe setzen - // für player durch UI - - /* - * Todo - * enemy.setships(); - */ - - boolean condition = true; - while(condition) { - //Gameloop bis Sieger - //WIP - break; - - } + public void startLocalGame(Class localPlayerClass, Class enemyClass, int size) throws InstantiationException, IllegalAccessException { - } + LocalPlayer localPlayer = localPlayerClass.newInstance(); + AiPlayer aiPlayer = enemyClass.newInstance(); + localPlayer.setEnemy(aiPlayer); + aiPlayer.setEnemy(localPlayer); + } } \ No newline at end of file diff --git a/src/HalloSchiffeVersenken.java b/src/HalloSchiffeVersenken.java index 8450b7d..8072168 100644 --- a/src/HalloSchiffeVersenken.java +++ b/src/HalloSchiffeVersenken.java @@ -1,14 +1,8 @@ public class HalloSchiffeVersenken { public static void main(String[] args) throws InterruptedException { - int default_size = 14; - HumanPlayer player = new HumanPlayer(); - AiPlayer enemy = new SpecificAiPlayer1(); // auswählen hehe. mal gucken und viel spaßßß - GameController game_controller = new GameController(); - game_controller.startLocalGame(player, enemy, default_size); // default_size oder auswählen, viel spaß - /* System.out.println("HelloSchiffeVersenekn"); System.out.println("sound"); diff --git a/src/HitResponse.java b/src/HitResponse.java index b913c3c..bc9fca0 100644 --- a/src/HitResponse.java +++ b/src/HitResponse.java @@ -3,18 +3,21 @@ import java.awt.*; public class HitResponse { private HitResponseType type; private Point point; + + public HitResponse(HitResponseType type, Point point) { + this.type = type; + this.point = point; + } public HitResponseType getHitResponse() { return this.type; } - public void setHitResponse(HitResponseType a) { - this.type = a; - } - + public Point getPoint() { return this.point; } - public void setPoint(int x, int y) { - this.point = new Point(x,y); + + public void setType(HitResponseType type) { + this.type = type; } } diff --git a/src/HumanPlayer.java b/src/HumanPlayer.java index eb2e466..6723e71 100644 --- a/src/HumanPlayer.java +++ b/src/HumanPlayer.java @@ -1,26 +1,7 @@ public class HumanPlayer extends LocalPlayer { - /* - - myTurn : bool - - isServer : bool - - waitingForResponse : bool - - enemy : Player - - name : String - - board : Board - + receiveShoot(Point) : void - + receiveHit(HitResponse) : void - + click(Point) : void - + beginTurn() : void - */ - - public HumanPlayer() { - Board board = new Board(); - this.board = board; - } - - public void setBoardSize(int s) { - this.board.setSize(s); - this.board.initBoard(); + public HumanPlayer(int size) { + super(size); } } diff --git a/src/LocalPlayer.java b/src/LocalPlayer.java index 686b874..cfa7cab 100644 --- a/src/LocalPlayer.java +++ b/src/LocalPlayer.java @@ -1,4 +1,8 @@ public class LocalPlayer extends Player { + + LocalPlayer(int size) { + super(size); + } } \ No newline at end of file diff --git a/src/Player.java b/src/Player.java index 3dbf7c8..192b3f4 100644 --- a/src/Player.java +++ b/src/Player.java @@ -1,4 +1,5 @@ import java.awt.*; +import java.util.List; public abstract class Player { protected boolean myTurn; @@ -8,12 +9,21 @@ public abstract class Player { protected String name; protected Board board; - public void receiveShoot(Point point) { + public Player(int size) { + this.board = new Board(size); + } + public void receiveShoot(Point point) { + HitResponse hitResponse = board.getHitResponsOnPoint(point); + if (!(hitResponse == null)){ + enemy.receiveHit(hitResponse); + } else { + enemy.receiveHit(this.board.hit(point)); + } } public void receiveHit(HitResponse hitResponse) { - + enemy.board.addHits(hitResponse); } public void click(Point point) { @@ -23,4 +33,8 @@ public abstract class Player { public void beginTrun() { } + + public void setEnemy(Player enemy) { + this.enemy = enemy; + } } diff --git a/src/Ship.java b/src/Ship.java index 2a5155a..08db6b6 100644 --- a/src/Ship.java +++ b/src/Ship.java @@ -1,24 +1,100 @@ import java.awt.Point; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +record ShipData (int size, String name){ +} public class Ship { - /* - - size : int - - horizontal : bool - - position : Point - - name : String - - button : ShipButton - - - + setPosition(Point) : void + static List> semeterList = Arrays.asList(Arrays.asList( + new ShipData(2, "PRG 1"), + new ShipData(2, "GDI"), + new ShipData(2, "MAT 1"), + new ShipData(2, "THI"), + new ShipData(4, "STP"), + new ShipData(6, "ENG")), + Arrays.asList( + new ShipData(2, "PRG 2"), + new ShipData(2, "DBS 1"), + new ShipData(2, "MAT 2"), + new ShipData(2, "STA"), + new ShipData(2, "AUD")), + Arrays.asList( + new ShipData(2, "PRG 3"), + new ShipData(2, "DBS 2"), + new ShipData(2, "MAT 3"), + new ShipData(2, "BSN 1"), + new ShipData(4, "PRP"), + new ShipData(6, "BWL")), + Arrays.asList( + new ShipData(2, "WEB"), + new ShipData(2, "SE 1"), + new ShipData(2, "CG 1"), + new ShipData(2, "BSN 2"), + new ShipData(4, "SEM"), + new ShipData(6, "E BWL")), + Arrays.asList( + new ShipData(2, "WPF 1"), + new ShipData(2, "SE 2"), + new ShipData(2, "CG 2"), + new ShipData(2, "PXP 1"), + new ShipData(6, "EF 1")), + Arrays.asList( + new ShipData(2, "WPF 2"), + new ShipData(1, "PXP 2"), + new ShipData(8, "BAA")) + ); - */ - int size; - boolean horizontal; - Point position; - String name; - - public void setPosition(Point pos) { - // raum für gedanken und die Methode + private int size; + private boolean horizontal; + private Point position; + private String name; + private int hitsOnMe; + private boolean sunk; + + public Ship (int size, String name) { + this.size = size; + this.name = name; + this.horizontal = false; + this.position = null; + this.hitsOnMe = 0; + this.sunk = false; } + public boolean setPosition(Point pos) { + //TODO Conte abrfrage ob shif da sein darf + this.position = pos; + return true; + } + + public Point getPosition() { + return position; + } + + public boolean isShipOnPos(Point pos){ + if ((this.horizontal && pos.y == this.position.y && pos.x >= this.position.x && pos.x < this.position.x + size) || + (!(this.horizontal) && pos.x == this.position.x && pos.y >= this.position.y && pos.y < this.position.y + size)) { + return true; + } + return false; + } + + public HitResponseType shootOnShip(Point pos) { + if (this.isShipOnPos(pos)) { + hitsOnMe++; + if (hitsOnMe >= size) { + this.sunk = true; + return HitResponseType.SUNK; + } else { + return HitResponseType.HIT; + } + } else { + return HitResponseType.MISS; + } + } + + public boolean isSunk() { + return sunk; + } } diff --git a/src/SpecificAiPlayer1.java b/src/SpecificAiPlayer1.java index 93d8aae..0bcce8c 100644 --- a/src/SpecificAiPlayer1.java +++ b/src/SpecificAiPlayer1.java @@ -1,13 +1,7 @@ public class SpecificAiPlayer1 extends AiPlayer{ - public SpecificAiPlayer1() { - Board board = new Board(); - this.board = board; - } - - public void setBoardSize(int s) { - this.board.setSize(s); - this.board.initBoard(); + public SpecificAiPlayer1(int size) { + super(size); } } From 15d5a67c3837052d7dc46b730438f1594fc177a5 Mon Sep 17 00:00:00 2001 From: Joshua Date: Fri, 15 Nov 2024 18:18:21 +0100 Subject: [PATCH 07/20] Continued work on startLocalGame and started work startMultiplayerGame --- src/HalloSchiffeVersenken.java | 6 +- src/startLocalGame.java | 104 ++++++++++++++++++++++++++++++++- 2 files changed, 105 insertions(+), 5 deletions(-) diff --git a/src/HalloSchiffeVersenken.java b/src/HalloSchiffeVersenken.java index 1b35740..8486151 100644 --- a/src/HalloSchiffeVersenken.java +++ b/src/HalloSchiffeVersenken.java @@ -2,10 +2,11 @@ public class HalloSchiffeVersenken { public static void main(String[] args) throws InterruptedException { //LUCAS CODE + /* MainMenuModel model = new MainMenuModel(); MainMenuView view = new MainMenuView(); MainMenuController controller = new MainMenuController(model, view); - +*/ //System.out.println("HelloSchiffeVersenekn"); @@ -21,6 +22,7 @@ public class HalloSchiffeVersenken { */ //JOSHUA CODE - startLocalGame huso = new startLocalGame(); + //startLocalGame localTest = new startLocalGame(); + //startMultiplayerGame multiplayerTest = new startMultiplayerGame(); } } diff --git a/src/startLocalGame.java b/src/startLocalGame.java index c3c63b0..c3464d8 100644 --- a/src/startLocalGame.java +++ b/src/startLocalGame.java @@ -2,16 +2,24 @@ import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +/* + TODO: + Back Button führt ins vorherige Fenster + Start geht ins nächste Fenster + Gebrauchte Attribute werden übergeben (Semester Spielername etc.) + Klasse mit Controller aufteilen + */ + public class startLocalGame { // Funktionshilfen int semesterCounter = 1; // Semester Counter Label + String leftPlayerNickname = "Spieler 1"; + String rightPlayerNickname = "Spieler 2"; // Grafiken ImageIcon backButtonIcon = new ImageIcon("graphics/backButton.png"); ImageIcon humanPlayerIcon = new ImageIcon("graphics/humanPlayer.png"); ImageIcon aiPlayerIcon = new ImageIcon("graphics/aiPlayer.png"); - //Lustiger Test - //System.out.println("!"); // Frame JFrame frame = new JFrame("Lokales Spiel"); @@ -38,6 +46,7 @@ public class startLocalGame { // Textfelder JTextField leftPlayerTextField = new JTextField(20); JTextField rightPlayerTextField = new JTextField(20); + startLocalGame() { // Erstelle Frame frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); @@ -102,6 +111,20 @@ public class startLocalGame { frame.add(rightPlayerTextField); // ActionListener für die Buttons + + //ZUSATZ + leftPlayerTextField.setText(leftPlayerNickname); + rightPlayerTextField.setText(rightPlayerNickname); + + // STARTBUTTON + startButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + startMultiplayerGame huso = new startMultiplayerGame(); + } + }); + + // SEMESTERBUTTONS semesterUpButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -122,6 +145,80 @@ public class startLocalGame { } }); + // PLAYERTOGGLEBUTTONS + + leftPlayerLeftButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + toggleLeftPlayerIcon(); + updateTextFields(); + } + }); + + leftPlayerRightButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + toggleLeftPlayerIcon(); + updateTextFields(); + } + }); + + rightPlayerLeftButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + toggleRightPlayerIcon(); + updateTextFields(); + } + }); + + rightPlayerRightButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + toggleRightPlayerIcon(); + updateTextFields(); + } + }); + + frame.setVisible(true); + } + + // TOGGLE METHODEN + // TODO Müssen evtl vergrößert werden je nach schwierigkeitsgraden + // dazu evt. übergabeparameter für links rechts gedrückt + private void toggleLeftPlayerIcon() { + if (leftPlayerIcon.getIcon() == humanPlayerIcon) { + leftPlayerIcon.setIcon(aiPlayerIcon); + } else { + leftPlayerIcon.setIcon(humanPlayerIcon); + } + } + + private void toggleRightPlayerIcon() { + if (rightPlayerIcon.getIcon() == humanPlayerIcon) { + rightPlayerIcon.setIcon(aiPlayerIcon); + } else { + rightPlayerIcon.setIcon(humanPlayerIcon); + } + } + + // Methode zum Aktualisieren der Textfelder basierend auf den ausgewählten Icons + private void updateTextFields() { + // Linker Spieler + if (leftPlayerIcon.getIcon() == humanPlayerIcon) { + leftPlayerTextField.setText(leftPlayerNickname); + } else { + leftPlayerTextField.setText("Leicht"); + } + + // Rechter Spieler + if (rightPlayerIcon.getIcon() == humanPlayerIcon) { + rightPlayerTextField.setText(rightPlayerNickname); + } else { + rightPlayerTextField.setText("Leicht"); + } + } + + /* POTENTIELL VERALTET leftPlayerLeftButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -171,5 +268,6 @@ public class startLocalGame { }); frame.setVisible(true); + */ } -} + From fe942ab66014ce4d5bb00b6fe4d450dd389d3c4c Mon Sep 17 00:00:00 2001 From: Joshua Date: Fri, 15 Nov 2024 18:18:28 +0100 Subject: [PATCH 08/20] Continued work on startLocalGame and started work startMultiplayerGame --- src/startMultiplayerGame.java | 215 ++++++++++++++++++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 src/startMultiplayerGame.java diff --git a/src/startMultiplayerGame.java b/src/startMultiplayerGame.java new file mode 100644 index 0000000..f184d68 --- /dev/null +++ b/src/startMultiplayerGame.java @@ -0,0 +1,215 @@ +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +/* + TODO: + Back Button führt ins vorherige Fenster + Spiel erstellen/beitreten geht ins nächste Fenster + Gebrauchte Attribute werden übergeben (Semester Spielername etc.) + Klasse mit Controller aufteilen +*/ + +public class startMultiplayerGame { + // Funktionshilfen + int semesterCounter = 1; // Semester Counter Label + String PlayerNickname = "Spieler 1"; + + // Grafiken + ImageIcon backButtonIcon = new ImageIcon("graphics/backButton.png"); + ImageIcon humanPlayerIcon = new ImageIcon("graphics/humanPlayer.png"); + ImageIcon aiPlayerIcon = new ImageIcon("graphics/aiPlayer.png"); + + // Frame + JFrame frame = new JFrame("Multiplayer Spiel"); + + // Labels + JLabel frameTitle = new JLabel("Multiplayer Spiel"); + JLabel semesterlable = new JLabel("Semester"); + JLabel PlayerName = new JLabel("Name"); + JLabel PlayerIcon = new JLabel(humanPlayerIcon); + JLabel semesterCounterLabel = new JLabel(String.valueOf(semesterCounter)); + + // Buttons + JButton backButton = new JButton(backButtonIcon); + JButton PlayerLeftButton = new JButton("<-"); + JButton PlayerRightButton = new JButton("->"); + JButton semesterUpButton = new JButton("^"); + JButton semesterDownButton = new JButton("v"); + JButton createGameButton = new JButton("Spiel erstellen"); + JButton joinGameButton = new JButton("Spiel beitreten"); + + // Textfelder + JTextField PlayerTextField = new JTextField(20); + + startMultiplayerGame() { + // Erstelle Frame + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(1500, 1000); + + // Layout Manager (absolute ositionierung) + frame.setLayout(null); + + // Erstelle Label + frameTitle.setBounds(20, 20, 200, 30); + frame.add(frameTitle); + + semesterlable.setBounds(700, 300, 200, 30); + frame.add(semesterlable); + + PlayerName.setBounds(50, 625, 200, 30); + frame.add(PlayerName); + + PlayerIcon.setBounds(75, 400, 200, 128); + frame.add(PlayerIcon); + + semesterCounterLabel.setBounds(725, 475, 50, 50); // zwischen den Up/Down-Buttons + semesterCounterLabel.setHorizontalAlignment(SwingConstants.CENTER); + frame.add(semesterCounterLabel); + + // Erstellt Buttons + backButton.setBounds(1380, 20, 80, 80); + frame.add(backButton); + + PlayerLeftButton.setBounds(50, 450, 50, 50); + frame.add(PlayerLeftButton); + + PlayerRightButton.setBounds(250, 450, 50, 50); + frame.add(PlayerRightButton); + + semesterUpButton.setBounds(725, 400, 50, 50); + frame.add(semesterUpButton); + + semesterDownButton.setBounds(725, 550, 50, 50); + frame.add(semesterDownButton); + + joinGameButton.setBounds(1100, 350, 200, 50); + frame.add(joinGameButton); + + createGameButton.setBounds(1100, 550, 200, 50); + frame.add(createGameButton); + + // Erstellt Textfelder + PlayerTextField.setBounds(50, 650, 250, 50); + frame.add(PlayerTextField); + + //ZUSATZ + PlayerTextField.setText(PlayerNickname); + + // ActionListener für die Buttons + // SEMESTERBUTTONS + semesterUpButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (semesterCounter < 6) { + semesterCounter++; + semesterCounterLabel.setText(String.valueOf(semesterCounter)); + } + } + }); + + semesterDownButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (semesterCounter > 1) { // Verhindert, dass der Wert unter 1 fällt + semesterCounter--; + semesterCounterLabel.setText(String.valueOf(semesterCounter)); + } + } + }); + + // PLAYERTOGGLEBUTTONS + + PlayerLeftButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + toggleLeftPlayerIcon(); + updateTextFields(); + } + }); + + PlayerRightButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + toggleLeftPlayerIcon(); + updateTextFields(); + } + }); + + frame.setVisible(true); + } + + // TOGGLE METHODEN + // TODO Müssen evtl vergrößert werden je nach schwierigkeitsgraden + // dazu evt. übergabeparameter für links rechts gedrückt + private void toggleLeftPlayerIcon() { + if (PlayerIcon.getIcon() == humanPlayerIcon) { + PlayerIcon.setIcon(aiPlayerIcon); + } else { + PlayerIcon.setIcon(humanPlayerIcon); + } + } + + private void updateTextFields() { + // Linker Spieler + if (PlayerIcon.getIcon() == humanPlayerIcon) { + PlayerTextField.setText(PlayerNickname); + } else { + PlayerTextField.setText("Leicht"); + } + } + + /* POTENTIELL VERALTET + leftPlayerLeftButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + ImageIcon MuteIcon = new ImageIcon("Grafik/sound button muted.png"); + if(leftPlayerIcon.getIcon()==humanPlayerIcon) { + leftPlayerIcon.setIcon(aiPlayerIcon); + }else{ + leftPlayerIcon.setIcon(humanPlayerIcon); + } + } + }); + + leftPlayerRightButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + ImageIcon MuteIcon = new ImageIcon("Grafik/sound button muted.png"); + if(leftPlayerIcon.getIcon()==humanPlayerIcon) { + leftPlayerIcon.setIcon(aiPlayerIcon); + }else{ + leftPlayerIcon.setIcon(humanPlayerIcon); + } + } + }); + + rightPlayerLeftButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + ImageIcon MuteIcon = new ImageIcon("Grafik/sound button muted.png"); + if(rightPlayerIcon.getIcon()==humanPlayerIcon) { + rightPlayerIcon.setIcon(aiPlayerIcon); + }else{ + rightPlayerIcon.setIcon(humanPlayerIcon); + } + } + }); + + rightPlayerRightButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + ImageIcon MuteIcon = new ImageIcon("Grafik/sound button muted.png"); + if(rightPlayerIcon.getIcon()==humanPlayerIcon) { + rightPlayerIcon.setIcon(aiPlayerIcon); + }else{ + rightPlayerIcon.setIcon(humanPlayerIcon); + } + } + }); + + frame.setVisible(true); + */ +} + + From a11885c76d5fc2f160666a61b2fb6c0f82389429 Mon Sep 17 00:00:00 2001 From: Kaver Date: Fri, 15 Nov 2024 18:34:05 +0100 Subject: [PATCH 09/20] =?UTF-8?q?Transission=20von=20Main=20zu=20MultiMenu?= =?UTF-8?q?=20angepasst=20Panels=20eingef=C3=BChrt=20anstatt=20neue=20Fram?= =?UTF-8?q?es=20zu=20=C3=B6ffnen=20MainmenuController=20angepasst?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/HalloSchiffeVersenken.java | 3 +- src/MainMenuController.java | 11 ++++--- src/MainMenuView.java | 55 +++++++++++++++++++++++----------- src/MultiMenuView.java | 35 ++++++++++++---------- 4 files changed, 64 insertions(+), 40 deletions(-) diff --git a/src/HalloSchiffeVersenken.java b/src/HalloSchiffeVersenken.java index 8486151..8e79372 100644 --- a/src/HalloSchiffeVersenken.java +++ b/src/HalloSchiffeVersenken.java @@ -2,11 +2,10 @@ public class HalloSchiffeVersenken { public static void main(String[] args) throws InterruptedException { //LUCAS CODE - /* MainMenuModel model = new MainMenuModel(); MainMenuView view = new MainMenuView(); MainMenuController controller = new MainMenuController(model, view); -*/ + //System.out.println("HelloSchiffeVersenekn"); diff --git a/src/MainMenuController.java b/src/MainMenuController.java index 1a58814..3fe165b 100644 --- a/src/MainMenuController.java +++ b/src/MainMenuController.java @@ -17,13 +17,12 @@ public class MainMenuController implements ActionListener { @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == view.getMultiButton()) { - view.closeWindow(); - MultiMenuModel model = new MultiMenuModel(); - MultiMenuView view = new MultiMenuView(); - MultiMenuController controller2 = new MultiMenuController(model, view); - } else if (e.getSource() == view.getMultiButton()) { model.setGameMode("Multiplayer"); - JOptionPane.showMessageDialog(view.getFrame(), "Multiplayer game selected."); + MultiMenuModel multiModel = new MultiMenuModel(); + MultiMenuView multiView = new MultiMenuView(); + MultiMenuController multiMenuController = new MultiMenuController(multiModel, multiView); + view.addPanel(multiView.getPanel(), "MultiMenu"); + view.showPanel("MultiMenu"); }else if (e.getSource() == view.getSoundButton()) { view.toggleMute(); } diff --git a/src/MainMenuView.java b/src/MainMenuView.java index f638bfa..513ea4b 100644 --- a/src/MainMenuView.java +++ b/src/MainMenuView.java @@ -3,6 +3,8 @@ import javax.swing.JFrame; import javax.swing.*; public class MainMenuView { + private JPanel mainPanel = new JPanel(new CardLayout()); // CardLayout for switching + private JPanel menuPanel = new JPanel(null); ImageIcon SoundIcon = new ImageIcon("graphics/sound button.png"); private JFrame frame = new JFrame(); private JLabel titelLabel = new JLabel("Studium versenken"); @@ -13,33 +15,52 @@ public class MainMenuView { public MainMenuView() { buildFrame(); - buildComponents(); - + buildPanel(); } + public void buildPanel(){ + mainPanel.add(menuPanel, "MainMenu"); + lokalButton.setBounds(200, 200, 500, 500); + multiButton.setBounds(800, 200, 500, 500); + titelLabel.setBounds(550, 10, 700, 100); + soundButton.setBounds(20, 20, 128, 128); - public void buildComponents(){ - lokalButton.setBounds(200,200,500,500); - multiButton.setBounds(800,200,500,500); - titelLabel.setBounds(550,10,700,100); - soundButton.setBounds(20,20,128,128); titelLabel.setFont(robotoFont); lokalButton.setFont(robotoFont.deriveFont(50f)); multiButton.setFont(robotoFont.deriveFont(50f)); + + menuPanel.add(titelLabel); + menuPanel.add(lokalButton); + menuPanel.add(multiButton); + menuPanel.add(soundButton); + + // mainPanel.add(menuPanel, "MainMenu"); + } + + public void showPanel(String panelName) { + CardLayout cl = (CardLayout)mainPanel.getLayout(); + cl.show(mainPanel, panelName); + } + + public void addPanel(JPanel panel, String name) { + mainPanel.add(panel, name); // Neue Panels hinzufuegen } public void buildFrame() { - frame.setLayout(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setSize(1500,1000); - frame.setVisible(true); - frame.getContentPane().setBackground( Color.decode("#98F5FF")); + frame.setSize(1500, 1000); + frame.setLayout(null); + JLabel backgroundLabel = new JLabel(new ImageIcon("graphics/mainmenubackground.png")); - frame.setContentPane(backgroundLabel); - frame.add(titelLabel); - frame.add(lokalButton); - frame.add(multiButton); - frame.add(soundButton); + backgroundLabel.setBounds(0, 0, 1500, 1000); + mainPanel.setBounds(0, 0, 1500, 1000); + mainPanel.setOpaque(true); + + frame.setContentPane(new JPanel(null)); + frame.getContentPane().add(backgroundLabel); + frame.getContentPane().add(mainPanel); + + frame.setVisible(true); frame.setLocationRelativeTo(null); } @@ -53,7 +74,7 @@ public class MainMenuView { } public void closeWindow(){ - frame.dispose(); + frame.setVisible(false); } public JFrame getFrame() { return frame; diff --git a/src/MultiMenuView.java b/src/MultiMenuView.java index fa57e2f..f03d96e 100644 --- a/src/MultiMenuView.java +++ b/src/MultiMenuView.java @@ -3,31 +3,24 @@ import javax.swing.JFrame; import javax.swing.*; public class MultiMenuView { + private JPanel mainPanel = new JPanel(new CardLayout()); // CardLayout for switching + private JPanel multiPanel = new JPanel(null); ImageIcon SoundIcon = new ImageIcon("graphics/sound button.png"); private JFrame frame = new JFrame(); private JButton soundButton = new JButton(SoundIcon); Font robotoFont = new Font("Roboto", Font.BOLD, 45); public MultiMenuView() { - buildFrame(); - buildComponents(); - + buildPanel(); } - public void buildComponents(){ + public void buildPanel(){ soundButton.setBounds(20,20,128,128); - } - public void buildFrame() { - frame.setLayout(null); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setSize(1500,1000); - frame.setVisible(true); - frame.getContentPane().setBackground( Color.decode("#98F5FF")); - JLabel backgroundLabel = new JLabel(new ImageIcon("graphics/mainmenubackground.png")); - frame.setContentPane(backgroundLabel); - frame.add(soundButton); - frame.setLocationRelativeTo(null); + mainPanel.add(multiPanel, "MultiMenu"); + soundButton.setFont(robotoFont.deriveFont(50f)); + + multiPanel.add(soundButton); } public void toggleMute(){ @@ -38,6 +31,18 @@ public class MultiMenuView { soundButton.setIcon(SoundIcon); } } + public JPanel getPanel() { + return multiPanel; + } + + public void showPanel(String panelName) { + CardLayout cl = (CardLayout)mainPanel.getLayout(); + cl.show(multiPanel, panelName); + } + + public void addPanel(JPanel panel, String name) { + multiPanel.add(panel, name); + } public void closeWindOw(){ frame.dispose(); From f7326a57d9474e381d220312269c93046647dcb2 Mon Sep 17 00:00:00 2001 From: Joshua Date: Sat, 16 Nov 2024 15:26:52 +0100 Subject: [PATCH 10/20] Added coinToss.java, first attempts integrating cardlayout in startLocalGame.java and startMultiplayerGame.java --- .idea/uiDesigner.xml | 124 ++++++++++++++++++++++++++++++++++ src/coinToss.java | 103 ++++++++++++++++++++++++++++ src/startLocalGame.java | 94 +++++++------------------- src/startMultiplayerGame.java | 110 ++++++++---------------------- 4 files changed, 279 insertions(+), 152 deletions(-) create mode 100644 .idea/uiDesigner.xml create mode 100644 src/coinToss.java diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/coinToss.java b/src/coinToss.java new file mode 100644 index 0000000..b044e3e --- /dev/null +++ b/src/coinToss.java @@ -0,0 +1,103 @@ +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class coinToss { + // Frame + private JFrame frame = new JFrame("Zugreihenfolge"); + private JPanel mainPanel = new JPanel(new CardLayout()); // Panel mit CardLayout für Szenenwechsel + private JLabel frameTitle = new JLabel("Zugreihenfolge", SwingConstants.CENTER); + private JLabel messageLabel = new JLabel("", SwingConstants.CENTER); // Label für die Nachricht + private int reihenfolge = 1; // Beispielhaft: 1 = Spieler 1 fängt an, 0 = Spieler 2 fängt an + private Timer timer; + + coinToss() { + // Erstelle Frame + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(1500, 1000); + frame.setLocationRelativeTo(null); + + // Panel für die Startszene erstellen + JPanel startPanel = new JPanel(); + startPanel.setLayout(new BorderLayout()); + + // Nachricht basierend auf 'reihenfolge' einstellen + String startMessage = (reihenfolge == 1) + ? "Du fängst an, mach dich bereit..." + : "Dein Gegner fängt an, mach dich bereit..."; + messageLabel.setText(startMessage); + messageLabel.setFont(new Font("Arial", Font.BOLD, 24)); + startPanel.add(frameTitle, BorderLayout.NORTH); + startPanel.add(messageLabel, BorderLayout.CENTER); + + // Panel zur Haupt-Panel hinzufügen + mainPanel.add(startPanel, "start"); + + // Beispielhaftes "Spielfeld" (nächste Szene) + JPanel gamePanel = new JPanel(); + gamePanel.setLayout(new BorderLayout()); + JLabel gameLabel = new JLabel("Das Spiel beginnt!", SwingConstants.CENTER); + gameLabel.setFont(new Font("Arial", Font.BOLD, 36)); + gamePanel.add(gameLabel, BorderLayout.CENTER); + + // GamePanel zu Haupt-Panel hinzufügen + mainPanel.add(gamePanel, "game"); + + // Frame-Layout einstellen + frame.add(mainPanel); + frame.setVisible(true); + + // Timer starten + startTimer(); + } + + private void startTimer() { + // Timer, der nach 3 Sekunden zum Spiel-Panel wechselt + timer = new Timer(3000, new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + // Wechsel zum Spiel-Panel + CardLayout cardLayout = (CardLayout) mainPanel.getLayout(); + cardLayout.show(mainPanel, "game"); + timer.stop(); // Timer stoppen + } + }); + timer.setRepeats(false); // Timer soll nur einmal ablaufen + timer.start(); // Timer starten + } +} + + + + + +/* +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + + + TODO: + + + +public class coinToss { + // Funktionshilfen + + + // Frame + JFrame frame = new JFrame("Zugreihenfolge"); + + // Labels + JLabel frameTitle = new JLabel("Zugreihenfolge"); + + coinToss() { + // Erstelle Frame + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(1500, 1000); + + // Layout Manager (absolute ositionierung) + frame.setLayout(null); + } +}*/ \ No newline at end of file diff --git a/src/startLocalGame.java b/src/startLocalGame.java index c3464d8..9142325 100644 --- a/src/startLocalGame.java +++ b/src/startLocalGame.java @@ -1,15 +1,8 @@ import javax.swing.*; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -/* - TODO: - Back Button führt ins vorherige Fenster - Start geht ins nächste Fenster - Gebrauchte Attribute werden übergeben (Semester Spielername etc.) - Klasse mit Controller aufteilen - */ - public class startLocalGame { // Funktionshilfen int semesterCounter = 1; // Semester Counter Label @@ -23,6 +16,11 @@ public class startLocalGame { // Frame JFrame frame = new JFrame("Lokales Spiel"); + JPanel mainPanel = new JPanel(new CardLayout()); + + // Panels + JPanel localGamePanel = new JPanel(); // Panel für das lokale Spiel + startMultiplayerGame multiplayerGame = new startMultiplayerGame(); // Instanziere Multiplayer-Klasse // Labels JLabel frameTitle = new JLabel("Lokales Spiel"); @@ -51,10 +49,15 @@ public class startLocalGame { // Erstelle Frame frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(1500, 1000); + frame.setLayout(new BorderLayout()); // Haupt-Layout + frame.add(mainPanel, BorderLayout.CENTER); - // Layout Manager (absolute ositionierung) + // Layout Manager (absolute positionierung) frame.setLayout(null); + // Lokales Spiel Panel erstellen + localGamePanel.setLayout(null); + // Erstelle Label frameTitle.setBounds(20, 20, 200, 30); frame.add(frameTitle); @@ -110,17 +113,24 @@ public class startLocalGame { rightPlayerTextField.setBounds(1200, 650, 250, 50); frame.add(rightPlayerTextField); - // ActionListener für die Buttons - //ZUSATZ leftPlayerTextField.setText(leftPlayerNickname); rightPlayerTextField.setText(rightPlayerNickname); - // STARTBUTTON + // Panels zum CardLayout hinzufügen + mainPanel.add(localGamePanel, "localGame"); + + // Multiplayer-Panel erstellen und hinzufügen + JPanel multiplayerGamePanel = multiplayerGame.createMultiplayerPanel((CardLayout) mainPanel.getLayout(), mainPanel); + mainPanel.add(multiplayerGamePanel, "multiplayerGame"); + + // ActionListener für den Start-Button startButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - startMultiplayerGame huso = new startMultiplayerGame(); + // Wechsel zum Multiplayer-Panel + CardLayout cardLayout = (CardLayout) mainPanel.getLayout(); + cardLayout.show(mainPanel, "multiplayerGame"); } }); @@ -146,7 +156,6 @@ public class startLocalGame { }); // PLAYERTOGGLEBUTTONS - leftPlayerLeftButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -183,8 +192,6 @@ public class startLocalGame { } // TOGGLE METHODEN - // TODO Müssen evtl vergrößert werden je nach schwierigkeitsgraden - // dazu evt. übergabeparameter für links rechts gedrückt private void toggleLeftPlayerIcon() { if (leftPlayerIcon.getIcon() == humanPlayerIcon) { leftPlayerIcon.setIcon(aiPlayerIcon); @@ -217,57 +224,4 @@ public class startLocalGame { rightPlayerTextField.setText("Leicht"); } } - - /* POTENTIELL VERALTET - leftPlayerLeftButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - ImageIcon MuteIcon = new ImageIcon("Grafik/sound button muted.png"); - if(leftPlayerIcon.getIcon()==humanPlayerIcon) { - leftPlayerIcon.setIcon(aiPlayerIcon); - }else{ - leftPlayerIcon.setIcon(humanPlayerIcon); - } - } - }); - - leftPlayerRightButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - ImageIcon MuteIcon = new ImageIcon("Grafik/sound button muted.png"); - if(leftPlayerIcon.getIcon()==humanPlayerIcon) { - leftPlayerIcon.setIcon(aiPlayerIcon); - }else{ - leftPlayerIcon.setIcon(humanPlayerIcon); - } - } - }); - - rightPlayerLeftButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - ImageIcon MuteIcon = new ImageIcon("Grafik/sound button muted.png"); - if(rightPlayerIcon.getIcon()==humanPlayerIcon) { - rightPlayerIcon.setIcon(aiPlayerIcon); - }else{ - rightPlayerIcon.setIcon(humanPlayerIcon); - } - } - }); - - rightPlayerRightButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - ImageIcon MuteIcon = new ImageIcon("Grafik/sound button muted.png"); - if(rightPlayerIcon.getIcon()==humanPlayerIcon) { - rightPlayerIcon.setIcon(aiPlayerIcon); - }else{ - rightPlayerIcon.setIcon(humanPlayerIcon); - } - } - }); - - frame.setVisible(true); - */ - } - +} diff --git a/src/startMultiplayerGame.java b/src/startMultiplayerGame.java index f184d68..2ead3f1 100644 --- a/src/startMultiplayerGame.java +++ b/src/startMultiplayerGame.java @@ -1,4 +1,5 @@ import javax.swing.*; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -20,9 +21,6 @@ public class startMultiplayerGame { ImageIcon humanPlayerIcon = new ImageIcon("graphics/humanPlayer.png"); ImageIcon aiPlayerIcon = new ImageIcon("graphics/aiPlayer.png"); - // Frame - JFrame frame = new JFrame("Multiplayer Spiel"); - // Labels JLabel frameTitle = new JLabel("Multiplayer Spiel"); JLabel semesterlable = new JLabel("Semester"); @@ -42,56 +40,54 @@ public class startMultiplayerGame { // Textfelder JTextField PlayerTextField = new JTextField(20); - startMultiplayerGame() { - // Erstelle Frame - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setSize(1500, 1000); - - // Layout Manager (absolute ositionierung) - frame.setLayout(null); + // Method to create the Multiplayer Panel + public JPanel createMultiplayerPanel(CardLayout cardLayout, JPanel mainPanel) { + // Create a new JPanel for the multiplayer game + JPanel multiplayerPanel = new JPanel(); + multiplayerPanel.setLayout(null); // Erstelle Label frameTitle.setBounds(20, 20, 200, 30); - frame.add(frameTitle); + multiplayerPanel.add(frameTitle); semesterlable.setBounds(700, 300, 200, 30); - frame.add(semesterlable); + multiplayerPanel.add(semesterlable); PlayerName.setBounds(50, 625, 200, 30); - frame.add(PlayerName); + multiplayerPanel.add(PlayerName); PlayerIcon.setBounds(75, 400, 200, 128); - frame.add(PlayerIcon); + multiplayerPanel.add(PlayerIcon); semesterCounterLabel.setBounds(725, 475, 50, 50); // zwischen den Up/Down-Buttons semesterCounterLabel.setHorizontalAlignment(SwingConstants.CENTER); - frame.add(semesterCounterLabel); + multiplayerPanel.add(semesterCounterLabel); // Erstellt Buttons backButton.setBounds(1380, 20, 80, 80); - frame.add(backButton); + multiplayerPanel.add(backButton); PlayerLeftButton.setBounds(50, 450, 50, 50); - frame.add(PlayerLeftButton); + multiplayerPanel.add(PlayerLeftButton); PlayerRightButton.setBounds(250, 450, 50, 50); - frame.add(PlayerRightButton); + multiplayerPanel.add(PlayerRightButton); semesterUpButton.setBounds(725, 400, 50, 50); - frame.add(semesterUpButton); + multiplayerPanel.add(semesterUpButton); semesterDownButton.setBounds(725, 550, 50, 50); - frame.add(semesterDownButton); + multiplayerPanel.add(semesterDownButton); joinGameButton.setBounds(1100, 350, 200, 50); - frame.add(joinGameButton); + multiplayerPanel.add(joinGameButton); createGameButton.setBounds(1100, 550, 200, 50); - frame.add(createGameButton); + multiplayerPanel.add(createGameButton); // Erstellt Textfelder PlayerTextField.setBounds(50, 650, 250, 50); - frame.add(PlayerTextField); + multiplayerPanel.add(PlayerTextField); //ZUSATZ PlayerTextField.setText(PlayerNickname); @@ -119,7 +115,6 @@ public class startMultiplayerGame { }); // PLAYERTOGGLEBUTTONS - PlayerLeftButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -136,12 +131,18 @@ public class startMultiplayerGame { } }); - frame.setVisible(true); + // ActionListener für den "Back" Button, um zum vorherigen Panel zurückzukehren + backButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + cardLayout.show(mainPanel, "localGamePanel"); + } + }); + + return multiplayerPanel; } // TOGGLE METHODEN - // TODO Müssen evtl vergrößert werden je nach schwierigkeitsgraden - // dazu evt. übergabeparameter für links rechts gedrückt private void toggleLeftPlayerIcon() { if (PlayerIcon.getIcon() == humanPlayerIcon) { PlayerIcon.setIcon(aiPlayerIcon); @@ -151,65 +152,10 @@ public class startMultiplayerGame { } private void updateTextFields() { - // Linker Spieler if (PlayerIcon.getIcon() == humanPlayerIcon) { PlayerTextField.setText(PlayerNickname); } else { PlayerTextField.setText("Leicht"); } } - - /* POTENTIELL VERALTET - leftPlayerLeftButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - ImageIcon MuteIcon = new ImageIcon("Grafik/sound button muted.png"); - if(leftPlayerIcon.getIcon()==humanPlayerIcon) { - leftPlayerIcon.setIcon(aiPlayerIcon); - }else{ - leftPlayerIcon.setIcon(humanPlayerIcon); - } - } - }); - - leftPlayerRightButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - ImageIcon MuteIcon = new ImageIcon("Grafik/sound button muted.png"); - if(leftPlayerIcon.getIcon()==humanPlayerIcon) { - leftPlayerIcon.setIcon(aiPlayerIcon); - }else{ - leftPlayerIcon.setIcon(humanPlayerIcon); - } - } - }); - - rightPlayerLeftButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - ImageIcon MuteIcon = new ImageIcon("Grafik/sound button muted.png"); - if(rightPlayerIcon.getIcon()==humanPlayerIcon) { - rightPlayerIcon.setIcon(aiPlayerIcon); - }else{ - rightPlayerIcon.setIcon(humanPlayerIcon); - } - } - }); - - rightPlayerRightButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - ImageIcon MuteIcon = new ImageIcon("Grafik/sound button muted.png"); - if(rightPlayerIcon.getIcon()==humanPlayerIcon) { - rightPlayerIcon.setIcon(aiPlayerIcon); - }else{ - rightPlayerIcon.setIcon(humanPlayerIcon); - } - } - }); - - frame.setVisible(true); - */ } - - From 5bedfddc60f2c016576ef8829fe4cd2d00f60873 Mon Sep 17 00:00:00 2001 From: Kaver Date: Mon, 18 Nov 2024 18:20:48 +0100 Subject: [PATCH 11/20] Erste Anpassungen an Multiplayermenu (sehr grob) diverse alte ungenutzte Methoden entfernt --- src/HalloSchiffeVersenken.java | 2 +- src/MainMenuController.java | 2 +- src/MainMenuView.java | 12 +++-- src/MultiMenuController.java | 7 +-- src/MultiMenuView.java | 91 ++++++++++++++++++++++------------ 5 files changed, 71 insertions(+), 43 deletions(-) diff --git a/src/HalloSchiffeVersenken.java b/src/HalloSchiffeVersenken.java index 8e79372..519e799 100644 --- a/src/HalloSchiffeVersenken.java +++ b/src/HalloSchiffeVersenken.java @@ -21,7 +21,7 @@ public class HalloSchiffeVersenken { */ //JOSHUA CODE - //startLocalGame localTest = new startLocalGame(); + startLocalGame localTest = new startLocalGame(); //startMultiplayerGame multiplayerTest = new startMultiplayerGame(); } } diff --git a/src/MainMenuController.java b/src/MainMenuController.java index 3fe165b..d7c1611 100644 --- a/src/MainMenuController.java +++ b/src/MainMenuController.java @@ -21,7 +21,7 @@ public class MainMenuController implements ActionListener { MultiMenuModel multiModel = new MultiMenuModel(); MultiMenuView multiView = new MultiMenuView(); MultiMenuController multiMenuController = new MultiMenuController(multiModel, multiView); - view.addPanel(multiView.getPanel(), "MultiMenu"); + view.addPanel(multiView.getMultiPanel(), "MultiMenu"); view.showPanel("MultiMenu"); }else if (e.getSource() == view.getSoundButton()) { view.toggleMute(); diff --git a/src/MainMenuView.java b/src/MainMenuView.java index 513ea4b..34d4838 100644 --- a/src/MainMenuView.java +++ b/src/MainMenuView.java @@ -25,6 +25,11 @@ public class MainMenuView { titelLabel.setBounds(550, 10, 700, 100); soundButton.setBounds(20, 20, 128, 128); + lokalButton.setOpaque(true); + multiButton.setOpaque(true); + titelLabel.setOpaque(true); + soundButton.setOpaque(true); + titelLabel.setFont(robotoFont); lokalButton.setFont(robotoFont.deriveFont(50f)); multiButton.setFont(robotoFont.deriveFont(50f)); @@ -34,7 +39,7 @@ public class MainMenuView { menuPanel.add(multiButton); menuPanel.add(soundButton); - // mainPanel.add(menuPanel, "MainMenu"); + //mainPanel.add(menuPanel, "MainMenu"); } public void showPanel(String panelName) { @@ -54,7 +59,7 @@ public class MainMenuView { JLabel backgroundLabel = new JLabel(new ImageIcon("graphics/mainmenubackground.png")); backgroundLabel.setBounds(0, 0, 1500, 1000); mainPanel.setBounds(0, 0, 1500, 1000); - mainPanel.setOpaque(true); + // mainPanel.setOpaque(true); frame.setContentPane(new JPanel(null)); frame.getContentPane().add(backgroundLabel); @@ -73,9 +78,6 @@ public class MainMenuView { } } - public void closeWindow(){ - frame.setVisible(false); - } public JFrame getFrame() { return frame; } diff --git a/src/MultiMenuController.java b/src/MultiMenuController.java index ea97136..79d8dfb 100644 --- a/src/MultiMenuController.java +++ b/src/MultiMenuController.java @@ -9,13 +9,14 @@ public class MultiMenuController implements ActionListener { public MultiMenuController(MultiMenuModel model, MultiMenuView view) { this.view = view; this.model = model; - this.view.getSoundButton().addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { - if (e.getSource() == view.getSoundButton()) { - view.toggleMute(); + if (e.getSource() == view.getPlayerLeftButton()){ + view.togglePlayerIcon(); + }else if(e.getSource() == view.getPlayerRightButton()){ + view.togglePlayerIcon(); } } } \ No newline at end of file diff --git a/src/MultiMenuView.java b/src/MultiMenuView.java index f03d96e..b5e7fec 100644 --- a/src/MultiMenuView.java +++ b/src/MultiMenuView.java @@ -3,56 +3,81 @@ import javax.swing.JFrame; import javax.swing.*; public class MultiMenuView { - private JPanel mainPanel = new JPanel(new CardLayout()); // CardLayout for switching + int semesterCounter = 1; private JPanel multiPanel = new JPanel(null); - ImageIcon SoundIcon = new ImageIcon("graphics/sound button.png"); - private JFrame frame = new JFrame(); - private JButton soundButton = new JButton(SoundIcon); - Font robotoFont = new Font("Roboto", Font.BOLD, 45); + + private ImageIcon humanPlayerIcon = new ImageIcon("graphics/humanPlayer.png"); + private ImageIcon aiPlayerIcon = new ImageIcon("graphics/aiPlayer.png"); + + JButton PlayerLeftButton = new JButton("<-"); + JButton PlayerRightButton = new JButton("->"); + JButton semesterUpButton = new JButton("^"); + JButton semesterDownButton = new JButton("v"); + + JLabel semesterLabel = new JLabel("Semester"); + private JLabel titelLabel = new JLabel("Multiplayer"); + private JLabel PlayerIcon = new JLabel(humanPlayerIcon); + private JLabel PlayerName = new JLabel("Name"); + private JTextField PlayerTextField = new JTextField(20); + JLabel semesterCounterLabel = new JLabel(String.valueOf(semesterCounter)); + + private Font robotoFont = new Font("Roboto", Font.BOLD, 45); public MultiMenuView() { buildPanel(); } public void buildPanel(){ - soundButton.setBounds(20,20,128,128); + titelLabel.setBounds(20,20,700,100); + PlayerIcon.setBounds(75, 400, 200, 128); + PlayerName.setBounds(50, 625, 200, 30); + PlayerTextField.setBounds(50, 650, 250, 50); + semesterCounterLabel.setBounds(725, 475, 50, 50); // zwischen den Up/Down-Buttons + PlayerLeftButton.setBounds(50, 450, 50, 50); + PlayerRightButton.setBounds(250, 450, 50, 50); + semesterLabel.setBounds(500, 400, 200, 30); + semesterUpButton.setBounds(700, 400, 50, 50); + semesterDownButton.setBounds(700, 550, 50, 50); - mainPanel.add(multiPanel, "MultiMenu"); - soundButton.setFont(robotoFont.deriveFont(50f)); - multiPanel.add(soundButton); + multiPanel.setLayout(null); + titelLabel.setFont(robotoFont.deriveFont(50f)); + semesterLabel.setFont(robotoFont.deriveFont(20f)); + + multiPanel.add(PlayerName); + multiPanel.add(titelLabel); + multiPanel.add(PlayerIcon); + multiPanel.add(PlayerTextField); + multiPanel.add(semesterCounterLabel); + multiPanel.add(semesterUpButton); + multiPanel.add(semesterDownButton); + multiPanel.add(PlayerLeftButton); + multiPanel.add(PlayerRightButton); + multiPanel.add(semesterLabel); } - public void toggleMute(){ - ImageIcon MuteIcon = new ImageIcon("graphics/sound button muted.png"); - if(soundButton.getIcon()==SoundIcon) { - soundButton.setIcon(MuteIcon); - }else{ - soundButton.setIcon(SoundIcon); - } - } - public JPanel getPanel() { + public JPanel getMultiPanel() { return multiPanel; } - public void showPanel(String panelName) { - CardLayout cl = (CardLayout)mainPanel.getLayout(); - cl.show(multiPanel, panelName); + //public void showMultiPanel(String panelName) { + // CardLayout cl = (CardLayout)mainPanel.getLayout(); + // cl.show(multiPanel, panelName); + //} + + public void togglePlayerIcon() { + if (PlayerIcon.getIcon() == humanPlayerIcon) { + PlayerIcon.setIcon(aiPlayerIcon); + } else { + PlayerIcon.setIcon(humanPlayerIcon); + } } - public void addPanel(JPanel panel, String name) { - multiPanel.add(panel, name); + public JButton getPlayerLeftButton() { + return PlayerLeftButton; } - public void closeWindOw(){ - frame.dispose(); + public JButton getPlayerRightButton() { + return PlayerRightButton; } - public JFrame getFrame() { - return frame; - } - - public JButton getSoundButton() { - return soundButton; - } - } From d95df0cf5fbbc90eb17eff8989d61a4ce3f53f12 Mon Sep 17 00:00:00 2001 From: Kaver Date: Tue, 19 Nov 2024 13:39:43 +0100 Subject: [PATCH 12/20] Minimale Anpassung an Actionlistener fuer MainMenu zu LocalGame --- src/HalloSchiffeVersenken.java | 9 +++++---- src/MainMenuController.java | 5 +++++ src/startLocalGame.java | 3 +++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/HalloSchiffeVersenken.java b/src/HalloSchiffeVersenken.java index 519e799..cd1f2c1 100644 --- a/src/HalloSchiffeVersenken.java +++ b/src/HalloSchiffeVersenken.java @@ -2,9 +2,10 @@ public class HalloSchiffeVersenken { public static void main(String[] args) throws InterruptedException { //LUCAS CODE - MainMenuModel model = new MainMenuModel(); - MainMenuView view = new MainMenuView(); - MainMenuController controller = new MainMenuController(model, view); + coinToss ct = new coinToss(); + //MainMenuModel model = new MainMenuModel(); + //MainMenuView view = new MainMenuView(); + //MainMenuController controller = new MainMenuController(model, view); //System.out.println("HelloSchiffeVersenekn"); @@ -21,7 +22,7 @@ public class HalloSchiffeVersenken { */ //JOSHUA CODE - startLocalGame localTest = new startLocalGame(); + //startLocalGame localTest = new startLocalGame(); //startMultiplayerGame multiplayerTest = new startMultiplayerGame(); } } diff --git a/src/MainMenuController.java b/src/MainMenuController.java index d7c1611..e866efe 100644 --- a/src/MainMenuController.java +++ b/src/MainMenuController.java @@ -25,6 +25,11 @@ public class MainMenuController implements ActionListener { view.showPanel("MultiMenu"); }else if (e.getSource() == view.getSoundButton()) { view.toggleMute(); + }else if(e.getSource() == view.getLocalButton()) { + model.setGameMode("LocalGame"); + startLocalGame localGame = new startLocalGame(); + view.addPanel(localGame.getLocalPanel(), "LocalMenu"); + view.showPanel("LocalMenu"); } } } \ No newline at end of file diff --git a/src/startLocalGame.java b/src/startLocalGame.java index 9142325..6a60ceb 100644 --- a/src/startLocalGame.java +++ b/src/startLocalGame.java @@ -224,4 +224,7 @@ public class startLocalGame { rightPlayerTextField.setText("Leicht"); } } + public JPanel getLocalPanel() { + return localGamePanel; + } } From 607004a3b3f44d32fab350c50aad667f05670c01 Mon Sep 17 00:00:00 2001 From: Joshua Date: Tue, 19 Nov 2024 14:24:09 +0100 Subject: [PATCH 13/20] Added test classes for CardLayout and GameBoard.java --- src/GameBoard.java | 3 +++ src/LocalGamePanel.java | 23 ++++++++++++++++++ src/MainFrame.java | 46 +++++++++++++++++++++++++++++++++++ src/MainMenuPanel.java | 32 ++++++++++++++++++++++++ src/MultiplayerGamePanel.java | 23 ++++++++++++++++++ 5 files changed, 127 insertions(+) create mode 100644 src/GameBoard.java create mode 100644 src/LocalGamePanel.java create mode 100644 src/MainFrame.java create mode 100644 src/MainMenuPanel.java create mode 100644 src/MultiplayerGamePanel.java diff --git a/src/GameBoard.java b/src/GameBoard.java new file mode 100644 index 0000000..61bdb72 --- /dev/null +++ b/src/GameBoard.java @@ -0,0 +1,3 @@ +public class GameBoard { + +} diff --git a/src/LocalGamePanel.java b/src/LocalGamePanel.java new file mode 100644 index 0000000..38dd7d7 --- /dev/null +++ b/src/LocalGamePanel.java @@ -0,0 +1,23 @@ +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class LocalGamePanel extends JPanel { + + public LocalGamePanel(MainFrame frame) { + setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + + JLabel label = new JLabel("Lokales Spiel"); + JButton backButton = new JButton("Zurück zum Hauptmenü"); + backButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + frame.showPanel("MainMenu"); + } + }); + + add(label); + add(Box.createVerticalStrut(20)); + add(backButton); + } +} diff --git a/src/MainFrame.java b/src/MainFrame.java new file mode 100644 index 0000000..e75dec3 --- /dev/null +++ b/src/MainFrame.java @@ -0,0 +1,46 @@ +import javax.swing.*; +import java.awt.*; + +public class MainFrame extends JFrame { + + private CardLayout cardLayout; + private JPanel mainPanel; + + public MainFrame() { + setTitle("Spiel UI mit CardLayout"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setSize(800, 600); + + // Erstelle das CardLayout und das Hauptpanel + cardLayout = new CardLayout(); + mainPanel = new JPanel(cardLayout); + + // Erstelle die verschiedenen Panels + MainMenuPanel mainMenuPanel = new MainMenuPanel(this); + LocalGamePanel localGamePanel = new LocalGamePanel(this); + MultiplayerGamePanel multiplayerGamePanel = new MultiplayerGamePanel(this); + + // Füge die Panels dem CardLayout hinzu + mainPanel.add(mainMenuPanel, "MainMenu"); + mainPanel.add(localGamePanel, "LocalGame"); + mainPanel.add(multiplayerGamePanel, "MultiplayerGame"); + + // Setze das Hauptpanel in das JFrame + add(mainPanel); + + // Zeige das Hauptmenü an + cardLayout.show(mainPanel, "MainMenu"); + } + + // Methode, um die Ansicht zu wechseln + public void showPanel(String panelName) { + cardLayout.show(mainPanel, panelName); + } + + public static void main(String[] args) { + SwingUtilities.invokeLater(() -> { + MainFrame frame = new MainFrame(); + frame.setVisible(true); + }); + } +} diff --git a/src/MainMenuPanel.java b/src/MainMenuPanel.java new file mode 100644 index 0000000..d642f00 --- /dev/null +++ b/src/MainMenuPanel.java @@ -0,0 +1,32 @@ +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class MainMenuPanel extends JPanel { + + public MainMenuPanel(MainFrame frame) { + setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + + // Button für "Lokales Spiel Starten" + JButton localGameButton = new JButton("Lokales Spiel Starten"); + localGameButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + frame.showPanel("LocalGame"); + } + }); + + // Button für "Multiplayer Spiel Starten" + JButton multiplayerButton = new JButton("Multiplayer Spiel Starten"); + multiplayerButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + frame.showPanel("MultiplayerGame"); + } + }); + + add(localGameButton); + add(Box.createVerticalStrut(20)); // Abstand zwischen den Buttons + add(multiplayerButton); + } +} diff --git a/src/MultiplayerGamePanel.java b/src/MultiplayerGamePanel.java new file mode 100644 index 0000000..4955a81 --- /dev/null +++ b/src/MultiplayerGamePanel.java @@ -0,0 +1,23 @@ +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class MultiplayerGamePanel extends JPanel { + + public MultiplayerGamePanel(MainFrame frame) { + setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + + JLabel label = new JLabel("Multiplayer Spiel"); + JButton backButton = new JButton("Zurück zum Hauptmenü"); + backButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + frame.showPanel("MainMenu"); + } + }); + + add(label); + add(Box.createVerticalStrut(20)); + add(backButton); + } +} From a84110a8a8253ffab642a1d2eeb0d5c2444d951a Mon Sep 17 00:00:00 2001 From: Kaver Date: Tue, 19 Nov 2024 15:41:45 +0100 Subject: [PATCH 14/20] Panellogik neu gemacht und dementsprechend views angepasst --- src/HalloSchiffeVersenken.java | 7 +- src/MainFrame.java | 26 ++--- src/MainMenuController.java | 32 +++--- src/MainMenuView.java | 102 ++++++------------- src/startLocalGame.java | 175 ++++++++------------------------- 5 files changed, 104 insertions(+), 238 deletions(-) diff --git a/src/HalloSchiffeVersenken.java b/src/HalloSchiffeVersenken.java index cd1f2c1..8ce7013 100644 --- a/src/HalloSchiffeVersenken.java +++ b/src/HalloSchiffeVersenken.java @@ -2,11 +2,12 @@ public class HalloSchiffeVersenken { public static void main(String[] args) throws InterruptedException { //LUCAS CODE - coinToss ct = new coinToss(); + //coinToss ct = new coinToss(); //MainMenuModel model = new MainMenuModel(); - //MainMenuView view = new MainMenuView(); + //MainMenuView view = new MainMenuView(new MainFrame()); //MainMenuController controller = new MainMenuController(model, view); - + MainFrame mf = new MainFrame(); + mf.setVisible(true); //System.out.println("HelloSchiffeVersenekn"); diff --git a/src/MainFrame.java b/src/MainFrame.java index e75dec3..7213b99 100644 --- a/src/MainFrame.java +++ b/src/MainFrame.java @@ -9,26 +9,26 @@ public class MainFrame extends JFrame { public MainFrame() { setTitle("Spiel UI mit CardLayout"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setSize(800, 600); + setSize(1500, 1000); + setLocationRelativeTo(null); - // Erstelle das CardLayout und das Hauptpanel + // CardLayout und Hauptpanel erstellen cardLayout = new CardLayout(); mainPanel = new JPanel(cardLayout); - // Erstelle die verschiedenen Panels - MainMenuPanel mainMenuPanel = new MainMenuPanel(this); - LocalGamePanel localGamePanel = new LocalGamePanel(this); - MultiplayerGamePanel multiplayerGamePanel = new MultiplayerGamePanel(this); + // Verschiedene Panels erstellen und hinzufügen + MainMenuView mainMenuView = new MainMenuView(this); + startLocalGame localGame = new startLocalGame(this); + startMultiplayerGame multiplayerGame = new startMultiplayerGame(this); - // Füge die Panels dem CardLayout hinzu - mainPanel.add(mainMenuPanel, "MainMenu"); - mainPanel.add(localGamePanel, "LocalGame"); - mainPanel.add(multiplayerGamePanel, "MultiplayerGame"); + mainPanel.add(mainMenuView, "MainMenu"); + mainPanel.add(localGame, "LocalGame"); + mainPanel.add(multiplayerGame, "MultiplayerGame"); - // Setze das Hauptpanel in das JFrame + // Hauptpanel in JFrame hinzufügen add(mainPanel); - // Zeige das Hauptmenü an + // Hauptmenü anzeigen cardLayout.show(mainPanel, "MainMenu"); } @@ -43,4 +43,4 @@ public class MainFrame extends JFrame { frame.setVisible(true); }); } -} +} \ No newline at end of file diff --git a/src/MainMenuController.java b/src/MainMenuController.java index e866efe..7a801ca 100644 --- a/src/MainMenuController.java +++ b/src/MainMenuController.java @@ -9,27 +9,27 @@ public class MainMenuController implements ActionListener { public MainMenuController(MainMenuModel model, MainMenuView view) { this.view = view; this.model = model; - this.view.getLocalButton().addActionListener(this); - this.view.getMultiButton().addActionListener(this); - this.view.getSoundButton().addActionListener(this); + //this.view.getLocalButton().addActionListener(this); + //this.view.getMultiButton().addActionListener(this); + // this.view.getSoundButton().addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { - if (e.getSource() == view.getMultiButton()) { - model.setGameMode("Multiplayer"); - MultiMenuModel multiModel = new MultiMenuModel(); - MultiMenuView multiView = new MultiMenuView(); - MultiMenuController multiMenuController = new MultiMenuController(multiModel, multiView); - view.addPanel(multiView.getMultiPanel(), "MultiMenu"); - view.showPanel("MultiMenu"); - }else if (e.getSource() == view.getSoundButton()) { - view.toggleMute(); - }else if(e.getSource() == view.getLocalButton()) { + //if (e.getSource() == view.getMultiButton()) { + // model.setGameMode("Multiplayer"); + // MultiMenuModel multiModel = new MultiMenuModel(); + // MultiMenuView multiView = new MultiMenuView(); + // MultiMenuController multiMenuController = new MultiMenuController(multiModel, multiView); + // view.addPanel(multiView.getMultiPanel(), "MultiMenu"); + // view.showPanel("MultiMenu"); + // }else if (e.getSource() == view.getSoundButton()) { + // view.toggleMute(); + // }else if(e.getSource() == view.getLocalButton()) { model.setGameMode("LocalGame"); startLocalGame localGame = new startLocalGame(); - view.addPanel(localGame.getLocalPanel(), "LocalMenu"); - view.showPanel("LocalMenu"); + // view.addPanel(localGame.getLocalPanel(), "LocalMenu"); + // view.showPanel("LocalMenu"); } } -} \ No newline at end of file +//} \ No newline at end of file diff --git a/src/MainMenuView.java b/src/MainMenuView.java index 34d4838..958d610 100644 --- a/src/MainMenuView.java +++ b/src/MainMenuView.java @@ -1,97 +1,51 @@ import java.awt.*; +import java.awt.event.ActionEvent; import javax.swing.JFrame; import javax.swing.*; -public class MainMenuView { - private JPanel mainPanel = new JPanel(new CardLayout()); // CardLayout for switching - private JPanel menuPanel = new JPanel(null); - ImageIcon SoundIcon = new ImageIcon("graphics/sound button.png"); - private JFrame frame = new JFrame(); +public class MainMenuView extends JPanel { + private JLabel titelLabel = new JLabel("Studium versenken"); private JButton lokalButton = new JButton("Lokal"); - private JButton multiButton= new JButton("Multiplayer"); - private JButton soundButton = new JButton(SoundIcon); - Font robotoFont = new Font("Roboto", Font.BOLD, 45); + private JButton multiButton = new JButton("Multiplayer"); + private JButton soundButton; - public MainMenuView() { - buildFrame(); - buildPanel(); + Font robotoFont = new Font("Roboto", Font.BOLD, 45); + private ImageIcon soundIcon = new ImageIcon("graphics/sound button.png"); + private ImageIcon muteIcon = new ImageIcon("graphics/sound button muted.png"); + + public MainMenuView(MainFrame frame) { + setLayout(null); + buildPanel(frame); } - public void buildPanel(){ - mainPanel.add(menuPanel, "MainMenu"); + private void buildPanel(MainFrame frame) { lokalButton.setBounds(200, 200, 500, 500); multiButton.setBounds(800, 200, 500, 500); titelLabel.setBounds(550, 10, 700, 100); + soundButton = new JButton(soundIcon); soundButton.setBounds(20, 20, 128, 128); - lokalButton.setOpaque(true); - multiButton.setOpaque(true); - titelLabel.setOpaque(true); - soundButton.setOpaque(true); - titelLabel.setFont(robotoFont); lokalButton.setFont(robotoFont.deriveFont(50f)); multiButton.setFont(robotoFont.deriveFont(50f)); - menuPanel.add(titelLabel); - menuPanel.add(lokalButton); - menuPanel.add(multiButton); - menuPanel.add(soundButton); + add(titelLabel); + add(lokalButton); + add(multiButton); + add(soundButton); - //mainPanel.add(menuPanel, "MainMenu"); + // Event Listener für Buttons + lokalButton.addActionListener(e -> frame.showPanel("LocalGame")); + multiButton.addActionListener(e -> frame.showPanel("MultiplayerGame")); + soundButton.addActionListener(e -> toggleMute()); } - public void showPanel(String panelName) { - CardLayout cl = (CardLayout)mainPanel.getLayout(); - cl.show(mainPanel, panelName); - } - - public void addPanel(JPanel panel, String name) { - mainPanel.add(panel, name); // Neue Panels hinzufuegen - } - - public void buildFrame() { - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setSize(1500, 1000); - frame.setLayout(null); - - JLabel backgroundLabel = new JLabel(new ImageIcon("graphics/mainmenubackground.png")); - backgroundLabel.setBounds(0, 0, 1500, 1000); - mainPanel.setBounds(0, 0, 1500, 1000); - // mainPanel.setOpaque(true); - - frame.setContentPane(new JPanel(null)); - frame.getContentPane().add(backgroundLabel); - frame.getContentPane().add(mainPanel); - - frame.setVisible(true); - frame.setLocationRelativeTo(null); - } - - public void toggleMute(){ - ImageIcon MuteIcon = new ImageIcon("graphics/sound button muted.png"); - if(soundButton.getIcon()==SoundIcon) { - soundButton.setIcon(MuteIcon); - }else{ - soundButton.setIcon(SoundIcon); + private void toggleMute() { + if (soundButton.getIcon() == soundIcon) { + soundButton.setIcon(muteIcon); + } else { + soundButton.setIcon(soundIcon); } } - - public JFrame getFrame() { - return frame; - } - - public JButton getLocalButton() { - return lokalButton; - } - - public JButton getMultiButton() { - return multiButton; - } - - public JButton getSoundButton() { - return soundButton; - } - -} +} \ No newline at end of file diff --git a/src/startLocalGame.java b/src/startLocalGame.java index 6a60ceb..5c6af2b 100644 --- a/src/startLocalGame.java +++ b/src/startLocalGame.java @@ -14,24 +14,15 @@ public class startLocalGame { ImageIcon humanPlayerIcon = new ImageIcon("graphics/humanPlayer.png"); ImageIcon aiPlayerIcon = new ImageIcon("graphics/aiPlayer.png"); - // Frame - JFrame frame = new JFrame("Lokales Spiel"); - JPanel mainPanel = new JPanel(new CardLayout()); - - // Panels - JPanel localGamePanel = new JPanel(); // Panel für das lokale Spiel - startMultiplayerGame multiplayerGame = new startMultiplayerGame(); // Instanziere Multiplayer-Klasse - - // Labels + // Labels und Buttons JLabel frameTitle = new JLabel("Lokales Spiel"); - JLabel semesterlable = new JLabel("Semester"); + JLabel semesterLabel = new JLabel("Semester"); JLabel leftPlayerName = new JLabel("Name"); JLabel rightPlayerName = new JLabel("KI-Level"); JLabel leftPlayerIcon = new JLabel(humanPlayerIcon); JLabel rightPlayerIcon = new JLabel(aiPlayerIcon); JLabel semesterCounterLabel = new JLabel(String.valueOf(semesterCounter)); - // Buttons JButton backButton = new JButton(backButtonIcon); JButton leftPlayerLeftButton = new JButton("<-"); JButton leftPlayerRightButton = new JButton("->"); @@ -41,157 +32,97 @@ public class startLocalGame { JButton rightPlayerRightButton = new JButton("->"); JButton startButton = new JButton("Start!"); - // Textfelder JTextField leftPlayerTextField = new JTextField(20); JTextField rightPlayerTextField = new JTextField(20); - startLocalGame() { - // Erstelle Frame - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setSize(1500, 1000); - frame.setLayout(new BorderLayout()); // Haupt-Layout - frame.add(mainPanel, BorderLayout.CENTER); - - // Layout Manager (absolute positionierung) - frame.setLayout(null); - - // Lokales Spiel Panel erstellen + // Methode zur Erstellung des Panels + public JPanel createLocalGamePanel(CardLayout cardLayout, JPanel mainPanel) { + JPanel localGamePanel = new JPanel(); localGamePanel.setLayout(null); - // Erstelle Label + // Setze Komponentenpositionen frameTitle.setBounds(20, 20, 200, 30); - frame.add(frameTitle); + localGamePanel.add(frameTitle); - semesterlable.setBounds(700, 300, 200, 30); - frame.add(semesterlable); + semesterLabel.setBounds(700, 300, 200, 30); + localGamePanel.add(semesterLabel); leftPlayerName.setBounds(50, 625, 200, 30); - frame.add(leftPlayerName); + localGamePanel.add(leftPlayerName); rightPlayerName.setBounds(1200, 625, 200, 30); - frame.add(rightPlayerName); + localGamePanel.add(rightPlayerName); leftPlayerIcon.setBounds(75, 400, 200, 128); - frame.add(leftPlayerIcon); + localGamePanel.add(leftPlayerIcon); rightPlayerIcon.setBounds(1225, 400, 200, 128); - frame.add(rightPlayerIcon); + localGamePanel.add(rightPlayerIcon); - semesterCounterLabel.setBounds(725, 475, 50, 50); // zwischen den Up/Down-Buttons + semesterCounterLabel.setBounds(725, 475, 50, 50); semesterCounterLabel.setHorizontalAlignment(SwingConstants.CENTER); - frame.add(semesterCounterLabel); + localGamePanel.add(semesterCounterLabel); - // Erstellt Buttons backButton.setBounds(1380, 20, 80, 80); - frame.add(backButton); + localGamePanel.add(backButton); leftPlayerLeftButton.setBounds(50, 450, 50, 50); - frame.add(leftPlayerLeftButton); + localGamePanel.add(leftPlayerLeftButton); leftPlayerRightButton.setBounds(250, 450, 50, 50); - frame.add(leftPlayerRightButton); + localGamePanel.add(leftPlayerRightButton); semesterUpButton.setBounds(725, 400, 50, 50); - frame.add(semesterUpButton); + localGamePanel.add(semesterUpButton); semesterDownButton.setBounds(725, 550, 50, 50); - frame.add(semesterDownButton); + localGamePanel.add(semesterDownButton); rightPlayerLeftButton.setBounds(1200, 450, 50, 50); - frame.add(rightPlayerLeftButton); + localGamePanel.add(rightPlayerLeftButton); rightPlayerRightButton.setBounds(1400, 450, 50, 50); - frame.add(rightPlayerRightButton); + localGamePanel.add(rightPlayerRightButton); startButton.setBounds(700, 750, 100, 50); - frame.add(startButton); + localGamePanel.add(startButton); - // Erstellt Textfelder leftPlayerTextField.setBounds(50, 650, 250, 50); - frame.add(leftPlayerTextField); + leftPlayerTextField.setText(leftPlayerNickname); + localGamePanel.add(leftPlayerTextField); rightPlayerTextField.setBounds(1200, 650, 250, 50); - frame.add(rightPlayerTextField); - - //ZUSATZ - leftPlayerTextField.setText(leftPlayerNickname); rightPlayerTextField.setText(rightPlayerNickname); + localGamePanel.add(rightPlayerTextField); - // Panels zum CardLayout hinzufügen - mainPanel.add(localGamePanel, "localGame"); - - // Multiplayer-Panel erstellen und hinzufügen - JPanel multiplayerGamePanel = multiplayerGame.createMultiplayerPanel((CardLayout) mainPanel.getLayout(), mainPanel); - mainPanel.add(multiplayerGamePanel, "multiplayerGame"); - - // ActionListener für den Start-Button - startButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - // Wechsel zum Multiplayer-Panel - CardLayout cardLayout = (CardLayout) mainPanel.getLayout(); - cardLayout.show(mainPanel, "multiplayerGame"); + // ActionListener für Buttons + semesterUpButton.addActionListener(e -> { + if (semesterCounter < 6) { + semesterCounter++; + semesterCounterLabel.setText(String.valueOf(semesterCounter)); } }); - // SEMESTERBUTTONS - semesterUpButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (semesterCounter < 6) { - semesterCounter++; - semesterCounterLabel.setText(String.valueOf(semesterCounter)); - } + semesterDownButton.addActionListener(e -> { + if (semesterCounter > 1) { + semesterCounter--; + semesterCounterLabel.setText(String.valueOf(semesterCounter)); } }); - semesterDownButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (semesterCounter > 1) { // Verhindert, dass der Wert unter 1 fällt - semesterCounter--; - semesterCounterLabel.setText(String.valueOf(semesterCounter)); - } - } - }); + leftPlayerLeftButton.addActionListener(e -> toggleLeftPlayerIcon()); + leftPlayerRightButton.addActionListener(e -> toggleLeftPlayerIcon()); - // PLAYERTOGGLEBUTTONS - leftPlayerLeftButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - toggleLeftPlayerIcon(); - updateTextFields(); - } - }); + rightPlayerLeftButton.addActionListener(e -> toggleRightPlayerIcon()); + rightPlayerRightButton.addActionListener(e -> toggleRightPlayerIcon()); - leftPlayerRightButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - toggleLeftPlayerIcon(); - updateTextFields(); - } - }); + backButton.addActionListener(e -> cardLayout.show(mainPanel, "MainMenu")); - rightPlayerLeftButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - toggleRightPlayerIcon(); - updateTextFields(); - } - }); + startButton.addActionListener(e -> cardLayout.show(mainPanel, "multiplayerGame")); - rightPlayerRightButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - toggleRightPlayerIcon(); - updateTextFields(); - } - }); - - frame.setVisible(true); + return localGamePanel; } - // TOGGLE METHODEN private void toggleLeftPlayerIcon() { if (leftPlayerIcon.getIcon() == humanPlayerIcon) { leftPlayerIcon.setIcon(aiPlayerIcon); @@ -207,24 +138,4 @@ public class startLocalGame { rightPlayerIcon.setIcon(humanPlayerIcon); } } - - // Methode zum Aktualisieren der Textfelder basierend auf den ausgewählten Icons - private void updateTextFields() { - // Linker Spieler - if (leftPlayerIcon.getIcon() == humanPlayerIcon) { - leftPlayerTextField.setText(leftPlayerNickname); - } else { - leftPlayerTextField.setText("Leicht"); - } - - // Rechter Spieler - if (rightPlayerIcon.getIcon() == humanPlayerIcon) { - rightPlayerTextField.setText(rightPlayerNickname); - } else { - rightPlayerTextField.setText("Leicht"); - } - } - public JPanel getLocalPanel() { - return localGamePanel; - } -} +} \ No newline at end of file From 8069315c15032a2c8cb59746eebc72e8601574b6 Mon Sep 17 00:00:00 2001 From: Joshua Date: Tue, 19 Nov 2024 16:25:52 +0100 Subject: [PATCH 15/20] Implemented CardLayout into startMultiplayerGame, startLocalGame, MainMenuView. Implemented MainFrame. --- src/LocalGamePanel.java | 23 -------- src/MainMenuController.java | 2 +- src/MainMenuPanel.java | 32 ---------- src/MultiplayerGamePanel.java | 23 -------- src/startLocalGame.java | 49 +++++++-------- src/startMultiplayerGame.java | 108 ++++++++++++---------------------- 6 files changed, 61 insertions(+), 176 deletions(-) delete mode 100644 src/LocalGamePanel.java delete mode 100644 src/MainMenuPanel.java delete mode 100644 src/MultiplayerGamePanel.java diff --git a/src/LocalGamePanel.java b/src/LocalGamePanel.java deleted file mode 100644 index 38dd7d7..0000000 --- a/src/LocalGamePanel.java +++ /dev/null @@ -1,23 +0,0 @@ -import javax.swing.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -public class LocalGamePanel extends JPanel { - - public LocalGamePanel(MainFrame frame) { - setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - - JLabel label = new JLabel("Lokales Spiel"); - JButton backButton = new JButton("Zurück zum Hauptmenü"); - backButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - frame.showPanel("MainMenu"); - } - }); - - add(label); - add(Box.createVerticalStrut(20)); - add(backButton); - } -} diff --git a/src/MainMenuController.java b/src/MainMenuController.java index 7a801ca..c0ddcb1 100644 --- a/src/MainMenuController.java +++ b/src/MainMenuController.java @@ -27,7 +27,7 @@ public class MainMenuController implements ActionListener { // view.toggleMute(); // }else if(e.getSource() == view.getLocalButton()) { model.setGameMode("LocalGame"); - startLocalGame localGame = new startLocalGame(); + //startLocalGame localGame = new startLocalGame(); // view.addPanel(localGame.getLocalPanel(), "LocalMenu"); // view.showPanel("LocalMenu"); } diff --git a/src/MainMenuPanel.java b/src/MainMenuPanel.java deleted file mode 100644 index d642f00..0000000 --- a/src/MainMenuPanel.java +++ /dev/null @@ -1,32 +0,0 @@ -import javax.swing.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -public class MainMenuPanel extends JPanel { - - public MainMenuPanel(MainFrame frame) { - setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - - // Button für "Lokales Spiel Starten" - JButton localGameButton = new JButton("Lokales Spiel Starten"); - localGameButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - frame.showPanel("LocalGame"); - } - }); - - // Button für "Multiplayer Spiel Starten" - JButton multiplayerButton = new JButton("Multiplayer Spiel Starten"); - multiplayerButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - frame.showPanel("MultiplayerGame"); - } - }); - - add(localGameButton); - add(Box.createVerticalStrut(20)); // Abstand zwischen den Buttons - add(multiplayerButton); - } -} diff --git a/src/MultiplayerGamePanel.java b/src/MultiplayerGamePanel.java deleted file mode 100644 index 4955a81..0000000 --- a/src/MultiplayerGamePanel.java +++ /dev/null @@ -1,23 +0,0 @@ -import javax.swing.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -public class MultiplayerGamePanel extends JPanel { - - public MultiplayerGamePanel(MainFrame frame) { - setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - - JLabel label = new JLabel("Multiplayer Spiel"); - JButton backButton = new JButton("Zurück zum Hauptmenü"); - backButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - frame.showPanel("MainMenu"); - } - }); - - add(label); - add(Box.createVerticalStrut(20)); - add(backButton); - } -} diff --git a/src/startLocalGame.java b/src/startLocalGame.java index 5c6af2b..04675fa 100644 --- a/src/startLocalGame.java +++ b/src/startLocalGame.java @@ -1,9 +1,7 @@ import javax.swing.*; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -public class startLocalGame { +public class startLocalGame extends JPanel { // Funktionshilfen int semesterCounter = 1; // Semester Counter Label String leftPlayerNickname = "Spieler 1"; @@ -36,64 +34,63 @@ public class startLocalGame { JTextField rightPlayerTextField = new JTextField(20); // Methode zur Erstellung des Panels - public JPanel createLocalGamePanel(CardLayout cardLayout, JPanel mainPanel) { - JPanel localGamePanel = new JPanel(); - localGamePanel.setLayout(null); + startLocalGame(MainFrame frame) { + setLayout(null); // Stelle das Layout des Panels ein // Setze Komponentenpositionen frameTitle.setBounds(20, 20, 200, 30); - localGamePanel.add(frameTitle); + add(frameTitle); semesterLabel.setBounds(700, 300, 200, 30); - localGamePanel.add(semesterLabel); + add(semesterLabel); leftPlayerName.setBounds(50, 625, 200, 30); - localGamePanel.add(leftPlayerName); + add(leftPlayerName); rightPlayerName.setBounds(1200, 625, 200, 30); - localGamePanel.add(rightPlayerName); + add(rightPlayerName); leftPlayerIcon.setBounds(75, 400, 200, 128); - localGamePanel.add(leftPlayerIcon); + add(leftPlayerIcon); rightPlayerIcon.setBounds(1225, 400, 200, 128); - localGamePanel.add(rightPlayerIcon); + add(rightPlayerIcon); semesterCounterLabel.setBounds(725, 475, 50, 50); semesterCounterLabel.setHorizontalAlignment(SwingConstants.CENTER); - localGamePanel.add(semesterCounterLabel); + add(semesterCounterLabel); backButton.setBounds(1380, 20, 80, 80); - localGamePanel.add(backButton); + add(backButton); leftPlayerLeftButton.setBounds(50, 450, 50, 50); - localGamePanel.add(leftPlayerLeftButton); + add(leftPlayerLeftButton); leftPlayerRightButton.setBounds(250, 450, 50, 50); - localGamePanel.add(leftPlayerRightButton); + add(leftPlayerRightButton); semesterUpButton.setBounds(725, 400, 50, 50); - localGamePanel.add(semesterUpButton); + add(semesterUpButton); semesterDownButton.setBounds(725, 550, 50, 50); - localGamePanel.add(semesterDownButton); + add(semesterDownButton); rightPlayerLeftButton.setBounds(1200, 450, 50, 50); - localGamePanel.add(rightPlayerLeftButton); + add(rightPlayerLeftButton); rightPlayerRightButton.setBounds(1400, 450, 50, 50); - localGamePanel.add(rightPlayerRightButton); + add(rightPlayerRightButton); startButton.setBounds(700, 750, 100, 50); - localGamePanel.add(startButton); + add(startButton); leftPlayerTextField.setBounds(50, 650, 250, 50); leftPlayerTextField.setText(leftPlayerNickname); - localGamePanel.add(leftPlayerTextField); + add(leftPlayerTextField); rightPlayerTextField.setBounds(1200, 650, 250, 50); rightPlayerTextField.setText(rightPlayerNickname); - localGamePanel.add(rightPlayerTextField); + add(rightPlayerTextField); // ActionListener für Buttons semesterUpButton.addActionListener(e -> { @@ -116,11 +113,9 @@ public class startLocalGame { rightPlayerLeftButton.addActionListener(e -> toggleRightPlayerIcon()); rightPlayerRightButton.addActionListener(e -> toggleRightPlayerIcon()); - backButton.addActionListener(e -> cardLayout.show(mainPanel, "MainMenu")); + backButton.addActionListener(e -> frame.showPanel("MainMenu")); - startButton.addActionListener(e -> cardLayout.show(mainPanel, "multiplayerGame")); - - return localGamePanel; + startButton.addActionListener(e -> frame.showPanel("MainMenu")); // TODO ECHTE FUNKTION EINFÜGEN } private void toggleLeftPlayerIcon() { diff --git a/src/startMultiplayerGame.java b/src/startMultiplayerGame.java index 2ead3f1..e26df35 100644 --- a/src/startMultiplayerGame.java +++ b/src/startMultiplayerGame.java @@ -1,17 +1,8 @@ import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -/* - TODO: - Back Button führt ins vorherige Fenster - Spiel erstellen/beitreten geht ins nächste Fenster - Gebrauchte Attribute werden übergeben (Semester Spielername etc.) - Klasse mit Controller aufteilen -*/ - -public class startMultiplayerGame { +public class startMultiplayerGame extends JPanel { // Funktionshilfen int semesterCounter = 1; // Semester Counter Label String PlayerNickname = "Spieler 1"; @@ -23,7 +14,7 @@ public class startMultiplayerGame { // Labels JLabel frameTitle = new JLabel("Multiplayer Spiel"); - JLabel semesterlable = new JLabel("Semester"); + JLabel semesterLabel = new JLabel("Semester"); JLabel PlayerName = new JLabel("Name"); JLabel PlayerIcon = new JLabel(humanPlayerIcon); JLabel semesterCounterLabel = new JLabel(String.valueOf(semesterCounter)); @@ -40,106 +31,83 @@ public class startMultiplayerGame { // Textfelder JTextField PlayerTextField = new JTextField(20); - // Method to create the Multiplayer Panel - public JPanel createMultiplayerPanel(CardLayout cardLayout, JPanel mainPanel) { - // Create a new JPanel for the multiplayer game - JPanel multiplayerPanel = new JPanel(); - multiplayerPanel.setLayout(null); + // Konstruktor + startMultiplayerGame(MainFrame frame) { + setLayout(null); // Setze das Layout für das Panel auf null - // Erstelle Label + // Setze Komponentenpositionen und füge sie dem Panel hinzu frameTitle.setBounds(20, 20, 200, 30); - multiplayerPanel.add(frameTitle); + add(frameTitle); - semesterlable.setBounds(700, 300, 200, 30); - multiplayerPanel.add(semesterlable); + semesterLabel.setBounds(700, 300, 200, 30); + add(semesterLabel); PlayerName.setBounds(50, 625, 200, 30); - multiplayerPanel.add(PlayerName); + add(PlayerName); PlayerIcon.setBounds(75, 400, 200, 128); - multiplayerPanel.add(PlayerIcon); + add(PlayerIcon); semesterCounterLabel.setBounds(725, 475, 50, 50); // zwischen den Up/Down-Buttons semesterCounterLabel.setHorizontalAlignment(SwingConstants.CENTER); - multiplayerPanel.add(semesterCounterLabel); + add(semesterCounterLabel); - // Erstellt Buttons + // Füge Buttons hinzu und setze ihre Positionen backButton.setBounds(1380, 20, 80, 80); - multiplayerPanel.add(backButton); + add(backButton); PlayerLeftButton.setBounds(50, 450, 50, 50); - multiplayerPanel.add(PlayerLeftButton); + add(PlayerLeftButton); PlayerRightButton.setBounds(250, 450, 50, 50); - multiplayerPanel.add(PlayerRightButton); + add(PlayerRightButton); semesterUpButton.setBounds(725, 400, 50, 50); - multiplayerPanel.add(semesterUpButton); + add(semesterUpButton); semesterDownButton.setBounds(725, 550, 50, 50); - multiplayerPanel.add(semesterDownButton); + add(semesterDownButton); joinGameButton.setBounds(1100, 350, 200, 50); - multiplayerPanel.add(joinGameButton); + add(joinGameButton); createGameButton.setBounds(1100, 550, 200, 50); - multiplayerPanel.add(createGameButton); + add(createGameButton); - // Erstellt Textfelder + // Füge das Textfeld hinzu PlayerTextField.setBounds(50, 650, 250, 50); - multiplayerPanel.add(PlayerTextField); - - //ZUSATZ PlayerTextField.setText(PlayerNickname); + add(PlayerTextField); - // ActionListener für die Buttons + // ActionListener für Buttons // SEMESTERBUTTONS - semesterUpButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (semesterCounter < 6) { - semesterCounter++; - semesterCounterLabel.setText(String.valueOf(semesterCounter)); - } + semesterUpButton.addActionListener(e -> { + if (semesterCounter < 6) { + semesterCounter++; + semesterCounterLabel.setText(String.valueOf(semesterCounter)); } }); - semesterDownButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (semesterCounter > 1) { // Verhindert, dass der Wert unter 1 fällt - semesterCounter--; - semesterCounterLabel.setText(String.valueOf(semesterCounter)); - } + semesterDownButton.addActionListener(e -> { + if (semesterCounter > 1) { + semesterCounter--; + semesterCounterLabel.setText(String.valueOf(semesterCounter)); } }); // PLAYERTOGGLEBUTTONS - PlayerLeftButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - toggleLeftPlayerIcon(); - updateTextFields(); - } + PlayerLeftButton.addActionListener(e -> { + toggleLeftPlayerIcon(); + updateTextFields(); }); - PlayerRightButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - toggleLeftPlayerIcon(); - updateTextFields(); - } + PlayerRightButton.addActionListener(e -> { + toggleLeftPlayerIcon(); + updateTextFields(); }); // ActionListener für den "Back" Button, um zum vorherigen Panel zurückzukehren - backButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - cardLayout.show(mainPanel, "localGamePanel"); - } - }); - - return multiplayerPanel; + backButton.addActionListener(e -> frame.showPanel("MainMenu")); } // TOGGLE METHODEN From 6ef3b38dd57f2df83b5877d3e1050f912b7ea496 Mon Sep 17 00:00:00 2001 From: Joshua Date: Tue, 19 Nov 2024 17:08:59 +0100 Subject: [PATCH 16/20] Implemented CardLayout into startMultiplayerGame, startLocalGame, MainMenuView. Implemented MainFrame. --- src/MainFrame.java | 2 ++ src/coinToss.java | 76 ++++++++--------------------------------- src/startLocalGame.java | 55 ++++++++++++++++++++++++++--- 3 files changed, 66 insertions(+), 67 deletions(-) diff --git a/src/MainFrame.java b/src/MainFrame.java index 7213b99..a703cf0 100644 --- a/src/MainFrame.java +++ b/src/MainFrame.java @@ -20,10 +20,12 @@ public class MainFrame extends JFrame { MainMenuView mainMenuView = new MainMenuView(this); startLocalGame localGame = new startLocalGame(this); startMultiplayerGame multiplayerGame = new startMultiplayerGame(this); + coinToss coinToss = new coinToss(this); mainPanel.add(mainMenuView, "MainMenu"); mainPanel.add(localGame, "LocalGame"); mainPanel.add(multiplayerGame, "MultiplayerGame"); + mainPanel.add(coinToss, "coinToss"); // Hauptpanel in JFrame hinzufügen add(mainPanel); diff --git a/src/coinToss.java b/src/coinToss.java index b044e3e..9720a08 100644 --- a/src/coinToss.java +++ b/src/coinToss.java @@ -3,36 +3,26 @@ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -public class coinToss { - // Frame - private JFrame frame = new JFrame("Zugreihenfolge"); - private JPanel mainPanel = new JPanel(new CardLayout()); // Panel mit CardLayout für Szenenwechsel +public class coinToss extends JPanel { + // Funktionshilfen private JLabel frameTitle = new JLabel("Zugreihenfolge", SwingConstants.CENTER); - private JLabel messageLabel = new JLabel("", SwingConstants.CENTER); // Label für die Nachricht + private JLabel text = new JLabel("", SwingConstants.CENTER); // Label für die Nachricht private int reihenfolge = 1; // Beispielhaft: 1 = Spieler 1 fängt an, 0 = Spieler 2 fängt an private Timer timer; - coinToss() { - // Erstelle Frame - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setSize(1500, 1000); - frame.setLocationRelativeTo(null); - - // Panel für die Startszene erstellen - JPanel startPanel = new JPanel(); - startPanel.setLayout(new BorderLayout()); + // Konstruktor + coinToss(MainFrame frame) { + setLayout(null); // Setze das Layout des Panels auf CardLayout // Nachricht basierend auf 'reihenfolge' einstellen String startMessage = (reihenfolge == 1) ? "Du fängst an, mach dich bereit..." : "Dein Gegner fängt an, mach dich bereit..."; - messageLabel.setText(startMessage); - messageLabel.setFont(new Font("Arial", Font.BOLD, 24)); - startPanel.add(frameTitle, BorderLayout.NORTH); - startPanel.add(messageLabel, BorderLayout.CENTER); + text.setText(startMessage); + text.setFont(new Font("Arial", Font.BOLD, 24)); + add(text); - // Panel zur Haupt-Panel hinzufügen - mainPanel.add(startPanel, "start"); + frameTitle.setFont(new Font("Arial", Font.BOLD, 32)); // Beispielhaftes "Spielfeld" (nächste Szene) JPanel gamePanel = new JPanel(); @@ -41,12 +31,8 @@ public class coinToss { gameLabel.setFont(new Font("Arial", Font.BOLD, 36)); gamePanel.add(gameLabel, BorderLayout.CENTER); - // GamePanel zu Haupt-Panel hinzufügen - mainPanel.add(gamePanel, "game"); - - // Frame-Layout einstellen - frame.add(mainPanel); - frame.setVisible(true); + // Füge das Spiel-Panel zu diesem Panel hinzu + add(gamePanel, "game"); // Timer starten startTimer(); @@ -58,8 +44,8 @@ public class coinToss { @Override public void actionPerformed(ActionEvent e) { // Wechsel zum Spiel-Panel - CardLayout cardLayout = (CardLayout) mainPanel.getLayout(); - cardLayout.show(mainPanel, "game"); + CardLayout cardLayout = (CardLayout) getLayout(); + cardLayout.show(coinToss.this, "game"); timer.stop(); // Timer stoppen } }); @@ -67,37 +53,3 @@ public class coinToss { timer.start(); // Timer starten } } - - - - - -/* -import javax.swing.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - - - TODO: - - - -public class coinToss { - // Funktionshilfen - - - // Frame - JFrame frame = new JFrame("Zugreihenfolge"); - - // Labels - JLabel frameTitle = new JLabel("Zugreihenfolge"); - - coinToss() { - // Erstelle Frame - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setSize(1500, 1000); - - // Layout Manager (absolute ositionierung) - frame.setLayout(null); - } -}*/ \ No newline at end of file diff --git a/src/startLocalGame.java b/src/startLocalGame.java index 04675fa..8dcc513 100644 --- a/src/startLocalGame.java +++ b/src/startLocalGame.java @@ -1,5 +1,7 @@ import javax.swing.*; import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; public class startLocalGame extends JPanel { // Funktionshilfen @@ -107,15 +109,41 @@ public class startLocalGame extends JPanel { } }); - leftPlayerLeftButton.addActionListener(e -> toggleLeftPlayerIcon()); - leftPlayerRightButton.addActionListener(e -> toggleLeftPlayerIcon()); + leftPlayerLeftButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + toggleLeftPlayerIcon(); + updateTextFields(); + } + }); - rightPlayerLeftButton.addActionListener(e -> toggleRightPlayerIcon()); - rightPlayerRightButton.addActionListener(e -> toggleRightPlayerIcon()); + leftPlayerRightButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + toggleLeftPlayerIcon(); + updateTextFields(); + } + }); + + rightPlayerLeftButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + toggleRightPlayerIcon(); + updateTextFields(); + } + }); + + rightPlayerRightButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + toggleRightPlayerIcon(); + updateTextFields(); + } + }); backButton.addActionListener(e -> frame.showPanel("MainMenu")); - startButton.addActionListener(e -> frame.showPanel("MainMenu")); // TODO ECHTE FUNKTION EINFÜGEN + startButton.addActionListener(e -> frame.showPanel("coinToss")); // TODO ECHTE FUNKTION EINFÜGEN } private void toggleLeftPlayerIcon() { @@ -133,4 +161,21 @@ public class startLocalGame extends JPanel { rightPlayerIcon.setIcon(humanPlayerIcon); } } + + // Methode zum Aktualisieren der Textfelder basierend auf den ausgewählten Icons + private void updateTextFields() { + // Linker Spieler + if (leftPlayerIcon.getIcon() == humanPlayerIcon) { + leftPlayerTextField.setText("Spieler 1"); + } else { + leftPlayerTextField.setText("Leicht"); + } + + // Rechter Spieler + if (rightPlayerIcon.getIcon() == humanPlayerIcon) { + rightPlayerTextField.setText("Spieler 2"); + } else { + rightPlayerTextField.setText("Leicht"); + } + } } \ No newline at end of file From 737e4857733f93dca24d37b7d4f0d1682f294630 Mon Sep 17 00:00:00 2001 From: Joshua Date: Tue, 19 Nov 2024 17:37:16 +0100 Subject: [PATCH 17/20] Implemented coinToss(still incomplete) --- src/coinToss.java | 66 ++++++++++++++++++----------------------------- 1 file changed, 25 insertions(+), 41 deletions(-) diff --git a/src/coinToss.java b/src/coinToss.java index 9720a08..cf4fc0e 100644 --- a/src/coinToss.java +++ b/src/coinToss.java @@ -1,55 +1,39 @@ import javax.swing.*; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; public class coinToss extends JPanel { - // Funktionshilfen - private JLabel frameTitle = new JLabel("Zugreihenfolge", SwingConstants.CENTER); - private JLabel text = new JLabel("", SwingConstants.CENTER); // Label für die Nachricht - private int reihenfolge = 1; // Beispielhaft: 1 = Spieler 1 fängt an, 0 = Spieler 2 fängt an + private int reihenfolge = 1; // 1 = Spieler 1 fängt an, 0 = Spieler 2 fängt an private Timer timer; + private JLabel infoLabel; // Konstruktor - coinToss(MainFrame frame) { - setLayout(null); // Setze das Layout des Panels auf CardLayout + public coinToss(MainFrame frame) { + setLayout(new BorderLayout()); - // Nachricht basierend auf 'reihenfolge' einstellen - String startMessage = (reihenfolge == 1) - ? "Du fängst an, mach dich bereit..." - : "Dein Gegner fängt an, mach dich bereit..."; - text.setText(startMessage); - text.setFont(new Font("Arial", Font.BOLD, 24)); - add(text); + // Info-Label für den Anzeigetext + infoLabel = new JLabel("", SwingConstants.CENTER); + infoLabel.setFont(new Font("Arial", Font.BOLD, 24)); + add(infoLabel, BorderLayout.CENTER); - frameTitle.setFont(new Font("Arial", Font.BOLD, 32)); + // Bestimme den Anfangstext basierend auf der "reihenfolge" Variable + if (reihenfolge == 1) { + infoLabel.setText("Du fängst an, mach dich bereit..."); + } else { + infoLabel.setText("Dein Gegner fängt an, mach dich bereit..."); + } - // Beispielhaftes "Spielfeld" (nächste Szene) - JPanel gamePanel = new JPanel(); - gamePanel.setLayout(new BorderLayout()); - JLabel gameLabel = new JLabel("Das Spiel beginnt!", SwingConstants.CENTER); - gameLabel.setFont(new Font("Arial", Font.BOLD, 36)); - gamePanel.add(gameLabel, BorderLayout.CENTER); + // Erster Timer, der den Text nach 3 Sekunden auf "Es geht Los!" setzt + timer = new Timer(3000, e -> { + infoLabel.setText("Es geht Los!"); - // Füge das Spiel-Panel zu diesem Panel hinzu - add(gamePanel, "game"); - - // Timer starten - startTimer(); - } - - private void startTimer() { - // Timer, der nach 3 Sekunden zum Spiel-Panel wechselt - timer = new Timer(3000, new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - // Wechsel zum Spiel-Panel - CardLayout cardLayout = (CardLayout) getLayout(); - cardLayout.show(coinToss.this, "game"); - timer.stop(); // Timer stoppen - } + // Zweiter Timer, der nach weiteren 3 Sekunden zum Hauptmenü zurückkehrt + Timer backToMenuTimer = new Timer(3000, ev -> { + frame.showPanel("MainMenu"); + }); + //backToMenuTimer.setRepeats(false); // Timer nur einmal ausführen + backToMenuTimer.start(); }); - timer.setRepeats(false); // Timer soll nur einmal ablaufen - timer.start(); // Timer starten + //timer.setRepeats(false); // Erster Timer soll nur einmal ausgeführt werden + timer.start(); } } From ea6a1c980482a865b37aadaf10a46b6233ba607f Mon Sep 17 00:00:00 2001 From: Kaver Date: Tue, 19 Nov 2024 18:33:05 +0100 Subject: [PATCH 18/20] =?UTF-8?q?grobe=20Weiterleitung=20fuer=20startMulti?= =?UTF-8?q?playerGame=20an=20Spiel=20beitreten/Spiel=20erstellen=20eingef?= =?UTF-8?q?=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/JoinGame.java | 44 +++++++++++++++++++++++++++++++++++ src/MainFrame.java | 9 ++++++- src/startMultiplayerGame.java | 2 ++ 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 src/JoinGame.java diff --git a/src/JoinGame.java b/src/JoinGame.java new file mode 100644 index 0000000..e980b58 --- /dev/null +++ b/src/JoinGame.java @@ -0,0 +1,44 @@ +import java.awt.*; +import java.awt.event.ActionEvent; +import javax.swing.JFrame; +import javax.swing.*; + +public class JoinGame extends JPanel { + JLabel spielBeitretenLabel= new JLabel("Spiel beitreten"); + JLabel ipLabel = new JLabel("IP-Adresse"); + JLabel portLabel = new JLabel("Port"); + + JTextField ipTextField = new JTextField(20); + JTextField portTextField = new JTextField(20); + + JButton losButton = new JButton("Los!"); + + Font robotoFont = new Font("Roboto", Font.BOLD, 45); + + public JoinGame(MainFrame frame) { + setLayout(null); + buildPanel(frame); + } + + private void buildPanel(MainFrame frame) { + spielBeitretenLabel.setBounds(20,20,700, 100); + losButton.setBounds(320, 225, 100, 50); + + ipLabel.setBounds(50, 125, 200, 30); + portLabel.setBounds(50, 200, 200, 30); + + ipTextField.setBounds(50, 150, 250, 50); + portTextField.setBounds(50, 225, 250, 50); + + + spielBeitretenLabel.setFont(robotoFont.deriveFont(50f)); + + add(spielBeitretenLabel); + add(ipLabel); + add(portLabel); + add(losButton); + add(ipTextField); + add(portTextField); + } + +} diff --git a/src/MainFrame.java b/src/MainFrame.java index a703cf0..4d69af9 100644 --- a/src/MainFrame.java +++ b/src/MainFrame.java @@ -12,6 +12,12 @@ public class MainFrame extends JFrame { setSize(1500, 1000); setLocationRelativeTo(null); + //JLabel backgroundLabel = new JLabel(new ImageIcon("graphics/mainmenubackground.png")); + // backgroundLabel.setBounds(0, 0, 1500, 1000); + // getContentPane().add(backgroundLabel); + + // backgroundLabel.setOpaque(true); + // CardLayout und Hauptpanel erstellen cardLayout = new CardLayout(); mainPanel = new JPanel(cardLayout); @@ -21,12 +27,13 @@ public class MainFrame extends JFrame { startLocalGame localGame = new startLocalGame(this); startMultiplayerGame multiplayerGame = new startMultiplayerGame(this); coinToss coinToss = new coinToss(this); + JoinGame joinGame = new JoinGame(this); mainPanel.add(mainMenuView, "MainMenu"); mainPanel.add(localGame, "LocalGame"); mainPanel.add(multiplayerGame, "MultiplayerGame"); mainPanel.add(coinToss, "coinToss"); - + mainPanel.add(joinGame, "JoinGame"); // Hauptpanel in JFrame hinzufügen add(mainPanel); diff --git a/src/startMultiplayerGame.java b/src/startMultiplayerGame.java index e26df35..4598994 100644 --- a/src/startMultiplayerGame.java +++ b/src/startMultiplayerGame.java @@ -107,7 +107,9 @@ 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.showPanel("JoinGame")); } // TOGGLE METHODEN From aaa9d57f6842d18471e65819fa29eca684320bf1 Mon Sep 17 00:00:00 2001 From: eyFlorian <45431375+eyFlorian@users.noreply.github.com> Date: Sun, 24 Nov 2024 12:47:45 +0100 Subject: [PATCH 19/20] Easy/MediumAI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Haben eine sehr einfache und Medium KI hinzugefügt. F&F Fragenaufwerfende Methoden: https://cdn.discordapp.com/attachments/1296860613212897413/1310209916325068894/WhatsApp_Bild_2024-11-24_um_12.31.02_fb836c3d.jpg?ex=67446392&is=67431212&hm=82f37b83dc5e711622abb43abe51edd62833450dddf91ed524991da6d0981f38& --- src/AiPlayer.java | 28 ++++++-- src/Board.java | 3 + ...Player1.java => SpecificAiPlayerEasy.java} | 0 src/SpecificAiPlayerHard.java | 7 ++ src/SpecificAiPlayerMedium.java | 65 +++++++++++++++++++ 5 files changed, 99 insertions(+), 4 deletions(-) rename src/{SpecificAiPlayer1.java => SpecificAiPlayerEasy.java} (100%) create mode 100644 src/SpecificAiPlayerHard.java create mode 100644 src/SpecificAiPlayerMedium.java diff --git a/src/AiPlayer.java b/src/AiPlayer.java index 06db3f0..05fc045 100644 --- a/src/AiPlayer.java +++ b/src/AiPlayer.java @@ -1,7 +1,27 @@ +import java.util.Random; +import java.awt.Point; public abstract class AiPlayer extends Player { - public AiPlayer(int size) { - super(size); - } -} + public AiPlayer(int size) { + super(size); + } + public Point RandomPoint() { + Random random = new Random(); // Pseudo Random für zufallszahlen + int posx = random.nextInt(super.board.size); // Generiert 0 - 13 + int posy = random.nextInt(super.board.size); // + return new Point(posx,posy); + } + + public void AiSetShips() { + for(int i = 0; i < super.board.ships.size(); i++) { // Interiert durch alle Shiffe + while(!super.board.ships.get(i).setPosition(RandomPoint())) + } // Versucht das Aktuelle Shiff zu setzten und wiederholt solange bis es funktioniert + return; + } + + public void AiShoot() { + super.board.hit(RandomPoint()); + return; + } +} \ No newline at end of file diff --git a/src/Board.java b/src/Board.java index c2c1112..5cec0cd 100644 --- a/src/Board.java +++ b/src/Board.java @@ -67,6 +67,9 @@ public class Board { return null; } + public int getSize() { + return size; + } } diff --git a/src/SpecificAiPlayer1.java b/src/SpecificAiPlayerEasy.java similarity index 100% rename from src/SpecificAiPlayer1.java rename to src/SpecificAiPlayerEasy.java diff --git a/src/SpecificAiPlayerHard.java b/src/SpecificAiPlayerHard.java new file mode 100644 index 0000000..0bcce8c --- /dev/null +++ b/src/SpecificAiPlayerHard.java @@ -0,0 +1,7 @@ + +public class SpecificAiPlayer1 extends AiPlayer{ + + public SpecificAiPlayer1(int size) { + super(size); + } +} diff --git a/src/SpecificAiPlayerMedium.java b/src/SpecificAiPlayerMedium.java new file mode 100644 index 0000000..b808ff9 --- /dev/null +++ b/src/SpecificAiPlayerMedium.java @@ -0,0 +1,65 @@ + +public class SpecificAiPlayerMedium extends AiPlayer{ + + private List hitsQueue = new ArrayList<>(); + + public SpecificAiPlayerMedium(int size) { + super(size); + } + + @Override + public void AiShoot() { + Point nextShot = ComputeNextShot(); + // Shoot at the enemy and receive the hit response + enemy.receiveShoot(nextShot); + + HitResponse hitResponse = enemy.board.getHitResponsOnPoint(nextShot) + // If it's a hit or sunk, add adjacent cells to the hitsQueue + if (hitResponse.getHitResponse() == HitResponseType.HIT) { + addAdjacentPoints(nextShot); + } + } + + public Point ComputeNextShot() { + Point nextShot; + + // Prioritize shots from the hitsQueue + while (!hitsQueue.isEmpty()) { + nextShot = hitsQueue.remove(0); + if (!alreadyShot(nextShot)) { + return nextShot; + } + } + + // If hitsQueue is empty, pick a random point that hasn't been shot + do { + nextShot = RandomPoint(); + } while (alreadyShot(nextShot)); + + return nextShot; + } + + private void addAdjacentPoints(Point point) { + int x = point.x; + int y = point.y; + + // Possible adjacent positions (up, down, left, right) + Point[] adjacentPoints = { + new Point(x, y - 1), + new Point(x, y + 1), + new Point(x - 1, y), + new Point(x + 1, y) + }; + + for (Point p : adjacentPoints) { + if (isValidPoint(p) && !alreadyShot(p) && !hitsQueue.contains(p)) { + hitsQueue.add(p); + } + } + } + + private boolean isValidPoint(Point point) { + return point.x >= 0 && point.x < board.getSize() && + point.y >= 0 && point.y < board.getSize(); + } +} \ No newline at end of file From 3d557361ee05695de2dc8419b7b253cceba60697 Mon Sep 17 00:00:00 2001 From: Joshua Date: Tue, 26 Nov 2024 14:13:14 +0100 Subject: [PATCH 20/20] Implemented coinToss(still incomplete) --- src/MainFrame.java | 2 +- src/coinToss.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/MainFrame.java b/src/MainFrame.java index a703cf0..61a78f0 100644 --- a/src/MainFrame.java +++ b/src/MainFrame.java @@ -7,7 +7,7 @@ public class MainFrame extends JFrame { private JPanel mainPanel; public MainFrame() { - setTitle("Spiel UI mit CardLayout"); + setTitle("Studium Versenken"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(1500, 1000); setLocationRelativeTo(null); diff --git a/src/coinToss.java b/src/coinToss.java index cf4fc0e..87ed50b 100644 --- a/src/coinToss.java +++ b/src/coinToss.java @@ -23,7 +23,7 @@ public class coinToss extends JPanel { } // Erster Timer, der den Text nach 3 Sekunden auf "Es geht Los!" setzt - timer = new Timer(3000, e -> { + /*timer = new Timer(3000, e -> { infoLabel.setText("Es geht Los!"); // Zweiter Timer, der nach weiteren 3 Sekunden zum Hauptmenü zurückkehrt @@ -34,6 +34,6 @@ public class coinToss extends JPanel { backToMenuTimer.start(); }); //timer.setRepeats(false); // Erster Timer soll nur einmal ausgeführt werden - timer.start(); + timer.start();*/ } }