Bir cümlelik özet
Bilgisayarın tuttuğu gizli bir sayıyı random, while, if ve input kullanarak tahmin ettiren, baştan sona çalışan küçük bir oyun yazıyoruz.
Neden önemli?
Şimdiye kadar döngüleri, koşulları ve kütüphaneleri ayrı ayrı öğrendik. Gerçek bir program ise bu parçaları bir araya getirir. Sayı tahmin oyunu bunun için çok iyi bir başlangıç projesidir: kısa ama içinde bir programın tüm temel iskeleti vardır.
Bu projede şunları bir arada kullanacağız:
- Rastgele sayı üretmek için bir kütüphane (
random). - Kullanıcıdan veri almak için
input. - Kararlar için
if / elif / else. - Doğru cevap bulunana kadar tekrar için
while.
Kısacası bu ders, "komutları biliyorum" ile "bir programı ben yazdım" arasındaki köprüdür.
Oyunun planı
Kod yazmadan önce oyunu günlük dille, adım adım düşünelim. Buna önceki modüllerde sözde kod demiştik.
Başla
Bilgisayar 1 ile 100 arasında gizli bir sayı tut
Deneme sayısını 0 yap
Tekrarla:
Kullanıcıdan bir tahmin al
Deneme sayısını 1 artır
Eğer tahmin gizli sayıdan küçükse
"Daha büyük dene" yaz
Eğer tahmin gizli sayıdan büyükse
"Daha küçük dene" yaz
Değilse (tahmin doğruysa)
"Tebrikler" yaz ve döngüyü bitir
Bitir
Bu plan, oyunun tamamını üç yapı üzerine kuruyor: bir gizli sayı, bir tekrar (döngü) ve her turda verilen bir karar. Şimdi bu parçaları teker teker Python'a çevirelim.
Yapı taşlarını tanıyalım
random ile gizli sayı
random, Python ile birlikte gelen standart bir kütüphanedir; rastgele sayı üretmek için kullanılır. Kullanmadan önce import ile programa dahil ederiz.
import random
gizli_sayi = random.randint(1, 100)
print(gizli_sayi) # test için, oyunda bunu göstermeyeceğiz
random.randint(1, 100) ifadesi, 1 ve 100 dahil olmak üzere aradan rastgele bir tam sayı verir. Her çalıştırdığında farklı bir sayı görürsün.
input ile tahmin almak
input her zaman metin (string) döndürür. Sayı karşılaştırması yapabilmek için gelen değeri int ile tam sayıya çeviririz.
tahmin = int(input("1-100 arası bir sayı tahmin et: "))
print(tahmin + 1) # artık sayı gibi işlem yapabiliyoruz
int(...) yazmayı unutursak "50" metnini bir sayıyla kıyaslamaya çalışıp hata alırız.
while ile tekrar
while döngüsü, koşulu doğru olduğu sürece içindeki satırları tekrar eder. Doğru tahmin gelene kadar durmadan sormasını istediğimiz için while True kullanıp, doğru cevapta break ile çıkacağız. break, döngüyü hemen bitiren komuttur.
Buradaki girinti (4 boşluk) çok önemli: bir satır while veya if bloğunun içinde mi, dışında mı olduğunu Python girintiyle anlar.
sayac = 0
while sayac < 3:
sayac = sayac + 1
print("Tur", sayac)
Bu küçük örnek üç kez yazdırır ve durur. Oyunda ise koşulu "doğru cevap gelene kadar" biçiminde kuracağız.
Tam oyun kodu
Şimdi bütün parçaları birleştiriyoruz. Aşağıdaki kod baştan sona çalışır:
import random
gizli_sayi = random.randint(1, 100)
deneme = 0
while True:
tahmin = int(input("1-100 arası bir sayı tahmin et: "))
deneme = deneme + 1
if tahmin < gizli_sayi:
print("Daha büyük bir sayı dene.")
elif tahmin > gizli_sayi:
print("Daha küçük bir sayı dene.")
else:
print(f"Tebrikler! Sayıyı {deneme} denemede buldun.")
break
Kodun mantığı, en baştaki planla birebir aynı. if küçükse, elif büyükse, else ise doğru tahmin demektir ve break oyunu bitirir. f"..." ise f-string'dir: süslü parantez içindeki {deneme} değerini metnin içine yerleştirir.
Test senaryoları
Bir programı yazmak yeterli değildir; farklı girdilerle denemeliyiz. Diyelim ki gizli sayı 42 olsun:
| Tahmin | Ekranda ne çıkar | Sonraki adım |
|---|---|---|
| 50 | Daha küçük bir sayı dene. | 1–49 arasına in |
| 25 | Daha büyük bir sayı dene. | 26–49 arasına çık |
| 42 | Tebrikler! Sayıyı 3 denemede buldun. | Oyun biter |
Her turda aralığı ortadan bölersen (buna ikili arama denir) 100 sayıyı en fazla 7 denemede bulabilirsin. Kendi oyununu birkaç kez oynayıp bunu test et.
Bir hata ve düzeltmesi
İlk yazdığımda if yerine iki tane bağımsız if kullandığım bir sürüm denedim:
if tahmin < gizli_sayi:
print("Daha büyük bir sayı dene.")
if tahmin > gizli_sayi: # burada elif olmalıydı
print("Daha küçük bir sayı dene.")
else:
print("Tebrikler!")
Sorun şuydu: ikinci if ile bağlı else, yalnızca "büyük değilse" durumunu kapsıyordu. Tahmin gizli sayıdan küçük olduğunda hem "Daha büyük dene" hem de yanlışlıkla "Tebrikler!" yazdırıyordu.
Düzeltme, ikinci if'i elif yapmaktı. Böylece üç durum tek bir karar zincirine bağlandı: küçük, büyük veya doğru. Bir programda "değilse" yolunu doğru bağlamak, koşulu yazmak kadar önemli.
Mini uygulama
Çalışan oyunun üzerine kendi geliştirmelerini ekle. Kolaydan zora birkaç fikir:
- Deneme hakkı sınırı:
while Trueyerinewhile deneme < 7kullan; hak biterse gizli sayıyı ekrana yazdır. - Aralığı değiştir:
random.randint(1, 500)yaparak oyunu zorlaştır. - "Çok yakınsın" ipucu: Tahmin ile gizli sayının farkı 5'ten küçükse ek bir mesaj yazdır.
- Tekrar oyna: Oyun bittiğinde "Tekrar oynamak ister misin?" diye sorup en dıştan bir döngüye al.
Deneme hakkı sınırı için başlangıç:
while deneme < 7:
tahmin = int(input("Tahminin: "))
deneme = deneme + 1
# ipuçlarını buraya ekle
if tahmin == gizli_sayi:
print("Kazandın!")
break
Projeyi güçlendirme planı
Proje: Sayı Tahmin Oyunu için yalnız çalışan bir gösterim hazırlamak yeterli değildir. İyi bir proje; hedefi, kullanıcıyı, sınırları, test koşullarını ve başarısız denemeleri de görünür kılar. Bu genişletme çalışmasında günlük ders programını kontrol eden komut satırı aracı bağlamını kullanarak çalışan kısa bir Python 3 programı, örnek girdiler ve beklenen çıktılar oluştur. Dersin hedefi “random, while, if ve input’u birleştirerek çalışan bir sayı tahmin oyunu yaz” olsa da proje sayfasında ölçülmemiş bir sonucu kesin başarı gibi yazma.
1. Proje özeti ve kapsam
Önce üç cümle yaz: Çözmek istediğin sorun nedir, bu sorun kimin için önemlidir ve ilk sürüm özellikle neyi yapmayacaktır? Kapsam dışını belirtmek projeyi küçültmez; tamamlanabilir hâle getirir. Oyunun planı ile random ile gizli sayı arasındaki ilişkiyi projenin temel varsayımı olarak yaz ve bu varsayımı hangi testin doğrulayacağını belirt.
2. Kabul ölçütleri
- Kod Python 3 sözdizimiyle çalışıyor mu?
- Değişken ve fonksiyon adları amacı açıklıyor mu?
- Boş, yanlış türde ve sınırdaki girdiler denendi mi?
- Hata mesajı kullanıcıya neyi düzeltmesi gerektiğini söylüyor mu?
- Aynı kod gereksiz tekrar olmadan yeniden kullanılabiliyor mu?
“Proje: Sayı Tahmin Oyunu” için kabul ölçütlerini “çalışıyor” gibi belirsiz sözcüklerle bırakma. Süre, mesafe, doğru deneme sayısı, ekran genişliği veya kullanıcı adımı gibi gözlenebilir bir ölçü seç. Ölçüm mümkün değilse en azından üç ardışık denemede aynı davranışın görülüp görülmediğini kaydet.
3. Test matrisi
| Test | Koşul | Beklenen | Gerçek sonuç | Sonraki karar |
|---|---|---|---|---|
| Normal | Standart giriş ve tam bağlantı | Temel görev tamamlanır | Test sırasında doldur | Koru veya küçük iyileştirme yap |
| Sınır | En düşük ya da en yüksek kabul edilen değer | Sistem kararlı kalır | Test sırasında doldur | Eşiği veya kuralı gözden geçir |
| Hata | Eksik, yanlış ya da beklenmeyen giriş | Güvenli ve anlaşılır tepki | Test sırasında doldur | Hata yönetimi ekle |
| Tekrar | Aynı koşulda en az üç deneme | Benzer sonuçlar | Test sırasında doldur | Tutarsızlığın kaynağını araştır |
4. Sürüm günlüğü
“Proje: Sayı Tahmin Oyunu” projesinin her sürümü için tarih, değiştirdiğin tek ana karar, değişikliğin nedeni ve test sonucu yaz. İlk sürümün çalışmaması başarısızlık değildir; Oyunun planı veya random ile gizli sayı ile ilgili hangi varsayımın yeniden düşünülmesi gerektiğini gösteren veridir. Görsel kullanırken kişisel bilgi ve özel arka plan ayrıntılarını paylaşma.
5. Sunum ve öz değerlendirme
“Proje: Sayı Tahmin Oyunu” projesini iki dakikada anlatacak şekilde hazırlan: sorun, çözüm yaklaşımı, günlük ders programını kontrol eden komut satırı aracı için en önemli test sonucu ve bir sonraki adım. “Tamamlandı” demek yerine hangi kısmın doğrulandığını ve hangi kısmın hâlâ geliştirilmesi gerektiğini açıkla.
Sık yapılan hatalar
int'e çevirmeyi unutmak
tahmin = input(...) yazarsan tahmin bir metin olur. "50" < gizli_sayi karşılaştırması hata verir. Çözüm: int(input(...)).
break koymayı unutmak
Doğru tahminde break yoksa döngü hiç bitmez; program doğru cevabı bulsa bile sormaya devam eder.
elif yerine iki ayrı if
Yukarıda gördüğümüz gibi, bağımsız if'ler beklenmedik sonuçlar üretebilir. Birbirini dışlayan durumlarda if / elif / else zinciri kullan.
Girintiyi bozmak
while ve if bloklarının içindeki satırlar 4 boşluk içeride olmalı. Girinti tutarsızsa Python IndentationError verir.
Güvenlik notu
Bu ders tamamen kendi bilgisayarında, kendi yazdığın kodu çalıştırmakla ilgilidir. İnternette bulduğun tanımadığın kodları çalıştırmadan önce bir yetişkine danış ve oyunlarında ad, adres, telefon gibi kişisel bilgileri isteme veya kaydetme.
Ders özeti
- Bir sayı tahmin oyunu; gizli sayı, tekrar ve karar yapılarını tek programda birleştirir.
random.randint(1, 100)1–100 arası rastgele tam sayı üretir.inputher zaman metin döndürür; sayı içinintile çevirmek gerekir.while Truevebreakile "doğru cevaba kadar tekrar" kurulur.- Programı bitirmek değil, farklı girdilerle test edip geliştirmek işin asıl parçasıdır.
Kontrol soruları
random.randint(1, 100)ifadesi hangi en küçük ve en büyük sayıları üretebilir?inputile alınan değeri nedenintile çeviriyoruz?- Oyunda
while Truedöngüsünü hangi komut sonlandırıyor? - İkinci koşulda
ifyerine nedenelifkullanmak daha doğru? - Deneme hakkını 7 ile sınırlamak için döngü koşulunu nasıl yazarsın?
Cevaplar
- En küçük 1, en büyük 100'dür; her iki uç da dahildir.
inputmetin döndürür;intile çevirmezsek sayı karşılaştırması hata verir.- Doğru tahmin geldiğinde
elsebloğundakibreakkomutu döngüyü bitirir. elif, önceki koşul yanlışsa kontrol edilir; böylece küçük, büyük ve doğru durumları tek karar zinciri olur. İki ayrıifyanlış eşleşmelere yol açabilir.while deneme < 7:biçiminde yazıp hak bittiğinde gizli sayıyı ekrana yazdırırsın.
Ek doğrulama görevi
“Proje: Sayı Tahmin Oyunu” için ikinci bir örnek oluştur: günlük ders programını kontrol eden komut satırı aracı. İlk çözümü aynen kopyalamak yerine Oyunun planı kavramının hangi bölümde, random ile gizli sayı kavramının hangi kararda kullanıldığını işaretle. Sonucu değerlendirmek için şu iki soruya yazılı cevap ver: “Beklediğim davranış neydi?” ve “Gerçekte hangi kanıtı gördüm?”
Ardından kontrol listesinden özellikle “Kod Python 3 sözdizimiyle çalışıyor mu?” ve “Aynı kod gereksiz tekrar olmadan yeniden kullanılabiliyor mu?” maddelerini kullan. İlk denemede fark bulamazsan bir sınır koşulu ekle; örneğin en küçük değer, en büyük değer, boş giriş, bağlantı kaybı veya yeniden başlatma durumu. Son notunda yaptığın tek değişikliği ve bu değişikliğin sonucu nasıl etkilediğini açıkla.
Kaynak ve doğrulama notu
“Proje: Sayı Tahmin Oyunu” dersi için doğrulama odağı Oyunun planı ile random ile gizli sayı arasındaki ilişkinin örnekler üzerinde tutarlı çalışmasıdır. Kod örnekleri Python 3 sözdizimi esas alınarak hazırlanmıştır. Çalıştırma ortamına göre küçük farklar görülebileceği için örnekler önce güvenli bir çevrim içi editörde veya yerel geliştirme ortamında denenmelidir.
Sonraki ders
Proje: Ders Programı Kontrolü: Bir liste ve döngü kullanarak, günün derslerine göre çantada hangi kitapların olması gerektiğini kontrol eden bir program.