Hi
ich habe gestern zum Spaß versucht “Conways Game of Life” (23/3) zu schreiben.
Bei Conways game of Life gibt es viele Zellen. Eine leere Zelle wird “belebt” wenn 3 angrenzende Zellen belebt sind.
Eine lebende Zelle bleibt am Leben wenn sie 2 oder 3 lebende Nachbarn hat.
Funktioniert so weit eigentlich auch ganz gut, aber irgendwas scheint mit meinen Tod/GeburtsBedingungen nicht zu stimmen, denn keine der oszillierende Objekte funktioniert bei mir und die Ergebnisse sehen immer anders aus als sie eigentlich sollten.
Hier der Code der Klasse in der die neue Generation berechnet wird:
Level.java
[spoiler]```package cmdmole.game.life;
public class Level {
private Zelle[][] zellen;
private Zelle[][] zellenTmp;
private int width;
private int height;
public Level(int width, int height)
{
zellen = new Zelle[width][height];
zellenTmp = new Zelle[width][height];
int chance = (width*height) / 400;
for(int x = 0; x < width; x++)
{
for(int y = 0; y < height; y++)
{
/*if(Component.rand.nextInt(chance) == 0)
zellen[x][y] = new Zelle(true);
else*/
zellen[x][y] = new Zelle(false);
}
}
zellen[89][90] = new Zelle(true); // Bilnker Figur, funktioniert nicht
zellen[90][90] = new Zelle(true);
zellen[91][90] = new Zelle(true);
/*zellen[90][90] = new Zelle(true); // Figur aus Wikipedia, sieht auch anders aus als erwartet
zellen[90][91] = new Zelle(true);
zellen[89][90] = new Zelle(true);
zellen[90][89] = new Zelle(true);
zellen[91][89] = new Zelle(true);*/
this.width = width;
this.height = height;
}
public void tick()
{
zellenTmp = zellen;
for(int x = 0; x < height; x++)
{
for(int y = 0; y < width; y++)
{
if(zellenTmp[x][y] == null)
{
throw new NullPointerException();
}
else
{
if(zellenTmp[x][y].isAlive())
{
if(!this.canSurvive(x, y))
{
zellen[x][y].kill();
break;
}
} else {
if(this.canBeRevived(x, y))
{
zellen[x][y].revive();
}
}
}
}
}
//zellenTmp = null;
}
private boolean canSurvive(int x, int y)
{
int n = getNeighbourCount(x, y);
if(n == 2 || n == 3) return true;
else return false;
}
private boolean canBeRevived(int x, int y)
{
if(getNeighbourCount(x, y) == 3) return true;
else return false;
}
// hier liegt vermutlich der Fehler. Habe aber schon versucht die Methode ganz neu zu schreiben, ist aber immmer noch genauso wie vorher.
// das auskommentierte ist der alte Code
private int getNeighbourCount(int x, int y)
{
int counter = 0;
int startX = (x <= 0 ? x : x-1);
int startY = (y <= 0 ? y : y-1);
int endX = (x >= 179 ? x : x+1);
int endY = (y >= 179 ? y : y+1);
for(int xO = startX; xO <= endX; xO++)
{
for(int yO = startY; yO <= endY; yO++)
{
if(zellenTmp[xO][yO].isAlive())
{
counter++;
}
}
}
if(zellenTmp[x][y].isAlive()){
counter --;
}
/**
for(int xO = (x > 0 ? (x >= 179 ? 2 : -1) : 1); xO <= 1; xO+=2)
{
for(int yO = (y > 0 ? (y >= 179 ? 2 : -1) : 1); yO <= 1; yO+=2)
{
//System.out.println("xO : " + xO + " , y: " + yO);
if(zellenTmp[x+xO][y+yO].isAlive()){
counter++;
}
}
}
for(int xO = (x > 0 ? (x >= 179 ? 2 : -1) : 1); xO <= 1; xO+=2)
{
if(zellenTmp[x+xO][y].isAlive()){
counter++;
}
}
for(int yO = (y > 0 ? (y >= 179 ? 2 : -1) : 1); yO <= 1; yO+=2)
{
if(zellenTmp[x][y+yO].isAlive()){
counter++;
}
}*/
return counter;
}
public Zelle[][] getZellen()
{
return zellen;
}
}
Und auch noch die "Zelle" Klasse
Zelle.java
[spoiler]```package cmdmole.game.life;
public class Zelle {
private boolean living;
public Zelle(boolean al)
{
living = al;
}
public boolean isAlive()
{
return living;
}
public void kill()
{
living = false;
}
public void revive()
{
living = true;
}
}
```[/spoiler]
Mfg
Oneric