Dokuz derstir parça parça öğrendik: değişkenler, input, koşullar, döngüler, listeler, sözlükler ve fonksiyonlar. Bu derste yeni bir konu yok. Onun yerine hepsini bir araya getirip gerçekten oynanabilen ilk programımızı yazıyoruz: sayı tahmin oyunu.
Kural basit: Bilgisayar 1 ile 100 arasında bir sayı tutar. Sen tahmin edersin, o da “daha büyük” ya da “daha küçük” der. Amacın sayıyı olabildiğince az denemede bulmak.
Oyunu tek seferde yazmayacağız. Her adımda çalışan bir sürüm olacak ve bir sonraki adımda ona bir özellik ekleyeceğiz. Gerçek projeler de böyle büyür.
Bütün kodlar Colab’da hazır: Colab’da Aç
Adım 1: Rastgele bir sayı tutmak
Python’un random modülü rastgele sayı üretiyor. Modül, başkalarının yazıp Python’la birlikte gelen hazır fonksiyonların bulunduğu bir dosya; import ile kullanıma açıyoruz. Modüllere Ders 15’te ayrıntılı bakacağız.
import randomgizli = random.randint(1, 100)print(gizli)
randint(1, 100) 1 ile 100 arasında, iki uç da dahil, rastgele bir tam sayı veriyor. Hücreyi birkaç kez çalıştır; her seferinde farklı bir sayı göreceksin.
Adım 2: Tek bir tahmin
gizli = random.randint(1, 100)tahmin = int(input("1 ile 100 arasında bir sayı tuttum. Tahminin: "))if tahmin == gizli: print("Bildin!")elif tahmin < gizli: print("Daha büyük bir sayı söyle.")else: print("Daha küçük bir sayı söyle.")
input her zaman metin döndürür; sayıyla karşılaştırmak için int ile tam sayıya çeviriyoruz (Ders 4). Ardından Ders 5’teki if, elif, else üç durumu ayırıyor. Bu sürüm çalışıyor, ama tek tahminle oyun bitiyor.
Adım 3: Bilene kadar sormak
Kaç tahmin gerekeceğini bilmiyoruz, o yüzden Ders 6’daki while True döngüsü tam yerinde. Bir de sayaç ekleyelim:
gizli = random.randint(1, 100)deneme = 0while True: tahmin = int(input("Tahminin: ")) deneme += 1 if tahmin == gizli: print(f"Bildin! {deneme} denemede buldun.") break elif tahmin < gizli: print("Daha büyük.") else: print("Daha küçük.")
Artık oynanabilir bir oyunumuz var. Şimdi bir arkadaşına oynat ve tahmin yerine yanlışlıkla abc yazsın. Program şu hatayla çöker:
ValueError: invalid literal for int() with base 10: 'abc'
int harfleri sayıya çeviremiyor. Kendi yazdığın programda bunu yapmazsın belki, ama kullanıcılar her şeyi yazar. Sıradaki adım bunun için.
Adım 4: Hatalı girişe karşı korumak
Kullanıcıdan geçerli bir sayı alana kadar soran bir fonksiyon yazalım. Ders 9’da öğrendiğimiz gibi, bu işi bir kez yazıp oyunun her yerinde kullanacağız:
def sayi_iste(mesaj, en_az, en_cok): """Kullanıcıdan en_az ile en_cok arasında bir tam sayı alana kadar sorar.""" while True: cevap = input(mesaj).strip() if not cevap.isdigit(): print("Lütfen sadece rakam yaz.") continue sayi = int(cevap) if en_az <= sayi <= en_cok: return sayi print(f"Sayı {en_az} ile {en_cok} arasında olmalı.")
Bir sayı yaz: abcLütfen sadece rakam yaz.Bir sayı yaz: 150Sayı 1 ile 100 arasında olmalı.Bir sayı yaz: 42Aldığım sayı: 42
Üç yeni detay var:
.strip()metnin başındaki ve sonundaki boşlukları siliyor. ” 42 ” yazan kullanıcı da kabul ediliyor..isdigit()metin sadece rakamlardan oluşuyorsaTruedöndürüyor.int‘e çevirmeden önce kontrol ediyoruz.continuedöngünün geri kalanını atlayıp başa dönüyor;returnise hem döngüyü hem fonksiyonu bitiriyor.
Hataları yakalamanın daha genel bir yolu da var: try ve except. Onu Ders 13’te işleyeceğiz.
Adım 5: Zorluk seviyesi ve deneme hakkı
Oyuna seviye ve sınırlı deneme hakkı ekleyelim. Ayarları Ders 8’deki gibi bir sözlükte tutmak, hepsini tek bir yerden değiştirmemizi sağlıyor:
ZORLUKLAR = { "kolay": {"ust_sinir": 50, "hak": 10}, "orta": {"ust_sinir": 100, "hak": 7}, "zor": {"ust_sinir": 1000, "hak": 10},}def oyna(zorluk="orta"): """Bir el oyun oynatır. Kazanırsa deneme sayısını, kaybederse None döndürür.""" ayar = ZORLUKLAR[zorluk] ust = ayar["ust_sinir"] gizli = random.randint(1, ust) print(f"1 ile {ust} arasında bir sayı tuttum. {ayar['hak']} hakkın var.") for deneme in range(1, ayar["hak"] + 1): tahmin = sayi_iste(f"{deneme}. tahmin: ", 1, ust) if tahmin == gizli: print(f"Bildin! {deneme} denemede buldun.") return deneme elif tahmin < gizli: print("Daha büyük.") else: print("Daha küçük.") print(f"Hakların bitti. Sayı {gizli} idi.") return None
Bu kez while yerine for kullandık, çünkü kaç tur süreceği artık belli: en fazla hak kadar. Sayı bulununca return döngüyü erkenden bitiriyor. Döngü sonuna kadar dönerse haklar bitmiş demektir.
Büyük harfle yazılan ZORLUKLAR adı bir Python geleneği: “Bu değer program boyunca değişmeyecek bir ayar” anlamına geliyor.
Adım 6: Ana program
Son olarak seviye seçimi, tekrar oynama ve skor tablosu:
def ana_program(): skorlar = [] while True: zorluk = input("Zorluk seç (kolay / orta / zor): ").strip().lower() if zorluk not in ZORLUKLAR: print("Bu seviyeyi tanımıyorum, orta ile başlıyoruz.") zorluk = "orta" sonuc = oyna(zorluk) if sonuc is not None: skorlar.append(sonuc) if input("Tekrar oynamak ister misin? (e/h): ").strip().lower() != "e": break print(f"{len(skorlar)} oyun kazandın.") if skorlar: print(f"En iyi skorun: {min(skorlar)} deneme")ana_program()
ana_program neredeyse düz Türkçe gibi okunuyor: seviye sor, oyna, kazandıysan skoru kaydet, devam etmek isteyip istemediğini sor. Ayrıntılar sayi_iste ve oyna fonksiyonlarının içinde saklanıyor. Program büyüdükçe fonksiyonlara bölmenin neden bu kadar önemli olduğu burada daha net görünüyor.
sonuc is not None satırına dikkat: oyna kaybedince None döndürüyor, sadece kazanılan oyunları skor listesine ekliyoruz.
Bonus: Oyunu bilgisayara oynatmak
Bu oyunun en akıllı stratejisi ne? Her seferinde kalan aralığın tam ortasını söylemek. İlk tahmin 50; “daha büyük” cevabı gelirse 51 ile 100 arasının ortası, 75. Her tahminde ihtimallerin yarısı eleniyor. Bu yönteme ikili arama (binary search) deniyor ve bilgisayar biliminin en temel algoritmalarından biri.
def bilgisayar_oyna(gizli, ust=100): alt, ust_sinir = 1, ust deneme = 0 while True: tahmin = (alt + ust_sinir) // 2 deneme += 1 if tahmin == gizli: return deneme elif tahmin < gizli: alt = tahmin + 1 else: ust_sinir = tahmin - 1print(bilgisayar_oyna(37)) # 3print(bilgisayar_oyna(100)) # 7denemeler = [bilgisayar_oyna(s) for s in range(1, 101)]print("En kötü durum:", max(denemeler), "deneme") # 7print("Ortalama:", sum(denemeler) / len(denemeler), "deneme") # 5.8
// bölmenin tam sayı kısmını veriyor; 75,5 yerine 75. 37’yi bulmak için bilgisayar 50, 25 ve 37 diyor, üç denemede buluyor. 1 ile 100 arasındaki hangi sayıyı tutarsan tut, en fazla 7 denemede buluyor.
Orta seviyedeki 7 hakkı bu yüzden seçtim: Akıllı oynayan biri her zaman kazanabilir, rastgele tahmin eden ise genelde kaybeder. Zor seviyedeki 10 hak da aynı mantıkla: 1 ile 1000 arasında ikili arama en fazla 10 denemede bitiyor.
Alıştırmalar
- Oyuncunun tahmini gizli sayıya 5 ya da daha yakınsa “Çok yaklaştın!” mesajı ekle.
ZORLUKLARsözlüğüne kendi seviyeni ekle (örneğin “imkansız”: 1 ile 10000 arası, 14 hak).- Oyun bitince oyuncunun bütün tahminlerini bir listede tut ve sırayla yazdır.
bilgisayar_oynafonksiyonunu 1 ile 1000 arası için çalıştır. En kötü durumda kaç deneme gerekiyor?
Cevaplar Colab not defterinin sonunda.
Bu projede neleri birleştirdik?
randomile ilk modülümüzü kullandık.input,int,stripveisdigitile kullanıcıdan güvenli giriş aldık.whilevefordöngülerini,break,continuevereturnile yönettik.- Ayarları bir sözlükte, skorları bir listede tuttuk.
- Programı üç fonksiyona böldük.
- İkili aramayla ilk algoritmamızı tanıdık.
Sıradaki ders
Python Dersi 11’de metinlerle çalışmayı öğreniyoruz: büyük-küçük harf, bölme, birleştirme ve arama.

Bir yanıt yazın