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ı.
- 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. 😄
- 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.
- 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ı.
- 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.
- 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ı.
- 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()








