İçeriğe geç
Yasir Uslu
Tüm işler

Gerçek zamanlı çok oyunculu oyun

Okey 101 — Çevrimiçi Masa

Tarayıcıda çalışan, 2–4 kişilik, Türk usulü tam kurallı Okey 101. Davetli oyuncular aynı masada gerçek zamanlı oynar; tek başına oynamak isteyen bilgisayara karşı oynar. Telefonda yatay ve dikey, masaüstünde tam ekran çalışır.

Durum
Canlıda
Araçlar
Next.js 16 · React 19 · TypeScript · Supabase Realtime · Web Crypto · WebAudio · Playwright
Okey 101 — Çevrimiçi Masa ekran görüntüsü

Problem

Tarayıcıda çok oyunculu bir taş oyunu kurmanın iki zor tarafı var: hile (başkasının elini ya da desteyi görmek) ve telefonun cebe girip bağlantının kopması. Hedef, ayrı bir oyun sunucusu işletmeden ikisini de çözmekti.

Rolüm

Tek geliştirici: kural motoru, bot, çok oyunculu altyapı, şifreleme, arayüz, ses ve testler.

Yaklaşım

  1. 01

    Kurucu yetkili mimari

    Oyun kuralları saf bir reducer. Oyunu kuran oyuncunun tarayıcısı durumu yürütür, Supabase Realtime yalnızca mesajları taşır. Ayrı bir oyun sunucusu yok; kural motoru sunucusuz, doğrudan test edilebilir.

  2. 02

    Uçtan uca şifreli eller

    Her oyuncu bir ECDH P-256 anahtar çifti üretir; kurucu her oyuncunun elini ortak anahtarla AES-GCM ile ayrı şifreler. Herkese giden yayında deste, başkalarının eli ve yığınların alt taşları hiç bulunmaz.

  3. 03

    Herkese açık, hilesiz

    Oynamak için giriş gerekmez; oda kodunu bilen masaya katılır. Kanal herkese açık olsa da eller şifreli olduğu için kimse başkasının taşlarını ya da desteyi göremez; kurallar ve sıra yalnız kurucunun tarayıcısında uygulanır.

  4. 04

    Kopmaya dayanıklılık

    Oturum cihazda saklanır, bağlantı artan aralıklarla yeniden kurulur. Misafirin hamlesi bir kimlikle gönderilir ve kurucu onaylayana kadar tekrarlanır; kopan oyuncunun yerine 25 saniye sonra bot oynar.

  5. 05

    Bot, ipucu ve his

    En iyi seri/per dizilişini bulan önbellekli bir arama, botu ve ipucu butonunu besler. Taş sesleri WebAudio ile fiziksel olarak sentezlenir; taşlar kavisli uçar, iPhone’da dokunsal geri bildirim vardır.

Zorlu an

Yenilenen sayfada boş ıstaka

Misafir sayfayı yenileyince bazen ıstakası boş kalıyordu. Kayıtlar iki sebep gösterdi: eski bağlantının varlık kaydı bir süre yaşıyor ve kurucu eli eski anahtarla şifreliyordu; ayrıca aynı durumun eski ve yeni anahtarlı iki kopyası karışık sırayla işleniyordu. En yeni varlık kaydını seçmek ve gelen durumları sırayla işlemek sorunu tamamen çözdü.

Kalite

360’tan fazla birim testi (Vitest) ve gerçek Supabase’e karşı iki tarayıcıyla oynanan uçtan uca test (Playwright): erişim kapısı, RLS, şifreli eller, yeniden bağlanma. Uçtan uca test her gece GitHub Actions’ta çalışır.