Sokak Efsaneleri
İstanbul'un sokak hayvanları üzerine bir kaydır-birleştir bulmacası. Kaydırınca bütün yaratıklar aynı anda kayıyor; aynı türden ikisi birleşiyor ve sokak yavrusu sonunda bir efsaneye dönüşüyor.
Kod gizli; bu yüzden bu sayfa koda link vermek yerine oyunun nasıl kurulduğunu anlatıyor.



Özet
- Sorun
- Yüzlerce bulmaca seviyesinin adil olması ve zorluğun bilinçli artması gerekiyordu; kalabalık bir test ekibi yoktu ve oyun Windows'tan iOS'a çıkmalıydı.
- Benim payım
- Tek geliştirici olarak hepsi: oyun tasarımı, C# kodu ve testleri, seviye üreticisi ve çözücü, yayın hattı. Çizimleri benim yazdığım brieflerden yapay zekâ üretti.
- Sonuç ve durum
- 500 seviyenin hepsi çözülmüş olarak geliyor; üretilenler genişlik öncelikli aramayla çözülüyor ve 803 test kuralları Unity olmadan sınıyor. Windows'ta geliştirilip bulut Mac'te imzalanan 1.0 App Store incelemesinde; sırada Android kapalı test var.
Sokaktan efsaneye
App Store sayfasındaki hâliyle gerçek oyun, bir de gerçek bir iPhone'dan alınmış ekran.
Ekran 1, toplam 7
Sokak
1Senin sokağın
Yaratıklar Balat'ta kartpostal gibi bir sokakta yaşıyor. Besledikçe sevgileri artıyor.
2İki semt
Kadıköy ve Balat; her birinin kendi yaratık türleri ve dokunulacak sürprizleri var.
3Gerçek bir iPhone'da
Kadıköy'ün ana sahnesi, cihazdan alınmış.
Oyun
4Bir seviye
Kaydırınca bütün yaratıklar aynı anda kayıyor. Hamleler bitmeden hedefe ulaş.
5Efsane!
Aynı türden sekizi bir efsane oluyor: Yavru, Afacan, Patron, sonra Efsane.
Koleksiyon
6Albüm
Beş tür, her birinin dört aşaması: toplanacak yirmi karakter.
7Efsane kartı
Her efsanenin bir lakabı, kısa bir hikâyesi ve üç kostümü var.
Kuralı dene
Tahtayı kaydır ya da ok tuşlarını kullan. Aynı türden ikisi birleşir, sayıları toplanır. 8'lik bir kedi yap, efsaneyi çıkar.
- Yavru1+
- Afacan2+
- Patron4+
- Efsane8+
Kuralın bu sayfa için yazılmış küçük bir tekrarı, oyunun kodu değil. Gösterilen en kısa çözüm, oyunun kullandığı fikirle bulunuyor: genişlik öncelikli arama.
Tahta odaktayken ok tuşları onu kaydırır. Altındaki düğmeler de aynısını yapar; tahtanın tablo hâli biraz aşağıda.
Hamle 0 / 8. En kısa çözüm 5 hamle.
Tahta odaktayken ok tuşları çalışır.Tahtada yana kaydır. Yukarı ve aşağı da kaydırmak için önce Tahtada oyna düğmesine bas.
Tahtayı tablo olarak göster
| Sütun 1 | Sütun 2 | Sütun 3 | Sütun 4 | |
|---|---|---|---|---|
| Satır 1 | Kedi 1 | boş | Martı 1 | Kedi 1 |
| Satır 2 | Kedi 1 | Kedi 1 | boş | Kedi 1 |
| Satır 3 | Kedi 1 | Martı 1 | Kedi 1 | boş |
| Satır 4 | boş | boş | Martı 1 | Kedi 1 |
Nasıl çalışıyor
Adil seviyeler üretmek, kalabalık bir test ekibi olmadan zorluğu ölçmek, Windows'tan iOS'a yayın yapmak ve yapay zekâyla üretilen çizimleri okunur tutmak.
Her seviye sen görmeden çözülüyor
1–60 arası seviyeler Unity içindeki bir seviye editöründe elle ayarlandı. 61–500 arası tohumlu bir üreticiden geliyor: her aday tahta genişlik öncelikli aramayla çözülüyor, bir yaratık kendi türüyle asla buluşamıyorsa atılıyor ve yalnızca derinliği (en kısa çözümün uzunluğu) yuvasına, yani seviyenin onluk bloktaki yerine uyuyorsa tutuluyor. Geçen seviyeler, oyunla birlikte gelen önceden üretilmiş seviye tablosuna yazılıyor.
- TohumMulberry32: aynı tohum, aynı tahta
- Üreticiher yuva için tahta tarifleri
- Çıkmaz kontrolüher yaratık türüyle buluşabilir mi?
- BFS çözücüen kısa çözüm seviyenin derinliği
- Hamle bütçesiderinlik artı pay
- Seviye tablosuönceden üretilmiş: 61–500, hepsi çözülmüş
Zorluk sanal bir oyuncuyla ölçülüyor
Bir oyuncu modeli birkaç kaydırma ileriye bakıp hamlesini softmax ile seçiyor; parametreleri benim kendi yıldız geçmişime göre ayarlandı. Her aday seviyeyi iki bine kadar oynuyor ve kaybedilen oyunların payı, seviyenin yuvası için belirlenen aralığa düşmek zorunda. Her onuncu seviye zor; bu yüzden eğri testere dişi gibi.
- Normal seviye
- Zor seviye, her onuncu
Tablo olarak göster
| Seviye | Hedef kayıp |
|---|---|
| 61 | %15–28 |
| 62 | %15–28 |
| 63 | %15–28 |
| 64 | %22–35 |
| 65 | %22–35 |
| 66 | %22–35 |
| 67 | %28–40 |
| 68 | %28–40 |
| 69 | %28–40 |
| 70 | %40–55 |
| 71 | %15–28 |
| 72 | %15–28 |
| 73 | %15–28 |
| 74 | %22–35 |
| 75 | %22–35 |
| 76 | %22–35 |
| 77 | %28–40 |
| 78 | %28–40 |
| 79 | %28–40 |
| 80 | %40–55 |
Tablo olarak göster
| Derinlik | Ölçülen kayıp |
|---|---|
| 4 | yaklaşık %10 |
| 5 | %20–30 |
| 6 | %45–55 |
| 7 | %60–70 |
Altı katman, tek yön
Kurallar, çözücü ve ekonomi Unity içermeyen saf bir C# çekirdeğinde duruyor; böylece 803 test .NET'te saniyeler içinde koşuyor. Her katman ayrı bir assembly ve bağımlılıklar yalnızca aşağıyı gösteriyor.
- Editorsahne kurucu, seviye editörü27 dosyaGametahta, HUD, sahneler107 dosya
- şunlara bağımlıServicesarayüzler + Firebase, AdMob, IAP adaptörleri55 dosyaDataScriptableObject katalogları ve ayarlar8 dosya
- şunlara bağımlıCoresaf C#: kurallar, çözücü, ekonomi48 dosya
Denge, yeni sürüm olmadan değişiyor
Her ayar önce koddaki varsayılandan, sonra ayar dosyasından, en son Remote Config'ten okunuyor. Analitik, oyuncu izin kartını kabul ettikten sonra başlıyor; günlük BigQuery aktarımı, oyuncuların nerede takıldığını gösteren bir seviye hunisini besliyor.
- Unity istemcisilevel_start, level_end
- İzin kartıKVKK, her olaydan önce
- Firebase AnalyticsCrashlytics ile
- BigQuerygünlük aktarım, SQL huni
- Remote Config121 parametre oyuna geri
Mac olmadan iOS'a yayın
Windows'ta geliştiriyorum. Unity Xcode projesini dışa aktarıyor, bir GitHub release onu Codemagic'e taşıyor, bulut Mac de derlemeyi imzalayıp yüklüyor. App Store Connect'in kendisi de API'si üzerinden betiklerle yönetiliyor: derlemeler, uygulama içi satın almalar, inceleme notları.
- Windows'ta UnityIL2CPP, ARM64
- Xcode dışa aktarımısıkıştırılmış proje
- GitHub releaseküçük, gizli bir CI deposu
- CodemagicMac mini M2: pod, imza, derleme
- TestFlightsonra App Store incelemesi
Sert kontrollerden geçen yapay zekâ çizimleri
Çizim brieflerini ben yazdım, görselleri Codex üretti. Ardından deterministik Python betikleri sprite'ları birleştirip her yaratığı 64 pikselde, gri tonlamada, çıplak siluet olarak ve üç tür renk körlüğü altında kontrol ediyor; böylece bir tür küçük ve kalabalık bir tahtada bile tanınır kalıyor.




Beş prototip, tek oyun
Unity'de tek satır yazmadan önce beş hızlı HTML5 prototipi yapıp oynadım. Kaydır-birleştir olanı kaldı.
Prototip 1, toplam 5

Blast

Sort

Block puzzle

Çini kaydır

Sokak Efsaneleriseçilen
Rakamlarla
- 500
- seviye, her biri yayından önce çözülmüş
- 803
- Unity olmadan, saf .NET'te koşan çekirdek testi
- 1.042
- Unity içinde EditMode testi
- 474
- Unity içinde PlayMode testi
- 121
- oyunun okuduğu Remote Config parametresi
- 49k
- satır C#
Yine aynı şekilde vereceğim kararlar
Her seviyeyi yayından önce çöz
Kazanılamayan ya da tesadüfen kazanılan bir seviye hiçbir oyuncuya ulaşmıyor; yıldızlar da gerçek en kısa çözüme göre veriliyor. Başta bir sonraki seviyeyi oyun sırasında telefon seçiyordu; ama oyuncu modeliyle her aday için tam bir arama ve iki bine kadar oyun gerekiyor, bu yüzden 61–500 arası seviyeler artık tablo olarak geliyor. Bedeli: üreticideki her değişiklik 61. seviyeden itibaren bütün tahtaları değiştiriyor; yayından sonra bu, bir geçiş planı gerektirir.
Kuralları motorun dışında tut
Çekirdek Unity'yi hiç bilmiyor; kurallar, çözücü ve ekonomi saniyeler içinde test ediliyor ve seviye araçlarında da kullanılıyor.
Ayarlamadan önce ölç
Zorluk hedefleri yüzüncü oynayıştan sonraki hissimden değil, kalibre edilmiş bir modelden geliyor ve BigQuery hunisiyle kontrol ediliyor.

