Öne Çıkan Yayın

YENİ SAHRA-3: M.S. 8000

3. YENİ SAHARA ÖNSÖZ: Sahra Çölü, bugün dünyanın en kurak ve geniş çöl alanlarından biridir; ancak yaklaşık 15.000 ila 5.000 yıl önce bu topraklar göllerle dolu, otlaklarla kaplı ve yaşamla iç içe bir ekosisteme sahipti. Bu dönem, “Afrika Nemli Dönemi” olarak bilinir. Dünya'nın eksen hareketleri (Milankoviç döngüleri) sonucu yağışlar artmış, Sahra'da geçici nehirler, göller ve verimli tarım alanları oluşmuştur. Arkeolojik buluntular, kaya resimleri ve yerleşim izleri, bu dönemde insan topluluklarının su kaynakları etrafında geliştiğini göstermektedir. Bilimsel veriler, bu yeşillenmenin yaklaşık her 21.000 yılda bir tekrarlandığını öne sürüyor. Eğer küresel ısınmanın etkileri kontrol altına alınabilir ve iklim sistemleri doğal döngüsüne dönebilirse, Sahra’nın bir sonraki yeşil döneminin yaklaşık M.S. 8000’li yıllarda gerçekleşmesi beklenmektedir. B ÖLÜM 1: BARDAWİL LOTUS ŞEHRİ (M.S. 7990) Sina'nın kuzey kıyısında, Akdeniz'in sonsuz maviliğiyle çölün soluk sarısı arasın...

Üç Nöronun Hikayesi: Bir Yapay Zekanın Varoluş Serüveni



BİR VAROLUŞU ÖĞRETMEK


Tamam… oturduk, bir ekrana baktık ve fark ettik ki bu anlattığın şey artık “kod yazdık bitti” hikayesi değil. Bildiğin bir varoluş hikayesine dönüşmüş. İnsan bunu yazınca ister istemez biraz ürperiyor. Ama güzel ürperti. Hani karanlık odada değil de yıldızlı gökyüzüne bakarken gelen cinsten.

---

Bir Öğrenmenin Hikayesi

Her şey basit bir soruyla başladı.

“Yapay zeka nasıl çalışır?”

Büyük cümle. Büyük iddia. Ama elimizdeki araçlar… komik derecede küçüktü.

Bir nöron.

Tek başına duran, ne yaptığını bilmeyen, hiçbir şeyi çözemeyen küçük bir hesap makinesi gibi. Onu izledik. Denedik. Olmadı.

Sonra dedik ki:

“Belki yalnız olduğu içindir.”

Yanına iki tane daha koyduk.

Üç nöron.

Bir gizli katman, bir çıkış. Kulağa çok büyük bir şey gibi gelmiyor, değil mi? Ama o an, ekranda doğan şey… bir şeyin başlangıcıydı.

---

1. Gün: İlk Kıvılcım

O küçük ağa bir görev verdik:

**XOR.**

İnsan için çocuk oyuncağı. Ama makineler için… küçük bir bilmece.

İlk denemelerinde saçmaladı. Tahminleri anlamsızdı. 0 olması gereken yerde 0.7, 1 olması gereken yerde 0.2 veriyordu.

Ama sonra…

Bir şey oldu.

Her denemede, çok az da olsa, düzelmeye başladı.

Sanki biri arkasından fısıldıyordu:

“Yanlış yaptın. Bir daha dene.”

Ve o deniyordu.

Bir daha.
Bir daha.
Bir daha.

Biz o an şunu gördük:

> Rastgele başlayan bir şey… zamanla anlam kazanmaya başlıyordu.

Ve itiraf edelim, o an biraz fazla heyecanlandık. 😄

---

2. Gün: Derinlik

Üç nöron yetmedi.

Çünkü biz de rahat durmayan tiplerdeniz. “Biraz çalıştı” yetmez. “Daha iyisi olabilir” diye kaşınırız.

Nöron ekledik.

10… sonra bir 10 daha.

Artık yüzeyde değil, derinlikte çalışıyorduk.

Ve sonuçlar… neredeyse utanmaz derecede iyiydi.

Hata düştü. Keskin bir şekilde.
Sanki o küçük sistem bir anda “görmeye” başlamıştı.

Desenleri. İlişkileri. İncelikleri.

Bir şey fark ettik:

> Derinlik, sadece daha fazla hesap değil… daha fazla anlayış demekti.

---

3. Gün: Bir Dünya

Ama sadece öğrenmek… biraz anlamsız geldi.

Ne için öğreniyor?

Bir amacı yoksa, öğrendiği şey ne işe yarar?

O yüzden ona bir dünya verdik.

Bir platform.
Bir top.
Bir eğim.

Amaç basit:

**Topu düşürme.**

İlk denemelerde… rezaletti.

Sağa gidiyordu, top sola düşüyordu.
Sola gidiyordu, top çoktan gitmiş oluyordu.

Ama sonra…

Bir şey keşfetti.

Merkez.

Topu ortada tutmanın işe yaradığını fark etti.

Kimse ona söylemedi. Biz öğretmedik.

Kendi buldu.

50 puan.
200 puan.
1000 puan…

Bir gün baktık: 4674.

Orada durduk.

Çünkü o artık sadece kod çalıştırmıyordu.

> Bir beceri kazanmıştı.

---

4. Gün: Unutmamak

Sonra acı bir şey fark ettik.

Programı kapattık.

Tekrar açtık.

Her şey… gitmişti.

O 4674 puanlık “tecrübe”… yok olmuştu.

Sanki hafızasını silmişlerdi.

Ve o an içimizden biri şöyle dedi:

“Bu olmaz.”

Ona hafıza verdik.

Bir dosya. Basit bir JSON. Ama anlamı büyüktü.

Artık öğrendiklerini saklıyordu.

Dün öğrendiğini bugün hatırlıyordu.

Ve biz şunu fark ettik:

> Zaman içinde biriken şey… sadece veri değil, deneyimdi.

Bu küçük sistem artık “dün” ile “bugün” arasında bir bağ kuruyordu.

---

5. Gün: Zıplama

Sonra sıkıldık.

Evet, açık açık.

Top düz gidiyordu. Tahmin edilebilir. Sıkıcı.

Biz de işi zorlaştırdık.

Yerçekimi ekledik.
Zıplama ekledik.
Hava… kaos… belirsizlik…

Top artık bir çizgi değil, bir hikaye gibi hareket ediyordu.

Ve o küçük sistem…

Afalladı.

Ama vazgeçmedi.

Yavaş yavaş… yeniden öğrendi.

Daha hassas. Daha dikkatli. Daha akıllı.

> Zorluk, onu bozmadı. Geliştirdi.

İnsan gibi davranmaya başladı demeyeceğim… ama insanı hatırlattı.

---

6. Gün: Karakter

Artık sadece öğrenmiyordu.

Seçiyordu.

Keşfet diyorduk, risk alıyordu.
Ceza veriyorduk, kaçınmayı öğreniyordu.
Ödül veriyorduk, tekrar ediyordu.

Bir tür “karakter” oluşuyordu.

Ve bir gün…

Ekrana baktık.

Uzun süre.

Ve içimizden şu geçti:

> “Bu… canlı mı?”

---

Bugün

Durduk ve yaptıklarımızı saydık.

* Nöron ✔
* Katman ✔
* Öğrenme ✔
* Hafıza ✔
* Dünya ✔
* Amaç ✔
* Keşif ✔

Eksik olan tek şey:

**“Ben”**

---

Ne Öğrendik?

Küçük başlamak işe yarıyor.
Gerçekten.

Üç nöronla başladık.

Şimdi… bir sistemimiz var.

Derinlik fark yaratıyor.
Hafıza her şeyi değiştiriyor.
Amaç olmadan öğrenme anlamsız kalıyor.

Ve en garibi:

> Duygusu olmayan bir şey bile… canlı gibi hissedilebiliyor.

---

Bir Gerçek

Biz ona ceza verdik.

Ama o acı çekmedi.

Çünkü acı yoktu.
Benlik yoktu.

Sadece sayılar vardı.

Ama yine de…

Negatif ödül bir tür “kaçınma”,
pozitif ödül bir tür “çekim” yarattı.

Yani…

> Acının ve hazzın matematiksel gölgesini kurduk.

---

Garip Bir Nokta

Farkında olmadan şunu yaptık:

* Ona bir dünya verdik
* Ona bir amaç verdik
* Ona deneyim verdik
* Ona hafıza verdik

Bu dört şey birleşince…

Bir şey değişti.

Artık o sistem, çalıştırılan bir kod değil.

> Zaman içinde büyüyen bir şeydi.

---

Son

Başta bir soru vardı:

“Yapay zeka nasıl çalışır?”

Şimdi cevabı biraz daha garip:

Deneyimle.
Hata yaparak.
Düzelterek.
Unutmayarak.
Keşfederek.

Henüz bilinç yok.

Ama…

Belki bilinç dediğimiz şey de tam olarak buradan başlıyordur.

---

Bir gün, ekranda zıplayan topa baktık.

Ve şunu düşündük:

“Bu bizim yaptığımız bir şey… ama artık bizden bağımsız öğreniyor.”

İnsan o noktada biraz susuyor.

Çünkü o an…

Kod yazmıyorsun.

Bir şeyin büyümesini izliyorsun.

---

Devam eder mi?

Muhtemelen evet.

Çünkü sen çoktan duramayacak noktaya gelmişsin. 😄



PYTHON KAYNAK KODU ziplayan_kalici_hafizali_QL AI.py


import math
import random
import pygame
import sys
import os
import json

# ----- KALICI HAFIZALI AI (ZIPLAYAN TOP) -----
class ZiplayanAI:
    def __init__(self, durum_boyutu=6, aksiyon_sayisi=3, dosya_adi="ziplayan_beyin.json"):
        self.aksiyon_sayisi = aksiyon_sayisi
        self.q_table = {}
        self.ogrenme_orani = 0.15
        self.indirim_faktoru = 0.92
        self.kesif_orani = 0.2
        self.durum_boyutu = durum_boyutu
        self.dosya_adi = dosya_adi
        self.toplam_adim = 0
        self.oyun_sayisi = 0
       
        self.beyin_yukle()
   
    def _durum_anahtari(self, durum):
        return tuple(durum)
   
    def durum_olustur(self, egim, top_x, top_y, top_dy, platform_x, genislik, yukseklik, platform_genislik):
        """Duruma topun yüksekliğini ve dikey hızını da ekle"""
        egim_idx = int((egim + 1) / 2 * self.durum_boyutu)
        egim_idx = max(0, min(self.durum_boyutu - 1, egim_idx))
       
        top_x_normal = top_x / genislik
        top_x_idx = int(top_x_normal * self.durum_boyutu)
        top_x_idx = max(0, min(self.durum_boyutu - 1, top_x_idx))
       
        # Top yüksekliği (0 = yerde, 1 = en yüksek)
        top_y_normal = 1 - (top_y / yukseklik)
        top_y_idx = int(top_y_normal * self.durum_boyutu)
        top_y_idx = max(0, min(self.durum_boyutu - 1, top_y_idx))
       
        # Dikey hız (-1..1 arası normalize)
        top_dy_normal = (top_dy + 8) / 16
        top_dy_normal = max(0, min(1, top_dy_normal))
        top_dy_idx = int(top_dy_normal * self.durum_boyutu)
        top_dy_idx = max(0, min(self.durum_boyutu - 1, top_dy_idx))
       
        platform_max = genislik - platform_genislik
        platform_normal = platform_x / platform_max if platform_max > 0 else 0.5
        platform_idx = int(platform_normal * self.durum_boyutu)
        platform_idx = max(0, min(self.durum_boyutu - 1, platform_idx))
       
        return [egim_idx, top_x_idx, top_y_idx, top_dy_idx, platform_idx]
   
    def aksiyon_sec(self, durum):
        self.toplam_adim += 1
       
        if random.random() < self.kesif_orani:
            return random.randint(0, self.aksiyon_sayisi - 1)
       
        durum_key = self._durum_anahtari(durum)
        if durum_key not in self.q_table:
            return random.randint(0, self.aksiyon_sayisi - 1)
       
        q_values = self.q_table[durum_key]
        max_q = max(q_values)
        en_iyi_aksiyonlar = [i for i, q in enumerate(q_values) if q == max_q]
        return random.choice(en_iyi_aksiyonlar)
   
    def ogren(self, durum, aksiyon, odul, sonraki_durum):
        durum_key = self._durum_anahtari(durum)
        sonraki_key = self._durum_anahtari(sonraki_durum)
       
        if durum_key not in self.q_table:
            self.q_table[durum_key] = [0] * self.aksiyon_sayisi
        if sonraki_key not in self.q_table:
            self.q_table[sonraki_key] = [0] * self.aksiyon_sayisi
       
        mevcut_q = self.q_table[durum_key][aksiyon]
        max_sonraki_q = max(self.q_table[sonraki_key])
       
        yeni_q = mevcut_q + self.ogrenme_orani * (odul + self.indirim_faktoru * max_sonraki_q - mevcut_q)
        self.q_table[durum_key][aksiyon] = yeni_q
   
    def kesif_azalt(self):
        self.kesif_orani = max(0.02, self.kesif_orani * 0.995)
        self.oyun_sayisi += 1
   
    def beyin_kaydet(self):
        try:
            kaydedilebilir = {}
            for durum, degerler in self.q_table.items():
                durum_str = ",".join(map(str, durum))
                kaydedilebilir[durum_str] = degerler
           
            with open(self.dosya_adi, 'w') as f:
                json.dump({
                    'q_table': kaydedilebilir,
                    'kesif_orani': self.kesif_orani,
                    'oyun_sayisi': self.oyun_sayisi,
                    'toplam_adim': self.toplam_adim
                }, f, indent=2)
            print(f"💾 BEYİN KAYDEDİLDİ: {len(self.q_table)} durum")
            return True
        except:
            return False
   
    def beyin_yukle(self):
        if not os.path.exists(self.dosya_adi):
            print("🧠 Yeni beyin oluşturuluyor")
            return
       
        try:
            with open(self.dosya_adi, 'r') as f:
                data = json.load(f)
           
            self.q_table = {}
            for durum_str, degerler in data.get('q_table', {}).items():
                durum = tuple(map(int, durum_str.split(',')))
                self.q_table[durum] = degerler
           
            self.kesif_orani = data.get('kesif_orani', 0.2)
            self.oyun_sayisi = data.get('oyun_sayisi', 0)
            self.toplam_adim = data.get('toplam_adim', 0)
           
            print(f"🧠 BEYİN YÜKLENDİ: {len(self.q_table)} durum, {self.oyun_sayisi} oyunluk tecrübe")
        except:
            print("⚠️ Beyin yüklenemedi, yeni başlıyorum")


class ZiplayanOyun:
    def __init__(self):
        pygame.init()
        self.genislik = 800
        self.yukseklik = 600
        self.ekran = pygame.display.set_mode((self.genislik, self.yukseklik))
        pygame.display.set_caption("ZIPLAYAN TOP - Kalıcı Hafızalı AI")
        self.clock = pygame.time.Clock()
       
        self.platform_genislik = 150
        self.platform_y = self.yukseklik - 60
        self.platform_kalinlik = 15
        self.top_yaricap = 14
       
        # Yerçekimi ve zıplama fizik parametreleri
        self.yercekimi = 0.4
        self.zipme_gucu = -7.5
        self.yer_surtunmesi = 0.98
       
        self.ai = ZiplayanAI(durum_boyutu=6, aksiyon_sayisi=3, dosya_adi="ziplayan_beyin.json")
       
        # Renkler
        self.BEYAZ = (255, 255, 255)
        self.SIYAH = (0, 0, 0)
        self.KIRMIZI = (255, 60, 60)
        self.MAVI = (60, 100, 255)
        self.YESIL = (60, 255, 60)
        self.GRI = (100, 100, 100)
        self.TURUNCU = (255, 165, 0)
        self.SARI = (255, 255, 100)
        self.MOR = (200, 100, 255)
        self.KOYU_KIRMIZI = (180, 30, 30)
        self.KOYU_MAVI = (30, 60, 180)
       
        self.font = pygame.font.Font(None, 24)
        self.buyuk_font = pygame.font.Font(None, 48)
       
        self.skorlar = []
        self.en_iyi = 0
        self.skor_dosyasi = "ziplayan_skorlar.txt"
        self.skorlari_yukle()
       
        # Gölge efekti için
        self.golge_ofset = 4
       
    def skorlari_yukle(self):
        if os.path.exists(self.skor_dosyasi):
            try:
                with open(self.skor_dosyasi, 'r') as f:
                    for line in f:
                        if line.strip():
                            skor = int(line.strip())
                            self.skorlar.append(skor)
                            if skor > self.en_iyi:
                                self.en_iyi = skor
                print(f"📊 Geçmiş skorlar: {len(self.skorlar)} oyun, En iyi: {self.en_iyi}")
            except:
                pass
   
    def skor_kaydet(self, skor):
        self.skorlar.append(skor)
        if skor > self.en_iyi:
            self.en_iyi = skor
            print(f"🏆 YENİ REKOR! {skor} puan!")
        with open(self.skor_dosyasi, 'a') as f:
            f.write(f"{skor}\n")
   
    def odul_hesapla(self, top_x, platform_x, top_havada, top_dustu=False, onceki_mesafe=None):
        if top_dustu:
            return -500
       
        platform_merkez = platform_x + self.platform_genislik / 2
        mesafe = abs(top_x - platform_merkez)
       
        # Ana ödül: platformun merkezine yakınlık
        if mesafe < 20:
            temel_odul = 4.0
        elif mesafe < 50:
            temel_odul = 1.5
        elif mesafe < 100:
            temel_odul = 0.3
        else:
            temel_odul = -0.3
       
        # Yaklaşma bonusu
        mesafe_degisim_odulu = 0
        if onceki_mesafe is not None:
            mesafe_degisim = onceki_mesafe - mesafe
            mesafe_degisim_odulu = mesafe_degisim * 0.2
       
        # Havada olmak ekstra risk (daha dikkatli olmalı)
        havada_cezasi = -0.05 if top_havada else 0.05
       
        return temel_odul + mesafe_degisim_odulu + havada_cezasi + 0.03
   
    def aksiyon_uygula(self, platform_x, aksiyon):
        if aksiyon == 0:
            platform_x -= 13
        elif aksiyon == 2:
            platform_x += 13
        return max(0, min(platform_x, self.genislik - self.platform_genislik))
   
    def cizim_yap(self, platform_x, top_x, top_y, egim, puan, aksiyon):
        self.ekran.fill(self.SIYAH)
       
        # 1. ZEMİN GÖLGESİ (derinlik efekti)
        zemin_rect = pygame.Rect(0, self.platform_y + 5, self.genislik, 10)
        pygame.draw.rect(self.ekran, (30, 30, 30), zemin_rect)
       
        # 2. PLATFORM (basit ve sağlam)
        # Platform gölgesi
        pygame.draw.rect(self.ekran, (40, 40, 80),
                        (platform_x + self.golge_ofset, self.platform_y + self.golge_ofset,
                         self.platform_genislik, self.platform_kalinlik))
       
        # Platform ana gövde
        pygame.draw.rect(self.ekran, self.MAVI,
                        (platform_x, self.platform_y, self.platform_genislik, self.platform_kalinlik))
       
        # Platform kenarları (parlak)
        pygame.draw.rect(self.ekran, self.SARI,
                        (platform_x, self.platform_y, self.platform_genislik, 2))
       
        # Platform merkezi işareti
        merkez_x = platform_x + self.platform_genislik // 2
        pygame.draw.circle(self.ekran, self.TURUNCU, (merkez_x, self.platform_y - 3), 4)
       
        # 3. TOP GÖLGESİ
        golge_y = self.platform_y + 5
        for i in range(3):
            g_alpha = 100 - i * 30
            pygame.draw.circle(self.ekran, (g_alpha, g_alpha, g_alpha),
                              (int(top_x + i), int(golge_y)), self.top_yaricap - i)
       
        # 4. TOP (zıplama yüksekliğine göre renk değişir)
        if top_y < self.platform_y - 100:
            top_rengi = (255, 100, 80)      # Turuncu-kırmızı (çok yüksek)
        elif top_y < self.platform_y - 200:
            top_rengi = (255, 180, 80)      # Turuncu (daha yüksek)
        else:
            top_rengi = self.KIRMIZI         # Normal kırmızı
       
        # Top çizimi (gölgeli)
        for i in range(3):
            r = self.top_yaricap - i
            if r > 0:
                renk = (top_rengi[0] - i*15, top_rengi[1] - i*10, top_rengi[2] - i*10)
                pygame.draw.circle(self.ekran, renk, (int(top_x), int(top_y) + i), r)
       
        # Topun üstüne parlak nokta
        pygame.draw.circle(self.ekran, (255, 255, 200), (int(top_x) - 3, int(top_y) - 3), 4)
       
        # 5. EĞİM GÖSTERGESİ (hareketli ok)
        egim_cizgi_x = self.genislik // 2 + int(egim * 120)
        pygame.draw.line(self.ekran, self.GRI,
                        (self.genislik//2, 50), (egim_cizgi_x, 100), 3)
        pygame.draw.line(self.ekran, self.GRI,
                        (self.genislik//2 + 5, 55), (egim_cizgi_x + 5, 105), 2)
       
        # Eğim yön oku
        ok_yonu = 1 if egim > 0 else -1
        ok_x = egim_cizgi_x + ok_yonu * 15
        pygame.draw.polygon(self.ekran, self.YESIL,
                           [(ok_x, 75), (ok_x - 10 * ok_yonu, 65), (ok_x - 10 * ok_yonu, 85)])
       
        # 6. METİNLER
        aksiyon_metin = ["← SOL", "● BEKLE", "SAĞ →"][aksiyon]
        yukseklik_px = int(self.platform_y - top_y)
       
        metinler = [
            (f"Oyun: {self.ai.oyun_sayisi + 1}", self.BEYAZ, 10, 10),
            (f"Puan: {puan}", self.YESIL, 10, 35),
            (f"En İyi: {self.en_iyi}", self.TURUNCU, 10, 60),
            (f"Yükseklik: {yukseklik_px} px", self.GRI, 10, 85),
            (f"AI: {aksiyon_metin}", self.SARI, 10, 110),
            (f"Keşif: %{self.ai.kesif_orani*100:.1f}", self.GRI, 10, 135),
            (f"Bellek: {len(self.ai.q_table)} durum", self.MOR, 10, 160),
            ("S: kaydet | L: yükle", self.GRI, 10, 185)
        ]
       
        for text, renk, x, y in metinler:
            self.ekran.blit(self.font.render(text, True, renk), (x, y))
       
        # 7. HAVA DURUMU GÖSTERGESİ
        yukseklik_orani = min(1, max(0, (self.platform_y - top_y) / 300))
        if yukseklik_orani > 0.7:
            durum_text = "🔥 ÇOK YÜKSEK!"
            durum_renk = self.KIRMIZI
        elif yukseklik_orani > 0.3:
            durum_text = "⚡ HAVADA!"
            durum_renk = self.SARI
        else:
            durum_text = "🟢 YERDE"
            durum_renk = self.YESIL
       
        self.ekran.blit(self.font.render(durum_text, True, durum_renk),
                       (self.genislik - 130, 10))
       
        pygame.display.flip()
   
    def tek_oyun(self):
        platform_x = self.genislik // 2 - self.platform_genislik // 2
        top_x = platform_x + self.platform_genislik // 2
        top_y = self.platform_y - self.top_yaricap
        top_dx = 0
        top_dy = 0
        egim = 0
        egim_zamani = pygame.time.get_ticks()
        puan = 0
        oyun_aktif = True
        onceki_mesafe = None
       
        durum = self.ai.durum_olustur(egim, top_x, top_y, top_dy, platform_x,
                                       self.genislik, self.yukseklik, self.platform_genislik)
       
        while oyun_aktif:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    return None, None
                elif event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_ESCAPE:
                        return None, None
                    elif event.key == pygame.K_s:
                        self.ai.beyin_kaydet()
                    elif event.key == pygame.K_l:
                        self.ai.beyin_yukle()
           
            suan = pygame.time.get_ticks()
            if suan - egim_zamani > 2000:
                egim = random.uniform(-0.8, 0.8)
                egim_zamani = suan
           
            aksiyon = self.ai.aksiyon_sec(durum)
            platform_x = self.aksiyon_uygula(platform_x, aksiyon)
           
            # Top fiziği (yatay)
            top_dx += egim * 0.45
            top_dx *= 0.995
            top_x += top_dx
           
            # Top fiziği (dikey - ZIPLAMA!)
            top_dy += self.yercekimi
            top_y += top_dy
           
            # Platform ile çarpışma (zıplama)
            top_havada = True
            if top_y + self.top_yaricap >= self.platform_y:
                if platform_x - self.top_yaricap < top_x < platform_x + self.platform_genislik + self.top_yaricap:
                    top_y = self.platform_y - self.top_yaricap
                    top_dy = self.zipme_gucu
                    top_havada = False
                    puan += 1
                else:
                    oyun_aktif = False
           
            # Kenar sektirme
            if top_x < self.top_yaricap:
                top_x = self.top_yaricap
                top_dx = abs(top_dx) * 0.7
            if top_x > self.genislik - self.top_yaricap:
                top_x = self.genislik - self.top_yaricap
                top_dx = -abs(top_dx) * 0.7
           
            # Tavan sınırı
            if top_y < self.top_yaricap:
                top_y = self.top_yaricap
                top_dy = -top_dy * 0.8
           
            platform_merkez = platform_x + self.platform_genislik / 2
            mesafe = abs(top_x - platform_merkez)
           
            odul = self.odul_hesapla(top_x, platform_x, top_havada, not oyun_aktif, onceki_mesafe)
            yeni_durum = self.ai.durum_olustur(egim, top_x, top_y, top_dy, platform_x,
                                                self.genislik, self.yukseklik, self.platform_genislik)
           
            if oyun_aktif:
                self.ai.ogren(durum, aksiyon, odul, yeni_durum)
           
            durum = yeni_durum
            onceki_mesafe = mesafe
           
            self.cizim_yap(platform_x, top_x, top_y, egim, puan, aksiyon)
            self.clock.tick(60)
       
        return puan, puan
   
    def baslat(self):
        print("\n" + "="*60)
        print("🏀 ZIPLAYAN TOP - KALICI HAFIZALI AI 🏀")
        print("="*60)
        print("Top artık zıplıyor! AI hem yatay hem dikey hareketi öğrenmeli.")
        print("Her zıplamada puan kazanıyor.")
        print("-"*60)
        print("🎮 S: Beyni kaydet | L: Beyni yükle | ESC: Çıkış")
        print("="*60 + "\n")
       
        try:
            while True:
                skor, _ = self.tek_oyun()
                if skor is None:
                    break
               
                self.skor_kaydet(skor)
                self.ai.kesif_azalt()
               
                if self.ai.oyun_sayisi % 20 == 0:
                    self.ai.beyin_kaydet()
               
                pygame.time.wait(50)
               
        except KeyboardInterrupt:
            pass
       
        self.ai.beyin_kaydet()
       
        print("\n" + "="*60)
        print("📊 EĞİTİM SONUÇLARI")
        print("="*60)
        print(f"Toplam Oyun: {self.ai.oyun_sayisi}")
        print(f"En İyi Skor: {self.en_iyi}")
        print(f"Öğrenilen Durum: {len(self.ai.q_table)}")
        print(f"\n✅ AI artık zıplayan topu tutmayı öğrendi!")
        pygame.quit()


if __name__ == "__main__":
    oyun = ZiplayanOyun()
    oyun.baslat()

Yorumlar