## 13. Beni dinle yoksa ... else ...

Programlamayı öğrenmek eğlenceli olabilir, ancak tüm zamanınızı bilgisayarın karşısında harcamayın. Eğer yağmur yağıyorsa çalışmaya devam edin, yağmıyorsa dışarıya çıkın ve oynayın. (Evet, büyükbaba sende!)

### Seçimleri yapmak

If ile başlayan cümle ile biraz eğlenelim.

If yağmur yağarsa,
... çalışmaya devam et,
değilse,
... dışarı çık ve oyna!

Bu küçük bir bilgisayar programı gibi gözükmeye başladı. Şimdi onu bir Python programı gibi yazalım.

    if it_rains():
        keep_reading()
    else:
        go_outside_and_play()

Yeni bir Python komutu öğrendiniz, else. Eğer yağmur yağıyorsa, okumaya devam edin, yağmıyorsa ne yapacağınızı biliyorsunuz.

### Reeborg görüyor

Reeborg biplerin yanında olduğunu anlamasının yanı sıra, önünde yolunu kapatan bir duvar olup olmadığını da görebilir. Kafasını sağa yada sola çevirip orada bir duvar olup olmadığını da görebilir. Aşağıdaki şartları kullanarak bunları test edebilirsiniz.

    front_is_clear()  # True eğer duvar yoksa, False eğer duvar varsa
    left_is_clear()   # True eğer solunda duvar yoksa, False eğer solunda duvar varsa
    right_is_clear()  # True eğer sağında duvar yoksa, False eğer sağında duvar varsa

İlkini Reeborg'un dünyasını keşfetmek için kullanalım. Reeborg eğer önünde engel yoksa bir adım ileriye gidecek, varsa sola dönecek. Aşağıdaki program ile bunu yaptırabiliriz:

    if front_is_clear():
        move()
    else:
        turn_left()

    turn_off()

Aşağıdaki resimlerde programın iki farklı durumda çalıştırılmış halini görüyorsunuz. Eğer bu programı denerseniz else komutundan sonraki : 'yı unutmayın!.

Şimdi bu programı 20 kez üst üste tekrarlatalım:

    def move_or_turn():
        if front_is_clear():
            move()
        else:
            turn_left()

    repeat(move_or_turn, 20)
    turn_off()

Aşağıdaki küçük dünyada bu programın uygulanmış halini görüyorsunuz.

Bu programı daha ilginç bir hale getirebiliriz. Reeborg eğer önünde engel yoksa dans edecek (4 kez sola dönerek) sonra bir adım ileriye gidecek, varsa sola dönecek ve bir bip bırakacak Aşağıdaki program ile bunu yaptırabiliriz:

    def dance():
        repeat(turn_left, 4)
    def move_or_turn():
        if front_is_clear():
            dance()
            move()
        else:
            turn_left()
            put_beeper()

    repeat(move_or_turn, 18)
    turn_off()

Reeborg'un bu görevi yerine getirmek için yeterli sayıda bip'i olduğundan emin olun. Reeborg'a yeterli sayıda bip vermek için butonunu kullanabilirsiniz.

`dance()` ve `move()`komutlarının ait oldukları if 'den sonra aynı düzeyde içe girik yazıldıklarına dikkat edin, bu şekildeki yazım onların aynı bloğa ait olduğunu gösterir. Benzer şekilde`turn_left()` ve `put_beeper()` komutları da ait oldukları else den sonra içe girik yazılmışlardır. Program çalıştırıldığında ne olduğunu aşağıdaki şekilden görebilirsiniz.

Peki aşağıda olduğu gibi, `put_beeper()` komutunu `turn_left()`komutu ile hizalamak yerine else ile hizalarsak ne olur.

    def dance():
        repeat(turn_left, 4)
    def move_or_turn():
        if front_is_clear():
            dance()
            move()
        else:
            turn_left()
        put_beeper()

    repeat(move_or_turn, 18)
    turn_off()

Bu durumda `move_or_turn()` tanımlaması önce if/else deki durumlardan birini yerine getirecek yani dans edip bir adım atacak veya sola dönecek sonrada bir şarta bağlı olmayan `put_beeper()`komutunu yerine getirecektir. Dolayısıyla `put_beeper()`komutu `move_or_turn()`her çalıştırıldığında bir şarta bağlı olmaksızın yerine getirilecektir. Program bu hali ile çalıştırıldığında ne olduğunu aşağıdaki şekilden görebilirsiniz.

Şekilden de gördüğünüz gibi her adım atıldıktan sonra bir bip bırakılmıştır. Köşelerde ise iki tane bip vardır. İlki dans edip adım attıktan sonra, ikincisi sola döndükten sonra koyulmuştur, yani `put_beeper()`komutu `move_or_turn()`her çalıştırıldığında bir şarta bağlı olmaksızın yerine getirilmiştir.

Şimdi `put_beeper()`'ı aşağıdaki gibi en başa hizalayalım:

    def dance():
        repeat(turn_left, 4)
    def move_or_turn():
        if front_is_clear():
            dance()
            move()
        else:
            turn_left()
    put_beeper()

    repeat(move_or_turn, 18)
    turn_off()

Yani artık move_or_turn() tanımlamasına ait olmasın. Bu haliyle `put_beeper()` ilk yerine getirilecek komut olur, daha sonra move_or_turn()18 kez tekrarlanır. Sonuç aşağıdaki gibi olur:

İçe girik yazma ile Reeborg'a pek çok bilgi verilebiliyor, boşluklar işe yarıyor. Python'un bu özelliğinden dolayı yazılan programlar kolay okunur olur ve programlar daha kolay anlaşılır.

### Engel atlama

Reeborg engel atlamada oldukça iyi bir duruma geldi. Artık uzun ve kısa mesafeli yarışlara katılıyor. Bir bip'e ulaştığında yarışı tamamladığını biliyor. Aşağıda iki yarış pistini görüyorsunuz, dünya dosyaları hurdles1.wld ve hurdles2.wld.

Yarışların 20 birimden daha uzun olmadığını varsayarak aşağıdaki gibi bir tanımlama yapın:

    def move_jump_or_finish():
        if next_to_a_beeper(): # yarışın sonu
            turn_off()
        else:
            if front_is_clear(): # engel yok, yarış devam ediyor
                move()
            else:
                jump_one_hurdle()

uygun bir `jump_one_hurdle()` tanımlamasıyla Reeborg'a yalnızca aşağıdaki komutu vererek yarışı tamamlamasını sağlayabilirsiniz.
`repeat(move_jump_or_finish, 20)`.

İlave testler eklendikçe kodun daha da içeriye girerek yazıldığına dikkat edin.

Reeborg kendi kendine karar verebilseydi ... - - If, else, if, else, ....