start game stuff - both online and offline #13

Merged
lgc merged 24 commits from start-game into main 2024-12-13 16:27:43 +00:00
7 changed files with 140 additions and 80 deletions
Showing only changes of commit 84865e5468 - Show all commits

View File

@ -5,11 +5,20 @@ import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
/**
* TODO Klassenbeschreibung
*/
public class BoardDisplay extends JPanel {
private JButton[][] fields;
private int gridSize;
private List <Ship> ships;
/**
* Konstruktor der startLocalGame.
* TODO fertig schreiben
* @param gridSize
* @param player
*/
public BoardDisplay(int gridSize, Player player) {
super(new GridLayout(gridSize + 1, gridSize + 1)); // +1 wegen extra Zeile/Splate
this.fields = new JButton[gridSize][gridSize];
@ -67,6 +76,14 @@ public class BoardDisplay extends JPanel {
// this.ships = new ArrayList<Ship>();
}
/**
* TODO Funktion beschreiben etc.
* @param ship
* @param o
* @param horizontal
* @param player
* @return
*/
private boolean setShip(Ship ship, Point o, boolean horizontal,Player player) {
//boolean a = true;
if (placeable(ship, ship.getPosition(), horizontal)) {
@ -83,6 +100,13 @@ public class BoardDisplay extends JPanel {
}
}
/**
* TODO Funktion beschreiben etc.
* @param ship
* @param o
* @param horizontal
* @return
*/
private boolean placeable(Ship ship,Point o, boolean horizontal) {
if (horizontal && (o.getX() + ship.getSize() > gridSize)) {
return false;
@ -97,6 +121,12 @@ public class BoardDisplay extends JPanel {
Ship current = (Ship) e.getSource();
}
/**
* TODO Funktion beschreiben etc.
* @param field
* @param o
* @param player
*/
private void handleFieldClick(JButton field, Point o,Player player) {
// Beispiel: Setze ein Schiff bei einem Klick
if (setShip(new Ship(3, "TestShip"), o, true,player)) {

View File

@ -8,6 +8,10 @@ import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.util.List;
/**
* Das GameBoard dient als Panel, in dem das tatsächliche Spiel stattfindet.
* Der Benutzer kann hier seine Schiffe platzieren, das Spiel starten etc.
*/
public class GameBoard extends JPanel {
// Funktionshilfen
//int semesterCounter = 1; //TODO: ersetzen durch param von vorpanel
@ -25,6 +29,13 @@ public class GameBoard extends JPanel {
JButton backButton = new JButton(backButtonIcon);
// Eigene ModulButtons
/**
* Konstruktor von GameBoard.
* @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden.
* @param semesterCounter Ausgewähltes Semester
* @param p1 Erstes Spielerobjekt
* @param p2 Zweites Spielerobjekt
*/
GameBoard(MainFrame frame, int semesterCounter,Player p1, Player p2) {
JToggleButton leftPlayerModul1 = new JToggleButton("Modul 1"); //TODO: Dynamische Namen durch abgleich mit Semester
JToggleButton leftPlayerModul2 = new JToggleButton("Modul 2");
@ -38,6 +49,7 @@ public class GameBoard extends JPanel {
leftPlayerModul1, leftPlayerModul2, leftPlayerModul3, leftPlayerModul4,
leftPlayerModul5, leftPlayerModul6, leftPlayerModul7,
};
// Gegnerische ModulButtons
JToggleButton rightPlayerModul1 = new JToggleButton("Modul 1");
JToggleButton rightPlayerModul2 = new JToggleButton("Modul 2");
@ -58,6 +70,11 @@ public class GameBoard extends JPanel {
backButton.addActionListener(e -> frame.showPanel("MainMenu"));
}
/**
* TODO Funktion beschreiben etc.
* @param ships
* @param buttons
*/
private void updateButtonLabels(List<Ship> ships,JToggleButton[] buttons) {
for(int i=0;i<buttons.length &&i<ships.size();i++ ) {
Ship ship = ships.get(i);
@ -65,6 +82,15 @@ public class GameBoard extends JPanel {
}
}
/**
* TODO Funktion beschreiben etc.
* @param frame
* @param semesterCounter
* @param p1
* @param p2
* @param leftButtons
* @param rightButtons
*/
public void buildPanel(MainFrame frame, int semesterCounter,Player p1,Player p2,JToggleButton[] leftButtons,JToggleButton[] rightButtons) {
// Hauptlayout - BorderLayout für die Anordnung der Komponenten
setLayout(new BorderLayout());

View File

@ -92,7 +92,7 @@ public class JoinGame extends JPanel {
public void actionPerformed(ActionEvent e) {
String ipAddress = ipTextField.getText();
if (ipAddress.equals("")) {
if (ipAddress.isEmpty()) {
ipAddress = "0.0.0.0";
}
String portText = portTextField.getText();

View File

@ -1,6 +1,10 @@
import javax.swing.*;
import java.awt.*;
/**
* Der MainFrame dient als Hub und Übergreifendes Fenster auf dem alle weiteren Panel angezeigt werden.
* Dadurch werden keine weiteren Fenster geöffnet.
*/
public class MainFrame extends JFrame {
private CardLayout cardLayout;
@ -16,40 +20,33 @@ public class MainFrame extends JFrame {
int semesterCounter;
// ---------- //
/**
* Konstruktor von MainFrame.
* Ermöglicht es Panel anzuzeigen.
*/
public MainFrame() {
setTitle("Studium Versenken");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
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);
// Verschiedene Panels erstellen und hinzufügen
// Panels erstellen
MainMenuView mainMenuView = new MainMenuView(this);
startLocalGame localGame = new startLocalGame(this);
//startLocalGameLoadingScreen LocalGameLoadingScreen = new startLocalGameLoadingScreen(this);
startMultiplayerGame multiplayerGame = new startMultiplayerGame(this);
coinToss coinToss = new coinToss(this);
Verbinden verbinden = new Verbinden(this);
//JoinGame joinGame = new JoinGame(this,localMult);
//GameBoard gameBoard = new GameBoard(this, localMult);
// Panels hinzufügen
mainPanel.add(mainMenuView, "MainMenu");
mainPanel.add(localGame, "LocalGame");
mainPanel.add(multiplayerGame, "MultiplayerGame");
mainPanel.add(coinToss, "coinToss");
mainPanel.add(verbinden, "Verbinden");
//mainPanel.add(joinGame, "JoinGame");
//mainPanel.add(gameBoard, "GameBoard");
// Hauptpanel in JFrame hinzufügen
add(mainPanel);
@ -58,82 +55,60 @@ public class MainFrame extends JFrame {
cardLayout.show(mainPanel, "MainMenu");
}
// Methode, um die Ansicht zu wechseln
/**
* Methode, um die Ansicht zu wechseln
* @param panelName Name des anzuzeigenden Panels
*/
public void showPanel(String panelName) {
cardLayout.show(mainPanel, panelName);
}
// --- ShowPanel der startMultiplayerGame Klasse
/**
* Spezifische ShowPanel-Funktion der startMultiplayerGame Klasse
* @param panelName Name des anzuzeigenden Panels
* @param num Hilfsvariable um abzugleichen, ob "Spiel erstellen" oder "Spiel beitreten" ausgewählt wurde
* @param playerType Spielertyp(HumanPlayer, AIEasy etc.)
* @param playerName Name des Spielers
*/
public void showPanelSMG(String panelName, int num, int playerType,String playerName) {
this.localMult = num;
//if (!isPanelPresent(panelName)) { //TODO potentiell raus
JoinGame joinGame = new JoinGame(this, localMult, playerType, playerName);
mainPanel.add(joinGame, panelName);
mainPanel.revalidate(); // Refresh
mainPanel.repaint();
//}
JoinGame joinGame = new JoinGame(this, localMult, playerType, playerName);
mainPanel.add(joinGame, panelName);
mainPanel.revalidate(); // Refresh
mainPanel.repaint();
cardLayout.show(mainPanel, panelName); // Show the panel
}
// --- ShowPanel der startLocalGameLoadingScreen Klasse (DURCH BACKEND AUFGERUFEN)
/**
* Spezifische ShowPanel der startLocalGameLoadingScreen Klasse (DURCH BACKEND AUFGERUFEN)
* @param panelName Name des anzuzeigenden Panels
* @param semesterCounter Ausgewähltes Semester
* @param p1 Erstes Spielerobjekt
* @param p2 Zweites Spielerobjekt
*/
public void showPanelSLG(String panelName,int semesterCounter, Player p1, Player p2) {
this.semesterCounter = semesterCounter;
//if (!isPanelPresent(panelName)) { //TODO potentiell raus
// gameBoard muss player übergeben bekommen
GameBoard gameBoard = new GameBoard(this, semesterCounter, p1, p2);
//mainPanel.add(mainMenuView, "MainMenu");
mainPanel.add(gameBoard, panelName);
mainPanel.revalidate(); // Refresh
mainPanel.repaint();
//}
this.semesterCounter = semesterCounter;
GameBoard gameBoard = new GameBoard(this, semesterCounter, p1, p2);
mainPanel.add(gameBoard, panelName);
mainPanel.revalidate();
mainPanel.repaint();
cardLayout.show(mainPanel, panelName); // Show the panel
}
// --- ShowPanel der startLocalGame Klasse
/**
* Spezifische ShowPanel der startLocalGame Klasse
* @param panelName Name des anzuzeigenden Panels
* @param semesterCounter Ausgewähltes Semester
*/
public void showPanelSLGLS(String panelName,int semesterCounter) {
this.semesterCounter = semesterCounter;
// gameBoard muss player übergeben bekommen
startLocalGameLoadingScreen LocalGameLoadingScreen = new startLocalGameLoadingScreen(this, semesterCounter);
mainPanel.add(LocalGameLoadingScreen, panelName);
mainPanel.revalidate(); // Refresh
mainPanel.repaint();
//}
cardLayout.show(mainPanel, panelName); // Show the panel
}
/* TODO ist dies unnötig?
private boolean isPanelPresent(String panelName) {
for (Component component : mainPanel.getComponents()) {
if (panelName.equals(mainPanel.getClientProperty("name"))) {
return true;
}
}
return false;
} */
// Methoden für übergabe von playern an GameBoard
/*
public void setPlayerData() {
this.semesterCounter = semesterCounter;
//if (!isPanelPresent(panelName)) { //TODO potentiell raus
// gameBoard muss player übergeben bekommen
GameBoard gameBoard = new GameBoard(this, semesterCounter);
mainPanel.add(gameBoard, panelName);
mainPanel.revalidate(); // Refresh
mainPanel.repaint();
}*/
/* Tut wohl gar nicht, weils nicht aufgerufen wird hoppla
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
MainFrame frame = new MainFrame();
frame.setVisible(true);
});
}
*/
}

View File

@ -1,6 +1,9 @@
import javax.swing.*;
import java.awt.*;
/**
* Das Verbinden Panel dient als "Überblende", während im Backend das Spiel erstellt/ eine Verbindung hergestellt wird.
*/
public class Verbinden extends JPanel{
ImageIcon backButtonIcon = new ImageIcon("graphics/backButton.png");
@ -9,12 +12,20 @@ public class Verbinden extends JPanel{
Font robotoFont = new Font("Roboto", Font.BOLD, 45);
public Verbinden(MainFrame frame) {
/**
* Konstruktor der startLocalGame.
* @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden.
*/
public Verbinden(MainFrame frame) {
setLayout(null);
buildPanel(frame);
}
private void buildPanel(MainFrame frame) {
/**
* Baut Panel auf.
* @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden.
*/
private void buildPanel(MainFrame frame) {
setLayout(new BorderLayout());
verbindenLabel.setFont(robotoFont.deriveFont(50f));
add(verbindenLabel, BorderLayout.CENTER);

View File

@ -245,7 +245,10 @@ public class startLocalGame extends JPanel {
}
// Hilfsfunktionen
// Setzt das jeweils "nächste" Icon, wenn der leftPlayerLeftButton gedrückt wird.
/**
* Setzt das jeweils "nächste" Icon, wenn der leftPlayerLeftButton gedrückt wird.
*/
private void toggleLeftPlayerIconLeft() {
if (leftPlayerIcon.getIcon() == humanPlayerIcon) {
leftPlayerIcon.setIcon(aiPlayerHardIcon);
@ -258,7 +261,9 @@ public class startLocalGame extends JPanel {
}
}
// Setzt das jeweils "nächste" Icon, wenn der leftPlayerRightButton gedrückt wird.
/**
* Setzt das jeweils "nächste" Icon, wenn der leftPlayerRightButton gedrückt wird.
*/
private void toggleLeftPlayerIconRight() {
if (leftPlayerIcon.getIcon() == humanPlayerIcon) {
leftPlayerIcon.setIcon(aiPlayerEasyIcon);
@ -271,7 +276,9 @@ public class startLocalGame extends JPanel {
}
}
// Setzt das jeweils "nächste" Icon, wenn der RightPlayerLeftButton gedrückt wird.
/**
* Setzt das jeweils "nächste" Icon, wenn der RightPlayerLeftButton gedrückt wird.
*/
private void toggleRightPlayerIconLeft() {
if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) {
rightPlayerIcon.setIcon(aiPlayerHardIcon);
@ -282,7 +289,9 @@ public class startLocalGame extends JPanel {
}
}
// Setzt das jeweils "nächste" Icon, wenn der RightPlayerRightButton gedrückt wird.
/**
* Setzt das jeweils "nächste" Icon, wenn der RightPlayerRightButton gedrückt wird.
*/
private void toggleRightPlayerIconRight() {
if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) {
rightPlayerIcon.setIcon(aiPlayerNormalIcon);
@ -293,7 +302,9 @@ public class startLocalGame extends JPanel {
}
}
// Aktualisiert die Textfelder basierend auf den Icons
/**
* Aktualisiert die Textfelder basierend auf den Icons
*/
private void updateTextFields() {
// Für Linken Spieler
if (leftPlayerIcon.getIcon() == humanPlayerIcon) {

View File

@ -178,7 +178,10 @@ public class startMultiplayerGame extends JPanel {
}
// Hilfsfunktionen
// Setzt das jeweils "nächste" Icon, wenn der PlayerLeftButton gedrückt wird.
/**
* Setzt das jeweils "nächste" Icon, wenn der PlayerLeftButton gedrückt wird.
*/
private void togglePlayerIconLeft() {
if (PlayerIcon.getIcon() == humanPlayerIcon) {
PlayerIcon.setIcon(aiPlayerHardIcon);
@ -191,7 +194,9 @@ public class startMultiplayerGame extends JPanel {
}
}
// Setzt das jeweils "nächste" Icon, wenn der PlayerRightButton gedrückt wird.
/**
* Setzt das jeweils "nächste" Icon, wenn der PlayerRightButton gedrückt wird.
*/
private void togglePlayerIconRight() {
if (PlayerIcon.getIcon() == humanPlayerIcon) {
PlayerIcon.setIcon(aiPlayerEasyIcon);
@ -204,7 +209,9 @@ public class startMultiplayerGame extends JPanel {
}
}
// Aktualisiert die Textfelder basierend auf den Icons
/**
* Aktualisiert die Textfelder basierend auf den Icons
*/
private void updateTextFields() {
if (PlayerIcon.getIcon() == humanPlayerIcon) {
PlayerTextField.setText(PlayerNickname);