Conway stuff

unknown
c_cpp
2 years ago
8.6 kB
2
Indexable
Never
```// File: good-life.c
// Description: A program that runs Conway's Game of Life based on user input
//
// @author Robert Tetreault (rrt2850)
//
// // // // // // // // // // // // // // // // // // // // // // // // // //

/*** Includes and Definitions ***/
#include <stdio.h>
#include <stdlib.h>

#define SIZE 20

/**
* getNeighbors(): Copies one 2d array into another
*
* @param arr1: The first 2d array
* @param arr2: The second 2d array
*
**/
void copyArr( char arr1[][SIZE], char arr2[][SIZE]){
int i, j;

for(i = 0; i < SIZE; i++){
for(j = 0; j < SIZE; j++){
arr2[i][j] = arr1[i][j];
}
}
}

/**
* getNeighbors(): Gets the total number of neighbors for a point on the 2d array
*
* @param life: A 2d array representing the current game of life
* @param row: The row the point is on
* @param col: The column the point is on
* @returns the total number of neighbors for the point
*
**/

int getNeighbors(char life[][SIZE], int row, int col){
int neighbors = 0;

if(life[row - 1][col - 1] == '*')++neighbors;

if(life[row - 1][col] == '*') ++neighbors;

if(life[row - 1][col + 1] == '*') ++neighbors;

if(life[row][col - 1] == '*') ++neighbors;

if(life[row][col + 1] == '*') ++neighbors;

if(life[row + 1][col - 1] == '*') ++neighbors;

if(life[row + 1][col] == '*') ++neighbors;

if(life[row + 1][col + 1] == '*') ++neighbors;

return neighbors;
}

/**
* getNeighborsWeird(): Gets the total number of neighbors for a point on the 2d array
*                      if that point is on one of the edges of the board
*
* @param life: A 2d array representing the current game of life
* @param row: The row the point is on
* @param col: The column the point is on
* @param num_row: The total number of rows in the grid
* @param num_col: The total number of columns in the grid
* @returns the total number of neighbors for the point
*
**/

int getNeighborsWeird(char life[][SIZE], int row, int col, int num_row, int num_col){
int neighbors = 0;

if(row == 0 && col == 0){
if(life[row][col + 1] == '*') neighbors++;
if(life[row + 1][col + 1] == '*') neighbors++;
if(life[row + 1][col] == '*') neighbors++;

return neighbors;
}
if(row == 0 && col < num_col - 1){
if(life[row][col - 1] == '*') neighbors++;
if(life[row][col + 1] == '*') neighbors++;
if(life[row + 1][col] == '*') neighbors++;
if(life[row + 1][col - 1] == '*') neighbors++;
if(life[row + 1][col + 1] == '*') neighbors++;

return neighbors;
}
if(row == 0 && col == num_col - 1){
if(life[row][col - 1] == '*') neighbors++;
if(life[row + 1][col - 1] == '*') neighbors++;
if(life[row + 1][col] == '*') neighbors++;

return neighbors;
}
if(row < num_row - 1 && col == num_col - 1){
if(life[row - 1][col] == '*') neighbors++;
if(life[row + 1][col] == '*') neighbors++;
if(life[row + 1][col - 1] == '*') neighbors++;
if(life[row - 1][col - 1] == '*') neighbors++;
if(life[row][col - 1] == '*') neighbors++;

return neighbors;
}
if(row == num_row - 1 && col == num_col - 1){
if(life[row - 1][col] == '*') neighbors++;
if(life[row - 1][col - 1] == '*') neighbors++;
if(life[row][col - 1] == '*') neighbors++;

return neighbors;

}
if(row == num_row - 1 && col < num_col - 1){
if(life[row - 1][col - 1] == '*') neighbors++;
if(life[row - 1][col] == '*') neighbors++;
if(life[row - 1][col + 1] == '*') neighbors++;
if(life[row][col - 1] == '*') neighbors++;
if(life[row][col + 1] == '*') neighbors++;

return neighbors;
}
if(row == num_row - 1 && col == 0){
if(life[row - 1][col] == '*') neighbors++;
if(life[row - 1][col + 1] == '*') neighbors++;
if(life[row][col + 1] == '*') neighbors++;

return neighbors;

}
if(row < num_row - 1 && col == 0){
if(life[row - 1][col] == '*') neighbors++;
if(life[row + 1][col] == '*') neighbors++;
if(life[row + 1][col + 1] == '*') neighbors++;
if(life[row - 1][col + 1] == '*') neighbors++;
if(life[row][col + 1] == '*') neighbors++;

return neighbors;
}
return 0;
}

/*** Game Modifiers ***/

/**
* survivalRule(): Determines whether or not an organism survives the generation
*
* @param life: A 2d array representing the current game of life
* @param num_row: The total number of rows on the board
* @param num_col: The total number of columns on the board
*
**/

void survivalRule(char life[][SIZE], int num_col, int num_row){
int row, col, neighbors;
char temp[SIZE][SIZE];

copyArr(life, temp);

for(row = 0; row < num_row; row++){
for(col = 0; col < num_col; col++){
if(temp[row][col] == '*'){
if(row == 0 || row == num_row - 1 || col == 0 || col == num_col - 1){
neighbors = getNeighborsWeird(life, row, col, num_row, num_col);
}
else{
neighbors = getNeighbors(life, row, col);
}

if(!(neighbors == 2 || neighbors == 3)){
life[row][col] = ' ';
}
}
}
}

return;
}

/**
* birthRule(): Determines whether or not an organism can be born on the board
*
* @param life: A 2d array representing the current game of life
* @param num_row: The total number of rows on the board
* @param num_col: The total number of columns on the board
*
**/

void birthRule(char life[][SIZE], int num_col, int num_row){
int row, col, neighbors;
char temp[SIZE][SIZE];

copyArr(life, temp);

for(row = 0; row < num_row; row++){
for(col = 0; col < num_col; col++){
if(temp[row][col] == ' '){
if(row == 0 || row == num_row - 1 || col == 0 || col == num_col - 1){
neighbors = getNeighborsWeird(life, row, col, num_row, num_col);
}
else{
neighbors = getNeighbors(life, row, col);
}
if(neighbors == 3){
life[row][col] = '*';
}
}
}
}

return;

}

/*** Game ***/

/**
* runGame(): Runs the game based on user input
*
* @param life: A 2d array representing the current game of life
* @param num_gens: The number of generations for the loop to run through
*
**/
void runGame(char life[][SIZE],int num_gens){
int row, col;
int num_col  = SIZE - 1;
int num_row  = SIZE - 1;
int curr_gen = 0;

while (curr_gen < num_gens) {
birthRule(life, num_col, num_row);
survivalRule(life, num_col, num_row);

for(row = 0; row < SIZE; row++) {
for(col = 0; col < SIZE; col++){

printf("%c", life[row][col]);
}

puts(" ");

}

printf("\ngeneration: %d\n", curr_gen);
curr_gen++;
}
}

/*** Initialization ***/

/**
*
* @param life: A 2d array representing the current game of life
* @param num_orgs: The number of organisms to add
*
**/

int row, col, i;
srand( 31 );

for(i = 0; i < num_orgs; i++){
row = rand();
row %= SIZE;
col = rand();
col %= SIZE;
if(life[row][col] != '*'){
life[row][col] = '*';
}
else{
i--;
}
}
}

/**
* fillSpace(): Fills all empty slots in the array with ' '
*
* @param life: A 2d array representing the current game of life
*
**/
void fillSpace(char life[][SIZE]){
int row, col;

for(row = 0; row < SIZE; row++){
for(col = 0; col < SIZE; col++){
if(life[row][col] != '*')
life[row][col] = ' ';
}
}
}

/**
* main(): Initializes everything and prompts for user input
*
* @returns 0 on success
*
**/
int main(void){
char life[SIZE][SIZE];
int num_orgs;
int num_gens = 100;

printf("\n\t..Welcome to the Game of life..\n");

printf("\nPlease enter the initial number of organisms: ");
scanf("%i", &num_orgs);

//printf("\nPlease enter the number of generations: ");
//scanf("%i", &num_gens);