I am coding a game of life where there are dead and alive cells. If the cell is dead and there are precisely 3 neighboring cells around it that are alive, the cells turns to life. If the cell is already alive, it needs specifically either 2 or 3 alive neighboring cells for it to stay alive, otherwise it dies. Here is my code:
The exact rules are as follows:
1.Any live cell with fewer than two live neighbours dies, as if caused by under-population.
2.Any live cell with two or three live neighbours lives on to the next generation.
3.Any live cell with more than three live neighbours dies, as if by overcrowding.
4.Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction.
My code isn't working. I need help figuring out the problem. Thanks in advance.
public void step() // each itteration of the game
{
Cell[][] copy = new Cell[worldSize][worldSize]; // create a new 2D array to copy the contents of the world.
for(int r=0;r<worldSize;r++){ // copy the contents of the world
for(int c=0;c<worldSize;c++){
copy[r][c] = new Cell();
copy[r][c].setState(world[r][c].isAlive());
}
}
for(int r=0;r<worldSize;r++){ // rules of the game of life
for(int c=0;c<worldSize;c++){
if(world[r][c].isAlive()){
if(neighAlive(r,c)!=2||neighAlive(r,c)!=3){
copy[r][c].setState(false);
}
}else{
if(neighAlive(r,c)==3){
copy[r][c].setState(true);
}
}
}
}
for(int r=0;r<worldSize;r++){ // replace the world with the copy
for(int c=0;c<worldSize;c++){
world[r][c].setState(copy[r][c].isAlive());
}
}
}
private int neighAlive(int row, int col) // returns the number of alive neighboring cells in world[row][col]
{
int counter = 0;
if(row==0){ // row edges
if(col==0){ // top left corner
if(world[row][col+1].isAlive())counter++;
if(world[row+1][col].isAlive())counter++;
if(world[row+1][col+1].isAlive())counter++;
}else
if(col==worldSize-1){ // top right corner
if(world[row][col-1].isAlive())counter++;
if(world[row+1][col].isAlive())counter++;
if(world[row+1][col-1].isAlive())counter++;
}else{ // top row, anywhere not including the two corners on the left edge and right edge
if(world[row][col+1].isAlive())counter++;
if(world[row][col-1].isAlive())counter++;
if(world[row+1][col+1].isAlive())counter++;
if(world[row+1][col].isAlive())counter++;
if(world[row+1][col-1].isAlive())counter++;
}
}else
if(row==worldSize-1){
if(col==0){ // bottom left corner
if(world[row][col+1].isAlive())counter++;
if(world[row-1][col].isAlive())counter++;
if(world[row-1][col+1].isAlive())counter++;
}else
if(col==worldSize-1){ // bottom right corner
if(world[row][col-1].isAlive())counter++;
if(world[row-1][col].isAlive())counter++;
if(world[row-1][col-1].isAlive())counter++;
}else{ // bottom row, anywhere not including the two corners on the left edge and right edge
if(world[row][col+1].isAlive())counter++;
if(world[row][col-1].isAlive())counter++;
if(world[row-1][col+1].isAlive())counter++;
if(world[row-1][col].isAlive())counter++;
if(world[row-1][col-1].isAlive())counter++;
}
}else
if(col==0){ // column edges
if(row==0){ // top corner of left-most column
if(world[row+1][col].isAlive())counter++;
if(world[row][col+1].isAlive())counter++;
if(world[row+1][col+1].isAlive())counter++;
}else
if(row==worldSize-1){ // bottom corner of left-most column
if(world[row-1][col].isAlive())counter++;
if(world[row][col+1].isAlive())counter++;
if(world[row-1][col+1].isAlive())counter++;
}else{ // left-most column, anywhere not including the top and bottom corners
if(world[row+1][col].isAlive())counter++;
if(world[row-1][col].isAlive())counter++;
if(world[row+1][col+1].isAlive())counter++;
if(world[row][col+1].isAlive())counter++;
if(world[row-1][col+1].isAlive())counter++;
}
}else
if(col==worldSize-1){
if(row==0){ // top corner of right-most column
if(world[row-1][col].isAlive())counter++;
if(world[row][col+1].isAlive())counter++;
if(world[row-1][col+1].isAlive())counter++;
}else
if(row==worldSize-1){ // bottom corner of right-most column
if(world[row-1][col].isAlive())counter++;
if(world[row][col-1].isAlive())counter++;
if(world[row-1][col-1].isAlive())counter++;
}else{ // right-most column, anywhere not including the top and bottom corners
if(world[row+1][col].isAlive())counter++;
if(world[row-1][col].isAlive())counter++;
if(world[row+1][col-1].isAlive())counter++;
if(world[row][col-1].isAlive())counter++;
if(world[row-1][col-1].isAlive())counter++;
}
}else{ // anywhere else on the cell grid not including the edges
for(int r=row-1;r<=row+1;r++){
for(int c=col-1;c<=col+1;c++){
if(world[r][c].isAlive()){
counter++;
}
}
}
if(world[row][col].isAlive()){ // subtract the cell itself if it was alive as the nested loops included it
counter-=1;
}
}
return counter;
}
