basit kurallardan doğan karmaşıklık

entry6 galeri
    6.
  1. birbiriyle etkileşen hücrelere dair 3 kural, süreç incelenmediği sürece öngörülemez ve tahmin edilemez neticeler doğuruyor:
    #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 GENISLIK = 1920; // Pencere genişliği piksel cinsinden
    const int YUKSEKLIK = 1080; // Pencere yüksekliği piksel cinsinden
    const int HUCRESAYISI = 4; // Her bir hücrenin genişliği ve yüksekliği piksel cinsinden
    const int IZGARA_GENISLIK = GENISLIK / HUCRESAYISI; // Hücre matrisinin yatayda hücre sayısı
    const int IZGARA_YUKSEKLIK = YUKSEKLIK / HUCRESAYISI; // 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>> izgara(IZGARA_YUKSEKLIK, std::vector<int>(IZGARA_GENISLIK, 0));
    // Bir sonraki durumları tutmak için yedek matris
    std::vector<std::vector<int>> sonrakiIzgara(IZGARA_YUKSEKLIK, std::vector<int>(IZGARA_GENISLIK, 0));

    // **Yaşam Oyunu Kuralları**:
    // 1. Her dolu hücre 2 veya 3 komşuya sahipse yaşamaya devam eder, aksi halde ölür.
    // 2. Boş hücreler tam 3 dolu komşuya sahipse canlanır.

    void izgaraBaslat() { // Hücre matrisini başlatır
    srand(static_cast<unsigned>(time(0))); // Rastgele başlangıç için tohum oluşturur.
    for (int y = 0; y < IZGARA_YUKSEKLIK; ++y) { // Her hücre için
    for (int x = 0; x < IZGARA_GENISLIK; ++x) {
    izgara[y][x] = rand() % 2; // Hücreyi rastgele olarak dolu (1) veya boş (0) yapar.
    }
    }
    }

    int komsuSay(int y, int x) { // Hücrenin komşularını say
    int sayac = 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 + IZGARA_YUKSEKLIK) % IZGARA_YUKSEKLIK; // Dikeyde çevrilebilir koordinat
    int nx = (x + dx + IZGARA_GENISLIK) % IZGARA_GENISLIK; // Yatayda çevrilebilir koordinat
    sayac += izgara[ny][nx]; // Eğer komşu hücre dolu ise sayacı artır.
    }
    }
    return sayac; // Bulunan komşu hücrelerin toplam sayısını döndür.
    }

    void izgaraGuncelle() { // Hücrelerin durumlarını günceller
    for (int y = 0; y < IZGARA_YUKSEKLIK; ++y) { // Her hücreyi güncelle
    for (int x = 0; x < IZGARA_GENISLIK; ++x) {
    int komsular = komsuSay(y, x); // Mevcut hücrenin komşu sayısını al
    if (izgara[y][x] == 1) { // Hücre dolu ise
    sonrakiIzgara[y][x] = (komsular == 2 || komsular == 3) ? 1 : 0; // 2 veya 3 komşu ile hayatta kalır.
    } else if (izgara[y][x] == 2) { // Genişleyen hücre durumu
    sonrakiIzgara[y][x] = (komsular >= 1) ? 2 : 0; // Komşuları varsa genişlemeye devam et.
    } else { // Hücre boş ise
    sonrakiIzgara[y][x] = (komsular == 3) ? 1 : 0; // Boş hücre, 3 komşu varsa doğar.
    }
    }
    }
    izgara.swap(sonrakiIzgara); // Eski durumu yeni durumla değiştir.
    }

    void izgaraCiz() { // Hücreleri ve ızgarayı çizer
    glClear(GL_COLOR_BUFFER_BIT); // Ekranı temizler.

    // Hücreleri çizer.
    for (int y = 0; y < IZGARA_YUKSEKLIK; ++y) {
    for (int x = 0; x < IZGARA_GENISLIK; ++x) {
    if (izgara[y][x] == 1) { // Hücre dolu ise
    glColor3f(0.0f, 1.0f, 0.0f); // Yeşil rengi ayarla.
    } else if (izgara[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 * HUCRESAYISI, y * HUCRESAYISI);
    glVertex2f((x + 1) * HUCRESAYISI - 1, y * HUCRESAYISI);
    glVertex2f((x + 1) * HUCRESAYISI - 1, (y + 1) * HUCRESAYISI - 1);
    glVertex2f(x * HUCRESAYISI, (y + 1) * HUCRESAYISI - 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 <= GENISLIK; x += HUCRESAYISI) {
    glVertex2f(x, 0); glVertex2f(x, YUKSEKLIK); // Dikey çizgiler
    }
    for (int y = 0; y <= YUKSEKLIK; y += HUCRESAYISI) {
    glVertex2f(0, y); glVertex2f(GENISLIK, y); // Yatay çizgiler
    }
    glEnd();
    }

    int main() { // Programın ana fonksiyonu
    if (!glfwInit()) { // GLFW başlat.
    return -1;
    }

    GLFWwindow* pencere = glfwCreateWindow(GENISLIK, YUKSEKLIK, "Yasam Oyunu", NULL, NULL); // Pencereyi oluştur.
    if (!pencere) {
    glfwTerminate(); // Oluşturulmazsa çık.
    return -1;
    }

    glfwMakeContextCurrent(pencere); // OpenGL bağlamını bu pencereye uygula.
    glOrtho(0, GENISLIK, YUKSEKLIK, 0, -1, 1); // Oranları ayarla.

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

    while (!glfwWindowShouldClose(pencere)) { // Pencere açıkken
    izgaraCiz(); // Çizimi güncelle.
    izgaraGuncelle(); // Oyun kurallarına göre hücre durumlarını güncelle.

    glfwSwapBuffers(pencere); // Çizimi pencereye uygula.
    glfwPollEvents(); // Olayları kontrol et.
    }

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

    https://galeri.uludagsozluk.com/r/2379048/+
    https://galeri.uludagsozluk.com/r/2379049/+
    https://galeri.uludagsozluk.com/r/2379050/+
    1 ...