Game of Life denilen algoritmada, karelerden oluşan bir dünyamız var. İdealde sonsuz genişlik ve sonsuz uzunlukta ancak tabiki biz sınırlandıracağız. Her karenin iki farklı durumu var, canlı veya ölü.
Her karenin bir sonraki durumda ölü mü canlı mı olacağına ise, o kareyi çevreleyen 8 karenin durumu belirliyor.
Kurallar gayet basit;
- Etrafında ikiden az canlı hücre olan bir canlı hücre, yalnızlık nedeniyle ölür
- Etrafında üçten fazla canlı hücre olan bir canlı hücre, aşırı kalabalık nedeniyle ölür.
- Etrafında iki veya üç canlı hücre olan bir canlı hücre, gelecek durumda canlı kalır.
- Etrafında üç canlı hücre olan bir ölü hücre, gelecek durumda yeniden doğar.
Bazı karelerin canlı olduğu bir başlangıç durumu belirlenir ve simulasyon başlatılır. Neler olacağını kafanızda canlandırabiliyor musunuz ?
Sizinle Game of Life 'ı anlatan bir video paylaşıyorum. Yazıya devam etmeden önce mutlaka izleyin ve neler olabileceğini görün.
Farklı türden şekiller oluşup birbirleriyle etkileşiyorlar. Çeşitli görevleri olan birbirinden ilginç yapılar ortaya çıkıyor. Ayrıca henüz keşfedilememiş türler de var. Bu basit kurallarla böyle karmaşık konseptlerin ortaya çıkması gerçekten şaşırtıcı birşey.
Şimdi gelelim bu algoritmayı nasıl programlayacağımıza. Bu konuyu düşündüğümde aklıma ilk gelen şey bu kareleri nasıl ekrana bastıracağımız, daha doğrusu size nasıl göstereceğim sorusu oldu. Her dilin kendine has özellikleri olduğu için normal bir render yapmayacağım, sadece bu kareleri ekrana, sıralı bir şekilde yazdıracağım. Tabiki isteyen, bu kareleri yazdırmak yerine, algoritmayı programlamak için kullandığı dille ekrana çizdirebilir.
Algoritmamızı programlarken, bu hücrelerden oluşan dünyayı bir 0 matrisi olarak tanımlayıp, ona göre işlemler yapacağız. Bu matriste ölü olan hücreler 0, canlı olan hücreler 1 ile temsil edilecek. Matris oluşturma işlemi her dilde farklı olduğu için, bunu matris adında bir fonksiyona yaptıracağım.
Pseudocode:
genişlik = 8
yükseklik = 8
dünya = matris_oluştur(genişlik+2, yükseklik+2) //kullandığınız dile göre
//0 matrisi fonksiyonu oluşturun
// +2 koymamın sebebi, dünya dediğimiz çerçevenin kenarlarına 0 lardan oluşan
// birer tampon bölge koymak. Biz işlemlerimizi bu bölgenin içinde yapacağız.
fonksiyon hesapla(matris): // dünyanın bir sonraki durumunu hesaplamak için
yedek_matris = matris_oluştur(genişlik+2, yükseklik+2)
1 den genişlik+1'e kadar her x için:
1 den yükseklik+1'e kadar her y için:
yedek_matris[x][y] = matris[x][y] // yedekleme için yeni bir matris oluşturup
// diğer matristeki değerleri yedek matrise attım
1 den genişlik+1'e kadar her x için:
1 den yükseklik+1'e kadar her y için:
durum = yedek_matris[x][y]
çevre=[[x, y+1], [x, y-1], [x+1, y+1], [x+1, y-1], [x+1, y], [x-1, y+1], [x-1, y-1], [x-1, y]]
// çevresindeki hücrelerin matristeki yerleri
toplam = 0
çevre içindeki her konum için:
toplam = toplam + yedek_matris[ konum[0] ][ konum[1] ] // çevresinde kaç canlı
//hücre olduğunu
//hesapladık
eğer durum, 1'e eşit ise:
eğer (toplam, 2'ye eşit veya toplam, 3'e eşit) değil ise:
matris[x][y] = 0 // yaşayan bir hücrenin etrafındaki hücre sayısı
// 2 veya 3 değilse, kalabalıktan veya yalnızlıktan ölür
değilse:
eğer toplam, 3'e eşit ise:
matris[x][y] = 1 // ölü bir hücrenin etrafındaki hücre sayısı 3 ise, yeniden doğar
fonksiyon matris_yazdır(matris):
1 den genişlik+1'e kadar her x için:
1 den yükseklik+1'e kadar her y için:
yazdir( matris[x][y] )
yazdir("\n") // alt satıra geçmek için
0 dan genişlik'e kadar her i için:
yazdir("-") // bittiğini belirtmek için çizgi
yazdir("\n")
// bir başlangıç konumu oluşturalım
dünya[5][5] = 1
dünya[6][5] = 1
dünya[7][5] = 1
dünya[5][6] = 1
dünya[6][7] = 1
// Bu desen glider adı verilen bir planöre aittir.
// Başlangıç konumunu rastgele verirseniz daha ilginç sonuçlar elde edebilirsiniz.
matris_yazdır(dünya)
// ilerlemek istediğiniz her adım için
hesapla(dünya)
matris_yazdır(dünya)
Ekran çıktımız 1 ve 0 lardan oluşan kareler olacak. Ben telefonumda programı yazıp renderledim, ilk adımdan sonraki birkaç durumunu sizinle paylaşıyorum.
Gördüğünüz gibi glider'ımız kuzeybatı'ya doğru ilerlemeye çalışıyor.
Çerçeveyi biraz genişletin ve rastgele durumlar koyup bir de kendiniz deneyin. Farklı türde oluşumları gözlemlemek oldukça keyifli.
Paylaşımlarınız güzel, ama örnek videolar hangi siteye ait ise bende gözükmüyorlar.
YanıtlaSilYouTube'dan almıştım ancak video linkleri ölmüştü. Linkleri güncelledim, feedback için teşekkürler.
Sil