Zweidimensionales Array durchsuchen und ändern

banthrass

Mitglied
Hallo zusammen,

wie schon mal erwähnt bin ich neu in Java. Aktuell stehe ich vor eine Aufgabe an der Uni. Wir sollen das GameOfLife programmieren....oder zumindest einen Teil davon. Aber mir fehlt irgendwie der richtige Ansatz. Ich will hier keine Lösung nur ein wenig Hilfe.

Es gibt ein zweidimensionales Array, das ich durchsuchen muss. Wenn bestimmte Vorgaben erfüllt werden, muss ich im Array etwas ändern.

Diese Bedingungen sind folgende:
Eine lebende Zelle lebt auch in der Folgegeneration, wenn genau zwei oder drei der acht
benachbarten Zellen in der aktuellen Generation leben.
 Eine lebende Zelle stirbt in der Folgegeneration an Einsamkeit oder Überbevölkerung, wenn
in der aktuellen Generation weniger als zwei oder mehr als drei der acht Nachbarzellen
leben.
 Eine tote Zelle wird in der Folgegeneration lebendig, wenn genau drei ihrer acht Nachbarn
in der aktuellen Generation lebendig sind.
 Unabhängig von den obigen drei Regeln sind die Randzellen (also dienjenigen Zellen, die
nicht genau acht Nachbarn haben) immer tot.

Hier mal das Array:
True ist eine lebende Zelle. Wird eine lebende Zelle gefunden, muss die Umgebung überprüft werden. Je nach Ergebnis muss der Zustand ja geändert werden.
Java:
	boolean[][] feld = { 
	{ false, false, false, false, false },
	{ false, false, true, false, false },
	{ false, false, true, false, false },
	{ false, false, true, false, false },
	{ false, false, false, false, false } }

Ich will mich erst mal an der ersten Bedingung versuchen. Leider find ich gerade keinen Ansatz dafür. Eine Lösung wäre sicherlich alle mit IF-Abfragen zu machen, wobei mir das sehr unelegant vorkommt. Im Forum habe ich bereits ansätze dazu gefunden. Teilweise hab ich sie nicht verstanden und teilweise waren sie in meinen Augen nicht so gut, da Sie probleme gemacht haben wenn man an den Rand des Arrays kommt.

Hat jemand einen guten Ansatz für mich?

Danke an alle
 
Zuletzt bearbeitet:

nrg

Top Contributor
erstmal musst du die erste lebendige zelle finden. das machst du mit einer verschachtelten for-schleife

Java:
for (int i = 0; i < feld.length; i++) {
     for (int j = 0; j < feld[i].length; j++) {
          if (feld[i][j]) doSomething(i, j);
     }
}

doSomething könnte dann einfach die benachbarten Zellen überprüfen:
feld[i-1][j-1]...
feld[i+1][j+1]...
feld[i-1][j]...
feld[j-1]...
etc.

vermeide dabei aber AIOOBE's mit Abfragen a la i >= 0 && i < länge
 

AmunRa

Gesperrter Benutzer
Eine Sache noch bei den For Schleifen,

da die Rand Zellen immer tot sind, bruachst du diese nicht zu besuch ob diese leben,


daher kannst:
Java:
for ( int i=1 ;i<feld.legnth-1;i++){
   for (int j= 1; j<feld[i].length -1;j++){

        if (feld[i][j]) doSomething();

   }
}

daher brauchst du dir dann in do something keine gedanken machen ob du vl eine ArrayIndexOutOfBoundsException bekommst, weil garantiert ist, dass es immer ein i+-1 und j+-1 feld gibt.
 

banthrass

Mitglied
:) danke für die Unterstützung. Bin gerade an diesem Punkt angekommen, wo ich mir um den Rand gedanken gemacht habe :). der Tip kam zur richtigen Zeit.
danke :)

PS.:
Wo kämen wir denn hin, wenn jeder nur sagen würde "Wo kämen wir denn
hin" und niemand ginge, um zu sehen, wohin man käme, wenn man ginge.

sehr cool :D:lol:
 

Samuel72

Aktives Mitglied
Noch ein kleiner Hinweis:
Du kannst nicht einfach die Zellen der Reihe nach durchgehen und im Bedarfsfall setzen/löschen,
da dann das Ergebnis für die folgenden Nachbarzellen falsch sein kann.

Eine Möglichkeit ist, in einem neuen zweidimensionalen Array die nächste Generation anzulegen
und dann, wenn alle Zellen fertig berechnet sind, zurückzukopieren.
 

banthrass

Mitglied
Hallo zusammen,

ich bin eben fertig geworden :). Danke für die Hilfe. Vielleicht hilft einem mein Code ja weiter:

Java:
public class GameOfLife {

	//Deklaration und Initialisierung des zweidimensionalen Felds
	boolean[][] feld = { { false, false, false, false, false },
			{ false, false, true, false, false },
			{ false, false, true, false, false },
			{ false, false, true, false, false },
			{ false, false, false, false, false } };
	
	//Deklaration und Initialisierung von privaten Variablen ( Sind nur in dieser Klasse sichtbar)
	private final int MaxRows = 5;
	private final int MaxCols = 5;
	
	//Programmeinstieg
	public static void main(String[] args) {
		GameOfLife myGame = new GameOfLife();
		for (int i = 0; i < 10; i++) {
			myGame.nextGeneration();
			myGame.print();
			System.out.println();
		}
	}

	//Funktion zur Ausgabe
	void print() {
		for (int i = 0; i < MaxRows; i++) {
			for (int j = 0; j < MaxCols; j++) {
				if (feld[i][j] == true)
					System.out.print(" o ");
				else
					System.out.print(" . ");
			}
			System.out.println();
		}
	}

	//Funktion zum zählen der lebenden Zellen
	int lifeCounter(int row, int col) {
		int counter = 0;
		
		try {
			if (feld[row - 1][col] == true)
				counter++;
			if (feld[row + 1][col] == true)
				counter++;
			if (feld[row][col - 1] == true)
				counter++;
			if (feld[row][col + 1] == true)
				counter++;
			if (feld[row - 1][col - 1] == true)
				counter++;
			if (feld[row + 1][col + 1] == true)
				counter++;
			if (feld[row + 1][col - 1] == true)
				counter++;
			if (feld[row - 1][col + 1] == true)
				counter++;
		} catch (ArrayIndexOutOfBoundsException e) {
			counter = 0; //Randzellen die nicht genau 8 Nachbarn haben sind tot
		}
		return counter;
	}

	void nextGeneration() {
		//Temp. zweidimensionales Array 
		boolean[][] tmpFeld = new boolean[MaxRows][MaxCols];
		
		//Iteration der Zeilen
		for (int i = 0; i < MaxRows; i++) {
			//Iteration der Spalten
			for (int j = 0; j < MaxCols; j++) {
				// Übergibt Anzahl lebender Zellen an alive
				int alive = lifeCounter(i, j);
				if (feld[i][j] == true) {
					if(alive == 2 || alive == 3) { 
						tmpFeld[i][j] = true;
					}
					else
						tmpFeld[i][j] = false;
				} else {
					tmpFeld[i][j] = alive == 3;
				}
			}
		}
		feld = tmpFeld;
	}
}
 

AmunRa

Gesperrter Benutzer
so ich hab noch nen kleinen kritik Punkt anzubringen.
wie ich in meinem oberen Post schon geschrieben hab musst du die Randfelder nicht durchlaufen.
daher kann man das so machen und spart sich einen try-catch-Block den ich ehrlich gesagt nicht schön finde.

Java:
public class GameOfLife2{
 
    //Deklaration und Initialisierung des zweidimensionalen Felds
    boolean[][] feld = { { false, false, false, false, false },
            { false, false, true, false, false },
            { false, false, true, false, false },
            { false, false, true, false, false },
            { false, false, false, false, false } };
    
    //Deklaration und Initialisierung von privaten Variablen ( Sind nur in dieser Klasse sichtbar)
    private final int MaxRows = 5;
    private final int MaxCols = 5;
    
    //Programmeinstieg
    public static void main(String[] args) {
        GameOfLife2 myGame = new GameOfLife2();
        for (int i = 0; i < 10; i++) {
            myGame.nextGeneration();
            myGame.print();
            System.out.println();
        }
    }
 
    //Funktion zur Ausgabe
    void print() {
        for (int i = 0; i < MaxRows; i++) {
            for (int j = 0; j < MaxCols; j++) {
                if (feld[i][j] == true)
                    System.out.print(" o ");
                else
                    System.out.print(" . ");
            }
            System.out.println();
        }
    }
 
    //Funktion zum zählen der lebenden Zellen
    int lifeCounter(int row, int col) {
        int counter = 0;
        
       
            if (feld[row - 1][col] == true)
                counter++;
            if (feld[row + 1][col] == true)
                counter++;
            if (feld[row][col - 1] == true)
                counter++;
            if (feld[row][col + 1] == true)
                counter++;
            if (feld[row - 1][col - 1] == true)
                counter++;
            if (feld[row + 1][col + 1] == true)
                counter++;
            if (feld[row + 1][col - 1] == true)
                counter++;
            if (feld[row - 1][col + 1] == true)
                counter++;
       
        return counter;
    }
 
    void nextGeneration() {
        //Temp. zweidimensionales Array 
        boolean[][] tmpFeld = new boolean[MaxRows][MaxCols];
        
        //Iteration der Zeilen
        for (int i = 1; i < MaxRows-1; i++) {    //<- HIER muss man die Randfelder nicht durchlaufen
            //Iteration der Spalten
            for (int j = 1; j < MaxCols-1; j++) {    //<- HIER muss man die Randfelder nicht durchlaufen
                // Übergibt Anzahl lebender Zellen an alive
                int alive = lifeCounter(i, j);
                if (feld[i][j] == true) {
                    if(alive == 2 || alive == 3) { 
                        tmpFeld[i][j] = true;
                    }
                    else
                        tmpFeld[i][j] = false;
                } else {
                    tmpFeld[i][j] = alive == 3;
                }
            }
        }
        feld = tmpFeld;
    }
}
 

banthrass

Mitglied
Also die Geschichte mit dem try/catch und auch den Randzellen war teil der Aufgabe die ich lösen sollte. Von daher ist das okay. Andernfalls wäre deine Lösung sicherlich besser.

Danke nochmal.
Gruß
 

AmunRa

Gesperrter Benutzer
Natürlich wenn der Lehrer das so will sollst du so abgeben, aber ich find es eben eleganter wenn man keine try-catch-Blöcke verwendet
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Ü Zweidimensionales Array in der ersten Zeile deklarieren Java Basics - Anfänger-Themen 13
S Prüfen ob ein zweidimensionales Array rechteckig ist Java Basics - Anfänger-Themen 4
sserio Iterierung über ein zweidimensionales Array Java Basics - Anfänger-Themen 16
sserio Zweidimensionales Array [][] wird untereinander ausgegeben Java Basics - Anfänger-Themen 14
G zweidimensionales int Array sortieren Java Basics - Anfänger-Themen 57
P Zweidimensionales Array als Tabelle mit befüllten Zahlen Java Basics - Anfänger-Themen 10
Yasemin bahar zweidimensionales Array Java Basics - Anfänger-Themen 5
O zweidimensionales array in eine csv-Datei Java Basics - Anfänger-Themen 1
K Übergabe von Werten (zweidimensionales Array) aus einer Methode an zweidimensionales Array in main() Java Basics - Anfänger-Themen 3
I Java zweidimensionales array befüllen mit for-schleife Java Basics - Anfänger-Themen 2
J zweidimensionales Array Java Basics - Anfänger-Themen 1
S Zweidimensionales Array in ein eindimensionales Array speichern Java Basics - Anfänger-Themen 6
J Zweidimensionales array kopieren und in eindimensionales überführen Java Basics - Anfänger-Themen 304
X Java zweidimensionales Array Java Basics - Anfänger-Themen 5
J Zweidimensionales Array in CSV File exportieren Java Basics - Anfänger-Themen 3
U Methoden Zweidimensionales Array mit Arrays.sort sortieren? Java Basics - Anfänger-Themen 22
F Erste Schritte zweidimensionales array Java Basics - Anfänger-Themen 2
J Erste Schritte zweidimensionales Array Muster befüllen. Java Basics - Anfänger-Themen 4
K drei eindimensionale Arrays in ein zweidimensionales Array Java Basics - Anfänger-Themen 10
K Zweidimensionales Array erstellen und zufällig mit 0 und 1 füllen Java Basics - Anfänger-Themen 11
P zweidimensionales Array anlegen und mit DB-Daten füllen Java Basics - Anfänger-Themen 14
W Erste Schritte Zweidimensionales Array - Gerade Zahlen anzeigen lassen Java Basics - Anfänger-Themen 3
L zweidimensionales char array reihenfolge ändern ? Java Basics - Anfänger-Themen 2
C ZweiDimensionales Array erstellen und Spiegeln Java Basics - Anfänger-Themen 1
H zweidimensionales array füllen Java Basics - Anfänger-Themen 6
D Zweidimensionales Array ( Java Basics - Anfänger-Themen 2
D Zweidimensionales Array (Länge) Java Basics - Anfänger-Themen 2
M Zweidimensionales Array aus Textdatei gewinnen Java Basics - Anfänger-Themen 6
M Zweidimensionales Array um 1 addieren Java Basics - Anfänger-Themen 3
B Zweidimensionales Array Elemente jeder Spalte zählen Java Basics - Anfänger-Themen 9
C Methoden Diagonalen am best. Punkt im zweidimensionales array finden Java Basics - Anfänger-Themen 3
S Zweidimensionales Array mit Diagonalen Java Basics - Anfänger-Themen 9
M Zugriffsproblem auf (zweidimensionales) Array in einer ArrayList Java Basics - Anfänger-Themen 15
C Datentypen Zweidimensionales Array mit String und int Java Basics - Anfänger-Themen 3
W Datentypen Zweidimensionales Boolean Array Java Basics - Anfänger-Themen 13
A Zweidimensionales Array Java Basics - Anfänger-Themen 3
M Zweidimensionales Array durchlaufen Java Basics - Anfänger-Themen 4
C zweidimensionales Array sortieren Java Basics - Anfänger-Themen 6
J Zweidimensionales Array durch ToString ausgeben lassen Java Basics - Anfänger-Themen 21
B Zweidimensionales Array mit boolean Werten Java Basics - Anfänger-Themen 3
M Zweidimensionales Array befüllen Java Basics - Anfänger-Themen 4
C Zweidimensionales String Array initialisieren Java Basics - Anfänger-Themen 2
S Zweidimensionales Array mit Schleife summieren Java Basics - Anfänger-Themen 2
N zweidimensionales array größe bestimmen Java Basics - Anfänger-Themen 1
F Datentypen Zweidimensionales Array füllen Java Basics - Anfänger-Themen 6
S zweidimensionales ARRAY Java Basics - Anfänger-Themen 2
S zweidimensionales Array Java Basics - Anfänger-Themen 6
berti99 Zweidimensionales Array befüllen Java Basics - Anfänger-Themen 5
U Zweidimensionales Array mit Eindimensionalem Array Java Basics - Anfänger-Themen 7
J zweidimensionales Array einselen und ausgeben Java Basics - Anfänger-Themen 15
G Zweidimensionales Array - dynamisch Java Basics - Anfänger-Themen 4
M Zweidimensionales Array Java Basics - Anfänger-Themen 3
G zweidimensionales Array vergrößern Java Basics - Anfänger-Themen 3
M Zweidimensionales dynamisches Array füllen Java Basics - Anfänger-Themen 2
J zweidimensionales Array Java Basics - Anfänger-Themen 3
M Zweidimensionales String-Array initialisieren Java Basics - Anfänger-Themen 6
P zweidimensionales Array erstellen Java Basics - Anfänger-Themen 9
D erste spalte eines zweidimensionales Array sortieren ??!! Java Basics - Anfänger-Themen 2
N zweidimensionales 10x10 Feld erstellen Java Basics - Anfänger-Themen 3
D aus 2 arrays ein zweidimensionales formen Java Basics - Anfänger-Themen 9
R dynamisches zweidimensionales Feld erzeugen Java Basics - Anfänger-Themen 8
V Zweidimensionales Ganzzahlfeld Java Basics - Anfänger-Themen 7
T Array verkleinern Java Basics - Anfänger-Themen 2
J Array aus Numberfield Eingaben Java Basics - Anfänger-Themen 7
D Array List mit Objekten sortieren Java Basics - Anfänger-Themen 2
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
Thomas Uppe 2D Array Reihenfolge vermischen Java Basics - Anfänger-Themen 4
T array auslesen Java Basics - Anfänger-Themen 2
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
moini Auf Array aus Superklasse zugreifen? Java Basics - Anfänger-Themen 2
J ArrayList in 2D-Array konvertieren. Java Basics - Anfänger-Themen 48
M NullPointerException: Cannot read the array length because "this.Kinder" is null Java Basics - Anfänger-Themen 1
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
Finn_lol Fehlermeldung bei Schleife mit Array Java Basics - Anfänger-Themen 4
Proxy Chars vor array übergabe toLowerUpcase Java Basics - Anfänger-Themen 14
iAmFaiinez Primzahlen Tester ohne Array Java Basics - Anfänger-Themen 4
S array 2 dimensional treppe Java Basics - Anfänger-Themen 3
S Array 2x2 Blöcke mit 0 und 1 Java Basics - Anfänger-Themen 10
C Array von Klassen Java Basics - Anfänger-Themen 2
julian0507 2Dim-Array Spaltensummen Java Basics - Anfänger-Themen 1
XWing Doppelte Zahlen im Array Java Basics - Anfänger-Themen 8
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
Proxy Stack erweitern mit neuem Array falls der alte voll ist!? Java Basics - Anfänger-Themen 5
E Array, nächste Zahl zur 5 ausgeben, wie? Java Basics - Anfänger-Themen 42
J Array.list vergleichen Java Basics - Anfänger-Themen 1
W Java-Code mit Array Java Basics - Anfänger-Themen 14
D Reflections & Generisches Array Java Basics - Anfänger-Themen 4
T Array Java Basics - Anfänger-Themen 2
T Array Java Basics - Anfänger-Themen 15
T Wörteranzahl im Array zählen Java Basics - Anfänger-Themen 9
Ostkreuz Zweidimensionaler Array Index Java Basics - Anfänger-Themen 2
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
R 2d Array individuell machen Java Basics - Anfänger-Themen 4
D 2D Char Array into String Java Basics - Anfänger-Themen 2
J Array Median bestimmen Java Basics - Anfänger-Themen 6
S Array Maximum bestimmen mit for und foreach Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben