Kendi ürünümüz · Carrom
Gerçek carrom, fiziğini kendimizin yazdığı.
Carrom, ahşap bir tahtada kesin disk fiziğiyle oynanan, önce telefon düşünülerek yapılmış bir tahta oyunudur. Bangladeş, Hindistan ve Pakistan'da oynanan 29 Game ve Tal Gach dahil beş oyun türü; çevrimiçi 1'e 1 ve 2'ye 2, botlar ve sırayla oynama sunar. Tek bir TypeScript kod tabanı web, Android ve iOS'ta çalışır; çevrimiçi oyun ise kendi gerçek zamanlı sunucumuzda çalışır.
Nasıl oynanır Yapay zekâ asistanınızla kullanın
Web'de, App Store'da (iPhone ve iPad) ve Google Play'de (Android) yayında.

- Web (PWA)
- Android
- iOS
- iPadOS
- her biri kendi kural motoruna sahip oyun türü
- 5
- tarayıcı motorları arasında bit düzeyinde aynı vuruş
- 4.320
- otomatik test: 396 birim ve 150 tarayıcı testi; her tarayıcı testi üç ekran boyutunda çalışır
- 540+
- yavaşlatılmış Fast 3G'de ilk yükleme
- ≤ 3 sn
Uygulamanın içi
Mağaza sayfalarında göründükleri gibi, yayındaki uygulamadan gerçek ekranlar.

Tal Gach kulesini kırın 
Sapan gibi nişan alın 
Animasyonlu tahtalar 
Çevrimiçi 2'ye 2 
Tahtalar, vurucular ve taş setleri 
Günlük meydan okuma 
Beş oyun türü, tek dokunuş
Oyuncular neler alıyor
Beş oyun türü
Klasik, 29 Game (29'a ilk ulaşan), Tal Gach (19 taşlık kuleyi kırın, 170'e ilk ulaşan), Disc Pool ve Serbest; ayrıca günlük bir meydan okuma ve bir öğretici.
Çevrimiçi 1'e 1 ve 2'ye 2
Puana göre Hızlı Eşleşme, boş koltukları dolduran botlar, özel odalar, uygulamayı açan meydan okuma bağlantıları, açık odalar lobisi, rövanş, ifadeler, 20 saniyelik sıra sayacı ve her oyun türü için bir Elo puanı.
Botlar ve sırayla oynama
4 zorlukta (Kolay'dan Uzman'a) ve 4 kişilikte (dengeli, saldırgan, savunmacı, hileli vuruşçu) botlar; her birinin kendi adı ve bayrağı var; ayrıca tek cihazda 2 veya 4 oyuncu için sırayla oynama.
Sizinle gelen ilerleme
Jetonlar, animasyonlu tahtalar, vurucular ve taş setlerinden oluşan bir mağaza, başarılar, istatistikler ve günlük seriler. Her cihazda saklamak için Google veya Apple ile giriş yapın.
İşletmeci araçları
Yönetim panelimiz canlı oyunları ve oyuncuları gösterir, moderasyonu yürütür, herhangi bir oyuncunun jetonlarını ona bir mesajla ayarlar; reklamları, zorunlu güncellemeleri, değerlendirme istemlerini, eşleştirme anahtarlarını ve hatta görünümü uygulama sürümü çıkarmadan değiştirir.
Tek kod tabanından her yerde
Web, Android, iPhone ve iPad tek kod tabanından; ayrıca web uygulaması olarak kurulabilir. Oda bağlantıları uygulama kuruluysa uygulamayı, değilse web oyununu açar.
Sıfırdan yapıldı
Her katman bize ait; oyunun kurallarından üzerinde çalıştığı sunucuya kadar.
Oyun istemcisi
Sıkı TypeScript, Vite ve Canvas 2D; oyun motoru ve arayüz framework'ü yok. Dönen tahtalar ve Tal Gach kulesi önizlemeleri saf CSS 3D'dir.
- TypeScript
- Vite
- Canvas 2D
- CSS 3D
Kendi fizik motorumuz
Kare hızından bağımsız, sabit 1/120 sn adımlı olay güdümlü disk fiziği: cep ağızları, ancak yeterli kısmı deliğin üstündeyken düşen taş, cepten çıkan taşlar ve dağılan bir kule. Genel amaçlı bir fizik kütüphanesinin yerini aldı.
- Deterministic
- Seeded randomness
- Headless tests
Gerçek zamanlı arka uç
MongoDB üzerinde kendi Node sunucumuz; küçük bir JSON-over-WebSocket protokolü konuşur: al, ayarla, karşılaştır-ve-ayarla, izle ve varlık. Firebase Realtime Database'in değerlendireceği güvenlik kuralları dosyasının aynısını değerlendirir.
- Node.js
- MongoDB
- WebSocket
- esbuild
Uygulamalar ve giriş
Android ve iOS için Capacitor uygulamaları. Google ve Apple girişi Firebase Auth üzerinden yürür ve sunucumuz her belirteci kendisi denetler. Reklamlar AdMob'dan gelir, gerçek parayla satın alma yoktur.
- Capacitor
- Firebase Auth
- AdMob
- App Links
Operasyon
Sunucuları kendimiz işletiyoruz
Arada oyun arka uç servisi yok: kendi sunucumuz, kendi dağıtımlarımız, kendi izlememiz.
- Kendi Linux sunucumuz: nginx, Cloudflare arkasında Let’s Encrypt TLS ile oyunu sunar
- WebSocket, uygulama yapılandırması ve sağlık kontrolleri systemd altındaki Node servisine yönlendirilir
- Yönetim paneli kendi servisi olarak çalışır ve yalnızca makinenin kendisinde yanıt veren bir işletmeci API'sini çağırır
- Tek komutla dağıtım: derle, zaman damgalı bir sürüm yükle, geç, yeniden başlat, sağlık kontrolü yap; anında geri alma için son 5 sürüm saklanır
- Bangladeş'ten Cloudflare üzerinden yaklaşık 210 ms ortanca gidiş-dönüş (lansmanda ölçüldü)
- Google Play ve App Store Connect için betikli uygulama derlemeleri
- Oda davetleri için Android App Links ve iOS universal links
Çözdüğümüz zor sorunlar
Oyuncuların hiç görmediği kısımlar, ölçtüğümüz sayılarla.
Her telefonda aynı fizik
- Sorun
- Çevrimiçi bir oyunda her telefon rakibin vuruşunu kendisi simüle eder. İki cihaz bir sayıyı bile farklı hesaplarsa tahtaları birbirinden ayrışırdı; bu yüzden fizik her yerde birebir aynı olmak zorundaydı.
- Ne yaptık
- Simülasyon yalnızca her JavaScript motorunda kesin olan işlemleri kullanır; karekök tabanlı kendi hypot, log, acos, sin ve cos fonksiyonlarımızla. Tüm rastgelelik tohumludur ve çekirdek hiçbir zaman saati okumaz.
Sonuç Chromium ve WebKit motorlarında 4.320 vuruş denetlendi: her tahta bit düzeyinde aynı.
Bulunan ve çevrelenen bir senkron kaybı
- Sorun
- Farklı uygulama sürümlerindeki, fiziği hafifçe farklı oyuncular birbiriyle eşleştiriliyordu ve tahtaları birbirini tutmuyordu.
- Ne yaptık
- Artık bir protokol sürümü eşleştirmeyi ve odaları denetliyor; fizik, sürüm yükselmeden değişirse bir fizik parmak izi testi derlemeyi başarısız kılıyor.
Sonuç Yalnızca aynı fiziğe sahip oyuncular aynı tahtayı paylaşır.
Adil kırılan bir kule
- Sorun
- Tal Gach'ta açılış vuruşu 19 taşlık üst üste dizili bir kuleye çarpar. Gerçek oyun gibi hissettirmeli ve iki oyuncuya da adil olmalı.
- Ne yaptık
- %70 hız veya üzerindeki bir vuruş alttaki bir ya da iki taşı dışarı atar ve kuleyi ayakta bırakır; daha yumuşak vuruşlar kuleyi devirir. Rastgelelik tohumludur, bu yüzden her cihaz aynı kırılmayı görür.
Sonuç Güçlü vuruşlar alttaki taşları %90 oranında temizler; her ekranda aynı.
Mac'lerde ses
- Sorun
- Apple-silicon Mac'lerde çalışan iPad uygulaması ne AAC ne de Opus sesini çözebiliyordu.
- Ne yaptık
- Uygulama seslerin ve müziğin 16 bit WAV kopyalarını taşır ve oyun bunları kendisi çözer.
Sonuç Mac'ler dahil her cihazda aynı ses.
Oyuna dokunmadan bir sağlayıcıdan ayrılmak
- Sorun
- Çevrimiçi oyun Firebase Realtime Database üzerinde başladı ve oyunu yeniden yazmadan oyun verilerini kendi sunucumuza almak istedik.
- Ne yaptık
- Her çevrimiçi özellik tek bir veritabanı arayüzüyle konuşur. Sunucumuz aynı kurallar dosyasını aynı anlambilimle uygular ve tam maçlardan ve 180'den fazla izinli ya da reddedilen yazmadan oluşan tek bir denetim paketi iki arka uca karşı da çalışır.
Sonuç Oyun verileri artık kendi sunucumuzda duruyor ve arka uç değiştirmek iki ayarlık bir derleme anahtarıdır.
İlk vuruşa kadar hızlı
- Sorun
- Gündelik bir oyunun oyuncuyu kazanmak için saniyeleri vardır, üstelik çoğu zaman yavaş bir mobil bağlantıda.
- Ne yaptık
- İndirilecek motor ya da framework yok, ilk dokunuştan önce ses yok ve yavaşlatılmış bir bağlantıda üretim derlemesini çalıştıran bir performans testi.
Sonuç Yavaşlatılmış Fast 3G'de ilk yükleme 3 sn veya daha kısa.
Demo değil, ürün gibi test edildi
- 396 birim testi ve 150 tarayıcı testi; her biri telefon, tablet ve masaüstü boyutunda ekran görüntüsü temelleriyle çalışır (400'den fazla çalıştırma)
- Bota karşı bot denge çalıştırmaları ve bir maymun testi
- Veritabanı kurallarına karşı tam çevrimiçi maçlar oynayan bir emülatör paketi
- Deterministik fizik sayesinde birim testlerinde başsız simüle edilen vuruşlar
Teknoloji
- TypeScript
- Vite
- Canvas 2D
- Node.js
- MongoDB
- WebSocket
- Capacitor
- Firebase Auth
- AdMob
- Vitest
- Playwright
- nginx
- Cloudflare
- systemd
Bir oyunu ya da gerçek zamanlı bir uygulamayı bu şekilde kurdurmak ister misiniz?
Oyunları ve gerçek zamanlı platformları baştan sona tasarlıyor, geliştiriyor ve işletiyoruz: uygulamalar, sunucular, mağazalar ve operasyon.