# Game of Life



## passi (25. Dez 2011)

Hi, im Moment programmiere ich das Game of Life von John H. Conway (Conways Spiel des Lebens ? Wikipedia)

Ich habe einen Algorythmus, um die benachbarten Zellen zu überprüfen. In diesem Beispiel für die linke obere, ausgehend von der aktuellen Zelle. (Eine Zelle hat 8 Nachbarzellen (vertikal, horizontal und diagonal))

Im folgenden Beispiel habe ich eine Kantenlänge von 5. Die Zellen 1|0, 2|1, 2|2, und 2|3 leben. Dies sieht dann so aus:

.*...
..*..
..*..
..*..
.....

Wenn ich jetzt überprüfe, ob Zelle 2|1 einen lebenden Nachbarn hat (In diesem Fall wird wie oben schon erwähnt nur nach einem Nachbarn oben links gesucht) Dies trifft zu, denn die Zelle 1|0 lebt auch). Ich frage mich nur, warum die ausgeklammerte Methode nicht funktioniert, die Methode darunter funktioniert einwandfrei.


```
public boolean lives(int x, int y) {
		boolean lives = false;
		if (myArray[y][x] == "*") {
			lives = true;
		}
		return lives;
	}

	public int getAnzahlLebenderNachbarn(int x, int y) {
		int counter = 0;

//		if(lives([(x - 1 + 5) % 5][(y - 1 + 5) % 5])){
//			counter++;
//		}

		if (myArray[(y - 1 + 5) % 5][(x - 1 + 5)
				% 5] == "*") {
			counter++;
		}
		
		return counter;
	}
}
```

MfG
passi


----------



## Final_Striker (25. Dez 2011)

```
if(lives(...)){
```

Weil [c]lives[/c] eine Variable ist und keine Methode.


----------



## passi (26. Dez 2011)

lives ist eine Methode, die eine lokale Variable lives enthält. Gut, ich gebe zu die Namenswahl ist nicht sonderlich klug. Jedoch existiert die lokale Variable nach Verlassen der Methode lives nicht mehr. Also sollte dort nicht das Problem liegen.


----------



## Gast2 (26. Dez 2011)

Deine Methode erwartet zwei Parameter. Du übergibst aber nur einen, die Syntax da ist auch noch falsch. Das ist kein Array


----------



## Kiri (26. Dez 2011)

```
if(lives([(x - 1 + 5) % 5][(y - 1 + 5) % 5])){...
```

Deine Methode lives erwartet zwei Argumente, du übergibst aber nur 1!


----------



## der-escrimador (26. Dez 2011)

Als erstes solltest du das Array immer in der Reihenfolge x,y benutzen,
sonst macht es die Sache etwas unübersichtlich.

Dann würde ich dir raten ein IDE z.B Eclipse zu benutzen, 
dann fallen Syntaxfehler schneller auf

```
//die Methode lives muss ohne [] aufgerufen werden
// lives(2,2) ok
// lives([2],[2]) falsch
//      if(lives([(x - 1 + 5) % 5][(y - 1 + 5) % 5])){
//          counter++;
//      }
      
if(lives((x - 1 + 5) % 5,(y - 1 + 5) % 5)){
         counter++;
}
```

so sollte es gehen


----------



## passi (26. Dez 2011)

Hä?
lives definiert zwei Parameter: lives(int x, int y). Ich übergebe der lives-Methode doch zwei Argumente:


```
if(lives([(x - 1 + 5) % 5][(y - 1 + 5) % 5]))
```

Lassen wir die if-Anweisung mal weg:


```
lives([(x - 1 + 5) % 5][(y - 1 + 5) % 5])
```

dann habe ich folgenden Aufruf (ausgerechnet):


> Wenn ich jetzt überprüfe, ob Zelle 2|1 einen lebenden Nachbarn hat




```
lives([1][0])
```
 ... bei diesem Aufruf bekomme ich 
	
	
	
	





```
true
```
 zurück.


----------



## Marcinek (26. Dez 2011)

Hallo,

in java ist das hier:


```
lives([1][0])
```
 nur ein Argument.

Eventuell gibt es bei der Methode eine überlagerung? ;D - Aber dann würde es hier auch keine Fehler geben.

Gruß,


----------



## Helgon (26. Dez 2011)

Du verstehst was falsch, die Argumente werden mit einem , getrennt

Also lives(blabla, blabla)


----------



## passi (26. Dez 2011)

@ der-escrimador: Du warst schneller, ich habe deine Antwort zu spät gelesen. Danke, das war mein Fehler. Ist natürlich logisch. Ich habe meinen Fehler ja gerade im letzten Post selbst geschrieben^^. Manchmal sieht man den Wald vor lauter Bäumen nicht. Vielen Dank!


----------



## passi (26. Dez 2011)

Ich hätte da am Rande noch eine Frage. Wenn ich zum Beispiel eine Ausgabe auf der Konsole habe. Eine Methode aufrufe und dieser Argumente mitgebe.


```
System.out.println("Anzahl der lebendenden Nachbarn: " + myGrid.getAnzahlLebenderNachbarn(2, 1));
```

Ist es möglich die gerade übergebenen Argumente mit in die Ausgabe zu bekommen?
So ist die aktuelle Ausgabe:


```
Anzahl der lebendenden Nachbarn: 2
```

So stelle ich mir es vor:


```
Anzahl der lebendenden Nachbarn der Zelle 2|1: 2
```


----------



## Marcinek (26. Dez 2011)

Einige Leute denken zwar, dass man um 1 Uhr nachts gute Programme schreibt, aber so ist es nicht ^^


```
System.out.println("Anzahl der lebendenden Nachbarn: " + myGrid.getAnzahlLebenderNachbarn(2, 1) + " in Spalte 2,1");
```

Also es geht nicht "automatisch"


----------



## der-escrimador (26. Dez 2011)

Doch eigendlich ist um 1Uhr ganz gut 


```
int x = 2;
	int y = 1;
	System.out.println("Anzahl der lebendenden Nachbarn der Zelle " 
        + x+ "|" + y + ":\t" + myGrid.getAnzahlLebenderNachbarn(x, y));
```


----------



## passi (26. Dez 2011)

Danke für die Antworten, das ist aber nicht ganz das, was ich gemeint habe (Ich habe mich vielleicht nicht genau genug ausgedrückt). Was ist, wenn ich z.B. mehrere Anweisungen habe, in denen ich nach den lebenden Nachbarn einer Zelle frage:


```
System.out.println("Anzahl der lebendenden Nachbarn: " + myGrid.getAnzahlLebenderNachbarn(2, 1));
System.out.println("Anzahl der lebendenden Nachbarn: " + myGrid.getAnzahlLebenderNachbarn(0, 4));
System.out.println("Anzahl der lebendenden Nachbarn: " + myGrid.getAnzahlLebenderNachbarn(1, 1));
System.out.println("Anzahl der lebendenden Nachbarn: " + myGrid.getAnzahlLebenderNachbarn(3, 2));
```

Somit fällt die Möglichkeit von der-escrimador weg. Es würde so aber gehen, wie Marcinek es gepostet hat:


```
System.out.println("Anzahl der lebendenden Nachbarn: " + myGrid.getAnzahlLebenderNachbarn(2, 1) + " in Spalte 2,1");
System.out.println("Anzahl der lebendenden Nachbarn: " + myGrid.getAnzahlLebenderNachbarn(0, 4) + " in Spalte 0,4");
```

Sollten die Argumente erst zur Laufzeit (z.B. von einer Benutzereingabe) übergeben werden, ist es dann irgendwie möglich, die Argumente "abzufangen"? Klar, normalerweise speichert man die Benutzereingabe eh in einer Variablen und die könnte man dann wiederum ausgeben (also wie der-escrimador es gepostet hat). Mich würde nur interessieren ob ich die zu übergebenden Argumente auch noch anders ausgeben kann.

passi


----------



## gman (26. Dez 2011)

Hi,

schreib dir doch eine Methode für die Ausgabe:


```
public void printNeighbourStuff(int x, int y) {
    System.out.println("Anzahl der lebendenden Nachbarn der Zelle " 
        + x+ "|" + y + ":\t" + myGrid.getAnzahlLebenderNachbarn(x, y));
}
```

Verwendung:


```
printNeighbourStuff(2, 1));
printNeighbourStuff(0, 4));
printNeighbourStuff(1, 1));
printNeighbourStuff(3, 2));
```



> Sollten die Argumente erst zur Laufzeit (z.B. von einer Benutzereingabe) übergeben werden, ist es dann irgendwie möglich, die Argumente "abzufangen"? Klar, normalerweise speichert man die Benutzereingabe eh in einer Variablen und die könnte man dann wiederum ausgeben (also wie der-escrimador es gepostet hat). Mich würde nur interessieren ob ich die zu übergebenden Argumente auch noch anders ausgeben kann.



Versteh ich jetzt nicht so ganz. Ist dein Problem jetzt die Ausgabe der Werte oder die Übergabe
der Koordinaten für die Ausgabe?


----------



## njans (26. Dez 2011)

Hmm bin wohl etwas spät, was mir jedoch auffällt udn wohl noch keiner geschrieben hat:


```
(myArray[y][x] == "*")
```
Sollte man lieber lassen, kann aber kann auch nicht wahr sein, denn == ist ein Referenzvergleich. 
Daher lieber mit equals() arbeiten.


----------



## TKausL (26. Dez 2011)

njans hat gesagt.:


> Hmm bin wohl etwas spät, was mir jedoch auffällt udn wohl noch keiner geschrieben hat:
> 
> 
> ```
> ...



Da er einen String nutzt stimmt das schon,
allerdings finde ich das etwas sinnlos, dort einen String zu nutzen. Fals das ganze Spiel sich mal vergrößern sollte (1000 x 1000) ist das nichtmehr so Ressourcen sparend. Da sollte man schon zum Char greifen, den man auch wieder mit == vergleichen kann, oder aber zum boolean, der hierbei ja auch völlig ausreicht.


----------



## passi (26. Dez 2011)

Ich könnte das aktuelle String-Array doch auch als boolean-Array nutzen und die Ausgabe mit der toString-Methode bearbeiten. So dass für tote Zellen (false) ein Punkt und für lebendige Zellen (true) ein Sternchen ausgegeben wird. Was haltet ihr davon?


----------



## passi (26. Dez 2011)

Funktioniert alles so wie ich es mir vorstelle. Danke für die Hilfe


----------

