In: Computer Science
Assignment
Implement Conway’s Game of Life.
The Game of Life is a simple simulation that takes place in a grid of cells. Each cell can be either alive or dead, and it interacts with its neighbors (horizontally, vertically, or diagonally). In each iteration, a decision will be made to see if living cells stay alive, or if dead cells become alive. The algorithm is as follows:
If a cell is alive:
If it has less than two living neighbors, it dies due to loneliness.
If it has two or three living neighbors, it lives to the next generation
If it has more than three living neighbors, it dies due to overpopulation.
If a cell is dead:
and, if it has exactly three live neighbors, it becomes alive due to reproduction.
After each simulation round, your program must print the updated game board to screen.
Functional Requirements
Hint
When doing a simulation run, define a second two-dimensional array. For each cell in the existing array, count the number of neighbors it has, and decide what its fate will be on the new board. After having done this for all cells, copy the value of your new board over the old one
source code:
life.h /* * life.h * * Created on: Sep 13, 2016 * Author: leune */ #ifndef LIFE_H_ #define LIFE_H_ #define XSIZE 15 #define YSIZE 15 #define DEFAULTROUNDS 15 #define ALIVE 1 #define DEAD 0 // initialize the board to all dead cells void initBoard(int vBoard[][YSIZE]); // play a round; updates the cells on the board void playRound(int vBoard[][YSIZE]); // print the board void printBoard(int vBoard[][YSIZE]); // determine the number of neighbors int neighbors(int vBoard[][YSIZE], int x, int y); /* determine if the given coordinates are within bounds * returns 0 if the cell is out of bounds; returns 1 if * the cell is in bounds */ int onBoard(int x, int y); #endif /* LIFE_H_ */
life.c
/* * life.c * * Created on: Sep 13, 2016 * Author: leune */ #include <stdio.h> #include <unistd.h> #include "life.h" int main(int argc, char *argv[]) { int board[XSIZE][YSIZE]; int rounds = DEFAULTROUNDS; initBoard(board); board[5][5] = ALIVE; board[5][6] = ALIVE; board[5][7] = ALIVE; board[6][6] = ALIVE; printf("Playing %d rounds.\n\n", rounds); for (int i=0; i<rounds; i++) { printf("Round: %d\n", i+1); printBoard(board); playRound(board); sleep(1); } return 0; } void initBoard(int vBoard[][YSIZE]) { /* write this function */ } void playRound(int vBoard[][YSIZE]) { int tmpBoard[XSIZE][YSIZE]; initBoard(tmpBoard); // perform the algorithm on vBoard, but update tmpBoard // with the new state /* write this fragment */ // copy tmpBoard over vBoard for (int y=0; y < YSIZE; y++) { for (int x=0; x < XSIZE; x++) { vBoard[x][y] = tmpBoard[x][y]; } } } int onBoard(int x, int y) { if (x < 0 || x >= XSIZE) return 0; else if (y < 0 || y >= YSIZE) return 0; else return 1; } int neighbors(int vBoard[][YSIZE], int x, int y) { int n=0; int xp1 = x + 1; int xm1 = x - 1; int yp1 = y + 1; int ym1 = y - 1; if (onBoard(xm1, y) && vBoard[xm1][y] == ALIVE) n++; if (onBoard(xm1, yp1) && vBoard[xm1][yp1] == ALIVE) n++; if (onBoard(x, yp1) && vBoard[x][yp1] == ALIVE) n++; if (onBoard(xp1, yp1) && vBoard[xp1][yp1] == ALIVE) n++; if (onBoard(xp1, y) && vBoard[xp1][y] == ALIVE) n++; if (onBoard(xp1, ym1) && vBoard[xp1][ym1] == ALIVE) n++; if (onBoard(x, ym1) && vBoard[x][ym1] == ALIVE) n++; if (onBoard(xm1, ym1) && vBoard[xm1][ym1] == ALIVE) n++; return n; } void printBoard(int vBoard[XSIZE][YSIZE]) { /* write this fragment */ }
Code:
/* * life.c * * Created on: Sep 13, 2016 * Author: leune */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include "life.h" int main(int argc, char *argv[]) { int board[XSIZE][YSIZE]; int rounds = DEFAULTROUNDS; initBoard(board); board[5][5] = ALIVE; board[5][6] = ALIVE; board[5][7] = ALIVE; board[6][6] = ALIVE; printf("Playing %d rounds.\n\n", rounds); for (int i = 0; i < 15; i++) { printf("Round: %d\n", i + 1); printBoard(board); playRound(board); sleep(1); } return 0; } void initBoard(int vBoard[][YSIZE]) { for (int i = 0; i < XSIZE; i++) for (int j = 0; j < YSIZE; j++) vBoard[i][j] = DEAD; } void playRound(int vBoard[][YSIZE]) { int tmpBoard[XSIZE][YSIZE]; initBoard(tmpBoard); // perform the algorithm on vBoard, but update tmpBoard // with the new state for (int x = 0; x < XSIZE; x++) { for (int y = 0; y < YSIZE; y++) { int noOfNeighbors = neighbors(vBoard, x, y); if (vBoard[x][y] == ALIVE) { // If a cell is alive if (noOfNeighbors < 2) // If it has less than two living neighbors, it dies due to loneliness. tmpBoard[x][y] = DEAD; else if (noOfNeighbors <= 3) // If it has two or three living neighbors, it lives to the next generation tmpBoard[x][y] = ALIVE; else // If it has more than three living neighbors, it dies due to overpopulation. tmpBoard[x][y] = DEAD; } else { // If a cell is dead if (noOfNeighbors == 3) // if it has exactly three live neighbors, it becomes alive due to reproduction. tmpBoard[x][y] = ALIVE; } } } // copy tmpBoard over vBoard for (int x = 0; x < XSIZE; x++) { for (int y = 0; y < YSIZE; y++) { vBoard[x][y] = tmpBoard[x][y]; } } } int onBoard(int x, int y) { if (x < 0 || x >= XSIZE) return 0; else if (y < 0 || y >= YSIZE) return 0; else return 1; } int neighbors(int vBoard[][YSIZE], int x, int y) { int n = 0; int xp1 = x + 1; int xm1 = x - 1; int yp1 = y + 1; int ym1 = y - 1; if (onBoard(xm1, y) && vBoard[xm1][y] == ALIVE) n++; if (onBoard(xm1, yp1) && vBoard[xm1][yp1] == ALIVE) n++; if (onBoard(x, yp1) && vBoard[x][yp1] == ALIVE) n++; if (onBoard(xp1, yp1) && vBoard[xp1][yp1] == ALIVE) n++; if (onBoard(xp1, y) && vBoard[xp1][y] == ALIVE) n++; if (onBoard(xp1, ym1) && vBoard[xp1][ym1] == ALIVE) n++; if (onBoard(x, ym1) && vBoard[x][ym1] == ALIVE) n++; if (onBoard(xm1, ym1) && vBoard[xm1][ym1] == ALIVE) n++; return n; } void printBoard(int vBoard[XSIZE][YSIZE]) { for (int i = 0; i < XSIZE; i++) { for (int j = 0; j < YSIZE; j++) { //print character '-' for DEAD and for alive 'O' printf("%c ", vBoard[i][j] ? 'O' : '-'); } printf("\n"); } }
output:
Playing 15 rounds. Round: 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - O O O - - - - - - - - - - - - - O - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Round: 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - O - - - - - - - - - - - - - O O O - - - - - - - - - - - - O O O - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Round: 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - O O O - - - - - - - - - - - - - - - - - - - - - - - - - - - O - O - - - - - - - - - - - - - O - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Round: 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - O - - - - - - - - - - - - - - O - - - - - - - - - - - - - O - O - - - - - - - - - - - - - O - - - - - - - - - - - - - - O - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Round: 5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - O O O - - - - - - - - - - - - O - O - - - - - - - - - - - - O O O - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Round: 6 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - O - - - - - - - - - - - - - O - O - - - - - - - - - - - O - - - O - - - - - - - - - - - O - O - - - - - - - - - - - - - O - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Round: 7 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - O - - - - - - - - - - - - - O O O - - - - - - - - - - - O O - O O - - - - - - - - - - - O O O - - - - - - - - - - - - - O - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Round: 8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - O O O - - - - - - - - - - - O - - - O - - - - - - - - - - O - - - O - - - - - - - - - - O - - - O - - - - - - - - - - - O O O - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Round: 9 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - O - - - - - - - - - - - - - O O O - - - - - - - - - - - O - O - O - - - - - - - - - O O O - O O O - - - - - - - - - O - O - O - - - - - - - - - - - O O O - - - - - - - - - - - - - O - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Round: 10 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - O O O - - - - - - - - - - - - - - - - - - - - - - - - - O - - - - - O - - - - - - - - O - - - - - O - - - - - - - - O - - - - - O - - - - - - - - - - - - - - - - - - - - - - - - - O O O - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Round: 11 - - - - - - - - - - - - - - - - - - - - - O - - - - - - - - - - - - - - O - - - - - - - - - - - - - - O - - - - - - - - - - - - - - - - - - - - - - - - - O O O - - - O O O - - - - - - - - - - - - - - - - - - - - - - - - - O - - - - - - - - - - - - - - O - - - - - - - - - - - - - - O - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Round: 12 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - O O O - - - - - - - - - - - - - - - - - - - - - - - - - O - - - - - O - - - - - - - - O - - - - - O - - - - - - - - O - - - - - O - - - - - - - - - - - - - - - - - - - - - - - - - O O O - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Round: 13 - - - - - - - - - - - - - - - - - - - - - O - - - - - - - - - - - - - - O - - - - - - - - - - - - - - O - - - - - - - - - - - - - - - - - - - - - - - - - O O O - - - O O O - - - - - - - - - - - - - - - - - - - - - - - - - O - - - - - - - - - - - - - - O - - - - - - - - - - - - - - O - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Round: 14 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - O O O - - - - - - - - - - - - - - - - - - - - - - - - - O - - - - - O - - - - - - - - O - - - - - O - - - - - - - - O - - - - - O - - - - - - - - - - - - - - - - - - - - - - - - - O O O - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Round: 15 - - - - - - - - - - - - - - - - - - - - - O - - - - - - - - - - - - - - O - - - - - - - - - - - - - - O - - - - - - - - - - - - - - - - - - - - - - - - - O O O - - - O O O - - - - - - - - - - - - - - - - - - - - - - - - - O - - - - - - - - - - - - - - O - - - - - - - - - - - - - - O - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -