Schiffe versenken

Loud Silence

Bekanntes Mitglied
Ich bin wahrscheinlich der zigtausendeste der das vorhat.
Jetzt stoße ich schon ganz am Anfang auf ein Problem:
Nämlich bei der Verteilung der Schiffe.
Ich habe 25 Label und will darauf Schiffe verteilen.
Wenn ich jetzt eines anklicke sollen, je nach dem welche Art von Schiff, die 1, 2, 3 oder 4 darunter liegenden Label schwarz werden.

Ich weiß nicht ob der Ansatz an sich euch nicht die Haare zu Berge stehen lässt.
Wenn nicht würde ich mich über ne Antwort freuen.
 

faetzminator

Gesperrter Benutzer
Hab auch Mal so was begonnen - allerdings Mehrspieler zum selber setzen. Leider liefert Google keine gescheiten Informationen, wie man am einfachsten eine solche Map erstellt.
Also musst du wohl zu Brute-Force greifen. Mach für alle Schiffe, am Besten mit dem grössten beginnend, jeweils eine Liste, welche Positionen noch möglich sind. Du shuffle'st die Liste und merkst sie dir. Wenn die Liste leer ist, musst du das vorherige Schiff wieder entfernen und die nächste mögliche Kombination verwenden. Wenn alle ausprobiert sind, muss dieser Schritt (das Entfernen des vorherigen) natürlich wiederholt werden. Irgendwie so.
 

diggaa1984

Top Contributor
hm das Prinzip habe ich ja schonmal verstanden .. nur die Frage ist, wo genau hast du das Problem :)
Du willst das der Nutzer die Schiffe (nicht wie faetzminator annahm, der computer) manuell auf der Karte platziert. Soweit ok.

Wo hängts? :D eventuell mit Code
 

Loud Silence

Bekanntes Mitglied
Also ich hab 25 im Quadrat angeordnete Label.
Wenn der User eines anklickt soll es schwarz werden.
Das sollte kein Problem werden.
Jetzt muss es aber Schiffe mit mehr als einem Feld geben
--> die darunter liegenden Label müssen mit gefärbt werden.
Aber wie?
 

hdi

Top Contributor
Also wann immer man ein rechteckiges Spielfeld hat bietet sich ein 2D-Array an:
Java:
private Feld[][] felder = new Feld[breite][hoehe]; // class Feld extends JLabel

Durch den wahlfreien Zugriff und die interne Array-Anordnung kannst du ganz leicht ganz bestimmte Positionen innerhalb des Spielfelds ansprechen.

Wenn du auf ein Feld geklickt hast, findest du zunächst seine Position im 2D-Array heraus.

int xPos = ...
int yPos = ...

Es ist jetzt die Frage wo du die Position speichern willst. Sie ist natürlich indirekt durch die Indizes des Arrays gegeben. Entweder du machst deinen Action/MouseListener direkt in das Spielfeld-Panel, und berechnest aus den Maus-Koordinaten das geklickte Feld, oder du speicherst die Array-Position im Feld selbst, und hängst dort deinen ActionListener dran. Ist zwar dann eigentlich redundant, aber am einfachsten:

Also befüllst du das Spielfeld wie folgt:
Java:
for(int x = 0; x<felder.length; x++){
    for(int y = 0;y<felder[x].length;y++){
       felder[x][y] = new Feld(x,y);
    }
}

Wenn du jetzt auf ein Feld klickst ist dir die Position des Felder im Array bekannt:

int xPos = feld.getX();
int yPos = feld.getY();

Und jetzt ist es natürlich leicht, die Felder darunter zu bekommen:

Java:
felder[xPos][yPos + 1] // Feld 1 darunter
felder[xPos][yPos + 2] // Feld 2 darunter
// usw
 

Loud Silence

Bekanntes Mitglied
Ok werde ich mal versuchen.
Gibt es eine Möglichkeit alle Label zu vereinheitlichen?
Sprich:
Ich schreibe einmal:
Von hier an werden alle Label, wie viele ich auch erstelle, blau und haben die Größe 20, 20
 

hdi

Top Contributor
Klar, mit einem LayoutManager und einer Schleife. Am besten GridLayout, dann sind die automatisch gleich groß.

Java:
panel.setLayout(new GridLayout(Anzahl Zeilen, Anzahl Spalten));
for(int i = 0; i< anzahlFelderGesamt; i++){ 
    Feld feld = new Feld(...);
    feld.setOpaque(true); // <- sonst geht das nicht mit der Hintergrundfarbe
    feld.setBackground(..);
    feld.setPreferredSize(new Dimension(breite, hoehe));
    panel.add(feld);
}

Falls dir LayoutManager nix sagen: Man verwendet dabei weder setSize noch setBounds oder sowas. Wichtig ist am Ende, nachdem du alle Komponenten ins Frame eingefügt hast, ein Aufruf der Methode
Code:
pack();
auf dem Frame.
 

Ähnliche Java Themen

Neue Themen


Oben