29 Kasım 2011 Salı

Python'a devam (3)

Merhaba arkadaşlar. Bakalım en son nerede kalmıştık... Ah evet, metin tabanlı bir oyun yazmıştık ve oyunu biraz geliştirecektik. Bu derste listelerden bahsedeceğim. Liste dediğimiz şeyi aslında bildiğimiz küme. Kendisini şöyle tanımlayabiliriz:

ilk_listem = []

Tabi bu boş bir liste oldu, buna eleman eklemekten başka bir şey yapmanız mümkün değil. Haydi o zaman dolu bir liste tanımlayalım:

ilk_listem = [1, 2, 3]

Şimdi üç elemanlı bir listemiz oldu. Listeyi böyle tanımlayıp bırakırsak biraz saçma olur tabi, muhtemelen onu çağırmak isteyeceğiz. Bunun için ismini yazmanız yeterli:

>>> ilk_listem
[1, 2, 3]

Bir dosyaya kaydedecek olursanız da tahmin edebileceğiniz gibi şöyle bir şey yazmanız gerekir:

ilk_listem = [1, 2, 3]
print(ilk_listem)

Üstteki iki satırın kayıtlı olduğu dosyayı çalıştırsanız yine [1, 2, 3] çıktısını alacaksınız. Şimdi bu liste ile biraz işlem yapalım. Mesela bir isim eklemeyi deneyebiliriz. Bunun için append() diye bir fonksiyon kullanacağız.

>>> ilk_listem.append(4)
>>> ilk_listem
[1, 2, 3, 4]

Bu şekilde listemize istediğimiz kadar eleman ekleyebiliriz. Buna benzer bir şekilde listeden eleman çıkarabiliriz. Kullanacağımız fonksiyon remove() fonksiyonu.

>>> ilk_listem.remove(4)
>>> ilk_listem
[1, 2, 3]

Buraya kadar bir sorun yoksa ufak bir liste yönetici program yazalım.

yöneticiler_listesi = ["anton", "tron", "bill gates"]

print("Merhaba kullanıcı. İsmin ne?")

isim = input()
if isim.lower() in yöneticiler_listesi:
    print("Listeye yönetici eklemek için 1'e")
    print("Listeden yönetici silmek için 2'ye basınız")
    işlem = input()
    if işlem == "1":
        ekle = input("Eklemek istediğiniz ismi giriniz: ")
        yöneticiler_listesi.append(ekle)
        print("Yöneticiler listesi güncellendi.")
        print("Yeni liste: ", yöneticiler_listesi)
    elif işlem == "2":
        sil = input("Silmek istediğiniz ismi giriniz: ")
        yöneticiler_listesi.remove(sil)
        print("Yöneticiler listesi güncellendi.")
        print("Yeni liste: ", yöneticiler_listesi)
    else:
        print("Öyle bir yönetici yok.")

Burada bahsetmediğim bir tek "in" işlemcisi var ama onu da tahmin etmek zor değil. "in" işlemcisi yazdığınız elemanın liste içinde olup olmadığını kontrol eder. Tabi bu program sadece bir kere çalışıp kapandığı için çok işe yaramayacaktır. Bunu engellemek için daha önce bahsettiğim def()'i kullanabilirsiniz. Ya da birazdan anlatacağım while döngüsü de işinizi görecektir. Hatta while bu durumda daha kullanışlı olacaktır.

"while" koşula bağlı bir döngüdür. Koşul sağlandığı sürece döngü devam eder. Hemen bir örnek üzerinde göstereyim:

devam = 1

while devam == 1:
    print("Döngü devam ediyor")
    devam_edelim_mi = input("Devam edelim mi (e/h): ")
    if devam_edelim_mi == "e":
        devam = 1
    else:
        devam = 0
print("Döngü sona erdi")

Bu programı çalıştırdığınızda devam = 1 satırından sonra program bir döngüye girecek ve "Devam edelim mi?" sorusuna "e" cevabını verdiğiniz sürece döngüden çıkmayacaktır. Şimdi olmasa bile daha kompleks oyunlar yazarken bu döngüden bol bol yararlanacaksınız. Bu derste bahsetmek istediğim birkaç liste fonksiyonu daha var. Onları da kısaca anlatacağım, bir sorunuz olursa yorum yazabilir ya da daha ayrıntılı bir anlatım için istihza.com'a bakabilirsiniz.

extend()

Eğer append() ile aynı anda birden fazla eleman eklemeyi denemişseniz muhtemelen başarısız olmuşsunuzdur. Bu noktada imdadımıza extend() yetişiyor. Kullanımı şu şekilde:

>>> liste = []
>>> liste.extend(["eleman1", "eleman2", "eleman3"])

Eğer aynı şekilde append() ile yazarsanız da eklendiğini görürsünüz ancak append() eklediğiniz bir liste olur. Yani liste'nin içine başka bir listeyi bir eleman olarak eklemiş olursunuz. İsterseniz deneyelim:

>>> liste.append(["yeni eleman", "yeni eleman 2", "yeni eleman 3"])
>>> print(liste)
["eleman1", "eleman2", "eleman3", ["yeni elman", "yeni eleman 2", "yeni eleman 3"]]

Hazır liste içine liste eklemekten bahsetmişken aynı şeyi "+" ile de yapabileceğinizi belirtmeliyim. Bunlar haricinde listelerin birçok fonksiyonu var ama bunlar şimdilik bize yetecektir. Şimdi oyunumuza geçelim. Yaptığım değişiklikleri yorum olarak kodun içine yazdım. IDLE ile açarsanız kırmızı satırları göreceksiniz.


#en başa çantamızı ekleyelim ve bölümün başındaki yazıları
#tekrar tekrar yazdırmamak için bölüm_1_göster ve bölüm_2_göster
#diye iki değişken tanımlayalım.
çanta = []
tahta = False
bölüm_1_göster = bölüm_2_göster = True

def ana_menü():
    print("")
    print("1. Yeni Oyun")
    print("2. Yardım")
    print("3. Çıkış")

    işlem = input()

    if işlem == "1":
        bölüm_1()
    elif işlem == "2":
        yardım()
    elif işlem == "3":
        print("Oyunumu oynadığınız için teşekkürler.")
    else:
        print("Yanlış giriş yaptınız.")
        yardım()

def yardım():
    print("Oyunu size sunulan seçeneklerin başındaki")
    print("numaraları girerek oynayabilirsiniz.")
    ana_menü()

def bölüm_1():
    global çanta, tahta, bölüm_1_göster
    #bu if'in sonunda bölüm_1_göster'i False yapıyoruz
    #bölüm_1()'i bir daha çağırırsak Python burayı atlaycaktır.
    if bölüm_1_göster:
        print("")
        print("Bir odada uyandınız. Oraya nasıl geldiğinizi")
        print("hatırlamıyorsunz.")
        bölüm_1_göster = False
    print("")
    print("1. Kapıyı aç")
    print("2. Etrafa bak")
    #artık sadece tahtayı görmemiz yetmiyor, gördükten sonra
    #onu almamız da gerekiyor.
    if tahta:
        print("3. Tahtayı al.")
    #yeni öğrendiğimiz "in" ile çantanın "tahta"nın çantada olup
    #olmadığını kontrol ediyoruz. Çantada ise "3. Tahta ile camı
    #kır." seçeneğini ekliyoruz.
    if "tahta" in çanta:
        print("3. Tahta ile camı kır.")

    hareket = input()

    if hareket == "1":
        print("Kapı kilitli.")
        bölüm_1()
    elif hareket == "2":
        print("Oda karanlık, kapı kilitli. Dışarıyı")
        print("göremeyeceğiniz kadar kirlenmiş bir")
        print("pencere var. Yerde birkaç tahta var.")
        tahta = True
        bölüm_1()
    elif hareket == "3" and tahta == True:
        print("Tahtayı aldınız.")
        #burada append() ile tahtayı çantamıza ekliyoruz.
        çanta.append("tahta")
        tahta = False
        bölüm_1()
    elif hareket == "3" and "tahta" in çanta:
        print("Tahta ile camı kırdınız.")
        #remove() ile tahtayı çanta'dan siliyoruz.
        çanta.remove("tahta")
        bölüm_2()
    elif hareket == "çanta":
        if len(çanta) == 0:
            print("Çantam boş.")
            bölüm_1()
        else:
            print("Çantamda", çanta, "var.")
            bölüm_1()
    else:
        print("Yanlış giriş yaptınız.")
        bölüm_1()

def bölüm_2():
    global bölüm_2_göster
    if bölüm_2_göster:
        print("")
        print("Pencereden sokağa atladınız. Eski fabrikaların")
        print("olduğu bir yerdesiniz. Görünüşe göre hepsi terk")
        print("edilmiş ve etrafta hiç insan yok. Sokağın")
        print("karşısında bir araba görüyorsunuz.")
        bölüm_2_göster = False
    print("")
    print("1. Arabaya doğru koş.")
    print("2. Koşarak kaç.")

    hareket = input()

    if hareket == "1":
        print("Arabayı çalıştırdığınız anda bunun bir hata")
        print("olduğunu anladınız. En yakındaki binadan")
        print("silahlı üç kişi çıktı. Sizi gördükleri gibi")
        print("üstünüze ateş açtılar. En son gördüğünüz şey")
        print("yüzünüze doğrultulmuş bir namlu oldu.")
    elif hareket == "2":
        print("En yakındaki köşeyi dönmeden hemen önce arabanın")
        print("önünde durduğu binadan silahlı üç kişinin")
        print("çıktığını gördünüz. O anda ne kadar doğru bir")
        print("karar verdiğinizi anladınız. Oradan uzaklaşmak")
        print("beş dakikanızı aldı. Orada her ne olduysa artık")
        print("sizi ilgilendirmiyordu...")
        tahta = False
    else:
        print("Yanlış giriş yaptınız.")
        bölüm_2()

ana_menü()


Artık nasıl bir çanta (ya da inventory) oluşturabileceğinizi bildiğinize göre güzel bir oyun yazabilirsiniz. Metin tabanlı oyunlara örnek isterseniz Zork serisini inceleyebilirsiniz.