diff --git a/src/Life.java b/src/Life.java index 84ab855..f676fb1 100644 --- a/src/Life.java +++ b/src/Life.java @@ -1,11 +1,20 @@ public class Life implements ILife { - + + private char[][] world = { + {'.', '.', '.', '.', '.'}, + {'.', '.', '.', '.', '.'}, + {'.', '.', '.', '.', '.'}, + {'.', '.', '.', '.', '.'}, + {'.', '.', '.', '.', '.'} + }; + private char[][] newWorld = world; + public static void main(String[] args) { - Life l = new Life(new String[] { " ", - " ", - " *** ", - " ", - " " }); + Life l = new Life(new String[] { ".....", + ".....", + ".***.", + ".....", + "....." }); l = (Life) l.nextGeneration(); } @@ -16,40 +25,87 @@ public class Life implements ILife { public Life(String[] setup) { this(); - for (int y = 0; y < setup.length; y++) - for (int x = 0; x < setup[y].length(); x++) - if (setup[y].charAt(x) != ' ') - setAlive(x, y); + + int x = 0; + int y; + + + for (y = 0; y < setup.length; y++) { + for (x = 0; x < setup[y].length(); x++) { + if (setup[y].charAt(x) != '.') { + world[x][y] = '*'; + } + } + } } @Override public void nukeAll() { - // TODO Auto-generated method stub + for (int y = 0; y < world.length; y++) + for (int x = 0; x < world[y].length; x++) { + setDead(x, y); + } } @Override public void setAlive(int x, int y) { - // TODO Auto-generated method stub + newWorld [x][y] = '*'; } @Override public void setDead(int x, int y) { - // TODO Auto-generated method stub + newWorld [x][y] = '.'; } @Override public boolean isAlive(int x, int y) { - // TODO Auto-generated method stub - return false; + if(world[y][x] == '*'){ + return true; + } + else return false; } @Override public ILife nextGeneration() { - // TODO Auto-generated method stub - return null; + String[] s = new String[newWorld.length]; + checkNeighbors(); + for(int y = 0; y < newWorld.length; y++){ + s[y] = new String (newWorld[y]); + System.out.println(s[y]); + } + return new Life(s); + } + + private void checkNeighbors(){ + for (int y = 0; y < world.length; y++) + for (int x = 0; x < world[y].length; x++) { + if (!isAlive(x, y) && getNeighborCount(x, y) == 3) { + setAlive(x, y); + } + else if (isAlive(x, y) && getNeighborCount(x, y) <= 1){ + setDead(x, y); + } + else if (isAlive(x, y) && getNeighborCount(x, y) >= 4){ + setDead(x, y); + } + else{ + newWorld[x][y] = world[x][y]; + } + } + } + + private int getNeighborCount(int x, int y){ + int aliveNeighborCount = 0; + for(int i = -1; i<=1; i++) { + for (int j = -1; j<=1; j++) { + if(isAlive(x, y)) + aliveNeighborCount++; + } + } + return aliveNeighborCount; } } \ No newline at end of file diff --git a/test/LifeTest.java b/test/LifeTest.java index 3940e66..645f831 100644 --- a/test/LifeTest.java +++ b/test/LifeTest.java @@ -22,16 +22,49 @@ public class LifeTest { @Test public void destroyLonelyCell() { + //Arrange: eine lebende Zelle + Life l = new Life(); + l.setAlive(1, 1); + + //Act + ILife nextGen = l.nextGeneration(); + + //Assert: Zelle sollte jetzt tot sein + assertFalse(nextGen.isAlive(1,1)); } @Test public void keepAliveCell() { + // Arrange: drei lebende Zellen + Life l = new Life(); + l.setAlive(0, 0); + l.setAlive(0, 1); + l.setAlive(1, 0); + + // Act: Berechnung der Folgegeneration + ILife nextGen = l.nextGeneration(); + + // Assert: Rasterpunkt mit zwei Nachbarn lebt noch + assertTrue(nextGen.isAlive(0, 1)); } @Test public void destroyCrowdedCell() { + // Arrange: Zellblock + Life l = new Life(); + l.setAlive(0, 0); + l.setAlive(0, 1); + l.setAlive(0, 2); + l.setAlive(1, 0); + l.setAlive(1, 1); + + // Act: Berechnung der Folgegeneration + ILife nextGen = l.nextGeneration(); + + // Assert: Rasterpunkt mit vier Nachbarn ist tot + assertFalse(nextGen.isAlive(1, 1)); }