Boolean in Java richtig verwenden?
Ich habe einen code wo ich bestimmte Koordinaten, auf true setzen möchte, wenn sie es nicht schon sind, wenn sie bereit true sind soll die forschleife nicht hochgezählt werden. Leider weiß ich überhaupt nicht wie man mit booleans arbeitet ( bin neu im Coden) Kurze Hilfe wo ich einen Denkfehler habe und Verbesserung des Codes wären toll. Hier der Code:
public void generiereBomben() {
int bomben = ((manager.boardGui.getBreite() * manager.boardGui.getLaenge()) /8);
for(int counter = 0; counter < bomben; counter++ ) {
int koordx = random.nextInt(manager.boardGui.getLaenge());
int koordy = random.nextInt(manager.boardGui.getBreite());
if (bombeliegt[koordx][koordy] = false) {
bombeliegt[koordx][koordy] = true;
System.out.println("durchgang bombelegen");
}else {
counter = counter - 1;
System.out.println("bombenichtlegen");
}
}
Vielen Dank für die Hilfe
2 Antworten
Der einzige Fehler, der mir auffällt, ist dieses "if (bombeliegt[koordx][koordy] = false) {", was schon gesagt wurde. Da musst du halt entweder das = durch == austauschen oder du nimmst den Vergleich raus, weil in dem Array ja sowieso schon booleans gespeichert sind.
Wenn du ein Boolean-Array erzeugst, werden die Felder automatisch alle mit false initialisiert, also brauchst du da nicht großartig was machen.
Was ich dir aber eigentlich empfehlen will: So, wie es aussieht, willst du einen Minesweeper-Klon bauen. Die jeweiligen Felder können also mehrere Zustände haben (leer, leer aber angeklickt, versteckte Bombe, Bombe angeklickt, mit einer Flagge markiert, Anzahl der umliegenden Bomben etc.). Es wäre aber schlecht, wenn du für jede der Eigenschaften ein Array baust, also solltest du eine Klasse bauen, die die ganzen Eigenschaften für jede Zelle speichern kann. Davon kannst du dann Objekte erzeugen, die du in dein Array packen kannst.
Das mit dem True setzen funktioniert jetzt auch erstmal habs hinbekommen
Ja richtig erkannt das soll ein Minesweeper-Klon werden, ich habs leider noch nicht so mit der Logik und wie ich das am besten umsetze und zu dem wie du es meinst kann ich mir leider nicht vorstellen wie ich das dann genau umsetzen soll -
if (bombeliegt[koordx][koordy] = false)
ist kein Vergleich. Dazu wären "==" nötig
das kannst du einfacher verkürzen:
if (!bombeliegt[koordx][koordy])
ist das gleiche wie
if (bombeliegt[koordx][koordy] == false)
ergänzung :
das ! vor dem boolean , negiert diesen , also aus wahr wird falsch , aus falsch wird wahr -
Boolean oder boolean? Also Gewrapped oder primitiv? Die Wrapperklasse ist standardmäßig null, der primitive boolean muss immer initialisiert werden.
boolean bombeliegt[][] = new boolean[manager.boardGui.getLaenge()][manager.boardGui.getBreite()];
So erstelle ich es - wenn da nichts falsch ist müsste ich was in meiner boardgui klasse falsch haben würde ich vermuten
Oder muss ich erst den ganzen boolean array auf false setzen damit dieser nicht überall null ist ?
das Array ist ja dann erstmal leer. Du hast nur die Dimensionen definiert, nicht den Inhalt.
Und lege das boolean Array am besten nicht mit dem primitiven "boolean" an, sondern mit der Klasse "Boolean", damit auch ein Null-Wert möglich ist.
wie genau mach ich das :´) ich hab noch gar keine Ahnung von Wrapper Klassen
Boolean bombeliegt[][] = new Boolean[manager.boardGui.getLaenge()][d2];
"new boolean" ist gar nicht möglich.
Du brauchst übrigens auch noch eine 2. Dimension d2, du definierst ja nur die eine bisher.
Alternativ machst du ein eindimensionales Array:
Boolean bombeliegt[] = new Boolean[manager.boardGui.getLaenge()];
Also wenn ich es mit der Wrapper Klasse mache läufts nicht durch, so wie ich es gemacht habe (mit der Hilfe das mein vergleich falsch ist ) läuft es wenigstens n paar mal durch dann kommt ne array out of bounds exception
habs mal selbst probiert, mit dem primitiven boolean wird dann automatisch das array mit false gefüllt.
Mit der Wrapperklasse müsstest du selbst erstmal jeden Wert instanziieren.
Du kannst also auch boolean nutzen, wenn du das willst.
Bei mir sieht es jetzt gerade so aus:
public void generiereBomben() {
//Arrays.fill(bombeliegt, false);
int bomben = ((manager.boardGui.getBreite() * manager.boardGui.getLaenge()) /8);
int counter = 0;
while(counter < bomben) {
//for(int counter = 0; counter < bomben; counter++ ) {
int koordx = random.nextInt(manager.boardGui.getLaenge()+1);
int koordy = random.nextInt(manager.boardGui.getBreite()+1);
if (bombeliegt[koordx][koordy] == false) {
bombeliegt[koordx][koordy] = true;
System.out.println("durchgang bombelegen" + koordx + koordy);
counter++;
}else {
//counter = counter - 1;
System.out.println("bombenichtlegen");
Findest du rein zufällig warum bei mir eine Arrayoutofbounds exception kommt ?
Ja. Der Index eines Arrays beginnt bei 0.
Das heißt, wenn dein Array
array[][] = new boolean[10][10] ist, dann gibt es beim Zugriff kein Element bei array[10][10].
das erste Element liegt bei array[0][0] und das letzte bei array[9][9]
Ja habe es selbst realisiert das mein feld ja nur 9x9 Felder groß ist x)
Es ist schon 10x10 Felder groß. von 0-9, das sind 10. Also wäre es, wenn mein Beispiel zutriff :D
Naja ich get die zahlen ja aus ner anderen klasse, da hab ich angegeben das mein gridlayout 9x9 felder groß ist also brauch ich nur ein array von 0 - 8, jetzt funktioniert jedenfalls alles
Okay es klappt trotzdem nichts. Der erste Fehler kommt bei mir schon beim erstellen des boolean array und ich weiß echt nicht warum
Was ist der Standard Zustand eines boolean? Gibts da einen?