Yapay Zekâ Ajanlarıyla Mobil Oyun Yapmak: Kalecik
8 dk okuma

Kalecik, parmağınla çizgi çektiğinde taşları tek tek dizilen bir sur ördüğün, iPhone ve iPad için sakin bir kale kurma oyunu. Yolu surun içinden geçirince kemerli bir kapı açılıyor, göletin üstünden geçirince köprüye dönüşüyor; koyunlar göletten su içiyor, gece olunca pencereler yanıyor.
Bu yazıda oyunun nasıl yapıldığını olduğu gibi anlatıyorum. İşin özü şu: kodu ben yazmadım. Kalecik’i, aynı anda çalışan beş Claude Code oturumunu yöneterek yaptım. Ben ne istediğimi anlattım, kararları verdim, her sürümü telefonumda denedim ve gördüğümü geri bildirdim; kodu ajanlar yazdı. Boş bir klasörden telefona kurulan ilk sürüme kadar yaklaşık iki buçuk saat geçti. Bu yazı o sürecin haritası; teknik ayrıntılar serinin diğer yazılarında.
Fikir: Tiny Glade neden telefonda yok?
Her şey bir soruyla başladı. Claude’a Tiny Glade’i bilip bilmediğini sordum ve dürüst bir fikir istedim. Tiny Glade, Pounce Light’ın bilgisayar oyunu: çizerek kale ve köy kurduğun, hedefsiz, çok güzel bir oyun. Resmî bir iPhone ya da Android sürümü yok.
Claude’un cevabı beklediğimden daha dürüsttü. Oyunun Rust ve Bevy ile yazıldığını, gerçek zamanlı küresel aydınlatma kullandığını, birebir bir kopyanın çok zor olduğunu söyledi. Mobil için birebir kopya yerine aynı hissi veren, daha sade bir melez önerdi. Karar oradan çıktı: aynı türde, dokunmatik ekran için baştan tasarlanmış, bağımsız bir oyun. Kalecik Tiny Glade’den ilham alıyor ama onunla bir bağı yok; bunu ürün sayfasında da açıkça yazıyoruz.
Neden Godot?
İkinci sorum motor seçimiydi. Prosedürel modelleme yapacaktık ve oyun mobilde çalışacaktı. Claude Godot’yu önerdi, gerekçesi de ilginçti: Godot’da sahne (.tscn), kod (.gd) ve shader (.gdshader) düz metin dosyası. Bir yapay zekâ ajanı bütün projeyi komut satırından ve metin dosyalarından yönetebiliyor; editörde tıklamak zorunda kalmıyor. Unity’de aynı iş, editör arayüzüne çok daha bağımlı.
Sonuç: Godot 4.7.2, Mobile renderer, her şey GDScript. Tek yerel kod, fotoğrafları galeriye kaydeden küçük bir Objective-C++ eklentisi. Geri kalan her şey, taşlar, evler, köprüler, ağaçlar, hayvanlar, kodla üretiliyor. Projede hazır bir 3B model dosyası yok.
İlk iki buçuk saat: çizgiden sura, suradan telefona
Zaman çizelgesi kabaca şöyle ilerledi (saatler 24 Eylül akşamı):
- 20:36 Boş klasörde ilk mesaj.
- 20:50 İlk dosyalar: sahne, çizgi araçları, sur yolu ve taş işçiliği.
- 21:06 Mac’te ilk demo: çizgi çekiyorsun, taş bir sur çıkıyor, köşelerde kuleler kendiliğinden yükseliyor.
- 21:10 Fareyle çizim ayrıntılarını bırakmasını, bunun baştan mobil bir oyun olacağını söyledim.
- 21:58 Dokunmatik kontroller hazır.
- 22:59 Çizilen alandan evler, baca dumanı, koyunlar, kuşlar, kodla üretilen sesler, surdan geçince kapı açan parke yollar, taş/harabe/çit duvarlar, gündüz/akşam/gece ve fotoğraf modu.
- 23:02 iPhone 15 Pro Max’e ilk kurulum.

Oyunun motorundan bir kare: bir gecede çizgiden sura, suradan köye.
Telefonda oynamaya başlayınca liste hemen doldu: rüzgâr sesi deniz dalgası gibi dönüyordu, kamera fazla hassas ve sertti, karalama yapınca saçma yerlerde kule çıkıyordu, fotoğraf modunda deklanşör yoktu, telefon sessiz moddayken de oyunun hiç sesi çıkmıyordu (ben müziğin sessiz modda da çalmasını istedim). Bunları tek tek yazdım; ajan düzeltti, yeniden kurdu. Aynı gece arazi, gölet ve balıklar da geldi. Bir noktada koyunların göletin kıyısına inip su içtiğini fark edip şaşırdım; oyunun ruhunu tam yakalayan türden bir ayrıntıydı.
Gece yarısını sekiz geçe ilk commit’i attım: 62 dosya, 5.770 satır. Saat bire doğru ilk Android APK’sı da hazırdı.
Tek ajan yetmeyince: beş paralel oturum
Oyun büyüdükçe tek bir oturum darboğaz oldu. Gece yarısından sonra ikinci bir Claude Code oturumu açtım, sonra üçüncüsünü, sonunda beş oturum aynı projede aynı anda çalışıyordu. Her birinin kendi alanı vardı:
- Lider oturum: bağlantılar, prosedürel yapılar, köprüler, düzenleme tutamaçları, birinci şahıs gezme modu ve telefona kurulum.
- Ses ve görünüm: sesler, müzik, shader’lar, yeşillik, hava durumu, iç mekânlar.
- Performans ve doğa: telefonun ısınması, 20 ağaç türü, yaban hayatı, çimen.
- Yayın: App Store hazırlığı, açılış ekranı, kayıt yuvaları, ayarlar, 20 dil, fotoğraf eklentisi.
- Kalite kontrol: önce ikon seçimi, sonra testler, fuzz ve README.
Bu kadar ajanın aynı dosyalara dokunması doğal olarak sorun çıkardı. Çözüm, insan ekiplerinde de işe yarayan şeylerdi: README’de kimin hangi dosyadan sorumlu olduğunu gösteren bir tablo, oturumların birbirine mesaj atması ve telefona yalnızca tek bir oturumun kurulum yapması. Bir oturum dosya düzenlerken diğerinin yarım kalmış bir dosyayla derleme yapmaması için de her build ve testten önce proje klasörünün anlık bir kopyası alınıyordu.
İşin başında Google’ın Antigravity aracı da projede birkaç düzenleme yaptı; ev kanatlarının birbirine yapışması ve bir tepe hatasının düzeltmesi ondan. Bir noktada dışarıdan bir GPT incelemesi de aldım; açılışta çökme ve “Yeni köy” düğmesinin veri silmesi gibi gerçek hataları o yakaladı. Yani Kalecik’i tek bir yapay zekâ yapmadı; birkaç araç, benim yönetimimde birlikte çalıştı.
Benim işim neydi?
Kod yazmadıysam ne yaptım? Birkaç somut şey:
- Yön ve kapsam. Ne yapılacağını ve hangi sırayla yapılacağını ben belirledim. İlk liste yetince “bu projeyi gerçek anlamda müthiş bir şeye dönüştür” diye yeni bir hedef koydum; ikinci turda köprü uçlarının düzenlenmesi, surların üstünde yürüme, iç mekânlar, mevsimler ve çok daha fazla ağaç çeşidi istedim.
- Telefonda test. Her sürümü iPhone’umda oynadım, gördüğümü ekran görüntüsü ve kayıtla anlattım. Ajan telefonu göremiyor ve ısısını hissedemiyor; “telefon acayip ısındı” diyen bendim.
- Ürün kararları. Ad (Kalecik), fiyat (tek seferlik, reklamsız), ikon. Önerilen yapay zekâ ikonlarını fazla yapay buldum; sonunda ikon, oyunun kendi motorundan alınmış akşam ışığındaki bir avlu karesi oldu.
- Durmayı bilmek. İlk sürüm App Store Connect’e yüklendikten kısa süre sonra “bu oyun bitmeden App Store’a çıkmayalım” dedim. Uyumadan önce son mesajım da “her şeyi hallet ama sağlam yap” oldu; ajanlar sabaha kadar çalıştı, ben uyudum.
Ajan göremediğini nasıl doğruluyor?
En çok merak edilen soru bu. Ajan oyunu oynayamıyor, sesi duyamıyor. Bunun için oyunun içine test araçları yazıldı:
- Senaryolu dokunma testi. Oyun
--testparametresiyle açıldığında sahte dokunuşlarla sur çiziyor, ev kuruyor, ekran görüntüsü alıyor ve kontrolleri çalıştırıyor. Kontrol sayısı 15’ten başlayıp 50’ye çıktı. Ajan sonucu, motorun çektiği ekran görüntülerine bakarak da değerlendiriyor. - Fuzz testi. Rastgele oynayıp her adımda değişmez kuralları kontrol ediyor: kaydet, yükle, tekrar kaydet ve aynı sonucu al; hiçbir değer NaN olmasın; her şeyi geri alıp yeniden yapınca köy aynı kalsın.
- Ses için ölçüm. Ajan duyamadığı için müziğin ve efektlerin yüksekliği LUFS ve tepe değerleriyle, karakteri spektrogramla kontrol edildi. Bunun ayrıntıları oyun müziğini kodla üretmek yazısında.
Küçük ama öğretici bir not: testler çalışırken bilgisayardan oyun sesleri geliyordu ve bu beni rahatsız etti. O günden sonra her test sessiz ses sürücüsüyle çalıştırıldı. Ajanlarla çalışırken sizin konforunuz da bir gereksinim; söylemezseniz bilemezler.
Duvara tosladığımız yerler
Her şey düzgün gitmedi. Öne çıkanlar:
- Telefon ısındı. Sebep, oyunun iPhone’un 120 Hz ekranında saniyede 120 kare çizmesiydi. Çözüm ve ölçümler iPhone’u ısıtan oyun yazısında.
- Döngü sesleri deniz gibi. Sonunda oyunda hiçbir ses döngü olarak çalmıyor; her şey tek seferlik ve rastgele zamanlı.
- Görünmeyen hatalar. GDScript’te
PackedVector3Arraygibi diziler değer tipi; bir sözlükten alınıp değiştirilen dizi geri yazılmayınca 46 çimen parçasının hepsi boş kaldı. Hata, mağaza ekran görüntülerinde çimensiz zemin görülünce fark edildi. - Galeriye kaydetme. İlk denenen yöntem hiç tetiklenmedi; sonunda küçük bir yerel eklenti yazıldı.
- Mağaza API’si. App Store Connect API’si uygulama kaydını oluşturmaya izin vermedi; o adım web arayüzünden yapıldı. Geri kalanı otomatik: App Store Connect API ile yayın hazırlığı.
Bu hataların hiçbiri ajanın “bilmemesinden” değil, kimsenin o durumu henüz görmemiş olmasından çıktı. Telefonda oynayan göz, testlerin yakalayamadığını yakaladı.
Şu an nerede?
Bu yazıyı yazarken ilk mesajın üzerinden yaklaşık on beş buçuk saat geçmişti. Oyunun kodu 17 binden fazla satır GDScript’e ulaştı; iki iOS sürümü App Store Connect’e yüklendi, mağaza metni 50 dilde hazır, fiyat belli. Ama oyun henüz yayında değil: incelemeye göndermeden önce bitmesini bekliyorum. Kalecik App Store’da çok yakında, Android sürümü de Google Play için hazırlanıyor.

Aynı köy gece: pencereler kendiliğinden yanıyor.
Surların nasıl örüldüğünü merak ediyorsanız serinin teknik yazılarına geçebilirsiniz: parmak çizgisinden taş sur, kapı ve köprü.
Aynı yolu deneyecekler için
- Motoru, ajanın rahat çalışacağı yere göre seçin. Metin dosyalarıyla ve komut satırıyla yönetilebilen bir araç, ajanın hızını belirliyor.
- İlk günden gerçek cihazda test edin. Mac’te kusursuz görünen oyun, telefonda ısınıyor, çok hassas geliyor ya da sessiz modda hiç ses vermiyor.
- Paralel ajanlara iş bölümü yazın. Kim hangi dosyadan sorumlu, kim cihaza kuruyor; bunu yazılı bir tabloda tutun.
- Doğrulamayı otomatikleştirin. Senaryolu test, fuzz ve ölçüm; ajanın göremediğini ölçebildiği bir şeye çevirin.
- Kararı siz verin. Ad, fiyat, ne zaman yayına çıkılacağı ve “bu yeterince iyi değil” demek hâlâ sizin işiniz.
Vibe coding ile uygulama çıkarma deneyimimi daha önce LevelUpStudy yazısında anlatmıştım. Kalecik farklıydı: tek ajan yerine beş ajan, uygulama yerine 3B bir oyun ve aylar yerine bir gece.
Sık Sorulan Sorular
Yapay zekâ ile gerçekten oyun yapılabilir mi?
Yapılabilir, ama “yapay zekâya söyle, o yapsın” kadar basit değil. Kalecik’te kodu Claude Code ajanları yazdı; yön, kararlar, telefonda test ve “bu olmamış” demek benim işimdi. En büyük katkıyı, ajanların göremediğini ölçülebilir hâle getiren testler yaptı.
Hiç kod yazmadan mı yaptın?
Evet, bu projede kod satırı yazmadım. Yazılım bilgim yine de her aşamada işe yaradı: ne istediğimi teknik olarak doğru tarif etmek, bir hatanın nereden gelebileceğini tahmin etmek ve ajanın önerdiği çözümün mantıklı olup olmadığını değerlendirmek için.
Neden Unity değil de Godot?
Godot’da sahne, kod ve shader düz metin dosyası olduğu için bir ajan projeyi tamamen komut satırından yönetebiliyor. Kalecik’in ihtiyacı da hazır model değil, kodla üretilen geometriydi; bunun için Godot fazlasıyla yeterli oldu.
Kalecik ne zaman çıkıyor?
App Store için sürüm hazır ama oyun bitmeden incelemeye göndermiyorum. Android sürümü de Google Play için hazırlanıyor. Yayına girdiğinde Kalecik sayfasındaki mağaza düğmeleri doğrudan mağazalara gidecek.
Kalecik, Tiny Glade’in mobil sürümü mü?
Hayır. Tiny Glade, Pounce Light’ın Windows, Linux ve macOS için yaptığı bir oyun ve resmî bir mobil sürümü yok. Kalecik ondan ilham alan, bağımsız bir iPhone ve iPad oyunu; bütün geometrisi, sesleri ve müziği kendi kodunda üretiliyor.
İlgili Yazılar
Telifsiz Oyun Müziği: Bütün Sesleri Kodla Üretmek
Kalecik'te tek bir ses kaydı yok: taş, kuş, koyun ve 37 müzik parçası Python ile üretildi. Döngüsüz çalma, müzik bekçisi ve LUFS ile ses kontrolü.
Godot'da Prosedürel Taş Sur, Kapı ve Köprü Üretmek
Kalecik'te parmakla çizilen bir çizgi nasıl taş sura, kemerli kapıya, köprüye ve eve dönüşüyor? Yumuşatma, tohumlu taş örgüsü ve parça parça mesh.
iPhone'u Isıtan Oyun: Godot'da Mobil Performans
Godot oyunum iPhone 15 Pro Max'i ısıttı. Kök neden 120 fps çıktı; kare hızı yöneticisi, gölge vekilleri, çimen parçaları ve iş parçacıklarıyla çözüm.