import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; /** * Das GameBoard dient als Panel, in dem das tatsächliche Spiel stattfindet. * Der Benutzer kann hier seine Schiffe platzieren, das Spiel starten etc. * @author Lucas Bronson, Luca Conte, Joshua Kuklok */ public class GameBoard extends JPanel { private BoardDisplay ownBoardPanel; private BoardDisplay opponentBoardPanel; private Player p1; private Player p2; // Grafiken ImageIcon backButtonIcon = new ImageIcon("graphics/backButton.png"); ImageIcon gameBoardEmtpy = new ImageIcon("graphics/gameboardempty.png"); ImageIcon gameBoardX = new ImageIcon("graphics/gameboardx.png"); // kontextText Text-Strings String kT1 = "Bitte Schiffe setzten"; String kT2 = "Warte auf Gegner"; String kT3 = "Du fängst an"; String kT4 = "Dein Gegner fängt an"; String kT5 = "Du bist am Zug"; String kT6 = "Dein Gegner ist am Zug"; String kT7 = "Du hast das Spiel gewonnen"; String kT8 = "Du hast das Spiel verloren"; String kT9 = "Bitte erst alle Schiffe setzten"; // Labels JLabel frameTitle = new JLabel("GameBoard"); JLabel kontextText = new JLabel(kT1); // Buttons JButton giveUpButton = new JButton("Aufgeben"); /** * Konstruktor von GameBoard. * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. * @param semesterCounter Ausgewähltes Semester * @param p1 Erstes Spielerobjekt * @param p2 Zweites Spielerobjekt * @author Lucas Bronson, Luca Conte, Joshua Kuklok */ GameBoard(MainFrame frame, int semesterCounter,Player p1, Player p2) { this.p1 = p1; this.p2 = p2; buildPanel(frame, semesterCounter); List shipsP1 =p1.getBoard().getShips(); List shipsP2 =p2.getBoard().getShips(); giveUpButton.addActionListener((e) -> { frame.showPanel("MainMenu"); p1.withdraw(); }); } // Timer für pulsierenden SchwarzGrau-Effekt Timer timer = new Timer(10, new ActionListener() { // Start-Grauwert (0 = Schwarz, 255 = Weiß) private int value = 50; private boolean increasing = false; @Override public void actionPerformed(ActionEvent e) { kontextText.setForeground(new Color(value, value, value)); if (increasing) { value++; if (value >= 90) { increasing = false; } } else { value--; if (value <= 0) { increasing = true; } } } }); /** * Baut das grundlegende Spielboard * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. * @param semesterCounter Ausgewähltes Semester * @author Lucas Bronson, Luca Conte, Joshua Kuklok */ public void buildPanel(MainFrame frame, int semesterCounter) { // Hauptlayout - BorderLayout für die Anordnung der Komponenten setLayout(new BorderLayout()); // Spielfelder erstellen (eigenes und gegnerisches) // Spielfelder werden in BoardDisplay erstellt int gridSize = GameController.semesterToBoardSize(semesterCounter); // Größe des Spielfelds this.ownBoardPanel = new BoardDisplay(gridSize,p1, false); this.opponentBoardPanel = new BoardDisplay(gridSize, p2, true); // Panel für das Kontext-Text-Feld JPanel headerPanel = new JPanel(); headerPanel.setLayout(new BorderLayout()); headerPanel.add(kontextText, BorderLayout.WEST); kontextText.setFont(new Font("Roboto", Font.BOLD, 30)); headerPanel.add(giveUpButton, BorderLayout.EAST); JPanel leftButtonsPanel = new JPanel(); leftButtonsPanel.setLayout(new GridLayout(7, 1)); // 6 Buttons untereinander JPanel rightButtonsPanel = new JPanel(); rightButtonsPanel.setLayout(new GridLayout(7, 1)); //Buttons in eine Gruppe packen damit diese beim drücken eines anderen Buttons wieder entwählt werden ButtonGroup leftButtonGroup= new ButtonGroup(); ButtonGroup rightButtonGroup= new ButtonGroup(); // Panel für die Buttons des linken Spielers (ganz links) for(Ship ship : p1.getBoard().getShips()) { ShipButton shipButton= new ShipButton(ship,ownBoardPanel); leftButtonsPanel.add(shipButton); leftButtonGroup.add(shipButton); ownBoardPanel.addShipButton(shipButton); } for(Ship ship : p2.getBoard().getShips()) { ShipButton shipButton= new ShipButton(ship,opponentBoardPanel); rightButtonsPanel.add(shipButton); rightButtonGroup.add(shipButton); opponentBoardPanel.addShipButton(shipButton); shipButton.setEnabled(false); } JToggleButton readyButton = new JToggleButton("Bereit"); readyButton.setBackground(Color.GREEN); rightButtonsPanel.add(readyButton); JToggleButton resetButton = new JToggleButton("Reset"); resetButton.setBackground(Color.RED); leftButtonsPanel.add(resetButton); resetButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ownBoardPanel.resetAllShips(); } }); // Um Bereit-Meldung and Backend zu geben, kontextText zu setzten und ready/reset Button zu deaktivieren readyButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { kontextText.setText(kT2); p1.ready(); if(true) { remove(readyButton); remove(resetButton); remove(rightButtonsPanel); remove(leftButtonsPanel); readyButton.setEnabled(false); resetButton.setEnabled(false); } } }); // Panel für beide Spielfelder (nebeneinander in der Mitte) JPanel centerPanel = new JPanel(); centerPanel.setLayout(new GridLayout(1, 2, 20, 0)); // 2 Spielfelder nebeneinander, mit Abstand von 20 Pixeln centerPanel.add(ownBoardPanel); centerPanel.add(opponentBoardPanel); // Spieler-Namen über den Spielfeldern hinzufügen JPanel playerNamesPanel = new JPanel(); playerNamesPanel.setLayout(new GridLayout(1, 2)); // Zwei Labels nebeneinander JLabel player1NameLabel = new JLabel(p1.getName(), SwingConstants.CENTER); JLabel player2NameLabel = new JLabel(p2.getName(), SwingConstants.CENTER); System.out.println("Name in Gameboard: " + player1NameLabel.getText()); // Schrift und Formatierung der Labels player1NameLabel.setFont(new Font("Roboto", Font.BOLD, 18)); player2NameLabel.setFont(new Font("Roboto", Font.BOLD, 18)); // Spieler-Labels zum Panel hinzufügen playerNamesPanel.add(player1NameLabel); playerNamesPanel.add(player2NameLabel); // Spieler-Namen-Panel oberhalb der Spielfelder hinzufügen JPanel namesAndBoardsPanel = new JPanel(new BorderLayout()); namesAndBoardsPanel.add(playerNamesPanel, BorderLayout.NORTH); namesAndBoardsPanel.add(centerPanel, BorderLayout.CENTER); // Panels dem Hauptlayout hinzufügen add(leftButtonsPanel, BorderLayout.WEST); add(rightButtonsPanel, BorderLayout.EAST); add(headerPanel, BorderLayout.NORTH); add(namesAndBoardsPanel, BorderLayout.CENTER); timer.start(); } /** * Aktualisiert Zustand(kontextText) je nach Zug * @author Luca Conte, Joshua Kuklok */ public void refresh() { if (this.p1.myTurn) { if (!kontextText.getText().equals(kT5)) { this.kontextText.setText(kT5); SoundHandler.playSound("yourturn"); } } else { this.kontextText.setText(kT6); } this.ownBoardPanel.refresh(); this.opponentBoardPanel.refresh(); } /** * Getter für Player1 * @return Player 1 * @author Peer Ole Wachtel */ public Player getP1() { return p1; } public Player getP2() { return p2; } }