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; }