diff --git a/Grid.java b/Grid.java index 939e05fd8e4207e92eb7ffaedebfcd6d4d0f6d0b..c89914d3c5ea2b3825cddaa6df58fddf8ba6df42 100644 --- a/Grid.java +++ b/Grid.java @@ -1,11 +1,10 @@ -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; -import java.util.Random; +import java.util.*; /** * {@code Grid} instances represent the grid in <i>The Game of Life</i>. */ + + public class Grid implements Iterable<Cell> { private final int numberOfRows; @@ -86,11 +85,9 @@ public class Grid implements Iterable<Cell> { * <p>The following rules are applied: * <ul> * <li>Any live {@link Cell} with fewer than two live neighbours dies, i.e. underpopulation.</li> - * <li>Any live {@link Cell} with two or three live neighbours lives on to the next - * generation.</li> + * <li>Any live {@link Cell} with two or three live neighbours lives on to the next generation.</li> * <li>Any live {@link Cell} with more than three live neighbours dies, i.e. overpopulation.</li> - * <li>Any dead {@link Cell} with exactly three live neighbours becomes a live cell, i.e. - * reproduction.</li> + * <li>Any dead {@link Cell} with exactly three live neighbours becomes a live cell, i.e. reproduction.</li> * </ul> */ void nextGeneration() { @@ -98,29 +95,83 @@ public class Grid implements Iterable<Cell> { } private boolean[][] calculateNextStates() { - return null; + boolean [][] nextState = new boolean[getNumberOfRows()][getNumberOfColumns()]; + for(int rowIndex=0; rowIndex<getNumberOfRows(); rowIndex++){ + for (int columnIndex = 0; columnIndex < getNumberOfColumns(); columnIndex++) { + nextState[rowIndex][columnIndex] = calculateNextState(rowIndex,columnIndex); + } + } + return nextState; } - private boolean calculateNextState(int rowIndex, int columnIndex, Cell cell) { - return false; + private boolean calculateNextState(int rowIndex, int columnIndex) { + Cell cell = getCell(rowIndex, columnIndex); + int numberOfAliveNeighbours = countAliveNeighbours(rowIndex, columnIndex); + return cell.isAliveInNextState(numberOfAliveNeighbours); } private int countAliveNeighbours(int rowIndex, int columnIndex) { - return 0; + List<Cell> neighboursList = getNeighbours(rowIndex, columnIndex); + Iterator<Cell> iterator = neighboursList.iterator(); + int counter = 0; + while(iterator.hasNext()) { + if(iterator.next().isAlive()) + counter++; + } + return counter; + } + + private boolean aliveNeighboursMajColor(int rowIndex, int columnIndex){ + List<Cell> neighboursList = getNeighbours(rowIndex, columnIndex); + int count = countAliveNeighbours(rowIndex, columnIndex); + Iterator<Cell> iterator = neighboursList.iterator(); + int redCount = 0; + while(iterator.hasNext()) { + Cell cell = iterator.next(); + if (cell.isAlive() && cell.isRed()) + redCount++; + } + return (redCount>(count/2)); } - private List<Cell> getNeighbours(int rowIndex, int columnIndex) { - return null; + List<Cell> neighboursList = new ArrayList<Cell>(); + neighboursList.add(getCell(rowIndex, columnIndex+1)); + neighboursList.add(getCell(rowIndex, columnIndex-1)); + neighboursList.add(getCell(rowIndex+1, columnIndex)); + neighboursList.add(getCell(rowIndex-1, columnIndex)); + neighboursList.add(getCell(rowIndex+1, columnIndex+1)); + neighboursList.add(getCell(rowIndex+1, columnIndex-1)); + neighboursList.add(getCell(rowIndex-1, columnIndex+1)); + neighboursList.add(getCell(rowIndex-1, columnIndex-1)); + return neighboursList; } private void goToNextState(boolean[][] nextState) { + for(int rowIndex=0; rowIndex<this.numberOfRows; rowIndex++) { + for (int columnIndex = 0; columnIndex < this.numberOfColumns; columnIndex++) { + Cell cell = getCell(rowIndex, columnIndex); + if (nextState[rowIndex][columnIndex]) { + if(cell.isDead()) { + boolean redColor = aliveNeighboursMajColor(rowIndex, columnIndex); + cell.setisRed(redColor); + } + cell.setAlive(); + }else{ + cell.setDead(); + } + } + } } /** * Sets all {@link Cell}s in this {@code Grid} as dead. */ void clear() { + for (Iterator<Cell> gridIt = iterator(); gridIt.hasNext(); ) { + Cell cell = gridIt.next(); + cell.setDead(); + } } /** @@ -129,8 +180,33 @@ public class Grid implements Iterable<Cell> { * @param random {@link Random} instance used to decide if each {@link Cell} is alive or dead * @throws NullPointerException if {@code random} is {@code null} */ - + void randomGeneration(Random random) { + Iterator<Cell> gridIt = iterator(); + while (gridIt.hasNext()) { + Cell cell = gridIt.next(); + boolean randomStat = random.nextBoolean(); + if (randomStat) { + cell.setAlive(); + randomStat = random.nextBoolean(); + if (randomStat) + cell.setisRed(true); + else + cell.setisRed(false); + }else { + cell.setDead(); + } + } + // Spaceships Test + /* + Cell cell0 = getCell(1,1); + Cell cell1 = getCell(2,2); + Cell cell2 = getCell(1,3); + Cell cell3 = getCell(2,3); + Cell cell4 = getCell(3,2); + cell0.setAlive();cell1.setAlive();cell2.setAlive();cell3.setAlive();cell4.setAlive(); + */ + } -} +} \ No newline at end of file