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