basit kurallardan doğan karmaşıklık

entry6 galeri
    2.
  1. #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.
    }

    void drawGrid() {
    glClear(GL_COLOR_BUFFER_BIT); // Ekranı temizler.

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

    GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "Game of Life", NULL, NULL); // Pencereyi oluştur.
    if (!window) {
    glfwTerminate(); // Oluşturulmazsa çık.
    return -1;
    }

    glfwMakeContextCurrent(window); // OpenGL bağlamını bu pencereye uygula.
    glOrtho(0, WIDTH, HEIGHT, 0, -1, 1); // Oranları ayarla.

    initializeGrid(); // Başlangıç gridini oluştur.

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

    glfwDestroyWindow(window); // Pencereyi temizle.
    glfwTerminate(); // GLFW'yi sonlandır.
    return 0;
    }
    0 ...