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.

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.

9 Ocak 2011 Pazar

Python'a Giriş (1)

Önsöz

Daha önce kısa yoldan oyun yapımını öğretme sözü vermiştim. Bu yüzden Python'un ayrıntılarından bahsetmek yerine ilk aşamada gerekli olan fonksiyonlarıdan bahsedeceğim. Hem zaten Python için çok güzel Türkçe bir kaynak var: www.istihza.com. Eğer ilk oyununuzu yaptıktan sonra hala bu işle uğraşmaya kararlıysanız ve bunun sizin için ideal bir iş olduğunu düşünüyorsanız benim anlattıklarımla yetinmeyin, o siteyi mutlaka inceleyin.

Python'da İlk Adımlar

Tahmin edebileceğiniz gibi önce sitesine gidip onu indirmemiz lazım: www.python.org . Siteye girdiğinizde göreceksiniz ki birçok Python sürümü var, en önemlileri Python 2.xx ve 3.xx. Aralarında çok büyük olmasa da bazı farklar var. Benim kişisel tercihim ve anlatacağım sürüm 3. sürümü. 3. sürümünü tercih etmemin en büyük sebebi Türkçe karakterleri destekliyor olması. Tahminimce nasıl indirip kuracağınızı çözersiniz, o yüzden bu kısmı atlıyorum.
Kurduktan sonra Başlat menüsünde Python3.1'in (ya da sizinki hangisi ise) altında IDLE'ı çalıştırın. Karşınıza Python'un sürümü ile başlayan ve “>>>” ile biten bir ekran çıkacaktır. İşte burası Python'un çalıştığı yer. Bütün programlama işini buradan halledebilirsiniz. Tabi ki buraya yazdıklarınızı kaydedemeyeceğiniz için böyle bir şey yapmayacaksınız ama kaydetme işine daha sonra değineceğiz.

Print() fonksiyonu
Her programlama dersinin girişinde olduğu gibi ekrana yazı yazdırmaktan başlayalım. Ekrana herhangi bir şey yazdırmak için print() fonksiyonunu kullanmamız yeterli. Bu noktada dikkat etmeniz gereken nokta eğer bir yazı bastıracaksanız tırnak içine almanız gerektiği. Şöyle orijinal bir örnek yapalım:

print(“Merhaba Anton, ben Dünya!”) yazın ve enter'a basın.

Yazdığınız tam olarak şöyle görünmeli:

>>> print(“Merhaba Anton, ben Dünya!”)
Merhaba Anton, ben Dünya!
>>>

Eğer cümlenizi tırnak arasına almayı unuttuysanız Python şöyle bir hata verecektir:

Traceback (most recent call last):
File "", line 1, in
print(asd)
NameError: name 'Merhaba Anton, ben Dünya!' is not defined

Bir sayı bastırmak istediğinizde tırnakları kullanmanıza gerek yok

>>> print(23)
23
>>>

İşlemler ve değer atama
Python'u hesap makinesi olarak kullanmanız da mümkün. Fazla uzatmadan iki ile üçü toplayalım:

>>> 2 + 3
5
>>>

Eğer isterseniz önce her sayıya bir isim verirsiniz (daha doğrusu isme bir sayı verirsiniz):

>>> a = 2
>>> b = 3
>>> a + b
5
>>>

Aynı şekilde a + b toplamına da başka bir isim verebiliriz:

>>> a = 2
>>> b = 3
>>> c = a + b
>>> c
5
>>>

Aynı çıktıları print() fonksiyonunu kullanarak da elde edebiliriz:

>>> print(2 + 3)
5
>>>

Ya da:

>>> print(a + b)
5
>>>

Ya da:

>>> print(c)
5
>>>

Yazmamız mümkün.

Aynı şekilde bir yazıyı da bir harfe atayabiliriz:

>>> a = “Merhaba Dünya, ben Anton!”
>>> print(a)
Merhaba Dünya, ben Anton!
>>>

Tabi bu atamaları yaparken sadece harf ile sınırlı değilsiniz, “a” yerine “cümle” de yazabilirsiniz.

input() fonksiyonu
Ekrana istediğimizi bastırabiliyoruz artık! Ne mutlu bize! Peki ya kullanıcıdan bir girdi almak istersek? İşte o zaman devreye input() fonksiyonu giriyor. Hemen bir deneme yapalım:

>>> input()


Gördüğünüz gibi input() deyince program öylece kalıyor. Peki neden? Çünkü bizden bir değer girmemizi bekliyor. Hemen bir şeyler yazalım öyleyse:

>>> input()
Kara Murat Benim!
'Kara Murat Benim!'
>>>

input() fonksiyonu yazdığımızı aynen bastırdı. Şimdi de bir değişkene isim vermeye çalışalım:

>>> isim = input()
Damla
>>>

Şimdi “isim” yazdığınızda Python size “Damla” çıktısını verecektir:

>>> isim
'Damla'
>>>

İsterseniz bir de nasıl bir girdi beklediğimizi soralım kullanıcıya. Bunun için input(“açıklama”) şeklinde bir açıklama girebilirsiniz.

>>> isim = input(“Bir isim giriniz: “)
Bir isim giriniz: Damla
>>> isim
'Damla'
>>>

Bu noktada print() fonksiyonuna dönmek istiyorum. print()'i kullanarak aynı anda birkaç argümanı birleştirerek bastırabilirsiniz. Bunu da şu şekilde yapabilirsiniz:

>>>print(“Merhaba ” + isim + “, ben Dünya!”)
Merhaba Damla, ben Dünya!
>>>

Dikkatinizi çekti mi bilmiyorum, ama burada “+” işaretinin işlevi değişmiş. Bu sadece print() için geçerli olan bir durum değil, sayı haricinde herhangi bir şey ile kullanıldığında o şeyleri yan yana ekler. Şöyle bir örnek yapalım:

>>> a = “Aaa! ”
>>> b = “Kim gelmiş!”
>>> a + b
'Aaa! Kim gelmiş!”
>>>

Aynı durum sayı haricinde her karakter için geçerli olduğundan şöyle bir şey görürseniz şaşırmayın:

>>> “2” + “3”
'23'
>>>

Tırnak arasına yazıldıkları için Python 2'yi ve 3'ü sayı olarak değil de bir harf gibi algılıyor. Şimdi dönelim input()'a. Az önce gördüğünüz gibi input() sayı değil de girdiyi karakter gibi algılıyor. Bu durumu düzeltmek için ne yapmalıyız? Cevap int() fonksiyonunda saklı. Önce şöyle bir şey yazalım:

>>> a = input(“Bir sayı girin: “)
Bir sayı girin: 12
>>> b = input(“Bir sayı daha girin: “)
Bir sayı daha girin: 43
>>> a + b
'1243'

Tıpkı beklediğimiz gibi Python 12 ve 43 sayılarını birer karakter olarak algıladı ve yan yana yazdı. Şimdi aynı şeyi int() ile deneyelim:

>>> a = input(“Bir sayı girin: “)
Bir sayı girin: 12
>>> b = input(“Bir sayı daha girin: “)
Bir sayı daha girin: 43
>>> int(a)
>>> int(b)
>>> a + b
55
>>>

Bu örnekte int() fonksiyonu karakter olarak görünen 12 ve 43'ü sayıya çevirdi. Aynı şey şu şekilde de yazılabilir:

>>> a = int(input(“Bir sayı girin: “))
Bir sayı girin: 42
>>> b = int(input(“Başka bir sayı girin: “))
Başka bir sayı girin: 14
>>> a + b
56
>>>

Olur da bir sayıyı karaktere dönüştürmek isterseniz str() fonksiyonunu kullanabilirsiniz. str() fonksiyonu int() ile tamamen aynı şekilde çalışıyor.

Kayıt olayı
Bu kadar şeyi yazdıktan sonra kaybolmalarını istemezsiniz herhalde? O halde hemen file'ın altındaki “New Window”a tıklayalım (ya da ctrl + n). Karşımıza beyaz bir pencere çıkacak. Hemen yazmak istediklerimizi yazalım oraya. Mesela:

isim = input(“İsminiz nedir? “)
print(“Hoşgeldin ” + isim + “!”)

Sonra yine File'ın altındaki “Save” seçeneğine tıklıyoruz (ya da ctrl + s). Kaydedeceğimiz yeri seçip dosya adının sonuna “.py” yazarak kaydediyoruz. Bundan sonra iki seçeneğiniz var; ya kaydettiğiniz dosyaya çift tıklayarak açarsınız ya da Run'ın altındaki “Run Module”e tıklarsınız (ya da f5). Eğer çift tıklayarak dosyayı açtıysanız ismi yazdıktan hemen sonra ekranın kapandığını göreceksiniz. Aslında Python önce “Hoşgeldin isim” (artık isme ne yazdıysanız)'i yazdırıyor, ardından bir işlem olmadığı için kendisini sonlandırıyor. Bunu önlemek için en sona input() ekleyebilirsiniz. Hatta input(“Çıkmak için herhangi bir tuşa basınız”) gibi bir açıklama bile girebilirsiniz.

Öyle tahmin ediyorum ki buraya kadar gelmek yarım saatinizi almamıştır. Şimdi size basit bir hesap makinesi yazmaktan bir adım uzakta olduğunuzu söylesem nasıl hissedersiniz? Evet, Python'da her şey gerçekten bu kadar kolay.

if, elif ve else
Bir hesap makinesi yazacağız dedik, kullanıcıdan girdi almayı biliyoruz, o girdiyi işlemeyi biliyoruz. Peki programın girdiye göre davranmasını nasıl sağlayacağız? Cevap if, else ve elif'te. Hemen bir örnek ile açıklayım, önce yeni bir sayfa açalım ve şunları yazalım:

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

işlem = input()

a = int(input(“İlk sayıyı giriniz: “))
b = int(input(“İkinci sayıyı giriniz: “))

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)
else:
    print(“Geçersiz işlem”)

input(“Programı kapatmak için bir tuşa basınız”)

Burada if'e kadar her şeyi biliyorsunuz zaten. Sıra if'e geldiğinde Python if'ten sonra yazdığım şarta bakıyor, işlem “1”e eşit mi? Eğer eşit ise print(a + b) diyor ve sonraki şartlara bakmıyor. Yok eğer eşit değil print(a + b)'yi atlıyor ve sonraki şarta bakıyor, eğer işlem “2”ye eşit ise print(a – b) işlemini yapıyor. Bu şekilde 4'e kadar geliyor, eğer işlem 4'e de eşit değilse else'te tanımlı olan işlemi yapıyor, yani ekrana “Geçersiz işlem” yazdırıyor. Burada dikkat etmeniz gereken iki nokta var. Birincisi işlem şuna eşit mi derken “=” yerine “==” kullanmak. Bunun sebebi “=”in bir değeri başka bir değere eşitliyor olması, “==”in ise küçüktür ya da büyüktür gibi bir işlemci olması. İkincisi de bıraktığım boşluklar. İki noktadan sonra tanımladığınız işlemleri aynı sayıda boşluk bırakarak yazmak zorundasınız. Onu da şöyle bir örnek ile açıkayım:

a = input()
if a == “1”:
    print(“a 1'e eşitmiş”)
else:
    print(“a 1 değildi”)

    print(“Trololo”)

input(“Programı sonlandırmak için bir tuşa basınız”)

Burada eğer a'ya 1 değerini verirseniz “a 1'e eşitmiş” satırı bastırılacak. Yok eğer başka herhangi bir değer girerseniz de önce “a 1 değildi” yazacak daha sonra “Trololo” yazacak. Bir de şöyle bir şey deneyelim:

a = input()
if a == “1”:
    print(“a 1'e eşitmiş”)
else:
    print(“a 1 değildi”)
print(“Trololo”)

input(“Programı sonlandırmak için bir tuşa basınız”)

Bu durumda da a ne olursa olsun “Trololo”yu bastıracak. Yani print(“Trololo”) satırı if – else'in dışında olacak. Eğer if'in altına bir if daha yazmak isteseydim bir boşluk daha bırakmam gerekecekti. Bu durum her “:” yazdığınızda geçerli oluyor. Hemen bir örnek vereyim hatta:

a = int(input())

if 1 < a < 4:
    if a == 2:
        print(“a = 2”)
    elif a == 3:
        print(“a = 3”)
else:
    print(“a 1 ve 4 arasında değil”)

input(“Programı sonlandırmak için bir tuşa basınız”)



for döngüsü

for döngüsü Python'nun çok önemli bir öğesidir. Sanırım bunu bir örnekle açıklamak daha kolay olacaktır.

for eleman in "elemanlar listesi":
    print(elaman)

Bu komutu çalıştırırsanız şöyle bir çıktı alırsınız:
e
l
e
m
a
n
l
a
r

l
i
s
t
e
s
i

Burada for komutunu kullanarak  "elemanlar listesi" satırındaki öncelikle ilk harfe eleman ismini verdik, daha sonra print() komutu ile ekrana bastırdık, daha sonra ikinci harfe geçip ona elaman ismini verdik ve bastırdık. Bunu sonuna kadar yaptıktan sonra for döngüsü bitti ve Python koda kaldığı yerden devam etti. Aynı şeyi daha sonra anlatacağım listelerle de yapabilirsiniz, zaten for daha çok listelerle birlikte kullanılıyor. Özellikle birçok öğeye aynı işlemi yapmak isterseniz çok kullanışlı olabiliyor. Asıl faydasını oyun yaparken göreceksiniz. İsterseniz bir cümlede bir harfin kaç kere geçtiğini bulan bir program yazalım ki for döngüsü biraz daha iyi anlaşılsın.

cümle = "Örnek cümlemiz böyle bir şey olsun. Burada belli bir harften kaç tane olduğunu sayacağız."
print(cümle)

harf = input("Saymak istediğiniz harfi yazın: ")

sayaç = 0
for harfler in cümle:
    if harf == harfler:
        sayaç = sayaç + 1

print("Örnek cümlemizde", harf, "harfinden", sayaç, "tane var.")

Sanırım burada yaptıklarımız anlaşılıyor. Önce örnek cümlemizi bastırdık, sonra kullanıcıdan bir karakter girmesini istedik. Karakter sayısını tutması için sayaç diye bir değişken tanımlayıp sıfıra eşitledik. Daha sonra for'un içinde if ile harfler'e atanmış olan her bir harfin kullanıcıdan aldığımız karakter ile aynı olup olmadığını kontrol ettik. Aynı olduğu taktirde de sayacı 1 arttırdık, for döngüsü bitince de print() ile sayacı bastırdık, böylece kullanıcının girdiği karakterin cümle içinde kaç kere geçtiğini bulduk.

Evet arkadaşlar, şimdilik benden bu kadar. En yakın zamanda ikinci dersi de ekleyeceğim ve hatta o dersin sonunda metin tabanlı bir oyun yazabileceksiniz! Bir sonraki derse kadar metin tabanlı oyunlar hakkında bir fikir edinmek isterseniz Zork'u inceleyebilirsiniz. Haydi kendinize iyi bakın!

İlk Adımlar 2 (oyun yapımı)

Haydi Bir Oyun Yapak!

İtiraf edin, birçoğunuzun böyle bir hayali var ya da en azından vardı. Belki çocukken tek hayaliniz buydu, herkesin oyununuzu konuştuğunu hayal ederdiniz falan. Daha sonra ilk bilgisayarınız alındığında “oyun yapacağım uleyn!” gazı ile oturmuşsunuzdur başına ama daha sonra ne yapacağınızı bilemediniz ya da bunun çok zor olduğunuzu fark ettiniz. Şimdi içinizdeki o çocuk ölmediyse, o gazınız geçmediyse, hala o hevesiniz varsa size iyi iki haberim var: size nasıl bir oyun yapacağınızı anlatacağım ve bu iş sandığınız kadar zor değil. Bu yazıyı okuduktan sonra oyun yapımı konusunda az da olsa bir fikriniz olacaktır.

İşe Başlarken

“c++ öğrenip kırayzise rakip bir oyun yapacağım, var mısın?” diye bir gazla arkadaşlarınızı topladıysanız biraz hevesinizi kıracağım, bir iki ayda adam akıllı c++ öğrenmeniz çok zor ve Crisys gibi bir oyun yapmak için yaklaşık yüz kişilik bir şirkete, iki – üç yıla ve 15 – 20 milyon dolara ihtiyacınız var. Bütün bunlara sahip olsanız bile ilk projenizin bu kadar başarılı olması çok ama çok düşük bir ihtimal. Bunun yerine size çok daha gerçekçi bir hedef teklif ediyorum: Mario'ya rakip bir oyun yapın! Ya da Monkey Island'a.
“Off, ne var ki onda? Hem kim oynar öyle bir şey?” dediğinizi duyar gibi oldum. Her şeyden önce Mario çok çok iyi bir oyun. 1985'ten beri neredeyse aynı formulü uygulayarak piyasaya oyunları sürülüyor ve Modern Warfare 2'den çok satıyorsa o oyunda bir hayır vardır. Ayrıca son zamanlarda Mario gibi basit grafikli ve çok eğlenceli olan onlarca oyun var. O oyunları yazanların da sizden çok bir farkı yok. Örnek isterseniz Geometry Wars, VVVVVV, Braid, Super Meat Boy, Word of Goo... bu liste böyle uzar gider. Özellikle işe ilk başladığınızda hedefi gerçekçi tutmakta fayda var. Hem oyunlarda önemli olan grafik falan değil, önemli olan eğlence.
Yukarıda yazdıklarımı kabullendiyseniz size bir tavsiyem daha var, olaya c++ ile başlmayın. Tabi ki c++ bügün en yaygın kullanılan dil ve tabi ki bütün profesyonel oyun şirketleri bu dili kullanıyor. Ancak siz daha yolun başındasınız ve yapacağınız projeler için çok daha basit diller de var. Benim (ve tanıdığım birçok bilgisayar mühendisinin, oyun yapımcısının) tavsiyem Python. Python öğrenilmesi ve kullanılması en basit dillerden bir tanesi. Hem programlamanın mantığını çözmeniz, bu konuda tecrübe kazanmanız için ideal bir dil. C++'a göre tek eksisi hızı. Tabi sizin bu hız farkını değerlendirebilmeniz için programlama konusunda epey bir deneyimli olmanız lazım. Bir arkadaşımın dediği gibi, hızlı çalıştıracağız diye programı bitirememe riskine girmeye gerek yok.
Python'dan daha kolay bir şey varsa o da oyun yapımı için hazırlanan programlarla oyun yapmak. FPS Maker, Adventure Game Studio (AGS) gibi programları kullanabilirsiniz. Bir zamanlar AGS'ye azıcık ucundan bir bakmıştım ve çok başarılı bir program olduğunu söyleyebilirim, ileride onun için de ders hazırlayabilirim.
Şimdi ilk dersimize geçelim isterseniz...

İlk Adımlar (yazarlık)



Hoşgeldiniz arkadaşlar. Buraya uğradığınıza göre oyun dünyası ile yakından ilgilisinizdir. Hatta belki işi biraz abartıp profesyonel bir oyuncu, bir yazar ya da bir oyun yapımcısı olmak istiyorsunuz. Benim amacım size elimden geldiği kadar yardım etmektir. Sakın öyle çok şey bildiğimi sanmayın, sadece bu konularda okuduğum birçok yazı var ve biraz da tecrübeye sahibim. Şimdi siz de hazırsanız ve iyice gaza gelmişseniz gazınız tükenmeden kısa yoldan nasıl oyun dünyasına giriş yapabilirsiniz ondan bahsedelim.

Giriş

“Kısa yoldan oyun dünyasına giriş” dedim de sakın yanlış anlamayın, iki günde profesyonel yazar ya da oyun geliştiricisi olmayacaksınız. Sadece ne ile uğraştığınız konusunda bir fikir edineceksiniz. Bunu yaparken de belki yazarlığın veya oyun yapımcılığının size göre olmadığını keşfedersiniz, belki de hayatınızın amacının bu olduğuna karar verirsiniz. Dilerseniz ilk olarak yazarlıktan bahsetmek istiyorum.

Ulan Gece Gündüz Oyun Oynayarak Para Kazanoyorsunuz Haa!

Evet, sanırım oyun yazarlarının en sık duydukları cümlelerden bir tanesi bu olsa gerek. Birçok genç de sadece çok oyun oynadığı için oyun eleştirmenliğinin ona göre olduğunu düşünür. Tabi çok oyun oynamış olmak bu iş için gerekli bir kriter ancak birçoğunun atladığı kısım “yazı” kısmı.
İşte ilk tavsiye, profesyonel bir oyun yazarı olmak istiyorsanız dil bilgisi derslerini iyi dinleyin. Bundan daha önemli bir şey varsa o da bol bol kompozisyon yazmanız. Temel dil bilgisi kurallarını öğrenmeniz bir iki haftanızı alacaktır ancak akıcı, anlaşılır ve sade bir dille yazı yazmayı öğrenmek için bolca pratiğe ihtiyacınız var. Bu noktada eleştirilere de açık olmalısınız. Hatalarınızı görmezden gelirseniz kendinizi geliştiremezsiniz. Yazmanın yanı sıra bol bol okumayı da ihmal etmeyin. Okumaktan kastım sadece dergiler değil tabi, kitapların ve çeşitli makalelerin yazı yeteneğinizi (ve aslında daha da önemlisi kendinizi) geliştirirken size çok yardımı olacaktır. Ayrıca oyunlarda sık sık popüler eserlere göndermeler ve onlardan alıntılar yapılır. Bunları yakalamanız incelemelerinizi zenginleştirecek ve okunması daha zevkli hale getirecektir. Aynı şey filmler için de geçerli tabi.
Dil bilgisi kurallarının yanı sıra dikkat etmeniz gereken bir başka nokta yazının fanboyluktan uzak olması. Bu hem oyunun kötü hem de iyi yanlarını anlatırken geçerli. Kendimden örnek vereyim, şahsen God of War oyunlarını bir türlü sevemedim, sarmadı. İlk oyunu genel kültür olsun diye oynadım. İkincisinin başında da neredeyse uyuya kalıyordum. Bir tek Ghost of Sparta'yı oynarken zevk aldım diyebilirim. Bana sorarsanız oyunda adam akıllı bir senaryo falan da yok (ki en çok buna dikkat ederim oyunlarda) ama eğer bunları bir incelemeye yazarsam ve on üzerinden dört ya da beş gibi bir not verirsem bir ton küfür yemekle kalırım. Neredeyse bütün dünyanın beğendiği bir oyunu kötülemenin bir manası yok. Bunun gibi zevkinize hitab etmeyen oyunların kötü incelemelerini yazmaktansa hiç yazmayın daha iyi (mesela ben genel olarak spor oyunlarını da sevmiyorum ama bu onların kötü olduğunu göstermez).
Bunların yanı sıra incelenecek bir oyunun hakkını vermelisiniz. On dakika oynayarak bir oyun konusunda en fazla ufak bir fikir sahibi olursunuz. Oyunun bütün eksi ve artılarını görmek için hiç olmazsa bir kez bitirmeniz iyi olacaktır.
Bu konuda son bir şey söylemek istiyorum, mutlaka kurallara uymanız gerekmiyor tabi ki. İnsanlar aynı formatta yazılmış yazıları okumaktan bir süre sonra sıkılacaklardır ama unutmayın ki bir kuralı çiğneyecekseniz önce onu öğrenmelisiniz, ancak öğrendikten sonra onun gerekliliğini tartışabilirsiniz.

Ben Yazımı Yazdım Ki!

Tamam, yazınızı yazdınız, hatalarınızı düzelttiniz, arkadaşlarınıza okuttunuz ve onlar çok beğendi. Tabi ki inceleme yazısını sadece arkadaşlarınıza okutmak için yazmamışsınızdır. Eserinizi daha geniş kitlelere ulaştırmak için ne yapmalısınız? Tabi ki internete koymalısınız! Asıl soru nereye. Bu konudaki tavsiyem paylaşım forumlarına koymamanız. Paylaşım forumlarının size kazandıracağı tek şey “emeğine sağlık aga” gibi “teşekkür” mesajları ve +rep olacaktır. Oysa siz bir profesyonel yazar olmak istiyorsunuz. Bunun için daha ciddi bir şeyler yapmalısınız. İşe bir blog açarak başlayabilirsiniz. Google'a “bedava blog” yazmanız yeterli olacaktır. Karşınıza birçok bedava blog sitesi çıkacaktır.
İkinci seçenek bir oyun sitesi kurmak ya da varolan bir siteye yazı göndermek. Tabi TRGamer ya da Merlinin Kazanı gibi siteler başvurunuzu kabul etmeyebilir, onların zaten güzel kadroları var. Bunun yerine biraz daha mütevazi olun ve başka siteler bulmaya çalışın. Hiç olmadı ufak bir araştırma ve bir haftalık çalışma ile kendi sitenizi açabilirsiniz.
Üçüncü seçenek de benim şahsi tercihim incelemeleri Oyungezer'in sitesine yollamak. Hem yukarıda anlattıklarımdan daha kolay olacaktır, hem de bu sayede çok daha geniş kitlelere ulaşabilirsiniz. Benim yaptığım da buydu, kısa bir süre sonra birkaç yerden (tabi hepsi amatör sitelerdi) teklif geldi (ulan reklam gibi oldu ya, kendimi o saçma ekzersiz aletlerin reklamlarında oynuyormuş gibi hissettim :P).

Son Olarak

Evet, benim tecrübelerim bu noktada bitiyor sanırım. Gördüğünüz gibi yazarlık yapmak o kadar da kolay bir iş değil. Hem ciddi bir yerde çalışacak olursanız yazılarınızı yetiştirmeniz gereken bir tarih, belki de karakter sınırı olacaktır. Ha bir de söylemeyi unuttum, oyun dünyasının her işinde olduğu gibi yazarlıkta da başarılı olmak istiyorsanız bunu sevgi ile yapmalısınız. Bir sonraki yazıya kadar kendinize iyi bakın.