birth()birth(): iterates over a HashMapHashMap containing a key-value pair of all alive cells along with its neighbors. If the key-value pair follows the game of life’s rules above, the key (an integer value that represents the location of a cell) is then pushed onto a stack that contains the next generation of alive cells. After each iteration, the value of the grid is reset to 0, and the key-value pair is removed from the HashMapHashMap.
insertAlive()insertAlive(): pops the stack and inserts the alive cell into the grid. Inserting a live cell follows the structure of minesweeper (neighbors of a live cell will be incremented by 1 and the alive cell will be incremented by 10 to denote that it is alive). All of the neighbors and alive cells are then put into a HashMapHashMap so that birth()birth() can run properly.
printBoard()printBoard() (should be named boardToStringboardToString()): uses a stringbuilderStringBuilder to format the grid into a string.
Note: mostMost comments have been taken out because they don't add much to the readability of the code.
CellularAutomaton.java
CellularAutomaton.java
GameOfLife.java
GameOfLife.java
package first;
import java.util.Stack;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class GameOfLife extends CellularAutomaton {
int board[][];
int dim;
Stack<Integer> stackCells;
HashMap<Integer, Integer> hmapCells;
public gameOfLife(int d, Stack<Integer> s){
board = new int[d][d];
dim = d;
stackCells = s;
hmapCells = new HashMap<>();
}
public boolean rules(int num){
return num == 3 || num == 12 || num == 13;
}
private void birth() {
Iterator<Map.Entry<Integer,Integer>> it=hmapCells.entrySet().iterator();
while(it.hasNext()) {
Map.Entry<Integer,Integer> pair = it.next();
int key = pair.getKey();
if(rules(pair.getValue())){
stackCells.add(key);
}
board[key/dim][key%dim] = 0;
it.remove();
}
}
private void insertAlive() {
while(!stackCells.isEmpty()) {
int cell = stackCells.pop();
int x = cell / dim;
int y = cell % dim;
int startX = (x <= 0) ? 0 : x - 1;
int startY = (y <= 0) ? 0 : y - 1;
int endX = (x >= dim - 1) ? x + 1 : x + 2;
int endY = (y >= dim - 1) ? y + 1 : y + 2;
for(int i = startX; i < endX; ++i) {
for(int j = startY; j < endY; ++j) {
hmapCells.put(i * dim + j, ++board[i][j]);
}
}
hmapCells.put(cell, board[x][y] += 9);
}
}
private String printBoard() {
StringBuilder s = new StringBuilder();
for(int elements[] : board) {
for(int element : elements) {
if(element >= 10){
s.append("* ");
}
else {
s.append(" ");
}
}
s.append("\n");
}
return s.toString();
}
public String lifeCycle() {
birth();
insertAlive();
return printBoard();
}
}
package first;
import java.util.Stack;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class GameOfLife extends CellularAutomaton {
int board[][];
int dim;
Stack<Integer> stackCells;
HashMap<Integer, Integer> hmapCells;
public gameOfLife(int d, Stack<Integer> s){
board = new int[d][d];
dim = d;
stackCells = s;
hmapCells = new HashMap<>();
}
public boolean rules(int num){
return num == 3 || num == 12 || num == 13;
}
private void birth() {
Iterator<Map.Entry<Integer,Integer>> it=hmapCells.entrySet().iterator();
while(it.hasNext()) {
Map.Entry<Integer,Integer> pair = it.next();
int key = pair.getKey();
if(rules(pair.getValue())){
stackCells.add(key);
}
board[key/dim][key%dim] = 0;
it.remove();
}
}
private void insertAlive() {
while(!stackCells.isEmpty()) {
int cell = stackCells.pop();
int x = cell / dim;
int y = cell % dim;
int startX = (x <= 0) ? 0 : x - 1;
int startY = (y <= 0) ? 0 : y - 1;
int endX = (x >= dim - 1) ? x + 1 : x + 2;
int endY = (y >= dim - 1) ? y + 1 : y + 2;
for(int i = startX; i < endX; ++i) {
for(int j = startY; j < endY; ++j) {
hmapCells.put(i * dim + j, ++board[i][j]);
}
}
hmapCells.put(cell, board[x][y] += 9);
}
}
private String printBoard() {
StringBuilder s = new StringBuilder();
for(int elements[] : board) {
for(int element : elements) {
if(element >= 10){
s.append("* ");
}
else {
s.append(" ");
}
}
s.append("\n");
}
return s.toString();
}
public String lifeCycle() {
birth();
insertAlive();
return printBoard();
}
}
Simulation.java