30 Nisan 2009 Perşembe

seymgeym



aklıma bir algoritma problemi getirip veya (daha güzeli) yaratıp onu çözmeye uğraşmak en büyük zevklerimden birisidir. bunun uygulanması için de "oyun"dan daha iyi bir alan olamaz. bu ara same game ismiyle bilinen efsane oyunu kafaya taktım. isim belki tanıdık gelmeyebilir. aynı renkten blokları bir araya getirip patlatarak yok ettiğimiz oyun. bir kaç temel algoritma var. aynı renkten ve birbirine komşu taşların tespiti, bu tespit edilen taşların yokedilmesi sonucu bunların üstünde kalan taşların bir kare aşağı inmesi, bir sütunda hiç taş kalmamışsa sağındaki bloğun tümünün en az bir kare yanaşarak sola yapışması, oyunun bittiğinin yani birbiriyle aynı renkte olup birbirine değen birden fazla taş olmadığının tespit edilmesi. çok zor problemler değil esasen, ama asıl olan kendine özgü bir yöntem geliştirmek, kod kopyalamamak ve en az döngü ve işlemle halletmeye çalışmak.

teknik detaya girmeden yapısal olarak anlatacak olursam, oyunun temel sınıfını içeren bir dosya ve bir de görsel olarak oyunu oynanabilir kılan pyqt'yi kullandığım dosya var. kısacası bir adet oyun motoru ve bir adet de oyun kaportası var. mümkün olduğunca genişletilebilir, değiştirilebilir bir ana oyun sınıfı yazdım. renk sayısı, oyun alanının kare sayısı vs her şey esnek. ve hatta renklerin kendisini bile (onlarca renk sayısına kadar) otomatik türeten bir kod parçası mevcut.

seymgeym'i de uitopy gibi google code sayfama attım. http://code.google.com/u/penguen@linux.erciyes.edu.tr/ adresinden erişilebilir. kodunun hepsini buraya koymam biraz abes olur. onun için google code'dan inceleyebilir, indirebilirsiniz. sadece aynı renkten olan ve birbirine komşu olan taşların tespit edildiği fonksiyonu ve tespit edilen bu grubun yıkılması fonksiyonununu yazayım örnek baabında.
    def etrafaBakin(self, yG, xG):
self.grup[yG][xG] = self.hangiRenk
for x, y in [[-1, 0],[0, -1],[1, 0],[0, 1]]:
if (yG + y in range(1, self.tahtaY + 1)) and (xG + x in range(1, self.tahtaX + 1)) and (self.tahta[yG + y][xG + x] == self.hangiRenk) and (self.grup[yG + y][xG + x] == 0) :
self.grup[yG + y][xG + x] == self.hangiRenk
self.etrafaBakin(yG + y, xG + x)

    def yik(self):
for n in range(1, self.tahtaX + 1):
for m in range(self.tahtaY, 0):
if self.tahta[m][n] == self.grup[m][n]:
for y in range ((m - 1), 0):
self.tahta[y + 1][n] = self.tahta[y][n]
self.tahta[1][n] = 0
if self.tahta[self.tahtaY][n] == 0:
for x in range(n+1, self.tahtaX + 1):
for y in range(1, self.tahtaY +1):
self.tahta[y][x-1] = self.tahta[y][x]
if x == self.tahtaX:
self.tahta[y][self.tahtaX] = 0

Hiç yorum yok:

Yorum Gönder