Produkt i yni · Carrom
Karrom i vërtetë, me fizikë që e shkruam vetë.
Carrom është një lojë tavoline për telefon, mbi një tabelë druri me fizikë të saktë diskesh. Ka pesë lloje lojërash, përfshirë 29 Game dhe Tal Gach që luhen në Bangladesh, Indi dhe Pakistan, me lojë online 1 me 1 dhe 2 me 2, botë dhe pass-and-play. Një bazë kodi TypeScript funksionon në ueb, Android dhe iOS, dhe loja online funksionon në serverin tonë realtime.
Si të luani Përdoreni me asistentin tuaj IA
Aktiv në ueb, në App Store (iPhone dhe iPad) dhe në Google Play (Android).

- Web (PWA)
- Android
- iOS
- iPadOS
- lloje lojërash, secili me motorin e vet të rregullave
- 5
- goditje, identike bit për bit mes motorëve të shfletuesve
- 4.320
- teste të automatizuara: 396 njësie dhe 150 shfletuesi, çdo test shfletuesi i ekzekutuar në tri madhësi ekrani
- 540+
- ngarkimi i parë në Fast 3G të kufizuar
- ≤ 3 s
Brenda aplikacionit
Ekrane të vërteta nga aplikacioni i publikuar, siç shfaqen në faqet e dyqaneve.

Thyeni kullën Tal Gach 
Shënjestroni si me hobe 
Tabela të animuara 
2 me 2 online 
Tabela, goditës dhe sete figurash 
Një sfidë ditore 
Pesë lojëra, një prekje
Çfarë marrin lojtarët
Pesë lloje lojërash
Classic, 29 Game (i pari te 29), Tal Gach (thyeni një kullë me 19 figura, i pari te 170), Disc Pool dhe Freestyle, plus një sfidë ditore dhe një tutorial.
Online 1 me 1 dhe 2 me 2
Quick Match sipas vlerësimit, me botë që mbushin vendet bosh, dhoma private, lidhje sfide që hapin aplikacionin, një lobi me dhoma të hapura, revanshi, emote, sahat radhe 20-sekondësh dhe vlerësim Elo për çdo lloj loje.
Botë dhe pass-and-play
Botë në 4 vështirësi (Easy deri Expert) dhe 4 personalitete (i balancuar, agresiv, mbrojtës, goditje të veçanta), secili me emrin dhe flamurin e vet, dhe pass-and-play për 2 ose 4 lojtarë në një pajisje.
Progres që ju ndjek
Monedha, një dyqan me tabela të animuara, goditës e sete figurash, arritje, statistika dhe vargje ditore. Hyni me Google ose Apple për ta mbajtur në çdo pajisje.
Mjete operatori
Paneli ynë i administrimit shfaq lojërat dhe lojtarët drejtpërdrejt, trajton moderimin, rregullon monedhat e çdo lojtari me një mesazh për të, dhe ndryshon reklamat, përditësimet e detyrueshme, kërkesat për vlerësim, çelësat e çiftimit e madje stilin pa lëshim aplikacioni.
Kudo nga një bazë kodi
Ueb, Android, iPhone dhe iPad nga një bazë kodi, dhe i instalueshëm si aplikacion uebi. Lidhjet e dhomave hapin aplikacionin nëse është i instaluar, ose lojën në ueb nëse jo.
Ndërtuar nga e para
Çdo shtresë është e jona, nga rregullat e lojës te serveri ku funksionon.
Klienti i lojës
TypeScript strikt, Vite dhe Canvas 2D, pa motor loje dhe pa framework UI. Tabelat që rrotullohen dhe pamjet paraprake të kullës Tal Gach janë CSS 3D e pastër.
- TypeScript
- Vite
- Canvas 2D
- CSS 3D
Fizika jonë
Fizikë diskesh e drejtuar nga ngjarjet me hap të fiksuar 1/120 s, e pavarur nga shpejtësia e kuadrove: nofullat e xhepit, një figurë që bie vetëm kur mjaft nga ajo është mbi vrimë, rënie dhe dalje nga xhepi dhe një kullë që thyhet. Zëvendësoi një bibliotekë fizike të përgjithshme.
- Deterministic
- Seeded randomness
- Headless tests
Backend në kohë reale
Serveri ynë Node mbi MongoDB, që flet një protokoll të vogël JSON mbi WebSocket: get, set, compare-and-set, watch dhe presence. Vlerëson të njëjtin skedar rregullash sigurie që do të vlerësonte Firebase Realtime Database.
- Node.js
- MongoDB
- WebSocket
- esbuild
Aplikacionet dhe hyrja
Aplikacione Capacitor për Android dhe iOS. Hyrja me Google dhe Apple kalon përmes Firebase Auth, dhe serveri ynë kontrollon vetë çdo token. Reklamat vijnë nga AdMob, pa blerje me para të vërteta.
- Capacitor
- Firebase Auth
- AdMob
- App Links
Operacionet
I drejtojmë vetë serverat
Pa shërbim backend loje në mes: serveri ynë, vendosjet tona, monitorimi ynë.
- Serveri ynë Linux: nginx e shërben lojën me TLS Let’s Encrypt pas Cloudflare
- WebSocket, konfigurimi i aplikacionit dhe kontrollet e shëndetit kalojnë përmes proxy te shërbimi Node nën systemd
- Paneli i administrimit funksionon si shërbim më vete dhe thërret një API operatori që përgjigjet vetëm në vetë makinën
- Vendosje me një komandë: ndërtim, ngarkim i një lëshimi me vulë kohe, ndërrim, rinisje, kontroll shëndeti; 5 lëshimet e fundit ruhen për rikthim të menjëhershëm
- Rreth 210 ms udhëtim i plotë mesatar nga Bangladeshi përmes Cloudflare (matur në nisje)
- Ndërtime aplikacionesh me skripte për Google Play dhe App Store Connect
- Android App Links dhe lidhje universale iOS për ftesat në dhoma
Probleme të vështira që zgjidhëm
Pjesët që lojtarët nuk i shohin kurrë, me shifrat që matëm.
E njëjta fizikë në çdo telefon
- Problemi
- Në një lojë online çdo telefon e simulon vetë goditjen e kundërshtarit. Nëse dy pajisje do të llogaritnin ndonjëherë një numër ndryshe, tabelat e tyre do të ndaheshin, prandaj fizika duhej të ishte e saktë kudo.
- Çfarë bëmë
- Simulimi përdor vetëm veprime të sakta në çdo motor JavaScript, me hypot, log, acos, sin dhe cos të vetat të bazuara te rrënja katrore. E gjithë rastësia ka farë dhe bërthama nuk e lexon kurrë sahatin.
Rezultati 4.320 goditje të kontrolluara në motorët e Chromium dhe WebKit: çdo tabelë identike bit për bit.
Një desinkronizim, i gjetur dhe i kufizuar
- Problemi
- Lojtarë me versione të ndryshme aplikacioni, me fizikë paksa të ndryshme, çiftoheshin bashkë dhe tabelat e tyre nuk përputheshin.
- Çfarë bëmë
- Tani një version protokolli kontrollon çiftimin dhe dhomat, dhe një test gjurmë-gishtash i fizikës e dështon ndërtimin nëse fizika ndryshon pa u rritur versioni.
Rezultati Vetëm lojtarët me fizikë identike ndajnë ndonjëherë një tabelë.
Një kullë që thyhet drejt
- Problemi
- Në Tal Gach goditja e hapjes godet një kullë me 19 figura të grumbulluara. Duhet të ndihet si e vërteta dhe të jetë e drejtë për të dy lojtarët.
- Çfarë bëmë
- Një goditje me 70% të shpejtësisë ose më shumë nxjerr një a dy figura nga fundi dhe e lë kullën në këmbë; goditjet më të buta e rrëzojnë. Rastësia ka farë, kështu që çdo pajisje e sheh të njëjtën thyerje.
Rezultati Goditjet e forta pastrojnë figurat e poshtme 90% të rasteve, njësoj në çdo ekran.
Zëri në Mac
- Problemi
- Aplikacioni i iPad që funksiononte në Mac me çip Apple nuk mund të dekodonte as audio AAC e as Opus.
- Çfarë bëmë
- Aplikacioni sjell kopje WAV 16-bit të tingujve dhe muzikës, dhe loja i dekodon vetë.
Rezultati I njëjti tingull në çdo pajisje, përfshirë Mac.
Largimi nga një ofrues pa prekur lojën
- Problemi
- Loja online nisi në Firebase Realtime Database dhe ne donim të dhënat e lojës në serverin tonë pa e rishkruar lojën.
- Çfarë bëmë
- Çdo veçori online flet me një ndërfaqe të vetme baze të dhënash. Serveri ynë zbaton të njëjtin skedar rregullash me të njëjtën semantikë, dhe një paketë kontrollesh me ndeshje të plota e mbi 180 shkrime të lejuara ose të refuzuara ekzekutohet kundër të dyja backend-eve.
Rezultati Të dhënat e lojës tani jetojnë në serverin tonë, dhe ndërrimi i backend-it është një ndërrim ndërtimi me dy cilësime.
I shpejtë deri te goditja e parë
- Problemi
- Një lojë e rastësishme ka sekonda për ta fituar lojtarin, shpesh në lidhje celulare të ngadaltë.
- Çfarë bëmë
- Pa motor apo framework për t’u shkarkuar, pa audio para prekjes së parë dhe një test performance që e ekzekuton ndërtimin e prodhimit në lidhje të kufizuar.
Rezultati Ngarkim i parë brenda 3 s ose më pak në Fast 3G të kufizuar.
Testuar si produkt, jo si demo
- 396 teste njësie dhe 150 teste shfletuesi, secili i ekzekutuar në madhësi telefoni, tableti dhe desktopi me bazë pamjesh (mbi 400 ekzekutime)
- Ekzekutime balancimi bot kundër bot dhe një monkey test
- Një paketë emulatori që luan ndeshje të plota online kundër rregullave të bazës së të dhënave
- Goditje të simuluara headless në testet e njësisë, falë fizikës deterministe
Teknologjia
- TypeScript
- Vite
- Canvas 2D
- Node.js
- MongoDB
- WebSocket
- Capacitor
- Firebase Auth
- AdMob
- Vitest
- Playwright
- nginx
- Cloudflare
- systemd
Dëshironi një lojë ose aplikacion realtime të ndërtuar kështu?
Projektojmë, ndërtojmë dhe drejtojmë lojëra dhe platforma realtime nga fillimi në fund: aplikacione, servera, dyqane dhe operacione.