#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#define WIDTH 40
#define HEIGHT 20
#define CLEAR "clear" // Use "cls" for Windows
// Function to initialize the grid with random values
void initializeGrid(int grid[HEIGHT][WIDTH]) {
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++) {
grid[i][j] = rand() % 2;
}
}
}
// Function to count neighbors of a cell
int countNeighbors(int grid[HEIGHT][WIDTH], int row, int col) {
int count = 0;
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
if (i == 0 && j == 0) continue;
int newRow = row + i;
int newCol = col + j;
// Check boundaries with wraparound
if (newRow < 0) newRow = HEIGHT - 1;
if (newRow >= HEIGHT) newRow = 0;
if (newCol < 0) newCol = WIDTH - 1;
if (newCol >= WIDTH) newCol = 0;
count += grid[newRow][newCol];
}
}
return count;
}
// Function to update the grid based on Conway's rules
void updateGrid(int grid[HEIGHT][WIDTH], int newGrid[HEIGHT][WIDTH]) {
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++) {
int neighbors = countNeighbors(grid, i, j);
// Apply Conway's rules
if (grid[i][j]) {
// Live cell
newGrid[i][j] = (neighbors == 2 || neighbors == 3) ? 1 : 0;
} else {
// Dead cell
newGrid[i][j] = (neighbors == 3) ? 1 : 0;
}
}
}
// Copy new grid to original grid
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++) {
grid[i][j] = newGrid[i][j];
}
}
}
// Function to display the grid
void displayGrid(int grid[HEIGHT][WIDTH]) {
// system(CLEAR); // Clear screen
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++) {
printf("%c ", grid[i][j] ? '#' : '.');
}
printf("\n");
}
}
int main() {
// Seed the random number generator
srand(time(NULL));
// Initialize grids
int grid[HEIGHT][WIDTH];
int newGrid[HEIGHT][WIDTH] = {0};
// Initialize with random values
initializeGrid(grid);
// Main game loop
while (1) {
printf("\x1b[H");
displayGrid(grid);
updateGrid(grid, newGrid);
usleep(100000); // Delay for visualization (100ms)
}
return 0;
}