🎲PythonBaşlangıç

Python ile Sayı Tahmin Oyunu: Adım Adım Yeni Başlayan Rehberi

⏱ 12 dk okuma · Yayın: 9 Ekim 2026 · Hazırlayan: Kuzey Kutbu Editörlüğü · Tüm kod örnekleri çalıştırılarak test edildi

Python ile sayı tahmin oyunu yap: random, input, while ve if ile adım adım ilerle; deneme hakkı, zorluk seviyesi, puan ve tekrar oyna özelliği ekle.

Sayı tahmin oyunu, Python öğrenmeye başlayan herkesin yazması gereken ilk gerçek oyundur. Kısa ama içinde programlamanın neredeyse bütün temel parçaları var: rastgele sayı üretmek, kullanıcıdan bilgi almak, karşılaştırma yapmak, döngü kurmak ve sayaç tutmak. Üstelik bitirdiğinde ailene, arkadaşına oynatabileceğin bir şey elinde olur.

Bu rehberin sonunda şunları yapabileceksin:

  • random modülüyle bilgisayara gizli bir sayı tutturmak,
  • input() ile tahmin almak ve onu sayıya çevirmek,
  • if, elif, else ile "daha büyük / daha küçük" ipuçları vermek,
  • while döngüsüyle oyunu doğru tahmin gelene kadar sürdürmek,
  • deneme hakkı, zorluk seviyesi, puan ve "tekrar oyna" özelliği eklemek,
  • kullanıcı harf yazınca programın çökmesini engellemek.

Kodları tarayıcıdaki kod editöründe ya da bilgisayarına kurduğun Python ile çalıştırabilirsin. Python'a hiç dokunmadıysan önce Python derslerine göz atmak işini kolaylaştırır. Değişken, koşul ve döngü kavramları sana yabancıysa Değişken, Koşul, Döngü rehberi bu oyun için iyi bir hazırlıktır.

Oyunun kuralları: önce planı kağıda dök

Kod yazmadan önce oyunun ne yapacağını sade cümlelerle yazmak, programcıların sık kullandığı bir alışkanlıktır. Bizim oyunumuz şöyle çalışacak:

  1. Bilgisayar 1 ile 100 arasında gizli bir sayı tutar.
  2. Oyuncu bir tahmin yazar.
  3. Tahmin küçükse "daha büyük", büyükse "daha küçük" der.
  4. Oyuncu doğru sayıyı bulana kadar 2. ve 3. adım tekrar eder.
  5. Bulunca kaç denemede bulduğunu söyler.

Bu listeye dikkat et: 4. adımda "tekrar eder" diyoruz, bu bir döngü. 3. adımda "küçükse... büyükse..." diyoruz, bu bir koşul. Kodun iskeleti planın içinde zaten saklı. Bu tür planlara algoritma denir; konuyu merak edersen Algoritma nedir? rehberine bakabilirsin.

1. Adım: Gizli sayı ve tek tahmin

En küçük çalışan sürümle başlayalım. Bilgisayar 1–10 arasında bir sayı tutsun, oyuncu tek bir tahmin yapsın.

import random

gizli = random.randint(1, 10)
print("1 ile 10 arasında bir sayı tuttum.")

tahmin = int(input("Tahminin: "))

if tahmin == gizli:
    print("Bildin! Tebrikler.")
else:
    print("Olmadı. Tuttuğum sayı:", gizli)

Satır satır ne oluyor:

  • import random: Python'un rastgele sayı araçlarını programa çağırır. Bu satır olmadan random.randint çalışmaz.
  • random.randint(1, 10): 1 ile 10 arasında bir tam sayı üretir. İki uç da dahildir, yani 1 de 10 da gelebilir.
  • input("Tahminin: "): Ekrana soruyu yazar ve oyuncunun klavyeden yazdığını metin olarak verir.
  • int(...): Bu metni tam sayıya çevirir. "7" yazısı ile 7 sayısı Python için farklı şeylerdir; karşılaştırma yapabilmek için çeviri şart.
  • ==: İki değerin eşit olup olmadığını sorar. Tek eşittir (=) ise değer atamak içindir.
İpucu: Programı birkaç kez çalıştır. Her seferinde farklı bir sayı tutulduğunu göreceksin. Rastgelelik oyunu her seferinde yeniden oynanabilir yapan şeydir.

2. Adım: while döngüsüyle bulana kadar sor

Tek tahmin hakkı eğlenceli değil. Oyuncu doğruyu bulana kadar sormaya devam etmeli ve her yanlışta ipucu almalı. Bunun için while döngüsü kullanacağız. Aynı zamanda aralığı 1–100'e çıkarıp bir sayaç ekliyoruz.

import random

gizli = random.randint(1, 100)
deneme = 0
print("1 ile 100 arasında bir sayı tuttum. Bakalım bulabilecek misin?")

while True:
    tahmin = int(input("Tahminin: "))
    deneme = deneme + 1

    if tahmin < gizli:
        print("Daha BÜYÜK bir sayı söyle.")
    elif tahmin > gizli:
        print("Daha KÜÇÜK bir sayı söyle.")
    else:
        print("Bildin!", deneme, "denemede buldun.")
        break

Bu kodda neler yeni?

  • while True: "sonsuza kadar tekrar et" demektir. Döngüden çıkmanın tek yolu içerideki break komutudur. Doğru tahmin gelince break çalışır ve döngü biter.
  • deneme = deneme + 1: Her tahminde sayacı bir artırır. Kısaca deneme += 1 da yazabilirsin, ikisi aynı işi yapar.
  • if / elif / else: Üç durumdan yalnızca biri çalışır. Önce "küçük mü?" diye bakılır, değilse "büyük mü?", o da değilse geriye tek ihtimal kalır: eşit.

Örnek bir oyun şöyle görünebilir (gizli sayı 82 iken):

Tahminin: 50
Daha BÜYÜK bir sayı söyle.
Tahminin: 90
Daha KÜÇÜK bir sayı söyle.
Tahminin: 80
Daha BÜYÜK bir sayı söyle.
Tahminin: 82
Bildin! 4 denemede buldun.
Önemli: gizli = random.randint(1, 100) satırı döngünün dışında, yukarıda duruyor. Onu döngünün içine koyarsan bilgisayar her tahminden sonra yeni bir sayı tutar ve oyun asla kazanılamaz hale gelir.

3. Adım: Deneme hakkı ekle

Şimdi oyuna heyecan katalım: oyuncunun sadece 7 hakkı olsun. Hakları biterse kaybeder ve gizli sayıyı görür. Neden 7? Çünkü 1–100 arasında, her seferinde kalan aralığın ortasını söyleyen biri sayıyı en fazla 7 denemede kesin bulur. Yani 7 hak, akıllı oynayana yeter ama rastgele sallayana yetmez. Bunu rehberin sonundaki bölümde kendimiz de kanıtlayacağız.

import random

gizli = random.randint(1, 100)
hak = 7
print("1 ile 100 arasında bir sayı tuttum. Toplam", hak, "hakkın var.")

while hak > 0:
    tahmin = int(input("Tahminin: "))
    hak = hak - 1

    if tahmin == gizli:
        print("Bildin! Tebrikler.")
        break
    elif tahmin < gizli:
        print("Daha büyük. Kalan hakkın:", hak)
    else:
        print("Daha küçük. Kalan hakkın:", hak)
else:
    print("Hakların bitti. Tuttuğum sayı:", gizli)

Burada iki yeni fikir var:

  • Koşullu while: while hak > 0: döngüsü, hak kaldığı sürece döner. Her turda hak bir azaldığı için döngü er ya da geç kendiliğinden biter.
  • while ... else: Python'da döngünün de else bloğu olabilir. Bu blok, döngü break ile kesilmeden, koşul yanlış olduğu için bittiğinde çalışır. Bizim oyunda bunun anlamı şu: oyuncu bulamadan haklar tükendiyse "Hakların bitti" yazılır. Oyuncu kazanıp break çalıştıysa else atlanır.
İpucu: while ... else ilk bakışta kafa karıştırabilir. Aynı işi bir kazandi = False değişkeniyle de yapabilirsin: kazanınca True yap, döngüden sonra if not kazandi: ile kontrol et. İkisi de doğru, hangisini daha net anlıyorsan onu kullan.

4. Adım: Yanlış girişlere karşı koruma

Şimdiye kadarki kodda oyuncu "elli" ya da boş bir şey yazarsa program şu hatayla kapanır:

ValueError: invalid literal for int() with base 10: 'elli'

Gerçek oyunlar böyle çökmez. Çözüm, tahmini alan işi ayrı bir fonksiyona taşımak ve try / except ile hatayı yakalamak:

def sayi_al(en_kucuk, en_buyuk):
    while True:
        metin = input("Tahminin: ")
        try:
            sayi = int(metin)
        except ValueError:
            print("Lütfen sadece rakam yaz.")
            continue
        if sayi < en_kucuk or sayi > en_buyuk:
            print("Sayı", en_kucuk, "ile", en_buyuk, "arasında olmalı.")
            continue
        return sayi

tahmin = sayi_al(1, 100)
print("Geçerli tahmin:", tahmin)

Bu fonksiyon geçerli bir sayı gelene kadar sormaya devam eder:

  • try: bloğundaki int(metin) başarısız olursa Python ValueError fırlatır; except ValueError: bunu yakalar ve programı kapatmak yerine nazik bir uyarı yazar.
  • continue: Döngünün geri kalanını atlayıp en başa, yeni bir soruya döner.
  • or: İki koşuldan biri doğruysa sonuç doğrudur. Sayı alt sınırdan küçük veya üst sınırdan büyükse aralık dışıdır.
  • return sayi: Her şey yolundaysa sayıyı fonksiyonu çağıran yere geri verir ve döngüden de çıkar.

"abc", ardından 500, ardından 42 yazıldığında çıktı şöyle olur:

Tahminin: abc
Lütfen sadece rakam yaz.
Tahminin: 500
Sayı 1 ile 100 arasında olmalı.
Tahminin: 42
Geçerli tahmin: 42

5. Adım: Tam oyun — zorluk, puan ve tekrar oyna

Parçaları birleştirme zamanı. Son sürümde oyuncu zorluk seçecek, her tur puan kazanacak, toplam skor tutulacak ve isterse yeniden oynayabilecek. Kodu fonksiyonlara böldük; her fonksiyonun tek bir görevi var. Bu, uzun kodu okunur tutmanın en iyi yoludur.

import random

ZORLUKLAR = {
    "1": ("Kolay", 50, 10),
    "2": ("Orta", 100, 7),
    "3": ("Zor", 1000, 10),
}


def sayi_al(en_kucuk, en_buyuk):
    while True:
        metin = input("Tahminin: ")
        try:
            sayi = int(metin)
        except ValueError:
            print("Lütfen sadece rakam yaz.")
            continue
        if sayi < en_kucuk or sayi > en_buyuk:
            print("Sayı", en_kucuk, "ile", en_buyuk, "arasında olmalı.")
            continue
        return sayi


def zorluk_sec():
    print("Zorluk seç: 1) Kolay  2) Orta  3) Zor")
    while True:
        secim = input("Seçimin (1/2/3): ").strip()
        if secim in ZORLUKLAR:
            return ZORLUKLAR[secim]
        print("Lütfen 1, 2 ya da 3 yaz.")


def tur_oyna():
    ad, ust_sinir, hak = zorluk_sec()
    gizli = random.randint(1, ust_sinir)
    toplam_hak = hak
    print(ad, "seviye: 1 ile", ust_sinir, "arasında bir sayı tuttum.", hak, "hakkın var.")

    while hak > 0:
        tahmin = sayi_al(1, ust_sinir)
        hak -= 1
        if tahmin == gizli:
            puan = hak * 10 + 10
            print("Bildin!", toplam_hak - hak, "denemede buldun. Bu turun puanı:", puan)
            return puan
        elif tahmin < gizli:
            print("Daha büyük. Kalan hak:", hak)
        else:
            print("Daha küçük. Kalan hak:", hak)

    print("Hakların bitti. Tuttuğum sayı:", gizli)
    return 0


def main():
    skor = 0
    tur = 0
    while True:
        tur += 1
        print("\n--- Tur", tur, "---")
        skor += tur_oyna()
        print("Toplam skorun:", skor)
        cevap = input("Tekrar oynamak ister misin? (e/h): ").strip().lower()
        if cevap != "e":
            break
    print("Oyun bitti.", tur, "tur oynadın, toplam skorun:", skor)


main()

Kodun parçaları

ParçaGörevi
ZORLUKLARBir sözlük (dictionary). Her seçim numarasına seviye adı, üst sınır ve hak sayısı bağlanır. Yeni seviye eklemek için tek satır yeterli.
sayi_al()4. adımdaki güvenli giriş fonksiyonu.
zorluk_sec()Oyuncu 1, 2 ya da 3 yazana kadar sorar ve seçilen ayarları döndürür.
tur_oyna()Bir tur oynatır ve kazanılan puanı döndürür. Kaybedilen tur 0 puandır.
main()Turları döndürür, skoru toplar, "tekrar oynamak ister misin?" diye sorar.

Puan nasıl hesaplanıyor? puan = hak * 10 + 10. Burada hak, bulduğun anda kalan hakkın. Ne kadar erken bulursan o kadar çok hak kalır, puanın da o kadar yüksek olur. Son hakkında bulsan bile 10 puan alırsın. Bu formülü istediğin gibi değiştirebilirsin; mesela zor seviyede puanı iki katına çıkarmak gibi.

Zorluk ayarları rastgele seçilmedi. 1–1000 arasında akıllı bir strateji sayıyı en fazla 10 denemede bulur (çünkü 2'yi 10 kez kendisiyle çarpınca 1024 eder, bu da 1000'den büyüktür). Bu yüzden "Zor" seviyede 10 hak var: tam yetecek kadar, hata payı yok.

Kısaltılmış örnek bir oturum:

--- Tur 1 ---
Zorluk seç: 1) Kolay  2) Orta  3) Zor
Seçimin (1/2/3): 2
Orta seviye: 1 ile 100 arasında bir sayı tuttum. 7 hakkın var.
Tahminin: 50
Daha büyük. Kalan hak: 6
Tahminin: 82
Bildin! 2 denemede buldun. Bu turun puanı: 60
Toplam skorun: 60
Tekrar oynamak ister misin? (e/h): h
Oyun bitti. 1 tur oynadın, toplam skorun: 60

Bonus: Rolleri değiştir, bilgisayar tahmin etsin

Şimdi sen bir sayı tut, bilgisayar bulsun. Bilgisayar her seferinde kalan aralığın tam ortasını söyler. "Büyük" dersen alt sınır yükselir, "küçük" dersen üst sınır düşer. Böylece aralık her adımda yarıya iner. Bu yönteme ikili arama (binary search) denir ve gerçek yazılımlarda büyük listelerde hızlı arama yapmak için kullanılır.

# Bilgisayar tahmin ediyor: ikili arama
alt = 1
ust = 100
deneme = 0
print("1 ile 100 arasında bir sayı tut. Ben tahmin edeceğim.")

while alt <= ust:
    orta = (alt + ust) // 2
    deneme += 1
    cevap = input("Senin sayın " + str(orta) + " mi? (b: büyük, k: küçük, d: doğru): ").strip().lower()
    if cevap == "d":
        print(deneme, "denemede buldum!")
        break
    elif cevap == "b":
        alt = orta + 1
    elif cevap == "k":
        ust = orta - 1
    else:
        deneme -= 1
        print("Sadece b, k ya da d yaz.")
else:
    print("Bir yerde yanlış cevap verdin galiba, aralık kalmadı.")

1'den 100'e kadar hangi sayıyı tutarsan tut, doğru cevap verdiğin sürece bilgisayar sayını bulur ve hiçbir zaman 7 denemeyi geçmez. 3. adımdaki "7 hak yeter" iddiasının kanıtı bu. // işareti tam sayı bölmesidir: (1 + 100) // 2 sonucu 50 verir, küsuratı atar.

Sık yapılan hatalar

  • int() unutmak: tahmin = input("Tahminin: ") yazıp int eklemezsen tahmin bir metin olur. tahmin == gizli her zaman False çıkar, çünkü "5" ile 5 eşit değildir. tahmin < gizli yazarsan da TypeError hatası alırsın.
  • = ile == karıştırmak: if tahmin = gizli: yazmak SyntaxError verir. Karşılaştırma için çift eşittir kullanılır.
  • Gizli sayıyı döngünün içinde üretmek: Sayı her turda değişir, oyun kazanılamaz. random.randint satırı döngüden önce bir kez çalışmalı.
  • Sonsuz döngü: while True: içinde break yoksa, ya da while hak > 0: içinde hak hiç azalmıyorsa program durmaz. Bu olursa çoğu ortamda Ctrl + C ile durdurabilirsin.
  • Girinti hatası: if, while ve def satırlarının altındaki kodlar 4 boşluk içeride olmalı. Bir satırı yanlış hizalamak IndentationError ya da daha sinsi bir sorun doğurur: kod çalışır ama yanlış zamanda.
  • import random satırını unutmak: NameError: name 'random' is not defined hatası alırsın.
  • randint ile range sınırlarını karıştırmak: random.randint(1, 10) 10'u da verebilir, ama range(1, 10) 10'u içermez. İkisi farklı kurallara uyar.

Hata mesajlarını okumayı öğrenmek istersen Yeni başlayanların en sık kod hataları rehberi her hatayı örnekle açıklıyor.

Kendin dene

Aşağıdaki görevler kolaydan zora doğru sıralandı. Her birini editörde deneyip çalıştığını görmeden bir sonrakine geçme.

  1. Isınma: 1. adımdaki kodu değiştir; aralık 1–20 olsun ve doğru bilince ekrana kendi adınla bir tebrik mesajı yazsın.
  2. Sıcak / soğuk: 2. adımdaki koda ek ipucu ekle. Tahmin ile gizli sayı arasındaki fark 5 ya da daha azsa "Çok yaklaştın!" yazsın. İpucu: farkı abs(tahmin - gizli) ile bulabilirsin.
  3. Tekrarlanan tahmin: Oyuncu aynı sayıyı ikinci kez söylerse "Bunu zaten denedin" uyarısı versin ve hakkı azalmasın. İpucu: tahminleri bir listede tut (denenenler = [], denenenler.append(tahmin), if tahmin in denenenler:).
  4. Rekor: Tam oyuna "en iyi tur" özelliği ekle. Oyun bitince en az denemede kazanılan turu ve deneme sayısını göstersin.
  5. İki oyunculu mod: Bonus bölümdeki ikili arama fikrini kullanarak bilgisayara karşı yarış yap: önce sen bilgisayarın sayısını tahmin et, sonra bilgisayar seninkini. Daha az denemede bulan kazansın.
Ebeveynler ve öğretmenler için: Bu proje, çocuğun bir problemi küçük adımlara bölmesini çok somut bir şekilde gösterir. Her adımı ayrı bir oturum olarak düşünebilirsiniz; kodun tamamını tek seferde yazdırmak yerine bir adımı bitirip çalıştırması, sonra bir sonrakine geçmesi daha kalıcı öğrenme sağlar. Çocuğa "neden 7 hak?" sorusunu kodu açmadan, kağıt üzerinde birbirinize sayı tutturarak sordurmak, ikili arama fikrini bilgisayarsız kavratmanın etkili bir yoludur. Hata çıktığında hemen düzeltmek yerine "hata mesajı ne diyor?" diye sorun; mesajı okumak başlı başına bir beceridir. Blok tabanlı kodlamadan gelen çocuklar için Scratch'ten Python'a geçiş rehberi bu projeden önce faydalı olabilir.

Sık sorulan sorular

Bu oyunu yazmak için ne kadar Python bilmem gerekiyor?

Değişken oluşturmayı ve print() ile ekrana yazı yazdırmayı biliyorsan başlayabilirsin. random, input, if ve while gibi gereken her şey rehberde adım adım anlatılıyor. Fonksiyon ve try/except gibi biraz daha ileri konular son adımlarda, örnekleriyle birlikte geliyor.

random.randint ile üretilen sayılar gerçekten rastgele mi?

Tam olarak değil. Bilgisayarlar bu sayıları bir hesaplama yöntemiyle üretir, bu yüzden bunlara sözde rastgele (pseudo-random) sayı denir. Oyunlar ve alıştırmalar için fazlasıyla yeterlidir. Şifre gibi güvenlik gerektiren işler için ise Python'un secrets modülü kullanılır.

Oyuncu sayı yerine harf yazınca program neden kapanıyor?

int() fonksiyonu "elli" gibi bir metni sayıya çeviremez ve ValueError hatası verir. Bu hata yakalanmazsa program durur. Çözüm, 4. adımdaki gibi int() satırını try bloğuna koymak ve except ValueError ile kullanıcıya uyarı gösterip yeniden sormaktır.

1 ile 100 arasındaki bir sayıyı bulmak için kaç hak yeterli?

Her seferinde kalan aralığın ortasını tahmin edersen en fazla 7 denemede kesin bulursun, çünkü her tahmin aralığı yarıya indirir ve 2'nin 7. kuvveti olan 128, 100'den büyüktür. Aynı mantıkla 1 ile 1000 arası için 10 deneme yeterlidir. Bu yönteme ikili arama denir.

Oyunu bitirdikten sonra ne yapmalıyım?

Önce Kendin dene bölümündeki görevleri çöz; özellikle tahmin listesi ve rekor özelliği yeni beceriler kazandırır. Sonra Python Turtle ile çizim rehberine geçebilir ya da aynı mantığı JavaScript ile tarayıcıda çalışan oyunlara taşımak için JavaScript Pong oyunu rehberini deneyebilirsin.

Öğrendiklerini hemen dene! 🚀

Kurulum yok: kodu tarayıcıdaki editöre yapıştır, çalıştır, değiştir.

💻 Kod Editörünü Aç📚 Ücretsiz Derslere Başla

Sıradaki rehberler