Python Ejderhalar bölgesi

Transkript

Python Ejderhalar bölgesi
Python Ejderhalar bölgesi
Amaç : Fonksiyonların kullanımı ve anlaşılması
●
●
●
●
Büyük bir kod içerisinde bir çok yerde kullanılmak amacıyla yaratılan küçük programlardır.
Kodumuzu fonksiyonlar üzerine oturursak her seferinde kodun tamamını kontrol etmek yerine ilgili
fonksiyonları kontrol etmemiz yeterli olur.
Aslında farkında olmadan bu kullanıcı dostu küçük programları kullandık bile.
Input ( ), print( ) gibi fonksiyonlar önceki pogramlarda kullanıldı. hatta okadar kolaylardıki yazarken
sıkılmıştık bile!
Şimdi Ejderler bölgesi oyununu yapmak üzere oyun yapımına yoğunlaşalım.
Ejderhalar bölgesi ne la! Fantastik dünyada yermi kalmadı?
●
●
Bir adamız var adada ejderhalar var
Hobbit hikayesinden bildiğimiz gibi ejderhalar paraya mala mülke çook düşkünmüş. Iki
çeeşit ejderha var birisi hazinesini bizimle paylaşırken, diğeri hem paylaşımcı değil hemde
kapısına gelen oyuncuyu yiyormuş..
●
Oyuncu içinde ejderhalar olan 2 mağradan birini seçecekti.
●
Duruma göre ya ejderhaya yem olacak yada ejderhanın hazinesinden birşeyler alablecektir.
●
Oyun şimdilik kitapta olduğu gibi inceleyelim...
Python Ejderhalar bölgesi
Ekran görüntüsü aşağıdaki gibi olacak bir kod yazacağız
Ejderhalarla dolu bir adadasın. Hemen önünde
iki mağra var. Birindeki ejderha dostcanlısı ve
seninle hazinesini paylaşacak. Gel gör ki diğeri öyle değil!
Diğer ejderha aç gözlü bencil ve aç bu yüzden seni yiyecek!
Hangi mağraya gireceksin? (1 veya 2)
1
Mağraya yaklaşıyorsun...
İçerisi karanlık ve ürkütücü...
Büyük kocaman bir ejderha hemen önüne atlıyor! Çenesini açıyor veee...
Tek ısırıkta seni yiyip bitiriyor!
Ne yapalım geçmiş olsun hacıı
O değil de...
Tekrar oynamak istermisin? (Evet yada Hayır)
Python Ejderhalar bölgesi
import random
import time
def girisEkrani():
print('Ejderhalarla dolu bir adadasın. Hemen önünde ')
print('iki mağra var. Birindeki ejderha dostcanlısı ve ')
print('seninle hazinesini paylaşacak. Gel gör ki diğeri öyle değil! ')
print('Diğer ejderha aç gözlü bencil ve aç bu yüzden seni yiyecek!')
print()
def secilenMagra():
magra = ''
while magra != '1' and magra != '2':
print('Hangi mağra ya gireceksin? (1 veya 2)')
magra = input()
return magra
def magraKontrol(secilenMagra):
print('Mağraya yaklaşıyorsun...')
time.sleep(2)
print('İçerisi karanlık ve ürkütücü...')
time.sleep(2)
print('Büyük kocaman bir ejderha hemen önüne atlıyor! Çenesini açıyor veee...')
print()
time.sleep(2)
dostMagra = random.randint(1, 2)
if secilenMagra == str(dostMagra):
print('Hazinesini sana veriyor!')
else:
print('Tek ısırıkta seni yiyip bitiriyor! ')
time.sleep(2)
print('Ne yapalım geçmiş olsun hacıı ')
#Bütün olay burada aslinda bundan sonrasını silerseniz yukarıdakeler çalışmaz
tekrarOyna = 'Evet'
while tekrarOyna == 'Evet' or tekrarOyna == 'E' or tekrarOyna == 'evet' or tekrarOyna == 'e':
girisEkrani()
magraNumarasi = secilenMagra()
magraKontrol(magraNumarasi)
print('')
print('O değil de...')
print('Tekrar oynamak istermisin? (Evet yada Hayır)')
tekrarOyna = input()
Python Ejderhalar bölgesi
Fonksiyon tanımlama
●
●
●
●
●
Şimdi istediğimiz zaman çağırmak üzere bir girişEkranı fonksiyonu
diye tanımlayalım.
Unutmayalım ki biz bu fonksiyonu sonradan çağırmak üzere
tanımladık. define(def).
Dikkat edileek olursa bizim tanımladığımız giriş ekranı herhangi bir
paremetre almıyor.
Çağrıldığı vakit içindeki Print fonksiyonlarınıekrena yazıyor o kadar.
Print fonksiyonu ise içine yazılan söz dizisini değişken olarak alıyor
ama şimdilik bunu kafamıza takmayalım.
def girisEkrani():
print('Ejderhalarla dolu bir adadasın. Hemen önünde ')
print('iki mağra var. Birindeki ejderha dostcanlısı ve ')
print('seninle hazinesini paylaşacak. Gel gör ki diğeri öyle değil! ')
print('Diğer ejderha aç gözlü bencil ve aç bu yüzden seni yiyecek!')
print()
Python Ejderhalar bölgesi
●
Buradaki fonksiyonumuz ise oyuncuya mağra seçimi yaptıracak!
●
Magra değişkeni tanımlanmış...
●
Dikkat edilecek olursa dışarıdan bir değişkeni yok bu fonksiyonun ama
●
Kendi programı sonucunda çevirdiği değer magra değişkenin değeri!
●
Bunun dışında, Oluşturulan fonksiyonun içinde bir while döngüsü görüyoruz. Bunun amacı
yanlış değişken girildiğine soruyu ve fonksiyonu tekrarlamasını sağlamaktır.
def secilenMagra():
magra = ''
while magra != '1' and magra != '2':
print('Hangi mağra ya gireceksin? (1 veya 2)')
magra = input()
return magra
Python Ejderhalar bölgesi
O değilde yeri gelmişken Boolean cebrine
bir bakalım
●
●
●
Kullanımları aynen yanda gösterildiği
gibidir.
Büyük küçük harf ayrımına duyarlıdır.
Not ifadesi soTrue ifadesşnden sonra
gelirse bir şey ifade etmez.
Dikkatimi çeken noktalar..
●
●
●
not(not True or not True) girdisinin
yanıtı False dur.
Dikkat edilecek olursa işlemciler
küçük harflidir. (not, or, and )gibi
Işlemciler bir parentez ile çalışabilir.
Python Ejderhalar bölgesi
Return değerleri
Kitaba göre az önce yeterince return değerlerini incelememişiz bakalımdaha neler var :)
return ifadesinin kullanımını açıklamak için bildiğiiz fonksiyonlara bakalım.
Hatırlarsak input() fonksiyonu kullanıcının girdiği string değeri saklıyordu. Benzer şekilde .randint fonksiyonu rastgele bir integer
(1,2,3,4....) çeviriyordu!
Bizim fonksiyonumuz içinse cevrilecek olan magra değişkenine yazılan string ifadedir!!!!! Biz 1veya 2 yazılsın istiyoruz.
Return için diğer hatırda kalması gereken nokta ise bir fonksiyonda rturn değeri döndükten sonra programın fonksiyondan
çıktığıdır. Öyle kafanıza göre return koymayın!!
def secilenMagra():
magra = ' '
while magra != '1' and magra != '2':
print('Hangi mağra ya gireceksin? (1 veya 2)')
magra = input()
return magra
Python Ejderhalar bölgesi
Evrensel ve Yerel çalışma alanları
●
●
Global Scope: Python kodunuzda Fonksiyonların dışındaki çalışma alanı olarak tanımlamamk
mümkün . Burada tanımlanan değişkenler golobal değişkenlerdir. Python kodunuzda sadece 1 tane
evrensel çalışma alanınız vardır.
Local Scope: Fonksiyonlar içindeki kısım yerel çalışma alanlarınızdır. Burada tanımlanan
değişkenler bu yerel bölgede tanımlıdırlar global de aynı değişken tanımlı değildir.
# This block doesn't run until funky() is called:
def funky():
# We create a local variable named "spam"
# instead of changing the value of the global
# variable "spam":
spam = 99
print(spam)
# 99
# A global variable named "spam":
spam = 42
print(spam) # 42
# Call the funky() function:
Funky()
print(spam)
Python Ejderhalar bölgesi
Fonksiyonlara devam: Önceki bölümlerde fonksiyonları çevirdiği değerleri incelemeiştik fonksiyon içinde tanımlanan değişkenlerin foksiyon çağrıldığında
çalıştığını da evrensel ve yerel çalışma alanları bölümünde gördük! Şimdi sıra deışarıdan değer alabilen fonksiyonlarda...
●
Bu bölümde oluşturacağımız fonksiyon değişkenleri girdi olarak alacak tıpkı str(5) veya random.randint(1,20) öntanımlı fonksiyonlarında olduğu gibi
●
Yazılan kodda magraKontrol fonksiyonu secilenMagra değişkenini alımasını ve sonrasında “ if ” değerlendirmesi içinde kullanmasını istiyoruz.
●
Burada dikkat edilmesi gereken diğer bir husus secilenMagra fonksiyonu ile bu fonksiyon içinde tanımlanan secilenMagra arasında bir ilişkinin henüz
olmamasıdır.
●
MagraKontrol fonksiyonu içindeki secilenMağra değişkeni fonksiyon dışında tanımsızdır.
●
Ancak iki ifade için söylenebilecek tek net şeyin ikisininde string döndürdüğüdür.
def magraKontrol(secilenMagra):
print('Mağraya yaklaşıyorsun...')
time.sleep(2)
print('İçerisi karanlık ve ürkütücü...')
time.sleep(2)
print('Büyük kocaman bir ejderha hemen önüne atlıyor! Çenesini açıyor veee...')
print()
time.sleep(2)
dostMagra = random.randint(1, 2)
if secilenMagra == str(dostMagra):
print('Hazinesini sana veriyor!')
else:
print('Tek ısırıkta seni yiyip bitiriyor! ')
time.sleep(2)
print('Ne yapalım geçmiş olsun hacıı ')
Python Ejderhalar bölgesi
#Bütün olay burada. bundan sonrasını silerseniz yukarıdakeler çalışmaz
tekrarOyna = 'Evet'
while tekrarOyna == 'Evet' or tekrarOyna == 'E' or tekrarOyna == 'evet' or
tekrarOyna == 'e':
girisEkrani()
magraNumarasi = secilenMagra()
magraKontrol(magraNumarasi)
print('')
print('O değil de...')
print('Tekrar oynamak istermisin? (Evet yada Hayır)')
tekrarOyna = input()
Python Hata Ayıklama
Wikipedia nın dediğine göre “bug”ve “Debugging” teriminin
doğuşu çoğunlukla Amiral Grace Hopper'a atıf edilirmiş.
Anlatılana göre Hopper 1940 larda Harvard Üniversite sinde Mark
II adlı bilgisayarla çalışırken, Çalışma arkadaşlarından birisi
bilgisayar içinde programın çalışmasını engelleyen güve bulur.
Bu olayın ardından Hopper yaptıkları işin
böcektemizleme(debugging)olduğunu söyler.
O dönemden bu güne bilgisayar programlarını sekteğe
uğratan, engelleyen hatalara bug, bunlardan kurtulma işlemine
debugging denirmiş.:)
Bu yandaki de o ünlü güve!
Hata tipleri : Programın çalışmasını engelleyen hatalar belirli
gruplara ayrılırlar. Bunlar aşağıdaki şekilde gruplanırlar.
●
Syntax errors: Program yazarken yazım hatalarına verilen
genel addır.Python eğer kodda böyle bir hata varsa zaten
çalışmaz.
●
Runtime Errors: Program yazıldıktan sonra execute
edilirken(çalışırken) hatalı satıra kadar normal ilerler ancak
hatalı satırda çatlar, patlar crash olur. Sonrasında hatanın
gerçekliştiği satır bilgisiyle hatayı verir.
●
Semantic Errors: Bunlar kodun yazımı yada kodun
çalışmasıyla alakalı hatalar değildir. Gerçete kod amacına
uygun çalışmadığı zaman oluşan durumdaki
hatlardır.Basitçe a,b,c değişkenlerinin toplamını çıkaran bir
kod yazmak istiyorsunuz ancak kodu yazarken topğlama
işaretinin birisini yalışlıkla çarpma yazdınız bu durumuda
yanlış sonucu vererk program çalışacaktır.
Python Hata Ayıklama
Program içindeki hataları bulmak bazen çok zorlayıcı olabilir. Hatta kod içindeki hataların
hepsini farketmiş olsanız bile.
Bazı durumlarda kod çalışırken daha önce tanımlanmış ve bir çok yerde çağrılması
gerekirken çağrılmadıklarını fark edebiliriz. Bu tur durumlarda Kod içinde sonsuz
döngülerin olabileceği fikrini akılda tutmak işlevsel olabilir.
Böyle bir durumda eğer terminalde isesniz Ctrl + C ile kodun çalışmasını yarıda
kesebilirsiniz.
Python Hata Ayıklama
İdle'da hata ayıklayıcı kullanmak
●
Python idle kullanmanın avantajlı yanlarından birisi içinde ki debuggerı kullanmaktır.
●
Bu debugger a ulaşmak için Python shell den Debug ve debugger seçeneğini aktif hale getirmek gerekir.
●
Sonrasında hatalarını bulmak istediğimiz dosyayı açmaız gerekir. Burada deneme için dragon.py uzantılı python
metnini kullanacağız.
●
Zaten python terminalinde debugger açıldı gibi ileti olacaktır.
●
Bu durumdayken debugger istediğimiz şekilde kodu ileri alacaktır
●
Istersek adım adım, istersek tek seferde çalıştırabilriiz.
Python Hata Ayıklama
●
Stepping out hızlıca fonksiyonları geçebileceğimiz bir metotdur.
●
Debuggerdaki Out butonu kullanılır.
●
Eger ki herhangi bir fonksiyon içinde değilseniz, Evrensel çalışma
alanındasınız demektir. Buda komple kodu çalıştıracağı manasına gelir.
Go butonu gibi...
●
Go - Executes the rest of the code as normal, or until it reaches a break point.
●
Step - Step one line of code. If the line is a function call, the debugger will step into the function.
●
Over - Step one line of code. If the line is a function call, the debugger will not step into the function,
but instead step over the call.
●
Out - Keeps stepping over lines of code until the debugger leaves the function it was in
●
when Out was clicked. This steps out of the function.
●
Quit - Immediately terminates the program.
Python Hata Ayıklama
Break Point
Python da kullandığımız Idle da kodun şüphelendiğimiz satırına odaklanmak için sağ tıkladıktan
sonra set breakpoint sekmesine basıp kodun o kızımını test edebiliyoruz .
Sonrsında Clear breakpoint sekmesini işaretleyip ilgili satırdaki “odaklanmayı” kaldırabilirz.
Bu debugger kullanırken işlevsel olabilir.