18 Şubat 2012 Cumartesi

Python'a devam (4)

Herkese merhaba! Biraz uzun bir aradan sonra yeni bir ders yazmaya karar verdim! Hepinizin de gördüğü gibi sonunda çalışan bir oyun yazabildim. Tabi bu oyunu yazarken bir çok şey öğrendim, gaza geldim ve sizlere anlatmaya karar verdim.

Her şeyden önce koyun sayma uygulaması gibi bir şey yapmayacaksanız dokumentasyon şart! Yani tam olarak oyununuzun içeriği ne olacak, nasıl çalışacak, nerede nasıl bir fonksiyon kullanacaksınız gibi aklınıza gelen her şeyi bir kağıda yazacaksınız (Word belgesine de yazabilirsiniz tabi :P). Bunu yapmazsanız eninde sonunda her şey birbirine girecektir. Stairway to Earth'ü bile bu durumdayken geliştirmek çok zor, çünkü kod çok karıştı ve yazarken ileride şöyle bir şey eklemek istersem nasıl eklerim diye düşünmediğimden herhangi bir şeyi eklemek için çok uğraşmak gerekiyor.

İkinci öğrendiğim şey ise kullandığınız dil nesne tabanlı programlamaya (object oriented programming) müsaitse (Python gibi) bundan mutlaka faydalanın! Python bu amaç için class (sınıf) diye bir yapı kullanıyor. İşte bu derste de class'lardan bahsedeceğim.

Önce bir class yaratalım:

class oyuncu():
    tanım = "Bu bir oyuncu"
    ek_bigi = "Oyuncu bir oyunu oynayan kişidir."

Burada yaptığımız şey oyuncu adında bir sınıf yaratmak oldu. Daha önce öğrendiğimiz def'ten çok farklı değil. Şimdi bu sınıfa ait bir obje yaratalım:

oyuncu1 = oyuncu()

Şimdi oyuncu1'i çağırdığımız zaman Python bize <__main__.oyuncu object at 0x02B31650> gibi bir çıktı verecek. Tabi bu aşamada biz bunun ne anlama geldiğini ve bununla ne yapabileceğimizi bilmiyoruz. Boşverin, zaten ben de henüz bilmiyorum, bize asıl lazım olacak şey kendi yazdıklarımız. Her birisine ulaşmak için şöyle bir yol izlemelisiniz: obje_adı.ulaşmak_istediğiniz değer. Yani oyuncu1.tanım yazarsanız "Bu bir oyuncu" çıktısını alırsınız. Aynı şekilde ek_bilgi'ye de ulaşabilirsiniz. Tabi class'ı sadece bir oyuncuyu tanımlamak için kullanmadık. O halde hemen bir oyuncu daha ekleyelim:

oyuncu2 = oyuncu()

Artık iki oyuncumuz var. Ama tahmin edebileceğiniz gibi ikisi de aynı özellikleri taşıyor. İstersek her zaman bu iki değişkeni değiştirebiliriz, mesela oyuncu1.ek_bilgi = "Büyücü" dersek oyuncu1'in ek_bilgi'si artık "Oyuncu bir oyunu oynayan kişidir." yerine "Büyücü" olacak. Peki bunun daha kolay bir yolu yok mu? Bir obje yarattığımız zaman o objenin diğerlerinden farklı olmalarını nasıl sağlarız? Cevabı çok basit:
class oyuncu():
    tanım= "Bu bir oyuncu"
    ek_bilgi = "Oyuncu bir oyunu oynayan kişidir."
    def __init__(self, oyuncu_adı):
        self.adı = oyuuncu_adı

oyuncu1 = oyuncu("Anton")
oyuncu2 = oyuncu("Damla")

Şimdi oyuncu1.adı yazdığınız zaman "Anton", oyuncu2.adı yazdığınız zaman ise "Damla" çıktısını alırsınız. Peki __init__() de neymiş? self'i neden kullandık?

__init__() aynı append gibi bir fonksiyon (aslında bunlar gibi özel fonksiyonlara metot deniyor, önceden söyleseydim daha iyi olurdu tabi). Bu metot class'ın değer alabileceğini söylüyor. İlk yazdığım self ise o değişkenin sadece bir objeye ait olduğunu anlatıyor (self zorunlu bir şey değil bu arada, onun yerine ali de yazabilirsiniz ama genelde self yazılır). tanım ve ek_bilgi'nin başında self olmadığı için bu ikisi oyuncu() sınıfını kullanarak yarattığımız her obje için ortak olacaklardır. Yani oyuncu1.tanım ve oyuncu2.tanım aynı şeyi ifade ederken (tabi sonradan değiştirmediyseniz) oyuncu1.adı ile oyuncu2.adı farklı şeyleri ifade edecek.

Az önce fark ettiğiniz gibi def'i kullandım. Bu demek oluyor ki class'ların içine istediğimiz fonksiyonları tanımlayabiliyoruz. O halde oyuncu()'ya yeni bir şeyler ekleyelim


class oyuncu():
    tanım= "Bu bir oyuncu"
    ek_bilgi = "Oyuncu bir oyunu oynayan kişidir."
    def __init__(self, oyuncu_adı, can):
        self.adı = oyuncu_adı
        self.can = can
    def hasar_aldı(hasar):
        self.can -= hasar
    def can_aldı(can_miktarı):
        self.can += can_miktarı

oyuncu1 = oyuncu("Bulrog", 100)
oyuncu2 = oyuncu("zaLim_BÜyÜcü_24", 10)

devam = 1

while devam:
    girdi = input("Kim vurdu? ")
    if girdi.lower() == "bulrog":
        oyuncu2.hasar_aldı(1)
    elif girdi.lower() == "zalim_büyücü_24":
        oyuncu1.hasar_aldı(150)
    else:
        print("Öyle bir oyuncu yok.")

    if oyuncu1.can <= 2 or oyuncu2.can <= 0:
        devam = 0

Bu şekilde iki oyuncuyu kolaylıkla yönetebiliriz. Belki sadece iki obje varsa buna gerek duymayabilirsiniz ama iki değil de on oyuncu olduğunu düşünün, o zaman hepsi için canlarını, adlarını ve diğer özelliklerini tanımlamak çok uzun sürecektir. Bunun gibi bir çok durumda class'lar hayatınızı kolaylaştıracak.

Evet, artık görsel bir şeyler yapmak için hazırsınız! Bir sonraki derste pygame'den bahsedeceğim, birkaç ders sonra da basit bir uçak ya da araba yarışı oyunu yapacağız. Şimdilik sağlıklı kalın, bu kış aylarında kendinize çok dikkat edin.

1 yorum:

  1. Buy it now - Titanium Art - TITanium Art - iTanium.com
    Titanium art. This titanium earrings sensitive ears item titanium cookware is for sale only and may not include the tags of the tags listed. The silicone dab rig with titanium nail auction is for the titanium linear compensator items edge titanium with the lowest value

    YanıtlaSil