#include <GLFW/glfw3.h> // GLFW kütüphanesini içe aktarır; pencere oluşturma ve OpenGL ile çizim için kullanılır. #include <vector> // Dinamik diziler ve iki boyutlu vektör yapısı için vektör kütüphanesi. #include <ctime> // Rastgele sayı üreteci için zaman kütüphanesi. #include <cstdlib> // Rastgele sayı üreteci için C standardında kütüphane.
const int WIDTH = 1920; // Pencere genişliği piksel cinsinden
const int HEIGHT = 1080; // Pencere yüksekliği piksel cinsinden
const int CELL_SIZE = 4; // Her bir hücrenin genişliği ve yüksekliği piksel cinsinden
const int GRID_WIDTH = WIDTH / CELL_SIZE; // Hücre matrisinin yatayda hücre sayısı
const int GRID_HEIGHT = HEIGHT / CELL_SIZE; // Hücre matrisinin dikeyde hücre sayısı
// Hücrelerin durumunu tutan iki boyutlu matris; 2: genişleyen hücre, 1: hücre dolu, 0: hücre boş
std::vector<std::vector<int>> grid(GRID_HEIGHT, std::vector<int>(GRID_WIDTH, 0));
// Bir sonraki durumları tutmak için yedek matris
std::vector<std::vector<int>> nextGrid(GRID_HEIGHT, std::vector<int>(GRID_WIDTH, 0));
void initializeGrid() {
srand(static_cast<unsigned>(time(0))); // Rastgele başlangıç için tohum oluşturur.
for (int y = 0; y < GRID_HEIGHT; ++y) { // Her hücre için
for (int x = 0; x < GRID_WIDTH; ++x) {
grid[y][x] = rand() % 2; // Hücreyi rastgele olarak dolu (1) veya boş (0) yapar.
}
}
}
int countNeighbors(int y, int x) {
int count = 0; // Komşu hücre sayacını sıfırla.
for (int dy = -1; dy <= 1; ++dy) { // -1, 0, 1: komşu hücreler için dikey kayma
for (int dx = -1; dx <= 1; ++dx) { // -1, 0, 1: komşu hücreler için yatay kayma
if (dy == 0 && dx == 0) continue; // Kendisi değil, sadece komşuları kontrol et.
int ny = (y + dy + GRID_HEIGHT) % GRID_HEIGHT; // Dikeyde çevrilebilir koordinat
int nx = (x + dx + GRID_WIDTH) % GRID_WIDTH; // Yatayda çevrilebilir koordinat
count += grid[ny][nx]; // Eğer komşu hücre dolu ise sayacı artır.
}
}
return count; // Bulunan komşu hücrelerin toplam sayısını döndür.
}
void updateGrid() {
for (int y = 0; y < GRID_HEIGHT; ++y) { // Her hücreyi güncelle
for (int x = 0; x < GRID_WIDTH; ++x) {
int neighbors = countNeighbors(y, x); // Mevcut hücrenin komşu sayısını al
if (grid[y][x] == 1) { // Hücre dolu ise
nextGrid[y][x] = (neighbors == 2 || neighbors == 3) ? 1 : 0; // 2 veya 3 komşu ile hayatta kalır.
} else if (grid[y][x] == 2) { // Genişleyen hücre durumu
nextGrid[y][x] = (neighbors >= 1) ? 2 : 0; // Komşuları varsa genişlemeye devam et.
} else { // Hücre boş ise
nextGrid[y][x] = (neighbors == 3) ? 1 : 0; // Boş hücre, 3 komşu varsa doğar.
}
}
}
grid.swap(nextGrid); // Eski durumu yeni durumla değiştir.
}
// Hücreleri çizer.
for (int y = 0; y < GRID_HEIGHT; ++y) {
for (int x = 0; x < GRID_WIDTH; ++x) {
if (grid[y][x] == 1) { // Hücre dolu ise
glColor3f(0.0f, 1.0f, 0.0f); // Yeşil rengi ayarla.
} else if (grid[y][x] == 2) { // Genişleyen hücre ise
glColor3f(0.0f, 1.0f, 0.5f); // Yeşil tonunda bir renk
} else {
glColor3f(0.0f, 0.0f, 0.0f); // Boş hücreler için siyah arka plan
}
glBegin(GL_QUADS); // Her hücreyi kare olarak çiz.
glVertex2f(x * CELL_SIZE, y * CELL_SIZE);
glVertex2f((x + 1) * CELL_SIZE - 1, y * CELL_SIZE);
glVertex2f((x + 1) * CELL_SIZE - 1, (y + 1) * CELL_SIZE - 1);
glVertex2f(x * CELL_SIZE, (y + 1) * CELL_SIZE - 1);
glEnd();
}
}
// Izgara çizgilerini çizer.
glColor3f(1.0f, 0.0f, 0.0f); // Izgara için kırmızı çizgi
glLineWidth(1.0f);
glBegin(GL_LINES);
for (int x = 0; x <= WIDTH; x += CELL_SIZE) {
glVertex2f(x, 0); glVertex2f(x, HEIGHT); // Dikey çizgiler
}
for (int y = 0; y <= HEIGHT; y += CELL_SIZE) {
glVertex2f(0, y); glVertex2f(WIDTH, y); // Yatay çizgiler
}
glEnd();
}
int main() {
if (!glfwInit()) { // GLFW başlat.
return -1;
}
while (!glfwWindowShouldClose(window)) { // Pencere açıkken
drawGrid(); // Çizimi güncelle.
updateGrid(); // Oyun kurallarına göre hücre durumlarını güncelle.
glfwSwapBuffers(window); // Çizimi pencereye uygula.
glfwPollEvents(); // Olayları kontrol et.
}