programmieren-projekt/src/BoardDisplay.java

210 lines
7.3 KiB
Java

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
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;
private Ship currentShip;
private Player player;
private boolean vertical = false;
/**
* 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/Spalte
this.fields = new JButton[gridSize][gridSize];
this.ships = new ArrayList<>();
this.player = player;
this.gridSize = gridSize;
System.out.println("Name in Boarddisplay: " + player.getName());//Testausgabe
// Erstellung von Spielfeld
for (int i = 0; i <= gridSize; i++) {
for (int j = 0; j <= gridSize; j++) {
final int x = i - 1; // Temporäre Variable
final int y = j - 1; // Temporäre Variable
if (i == 0 && j == 0) {
add(new JLabel(" "));
} else if (i == 0) {
JLabel colLabel = new JLabel(String.valueOf(j));
colLabel.setHorizontalAlignment(SwingConstants.CENTER);
colLabel.setFont(new Font("Arial", Font.BOLD, 14));
add(colLabel);
} else if (j == 0) {
JLabel rowLabel = new JLabel(String.valueOf((char) ('A' + i - 1)));
rowLabel.setHorizontalAlignment(SwingConstants.CENTER);
rowLabel.setFont(new Font("Arial", Font.BOLD, 14));
add(rowLabel);
} else {
// Spielfeld (interaktive Zellen)
JButton field = new JButton("");
field.setBackground(Color.BLUE);
field.setOpaque(true);
field.setBorderPainted(true);
fields[i - 1][j - 1] = field;
add(field);
//field.addMouseListener(new MouseAdapter() {
// @Override
//public void mouseClicked(MouseEvent e) {
// if (SwingUtilities.isRightMouseButton(e)) {
// handleFieldClick(field);
// }
// }
//@Override
//public void mouseExited(MouseEvent e) {
// field.setBackground(Color.LIGHT_GRAY);
// }
// });
field.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)) {
togglePlacementDirection(); // Ausrichtung ändern
} else if (SwingUtilities.isLeftMouseButton(e)) {
Point o = new Point(x, y);
currentShip.setHorizontal(vertical);
handleFieldClick(o); // Linksklick -> Schiff platzieren
vertical = false; // TODO nur nach auswahl von neuem Modul wieder auf false setzten
}
}
});
}
}
}
// this.ships = new ArrayList<Ship>();
}
public void selectCurrentShip(Ship ship) {
this.currentShip = ship;
}
public void resetAllShips() {
ships.clear();
this.currentShip = null;
for(int i = 0; i < gridSize; i++) {
for(int j = 0; j < gridSize; j++) {
fields[i][j].setBackground(Color.BLUE);
}
}
}
/**
* 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)) {
ship.setPosition(new Point(o.getX(),o.getY()),player.getBoard().getShips(),gridSize);
ship.setHorizontal(horizontal);
ships.add(ship);
List<Point> occupied = ship.getOccupiedPoints();
for(Point p: occupied) {
fields[p.getX()][p.getY()].setBackground(Color.LIGHT_GRAY);
}
return true;
}else{
return false;
}
}
/*private boolean placeable(Ship ship,Point o, boolean horizontal) {
if (horizontal && (o.getX() + ship.getSize() > gridSize)) { // Fehler
return false;
}
if (!horizontal && (o.getY() + ship.getSize() > gridSize)) {
return false;
}
return true;
}*/
/**
* 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;
}
if (!horizontal && (o.getY() + ship.getSize() > gridSize)) {
return false;
}
// Prüfen auf Kollision mit bestehenden Schiffen
for (Ship other : ships) {
for (Point p : other.getOccupiedPoints()) {
for (Point newP : ship.getOccupiedPoints()) {
if (p.equals(newP)) {
return false; // Überschneidung gefunden
}
}
}
}
return true;
}
/**
* Wechselt die Platzierungsrichtung zwischen horizontal und vertikal.
*/
private void togglePlacementDirection() {
vertical = !vertical;
String direction = vertical ? "vertikal" : "horizontal";
System.out.println("Platzierungsrichtung geändert zu: " + direction);
}
/**
* Handhabt das Platzieren eines Schiffs auf dem Spielfeld.
* @param o Die Koordinaten des Klicks.
*/
private void handleFieldClick(Point o) {
if (!this.currentShip.setPosition(o,player.getBoard().getShips(),this.gridSize)) {
}
paintFields();
//if(this.currentShip.isPlaced()){
// this.currentShip.
// };
// Beispiel: Setze ein Schiff bei einem Klick
//if (setShip(new Ship(3, "TestShip"), o, true,player)) {
// field.setBackground(Color.BLUE); // Visualisiere Schiff
//}
}
public void paintFields() {
for(int i = 0; i < gridSize; i++) {
for(int j = 0; j < gridSize; j++) {
if(fields[i][j] == null) {
continue;
}
fields[i][j].setBackground(Color.BLUE);
for(Ship ship: player.getBoard().getShips()) {
if(ship.isShipOnPos(new Point(i,j))) {
fields[i][j].setBackground(Color.LIGHT_GRAY);
break;
}
}
}
}
}
}