21 Ocak 2011 Cuma

Python'a devam... (2)

Son yazımda metin tabanlı bir oyun yazma sözüm vardı. Bunun için bilmeniz gereken iki fonksiyon kaldı: def ve global.

def
def aslında bir fonksiyon tanımlama fonksiyonu. Yani bu fonksiyon sayesinde kendiniz istediğiniz gibi fonksiyon yazabiliyorsunuz. Kullanımı şöyle:

def benim_fonksiyonum():
    print(“Artık benim de bir fonksiyonum var!”)

Bu şekilde fonksiyonu tanımladık, çarğırmak için ise input()'ta olduğu gibi benim_fonksiyonum() yazmanız yeterli. Peki input() ve print()'te olduğu gibi bir argüman kullanamaz mıyız? Tabi ki de kullanırız. Bunun için fonksiyonu şu şekilde tanımlamanız yeterli:

def merhaba(isim):
    print(“Merhaba “, isim, “ ben Dünya!”)

merhaba(“Damla”)

Tahmin edebileceğiniz gibi buradan “Merhaba Damla, ben Dünya!” çıktısını alacaksınız. Şimdiye kadar Python'un bahsetmediğim bir özelliğini anlatmak istiyorum. Python kodu okurken satır satır okur, satır atlamaz. Bu yüzden şu şekilde yazarsanız hata verecektir:

merhaba(“Damla”)

def merhaba(isim):
    print(“Merhaba “, isim, “ ben Dünya!”)

Sıra merhaba(“Damla”) satırına geline kadar merhaba() diye bir fonksiyon tanımlı olmadığı için Python geriye kalan koda bakmadan hata verecektir. Aynı şey değişkenler için de geçerli. Bu yüzden fonksiyonlarınızı ve değişkenlerinizi kodunuzun başında tanımlarsanız daha rahat edersiniz. Diyelim ki fonksiyon dışında bir değişkenimiz var ve onunla bir işlem yapmak istiyorsunuz. Muhtemelen şöyle bir şey yazmayı düşünürsünüz:

değişken = 25

def işlem(x):
    değişken = x + 5

işlem(değişken)
print(değişken)

Bu kodu çalıştırdığınızda işlem() fonksiyonunun değişkenin değerini 5 arttırmasını bekliyorsunuz. Oysa değişkeni print() ile bastırdığınızda Python inatla 25 değerini döndürüyor. Buradaki sorun şundan kaynaklanıyor, def ile tanımladığınız fonksiyonun içindeki değişkenler sadece o fonksiyonda tanımlı kalıyor. Yani işlem() içindeki değişken ile baştaki değişken tamamen farklı şeyler. Bu sorunu iki şekilde düzeltebiliriz. İlk yol “global”ı kullanmak:

değişken = 25

def işlem(x):
    global değişken
    değişken = x + 5

işlem(değişken)
print(değişken)

Kodunuzu bu şekilde çalıştırırsanız tam olarak istediğiniz gibi çalışacaktır. İkinci yol da “return”den geçiyor. Şöyle ki:

değişken = 25

def işlem(x):
    değişken = x + 5
    return değişken

değişken = işlem(değişken)
print(değişken)

Şimdi ne yaptık? “return” fonksiyonu herhangi bir değer döndürebilir. Bu durumda işlem() içinde tanımladığımız değişkeni döndürdü ve işlem()'in dışında tanımladığımız değişkene eşitledi. Şimdi fonksyon tanımlarını kullanarak yeni bir hesap makinesi yazalım.

def hesap_makinesi():
    print(“Toplama işlemi için 1 yazınız.”)
    print(“Çıkarma işlemi için 2 yazınız.”)
    print(“Çarpma işlemi için 3 yazınız.”)
    print(“Bölme işlemi için 4 yazınız.”)

    işlem = input()
    if işlem == “1” or işlem == “2” or işlem == “3” or işlem == “4”:
        a = int(input(“İlk sayıyı giriniz: “)
        b = int(input(“İkinci sayıyı giriniz: “)
    else:
        print(“Yanlış giriş yaptınız.”)
        hesap_makinesi()

    if işlem == “1”:
        print(a + b)
    elif işlem == “2”:
        print(a – b)
    elif işlem == “3”:
        print(a * b)
    elif işlem == “4”:
        print(a / b)


    print(“Başka bir işlem yapmak ister misiniz? (e/h): “)
    seçim = input()

    if seçim == “e”:
        hesap_makinesi()
    else:
        print(“Hesap makinemi kullandığınız için teşekkürler.”)

hesap_makinesi()

Bu kodu çalıştırdığınızda göreceksiniz ki kullanıcı istemediği taktirde program sona ermiyor. Bunu he defasında hesap_makinesi() fonksiyonunu çağırarak sağlıyoruz. Buraya kadar bir sorun yoksa basit bir metin tabanlı macera oyunu yazmaya hazırsınız demek.

tahta = False

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 tahta
    print("")
    print("Bir odada uyandınız. Oraya nasıl geldiğinizi")
    print("hatırlamıyorsunz.")
    print("")
    print("1. Kapıyı aç")
    print("2. Etrafa bak")
    if tahta == True:
        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("Tahta ile pencereyi kırdınız.")
        bölüm_2()
    else:
        print("Yanlış giriş yaptınız.")
        bölüm_1()

def bölüm_2():
    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.")
    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.")
        ana_menü()
    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
        ana_menü()

ana_menü()

Şimdi burada ne yaptık adım adım inceleyelim. “tahta = False”un ne olduğunu açıklamadım sanırım ama çok da zor bir şey değil. “tahta” bildiğimiz değişken “False” değeri ise tahmin edebileceğiniz gibi “yanlış” anlamına geliyor. Eğer liseden mantık konusunu hatırlarsanız oradaki 0'a denk geliyor. Tabi bunun tersi de “True” değeri. Burada dikkat etmeniz gereken nokta ikisinin de büyük harfle yazıldığı. Onun haricinde yeni bir şey yok. Böyle bir şey yazarken dikkat etmeniz bir başka şey ise ilk fonksiyonunuzu (bu durumda ana_menü() fonksiyonu) kodunuzun en sonunda çağırmanız gerektiği. Daha önce de söylediğim gibi Python kodu okurken satır atlamaz, bu yüzden ana_menü() fonksiyonunu çağırdığımız satırın altında kalan hiçbir kod çalışmayacak.

ana_menü() fonksiyonunda değişik bir şey yok, şimdiye kadar hepsini anlattım zaten. Bir tek bölüm_1()'de en başta sadece kapıyı aç ve etrafa bak. Kapıyı aç dediğimiz zaman kapı kilitli mesajını alıyoruz. Ancak etrafına bak dersek tahta değişkeni True değerini alıyor ve bir daha bölüm_1() fonksiyonu çağrılıyor. Bu defa tahta = True şartı sağlandığı için üçüncü seçenek açılıyor ve camı kırarak dışarı çıkabiliyoruz. İkninci bölümde hangi seçeneği seçerseniz seçin oyun sona erecek, tahta yine False değerini alacak ve ana menü açılacak. Tahtayı false yapmazsak ve kullanıcı oyunu kapatmadan bir daha oynamak isterse birinici bölümde tahta True olduğu için üçüncü seçenek açık olacaktır.

Evet, şimdilik bu kadar. Bir dahaki derste oyunumuzu biraz geliştireceğiz. Kendinize iyi bakın.

Hiç yorum yok:

Yorum Gönder