# Oyun geliştirmek planımda yoktu — kapsamı kısıt seçti

> Tek başına bir strateji oyunu yapmanın tek yolu kapsamı kesmekti. Kısıt listesi, oyunun bütün mekaniklerini kendiliğinden seçti.

- Yayın: 2026-09-14
- Kategori: Günlük
- Etiketler: TypeScript, Kariyer
- Okuma süresi: 4 dk okuma
- Kaynak: https://www.muhammetsafak.com.tr/blog/oyun-gelistirmek-planimda-yoktu-regnarium/
- Dil: tr-TR
- Yazar: Muhammet Şafak

---
Oyun geliştirmek hiçbir zaman planımda yoktu. On yedi yıldır yazdığım şey iş
uygulamasıydı; oyun benim için oynanan bir şeydi, yapılan bir şey değil. Birkaç
arkadaşımın oyun geliştirmeye başlaması ve ısrarla itmesi olmasa bu yazı da
olmazdı.

İtki geldiğinde ilk sorduğum soru "ne yapayım" değil, "ne yapabilirim"di. Bu
yazı o sorunun cevabının — bir kısıt listesinin — nasıl bir oyun tasarımına
dönüştüğünün hikâyesi. Kısa hâli şu: **kısıtlar kapsamı daraltmadı, kapsamı
seçti.** "Tek oturumda bitmeli" kararı tur sınırını, zarsız savaşı ve
sunucusuz mimariyi tek tek belirledi; ben bunların hiçbirini ayrı ayrı
seçmedim. Ortaya çıkan şeyin adı [Regnarium](/portfolyo/regnarium/).

## Tek bildiğim tür

Kendime dürüst olduğumda elimde tek bir varlık vardı: strateji oyunlarına
gömdüğüm on binlerce saat. Başka bir türü oynadığım kadar bilmiyordum, ve
bilmediğim bir türü tasarlamaya çalışmak, tek kişilik bir işte harcanacak en
pahalı zaman olurdu.

Bu ilk kısıttı ve aslında bir avantajdı. Bir türü oyuncu olarak iyi bilmek,
tasarımcı olarak "burada canım sıkılıyor" diyebilmek demek. 4X stratejide o
nokta bellidir: oyunun ortası. Keşif bitmiş, savaş başlamamış, siz sıra tuşuna
basıp duruyorsunuz.

## Elimde olmayanların listesi

İkinci kısıt ölçekti. Tek kişiyim, bir stüdyo değil. Bu, şununla yarışamayacağım
anlamına geliyordu: içerik hacmi. Büyük yapımların yüzlerce birimi, onlarca
uygarlığı, derin teknoloji ağaçları var ve bunların hepsi insan-yılı demek.

Buradaki hata, azıyla aynı şeyi yapmaya çalışmak olurdu — yani her sistemin
yarısını kurup hiçbirini bitirmemek. Onun yerine listeyi bilinçli olarak kısa
tuttum: beş birim, beş bina, dört arazi, üç kaynak. Tek kural şuydu: her kaydın
tahtada **ayırt edilebilir bir işi** olacak. Bir birim başka bir birimin biraz
daha iyisiyse, o birim listeyi uzatıyor ama oyunu zenginleştirmiyor.

## "Yarım saatte bitmeli" neyi seçti

Üçüncü kısıt en belirleyicisiydi ve kişiseldi: bu oyunu bir bakıma kendim için,
beklemelerde oynamak için kurguluyordum. Yani el, yarım saatte bitmeliydi.

Bu tek cümlenin seçtiği şeylere bakın:

- **Sabit bir tur sınırı.** Oyun kendini bitiriyor: el azami altmış turda
  kapanıyor ve fetih tamamlanmadıysa kazananı puan belirliyor. Süre bir uyarı
  değil, kuralın parçası. "İstersen devam et" diyen bir tasarım, yarım saatlik
  vaadi ilk gün bozardı.
- **Küçük ama dolu bir harita.** Tahtanın ölçüsü doğrudan tur sayısından türedi:
  keşfin bitmesi, genişlemenin sıkışması ve cephenin oluşması altmış tura
  sığmalıydı.
- **Beklemeyen bir rakip.** Yapay zekâ rakibin karar süresi bir bütçe kalemi
  hâline geldi; oyuncunun sırasını beklediği her saniye, yarım saatten çalınan
  bir saniye.

Hiçbirini "iyi tasarım" olduğu için seçmedim. Üçü de tek bir kısıttan düştü.

## Zarsız savaş bir tasarım kararıdır

Dördüncü karar kısıttan değil, kendi oyunculuğumdan geldi — ve en çok
düşündüğüm yer burasıydı.

Zar atan bir savaş sistemi, kaybedilen her eli sisteme yıkma imkânı verir.
Oyuncu kendi kararını sorgulamak yerine talihi suçlar; kısa bir oyunda bu
ölümcül, çünkü telafi edecek üç saatiniz yok. O yüzden savaş tamamen
deterministik: saldırıdan önce gördüğünüz önizleme, motorun işlettiği hesabın
**aynısı**. Ayrı bir "tahmin" fonksiyonu yazmak, önizleme ile sonucun
ayrışabileceği tek kapıyı açardı; o kapı hiç açılmadı.

Sonuç şu cümleye indi: sürpriz yok, pişmanlık var. Kaybettiğiniz el, sizin
okumadığınız bir sayı yüzünden kaybedildi.

Rastgelelik tamamen yok değil — harita tohumlu bir üreticiden geliyor — ama
oynanışın içine sızmıyor. Bu ayrım aynı zamanda çevrimdışı çalışmayı mümkün
kılan şey: aynı tohum ve aynı komut dizisi her zaman aynı eli ürettiği için,
kayıt tam bir durum kopyası olmak zorunda değil. Tohum ve komut listesi
yeterli; yükleme onu yeniden oynatıyor. Sunucu, hesap ve senkronizasyon
ihtiyacı buradan düştü.

## Kodu ben yazmadım, mimariyi ben tuttum

Bir künye satırı olarak söylemek gerekiyor: mekanikleri ve mimariyi ben
tasarladım, kodun büyük kısmını yapay zekâ yazdı. Benim işim üretmek değil,
**sapmayı engellemekti** — belirlediğim mimariden çıkılmaması, yanlış
kütüphanenin projeye girmemesi, bir kuralın iki yerde hesaplanmaya
başlamaması. Bu ayrımı daha önce
[üç seviye üzerinden yazmıştım](/blog/vibe-coding-mi-ai-destekli-gelistirme-mi/);
burada kendi üzerimde denedim ve tezimi değiştirmedi.

Tek şey ekleyeceğim: bir kuralı gözle korumak ölçeklenmiyor. O yüzden kısıtların
çoğunu makineye devrettim — kural çekirdeğinin saate, ağa ve tarayıcıya
erişmesi denetim kapısında yasaklı, ve kapının gerçekten tuttuğu, kasıtlı olarak
hatalı yazılmış dosyalarla ayrıca sınanıyor. Yazılmış bir kural, bağlı olduğunun
kanıtı değil.

## Günün sonunda

Ortaya çıkan iş beni tatmin etti, ve bunun sebebi oyunun büyük olması değil;
bitmiş olması. Tek kişilik bir işte kapsamı kesmek bir taviz gibi hissettiriyor
ama pratikte tam tersi: kesilmemiş kapsam, hiçbir sistemi bitirmemek anlamına
geliyor.

Yan proje yapan birine söyleyebileceğim tek şey bu. Kısıt listenizi önce yazın —
ne kadar zamanınız var, neyi gerçekten biliyorsunuz, ürün nerede çalışacak — ve
tasarım kararlarını o listeden düşürün. Boş bir sayfadan başlamak özgürlük gibi
görünüyor; aslında bitirmemenin en kısa yolu.

Nasıl kurulduğu ve hangi kararın neden verildiği
[Labs kaydında](/labs/regnarium-lab/); oyunun kendisi tarayıcıda, hesapsız ve
çevrimdışı.
