Arcade Türü Oyun Programlamayı
ve Bilgisayar Bilimleri ÖğreninChapter 4: Rastgele Sayılar ve Döngülerle Tahmin Oyunları
Grafiksel arayüzlerle çalışmaya başlamadan önceki son aşamamız döngülerle nasıl çalışacağımızı öğrenmek. Birçok oyun "döner." Aynı kodu tekrar tekrar çalıştırırlar. Örneğin, alttaki sayı tahmin oyunu kullanıcının yaptığı her tahmin için tekrar döner:
Hi! I'm thinking of a random number between 1 and 100. --- Attempt 1 Guess what number I am thinking of: 50 Too high. --- Attempt 2 Guess what number I am thinking of: 25 Too high. --- Attempt 3 Guess what number I am thinking of: 17 Too high. --- Attempt 4 Guess what number I am thinking of: 9 Too low. --- Attempt 5 Guess what number I am thinking of: 14 Too high. --- Attempt 6 Guess what number I am thinking of: 12 Too high. --- Attempt 7 Guess what number I am thinking of: 10 Too low. Aw, you ran out of tries. The number was 11.
Bekleyin, döngüler grafiklerle ve video oyunlarıyla birlikte ne yapmak zorunda? Oyunun gösterdiği her frame(çerçeve) döngünün bir seferini temsil eder. Birçok oyunun gösterdiği saniyedeki-çerçeve-sayısı (frame-per-second) istatistiğine aşina olabilirsiniz. FPS, bilgisayarın her saniyede ekranı kaç kez yenilediğini temsil eder. (FPS oranı 60'tan yüksek olanlar çoğu ekranın güncelleme hızından yüksek olacağı için FPS'yi bu sayının üzerine çıkarmak anlamsızdır.)
Bu oyunlardaki döngü Şekil 4.2'de görülene benzer şekilde çalışır. Bu döngünün içerisindekiler Bölüm 1'de yaptığımız hesap makinesine benzerdir.
Döngüler başka döngülerin içinde bile olabilir. Şekil 4.2'deki "Draw Everything" kutusuna bir göz atın. Kutu, Şekil 4.3'de görülene benzer şekilde içerisinde bir döngüye sahiptir.
Python'da döngüler iki ana türden oluşur: for döngüleri ve while döngüleri Program kodun bir bölümünü belirli sayıda tekrar etmesini isterse for döngüsünü kullanır. Diğer bütün döngüler while döngüsü ile kurulur.
Örneğin, bütün öğrencilerin kayıtlarını yazdıracak bir döngü bilgisayar kaç tane öğrenci olduğunu bildiği için for döngüsüyle kurulur. Kullanıcının mause tuşuna basıp basmadığını bekleyen ve kontrol eden bir döngü ise, bilgisayar kullanıcının bir şey yapacağını ne kadar süre bekleyeceğini bilmediği için while döngüsüyle kurulur.
4.1 "For" döngüleri
Alttaki kod for döngüsünü kullanarak ifadeyi beş kez yazdırıyor.
Bu kodun if yapısına benzerliklerine dikkat edin. İkisi de girinti ve iki nokta kullanıyor.
for i in range(5): print ("Sınıfta sakız çiğnemeyeceğim.") |
Çıktı:
Sınıfta sakız çiğnemeyeceğim. Sınıfta sakız çiğnemeyeceğim. Sınıfta sakız çiğnemeyeceğim. Sınıfta sakız çiğnemeyeceğim. Sınıfta sakız çiğnemeyeceğim. |
1. satırda yer alan i bir değişkendir. Bu değişken, geçerli herhangi bir değişken ismiyle isimlendirilebilen yeni bir değişkendir. Programcılar genelde isim olarak i'yi kullanırlar. Sebebi ise i'nin increment (artış) kelimesinin kısaltılmasından dolayıdır. Bu değişken döngünün bittiğini anlamaya yardımcı olur.
range fonksiyonu döngünün içerisindeki kodun kaç kez çalıştırılacağını kontrol eder. Bu durumda, 5 kez.
Sıradaki kod beş kez "Please" ve bir kez "Can I go to the mall?" yazacak. "Can I go to the mall?" girintilenmediği için for döngüsünün bir parçası değil ve for döngüsü tamamlanana kadar yazdırılmayacak.
for i in range(5): print ("Please,") print ("Can I go to the mall?") |
Output:
Please, Please, Please, Please, Please, Can I go to the mall? |
Bu kod önceki örnekteki kodu alıyor ve 3. satırı girintiliyor. Bu değişiklik, programın 5 kez "Please," ve "Can I go to the mall?" yazdırmasını sağlıyor. Artık "Can I go to the mall?" ifadesi girintilendiği için for döngüsünün bir parçası haline geliyor ve tıpkı "Please," gibi 5 kez tekrarlanıyor.
for i in range(5): print ("Please,") print ("Can I go to the mall?") |
Çıktı:
Please, Can I go to the mall? Please, Can I go to the mall? Please, Can I go to the mall? Please, Can I go to the mall? Please, Can I go to the mall? |
range fonksiyonu bir sayı kümesi döndürür. Yukarıdaki örnekte, range(10) kodu 10 adet sayı döndürür. İlk sayı sıfır, son sayı 9'dur. Alttaki kod 0'dan 9'a kadar olan sayıları yazdıracaktır. Döngünün 0'dan başladığına ve 10'u içermediğine dikkat edin. range(10)'un 10 sayısını içereceğini düşünmek doğaldır, fakat ona azıcık kala biter.
for i in range(10): print (i) |
Çıktı:
0 1 2 3 4 5 6 7 8 9 |
i değişkeninin farklı bir isimle de isimlendirilebileceğine dikkat edin. Örneğin, programcı bir metin dosyasını işliyorsa lineNumber olarak da isimlendirebilir.
Programcı aslında 1'den 10'a gitmek istiyorsa, bunu yapmanın iki yolu vardır. İlk yol range fonksiyonuna iki sayı göndermektir. Bu sayılardan birisi başlangıç içindir. İkinci sayıda programcı sadece 10'u 11'e arttırır.
for döngüsünün ilk sayıyı içerecek ve ikinci sayıyı içermeyecek şekilde çalışma şekline alışmak biraz pratik gerektirir.
for i in range(1,11): print (i) |
Çıktı:
1 2 3 4 5 6 7 8 9 10 |
Alttaki kod hala i değişkeninin 0'dan 9'a kadar değerlerine sahip. Fakat programcı ekrana yazdırmadan hemen önce ona bir ekliyor.
# Print the numbers 1 to 10. for i in range(10): print (i+1)
4.1.1 Birden fazla aralıkla saymak
Program 2 veya daha farklı bir artışla saymak isterse, bu kolaydır. Bunu yapmanın iki yolu vardır. En kolay yolu range fonksiyonunu üçüncü bir parametreyle çalıştırmak ve ona 2'şer 2'şer saymasını söylemektir. İkinci yol ise 1'er 1'er saymaya devam etmek ama değişkeni 2 ile çarpmaktır.
# 2'den 10'a kadar çift sayıları yazdırmanın iki yolu for i in range(2,12,2): print (i) for i in range(5): print ((i+1)*2) |
Çıktı:
2 4 6 8 10 2 4 6 8 10 |
Sıfıra doğru azaltarak geriye saydırmak da mümkündür.
for i in range(10,0,-1): print(i) |
Çıktı:
10 9 8 7 6 5 4 3 2 1 |
Programın ihtiyacı olan sayılar kolay bir kalıpla şekillendirilip yenilenemiyorsa, sayıları bir listeye koyup ordan çekmek de mümkündür:
for i in [2,6,4,2,4,6,7,4]: print(i)
Bunun yazdırdığı şey:
2 6 4 2 4 6 7 4
4.1.2 İç içe döngüler
Alttaki kodun ne yazdıracağını tahmin etmeye çalışın. Daha sonra kodu yazıp doğru olup olmadığınızı kontrol edin.
# Bu ne yazdırır? Neden? for i in range(3): print("a") for j in range(3): print("b")
Yeni kod bloğu bir öncekiyle neredeyse aynıdır. İkinci for döngüsü artık ilk for döngüsü ile iç içe (nested) olduğu için bir sekme girintilenmiştir. Bu kodun çalışmasını önemli ölçüde değiştirir. Deneyin ve görün.
# Bu ne yazdırır? Neden? for i in range(3): print("a") for j in range(3): print("b") print("Bitti")
Bu video önceki kod örneğinde ne olduğunu canlandırıyor:
4.1.3 O anki toplamı tutmak
Döngülerle yapılan en yaygın işlerden biri o anki toplamı tutmaktır. Alttaki kod kullanıcının girdiği tüm sayıları toplayacaktır:
total = 0 for i in range(5): newNumber = int (input( "Bir sayı girin: " )) total += newNumber print("Toplamın değeri: ", total)
1. satırın total isimli değişkeni oluşturduğuna ve ona başlangıç miktarı olarak sıfır verdiğine dikkat edin. Bunu unutmak kolaydır. Ayrıca 4. satırda kullanıcının girdiğinin toplam değere eklendiğine de dikkat edin. i'nin bu eşitlikte kullanılması çok sık yapılan bir hatadır.
Alttaki kod 1'den 100'e kadar olan bütün sayıları toplar. Bu kod, o ana kadar olan toplamın döngünün içerisinde tutulduğu oldukça yaygın bir örneği göstermektedir. Ayrıca, toplamı takip etmek için ayrı bir değişken kullanmaktadır.
# Toplamın değeri nedir? sum = 0 for i in range(1, 101): sum = sum + i print(sum)
Bu kod kullanıcının kaç kez 0 sayısını girdiğini sayacaktır.
total = 0 for i in range(5): newNumber = int(input( "Bir sayı giriniz: " )) if newNumber == 0: total += 1 print("Toplam", total, "kez sıfır girdiniz")
İç içe for döngülerini anlayan ve toplamı tutmayı anlayan bir programcı alttaki kodun çıktısını tahmin edebilmelidir.
# a'nın değeri nedir? a=0 for i in range(10): a=a+1 print(a) # a'nın değeri nedir? a=0 for i in range(10): a=a+1 for j in range(10): a=a+1 print(a) # a'nın değeri nedir? a=0 for i in range(10): a=a+1 for j in range(10): a=a+1 print(a)
4.2 For döngüsü örnekleri
# Sample Python/Pygame Programs # Simpson College Computer Science # http://programarcadegames.com/ # http://simpson.edu/computer-science/ # Print 'Hi' 10 times for i in range(10): print("Hi") # Print 'Hello' 5 times and 'There' once for i in range(5): print("Hello") print("There") # Print 'Hello' 'There' 5 times for i in range(5): print("Hello") print("There") # Print the numbers 0 to 9 for i in range(10): print(i) # Two ways to print the numbers 1 to 10 for i in range(1, 11): print(i) for i in range(10): print(i + 1) # Two ways to print the even numbers 2 to 10 for i in range(2, 12, 2): print(i) for i in range(5): print((i + 1) * 2) # Count down from 10 down to 1 (not zero) for i in range(10, 0, -1): print(i) # Print numbers out of a list for i in [2, 6, 4, 2, 4, 6, 7, 4]: print(i) # What does this print? Why? for i in range(3): print("a") for j in range(3): print("b") # What is the value of a? a = 0 for i in range(10): a = a + 1 print(a) # What is the value of a? a = 0 for i in range(10): a = a + 1 for j in range(10): a = a + 1 print(a) # What is the value of a? a = 0 for i in range(10): a = a + 1 for j in range(10): a = a + 1 print(a) # What is the value of sum? sum = 0 for i in range(1, 101): sum = sum + i
4.3 While döngüleri
for döngüleri, program bir kod bloğunun kesin bir sayıda çalışmasına ihtiyaç duyduğunda ya da bir listedeki değerlerin işlenmesi gerektiğinde kullanılır.
Bir while döngüsü for döngüsünün kullanıldığı her yerde kullanılabilir. Ayrıca, özel bir koşul sağlanana kadar döngünün çalışması gerekiyorsa da kullanılabilir. Örneğin, farenin ne yaptığını "kapat" butonuna basana kadar kontrol etmek için while döngüsü kullanılır.
for döngüsü şunun gibidir:
for i in range(10): print (i)...bir while döngüsü ile şuna benzer şekilde yapılabilir:
i=0 while i < 10: print(i) i = i + 1
Kod üzerinden de görülebileceği üzere, for döngüsü while döngüsünden daha yoğun ve okunması daha kolaydır. Diğer yandan, programlar her şeyi bir while döngüsü ile yapabilirler.
while döngüsünün 1. satırı döngünün kaç kere çalıştırıldığını sayması için bir "gözlemci" değişken oluşturuyor.
2. satır asıl while döngüsünü barındırıyor. while döngüsünün formatı if ifadesininkine oldukça benzerdir. Koşul geçerli oldukça döngünün içerisindeki kod tekrar edilecektir.
for döngüsü ve while döngüsünün karıştırılması çok yapılan bir hatadır. Alttaki kod while veya for döngüsü arasında tam olarak karar veremeyen bir programcıyı gösteriyor.
while range(10): print(i)
Kodu kısaltmak da:
i=i+1
Bu haliyle mümkündür:
i += 1
Bu aynı şekilde çıkarma ve çarpmada da yapılabilir. Örneğin:
i=0 while i < 10: print(i) i += 1
Bu ne yazdırır?
i=1 while i <= 2**32: print(i) i *= 2
Kullanıcı bir çıkış isteği yapana kadar döngünün devam etmesi için yapılan bilinen bir işlem:
quit="n" while quit == "n": quit = input ("Çıkmak istiyor musunuz? ")
Bir döngü için çıkmanın birkaç yolu olabilir. Başlatıcı olarak bir mantıksal(Boolean) değişken kullanmak bununla başa çıkmanın yollarından biridir.
done=False while not(done): quit = input ("Çıkmak istiyor musun? ") if quit == "y" : done = True; attack = input ("Senin cinin ejdere saldıracak mı? ") if attack == "y": print ("Kötü seçim, öldün.") done = True;
Bu mükemmel değildir, çünkü kullanıcı çıkmak istediğini söylerse bile program hala kullanıcıya, ejdere saldırmak isteyip istemediğini soracaktır.
Burada while döngüsünün değer sıfıra yeterince yaklaşana kadar tekrar ettiği bir kullanım örneği var:
value = 0 increment = 0.5 while value < 0.999: value += increment increment *= 0.5 print(value)
4.3.1 While döngüsüyle yaşanan bilindik sorunlar
Programcı 10'dan geriye doğru saymak istemektedir. Yanlış olan nedir ve nasıl düzeltilebilir?
i = 10 while i == 0: print(i) i -= 1
10'a kadar geri sayması gereken bu döngüde yanlış olan şey nedir? Çalıştırıldığı zaman ne olur? Nasıl düzeltilmelidir?
i = 1 while i < 10: print(i)
4.4 While döngü örnekleri
# Sample Python/Pygame Programs # Simpson College Computer Science # http://programarcadegames.com/ # http://simpson.edu/computer-science/ # A while loop can be used anywhere a for loop is used: i = 0 while i < 10: print(i) i = i + 1 # This is the same as: for i in range(10): print(i) # It is possible to short hand the code: # i = i + 1 # With the following: # i += 1 # This can be done with subtraction, and multiplication as well. i = 0 while i < 10: print(i) i += 1 # What would this print? i = 1 while i <= 2**32: print(i) i *= 2 # A very common operation is to loop until the user performs # a request to quit quit = "n" while quit == "n": quit = input("Do you want to quit? ") # There may be several ways for a loop to quit. Using a boolean # to trigger the event is a way of handling that. done = False while not done: quit = input("Do you want to quit? ") if quit == "y": done = True attack = input("Does your elf attach the dragon? ") if attack == "y": print("Bad choice, you died.") done = True value = 0 increment = 0.5 while value < 0.999: value += increment increment *= 0.5 print(value) # -- Common problems with while loops -- # The programmer wants to count down from 10 # What is wrong and how to fix it? i = 10 while i == 0: print(i) i -= 1 # What is wrong with this loop that tries # to count to 10? What will happen when it is run? i = 1 while i < 10: print(i)
4.5 Rastgele Sayılar
4.5.1 randrange fonksiyonu
Rastgele sayılar(random numbers) oyun veya simulasyon içeren programlar için Bilgisayar Biliminde aşırı miktarda kullanılmaktadır.
Varsayılan olarak, Python rastgele sayıları nasıl üreteceğini bilmemektedir. Python'da rastgele sayılar üretebilen bir kod kütüphanesini import etmek(içeri almak) gerekmekir. Yani rastgele sayıları kullanabilmek için yapılması gereken ilk şey programın en başına bir import ifadesinin yazılmasıdır:
import random
Tıpkı pygame gibi, import edilenle aynı isimde bir dosya açmamak önemlidir. random.py isimli bir dosya oluşturmak Python'un rastgele sayılar üreten sistem kütüphanesi yerine bu dosyayı import etmesine sebep olacaktır.
Bunun ardından, rastgele sayılar randrange fonksiyonuyla oluşturulabilir. Örneğin, bu kod 0 ile 49 arasında rastgele sayılar oluşturacaktır. Varsayılan olaran alt sınır 0'dır.
my_number=random.randrange(50)
Bu kod ise 100'den 200'e rastgele sayılar üretir. İkinci parametre dahil olmayan üst sınırı belirtir. (200'e kadar ve 200 dahil rastgele sayılar istiyorsanız, 201 yazın.)
my_number = random.randrange(100, 201)
Program bir listeden rastgele bir öğe seçmek istiyorsa, bu basittir:
my_list = ["rock", "paper", "scissors"] random_index = random.randrange(3) print(my_list[random_index])
4.5.2 random fonksiyonu
Üstteki kodların tamamı tamsayılar(integer) üretir. Ondalıklı bir sayı isteniyorsa, programcı random fonksiyonunu kullanabilir.
Alttaki kod 0 ile 1 arasında 0.4355991106620656 gibi rastgele sayılar üretmektedir.
my_number = random.random()
Biraz basit matematik kullanılarak bu sayı ayarlanabilir. Örneğin, alttaki kod 10 ile 15 arasında rastgele bir ondalıklı sayı üretecektir:
my_number = random.random() * 5 + 10
4.6 Döngü içermeyen Tekrar Soruları
- Python'da geçerli olmayan değişken isimlerinin üstünü çizin.
pi PI fred Fred GreatBigVariable greatBigVariable great_big_variable great.big.variable 2x x2x total% #left
- Geçerli olabilen ancak uygun olmayan değişken isimlerini yuvarlak içine alın.
pi PI fred Fred GreatBigVariable greatBigVariable great_big_variable great.big.variable 2x x2x total% #left
- Bir Python ifadesi örneği verin:
- Python'da "operatör" ne demektir?
- Alttaki program ne yazdırır?
x=3 x+1 print(x)
- Alttaki kodu düzeltin:
user_name=input("İsminizi girin: )"
- Alttaki kodu düzeltin:
value=int(input(print("Yaşınızı girin")))
- Alttaki kodu düzeltin:
temperature = float (input("Sıcaklık")) if temperature > = 90 print("Dışarısı sıcak.")
- Alttaki kodu düzeltin:
print("Oregon Trail'e hoşgeldiniz!") userInput = input("Mesleğiniz nedir?") print("A. Bankacı") print("B. Marangoz") print("C. Çiftçi") if userInput = A: money=100 else if userInput = B: money=70 else if userInput = C: money=50
- Bu kodta yanlış olan şey nedir?
x=input("Bir sayı girin:") if x > 100 print ("Büyük bir sayı girdiniz.") else print ("Büyük bir sayı girmediniz.")
- Kullanıcıya kaç adet 25 kuruş ve 5 kuruşu olduğunu soran ve daha sonra bu bozuk paraların toplam değerini gösteren bir program yazın.
4.7 Döngülerle İlgili Tekrar soruları
Çoktan seçmeli test soruları için burayı tıklayın.
- for döngüsü kullanarak adınızı 10 kez yazdıran ve bittiğinde sonuna "Bitti" kelimesini yazan bir Python programı yazın.
- for döngüsünü kullanarak 20 kere "Kırmızı" ve ardından "sarı" yazdıran bir Python programı yazın.
- 2'den 100'e kadar 100 dahil çift sayıları yazdıran for döngüsünü kullanan bir Python programı yazın.
- while döngüsünü kullanarak 10'dan 0'a geri sayan, sıfır dahil olmak üzere, bir Python programı yazın. Ardından "Fırlatma gerçekleşti!" yazsın.
- Bu programda yanlış olan dört şey var. Onları bulun ve düzeltin.
print ("This program takes three numbers and returns the sum.") total=0 for i in range(3): x=input("Bir sayı girin: ") total=total+i print ("Toplam:",x)
- Şunları yapan bir Python programı yazın:
- kullanıcıya yedi sayı soran
- bu sayıların toplamını gösteren
- pozitif değerli, sıfır olan ve negatif değerli girişlerin kaç kez yapıldığını gösteren
4.8 Rastgele Sayılar Tekrarı
- 1'den 10'a kadar (10 dahil) olan aralıkta ekrana rastgele bir sayı yazdıran program yazın.
- 1 ile 10 arasında (10 dahil) rastgele ondalıklı sayı gösteren bir program yazın.
- Yazı tura atıcı
- Rastgele 1 veya 0 yazdıran bir program oluşturun.
- 0 veya 1 yerine, yazı veya tura yazdırsın.
- Programın bunu 50 kez yapabilmesi için bir döngü ekleyin.
- Kaç kere yazı ve kaç kere tura geldiğini gösteren toplamı tutan değişkenler oluşturun.
- Taş, kağıt, makas oynayan bir program yazın.
- Rastgele 0, 1 ya da 2 yazdıran bir program oluşturun.
- Programı if yapısını kullanarak rastgele taş, kağıt veya makas yazdıracak şekilde genişletin. Bu bölümde gösterildiği gibi listeden seçmeyin.
- Programa ilk olarak kullanıcının seçimini soracağı şekilde ekleme yapın.
- Kullanıcı 1, 2 veya 3 girerse daha kolay olacaktır.
- Kimin kazandığını belirleyen koşullu bir ifade ekleyin.
You are not logged in. Log in here and track your progress.
English version by Paul Vincent Craven
Spanish version by Antonio Rodríguez Verdugo
Russian version by Vladimir Slav
Turkish version by Güray Yildirim
Portuguese version by Armando Marques Sobrinho and Tati Carvalho
Dutch version by Frank Waegeman
Hungarian version by Nagy Attila
Finnish version by Jouko Järvenpää
French version by Franco Rossi
Korean version by Kim Zeung-Il
Chinese version by Kai Lin