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.

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.

Ç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.

  1. 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
  2. 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
  3. 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
  4. 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.

  1. 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.

  2. 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ë.

  3. 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.

  4. 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.

  5. 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.

  6. 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

GPScom: ridizajnim i plotë i gpscom.gr

Shihni punët tona

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.