Δικό μας προϊόν · Carrom
Αληθινό carrom, με φυσική που γράψαμε εμείς.
Το Carrom είναι ένα επιτραπέζιο για κινητά σε ξύλινο ταμπλό με ακριβή φυσική δίσκων. Έχει πέντε τύπους παιχνιδιού, μαζί με το 29 Game και το Tal Gach που παίζονται σε Μπανγκλαντές, Ινδία και Πακιστάν, με online 1 εναντίον 1 και 2 εναντίον 2, bots και παιχνίδι στην ίδια συσκευή. Ένας κώδικας TypeScript τρέχει σε web, Android και iOS, και το online παιχνίδι τρέχει στον δικό μας διακομιστή πραγματικού χρόνου.
Πώς παίζεται Χρήση με τον βοηθό AI σας
Σε λειτουργία στο web. Οι εφαρμογές Android και iOS είναι σε δοκιμές και έλεγχο: σύντομα στο Google Play και στο App Store.

- Web (PWA)
- Android
- iOS
- iPadOS
- τύποι παιχνιδιού, ο καθένας με δική του μηχανή κανόνων
- 5
- χτυπήματα, πανομοιότυπα bit προς bit σε μηχανές browser
- 4.320
- αυτόματες δοκιμές: 396 μονάδας και 150 browser, κάθε δοκιμή browser σε τρία μεγέθη οθόνης
- 540+
- πρώτη φόρτωση σε περιορισμένο Fast 3G
- ≤ 3 s
Μέσα στην εφαρμογή
Πραγματικές οθόνες από την εφαρμογή, όπως εμφανίζονται στα καταστήματα εφαρμογών.

Σπάστε τον πύργο Tal Gach 
Σημάδι σαν σφεντόνα 
Κινούμενα ταμπλό 
2 εναντίον 2 online 
Ταμπλό, strikers και σετ δίσκων 
Καθημερινή πρόκληση 
Πέντε τύποι παιχνιδιού, ένα άγγιγμα
Τι παίρνουν οι παίκτες
Πέντε τύποι παιχνιδιού
Classic, 29 Game (πρώτος στο 29), Tal Gach (σπάστε έναν πύργο 19 δίσκων, πρώτος στο 170), Disc Pool και Freestyle, μαζί με καθημερινή πρόκληση και οδηγό.
Online 1 εναντίον 1 και 2 εναντίον 2
Quick Match με βάση τη βαθμολογία, με bots σε άδειες θέσεις, ιδιωτικά δωμάτια, συνδέσμους πρόκλησης που ανοίγουν την εφαρμογή, λόμπι ανοιχτών δωματίων, ρεβάνς, emotes, ρολόι 20 δευτερολέπτων ανά γύρο και βαθμολογία Elo ανά τύπο.
Bots και παιχνίδι στην ίδια συσκευή
Bots σε 4 επίπεδα δυσκολίας (Εύκολο έως Ειδικό) και 4 προσωπικότητες (ισορροπημένο, επιθετικό, αμυντικό, trick-shot), το καθένα με όνομα και σημαία, και παιχνίδι για 2 ή 4 παίκτες στην ίδια συσκευή.
Πρόοδος που σας ακολουθεί
Νομίσματα, κατάστημα με κινούμενα ταμπλό, strikers και σετ δίσκων, επιτεύγματα, στατιστικά και καθημερινά σερί. Σύνδεση με Google ή Apple για να τα έχετε σε κάθε συσκευή.
Εργαλεία διαχείρισης
Ο πίνακας διαχείρισης δείχνει ζωντανές παρτίδες και παίκτες, κάνει εποπτεία, προσαρμόζει τα νομίσματα κάθε παίκτη με μήνυμα προς αυτόν και αλλάζει διαφημίσεις, υποχρεωτικές ενημερώσεις, αιτήματα αξιολόγησης, ρυθμίσεις ζευγαρώματος ακόμη και την εμφάνιση χωρίς νέα έκδοση.
Παντού από έναν κώδικα
Web, Android, iPhone και iPad από έναν κώδικα, με εγκατάσταση και ως εφαρμογή web. Οι σύνδεσμοι δωματίων ανοίγουν την εφαρμογή αν υπάρχει, αλλιώς το παιχνίδι στο web.
Φτιαγμένο από το μηδέν
Κάθε επίπεδο είναι δικό μας, από τους κανόνες του παιχνιδιού μέχρι τον διακομιστή όπου τρέχει.
Πρόγραμμα παιχνιδιού
Αυστηρή TypeScript, Vite και Canvas 2D, χωρίς μηχανή παιχνιδιού και χωρίς πλαίσιο UI. Τα ταμπλό που γυρίζουν και ο πύργος Tal Gach είναι καθαρό CSS 3D.
- TypeScript
- Vite
- Canvas 2D
- CSS 3D
Δική μας φυσική
Φυσική δίσκων με γεγονότα, σε σταθερό βήμα 1/120 s ανεξάρτητα από τα καρέ: σιαγόνες τσέπης, δίσκος που πέφτει μόνο όταν αρκετό μέρος του είναι πάνω από την τρύπα, αναπηδήσεις έξω και πύργος που γκρεμίζεται. Αντικατέστησε μια γενική βιβλιοθήκη φυσικής.
- Deterministic
- Seeded randomness
- Headless tests
Backend πραγματικού χρόνου
Δικός μας διακομιστής Node πάνω σε MongoDB, με ένα μικρό πρωτόκολλο JSON πάνω από WebSocket: get, set, compare-and-set, watch και presence. Αξιολογεί το ίδιο αρχείο κανόνων ασφαλείας που θα αξιολογούσε το Firebase Realtime Database.
- Node.js
- MongoDB
- WebSocket
- esbuild
Εφαρμογές και σύνδεση
Εφαρμογές Capacitor για Android και iOS. Η σύνδεση Google και Apple γίνεται μέσω Firebase Auth, και ο διακομιστής μας ελέγχει μόνος του κάθε token. Διαφημίσεις μέσω AdMob, χωρίς αγορές με πραγματικά χρήματα.
- Capacitor
- Firebase Auth
- AdMob
- App Links
Λειτουργία
Τρέχουμε τους διακομιστές μόνοι μας
Καμία υπηρεσία backend ενδιάμεσα: δικός μας διακομιστής, δικές μας εκδόσεις, δική μας παρακολούθηση.
- Δικός μας διακομιστής Linux: το nginx σερβίρει το παιχνίδι με TLS Let’s Encrypt πίσω από το Cloudflare
- WebSocket, ρυθμίσεις εφαρμογής και έλεγχοι υγείας προωθούνται στην υπηρεσία Node υπό systemd
- Ο πίνακας διαχείρισης τρέχει ως ξεχωριστή υπηρεσία και καλεί ένα API που απαντά μόνο τοπικά στο μηχάνημα
- Εκδόσεις με μία εντολή: build, ανέβασμα έκδοσης με χρονοσφραγίδα, εναλλαγή, επανεκκίνηση, έλεγχος υγείας· οι 5 τελευταίες εκδόσεις μένουν για άμεση επαναφορά
- Περίπου 210 ms διάμεσος χρόνος απόκρισης από το Μπανγκλαντές μέσω Cloudflare (μέτρηση στην έναρξη)
- Αυτοματοποιημένα builds εφαρμογών για Google Play και App Store Connect
- Android App Links και iOS universal links για προσκλήσεις σε δωμάτια
Δύσκολα προβλήματα που λύσαμε
Όσα δεν βλέπουν ποτέ οι παίκτες, με τα νούμερα που μετρήσαμε.
Ίδια φυσική σε κάθε κινητό
- Το πρόβλημα
- Σε online παιχνίδι κάθε κινητό προσομοιώνει μόνο του το χτύπημα του αντιπάλου. Αν δύο συσκευές υπολόγιζαν ποτέ έναν αριθμό διαφορετικά, τα ταμπλό θα απέκλιναν, άρα η φυσική έπρεπε να είναι ακριβής παντού.
- Τι κάναμε
- Η προσομοίωση χρησιμοποιεί μόνο πράξεις ακριβείς σε κάθε μηχανή JavaScript, με δικές μας hypot, log, acos, sin και cos βασισμένες στην τετραγωνική ρίζα. Όλη η τυχαιότητα έχει seed και ο πυρήνας δεν διαβάζει ποτέ το ρολόι.
Αποτέλεσμα 4.320 χτυπήματα ελέγχθηκαν στις μηχανές του Chromium και του WebKit: κάθε ταμπλό πανομοιότυπο bit προς bit.
Ένας αποσυγχρονισμός, εντοπίστηκε και αποκλείστηκε
- Το πρόβλημα
- Παίκτες με διαφορετικές εκδόσεις, με ελαφρώς διαφορετική φυσική, ζευγαρώνονταν μαζί και τα ταμπλό τους διαφωνούσαν.
- Τι κάναμε
- Μια έκδοση πρωτοκόλλου ελέγχει πλέον το ζευγάρωμα και τα δωμάτια, και ένα τεστ «αποτυπώματος» φυσικής αποτυγχάνει αν η φυσική αλλάξει χωρίς αύξηση έκδοσης.
Αποτέλεσμα Μόνο παίκτες με πανομοιότυπη φυσική μοιράζονται ταμπλό.
Ένας πύργος που σπάει δίκαια
- Το πρόβλημα
- Στο Tal Gach το πρώτο χτύπημα πέφτει σε έναν πύργο 19 δίσκων. Πρέπει να μοιάζει αληθινό και να είναι δίκαιο και για τους δύο.
- Τι κάναμε
- Ένα χτύπημα με 70% ταχύτητα ή περισσότερο βγάζει έναν ή δύο δίσκους από τη βάση και ο πύργος μένει όρθιος· πιο απαλά χτυπήματα τον γκρεμίζουν. Η τυχαιότητα έχει seed, άρα κάθε συσκευή βλέπει το ίδιο σπάσιμο.
Αποτέλεσμα Τα δυνατά χτυπήματα βγάζουν τους δίσκους της βάσης στο 90% των περιπτώσεων, ίδια σε κάθε οθόνη.
Ήχος σε Mac
- Το πρόβλημα
- Η εφαρμογή iPad σε Mac με Apple silicon δεν μπορούσε να αποκωδικοποιήσει ούτε AAC ούτε Opus.
- Τι κάναμε
- Η εφαρμογή περιέχει αντίγραφα 16-bit WAV των ήχων και της μουσικής, και το παιχνίδι τα αποκωδικοποιεί μόνο του.
Αποτέλεσμα Ίδιος ήχος σε κάθε συσκευή, και στα Mac.
Αλλαγή παρόχου χωρίς να αγγίξουμε το παιχνίδι
- Το πρόβλημα
- Το online παιχνίδι ξεκίνησε στο Firebase Realtime Database και θέλαμε τα δεδομένα στον δικό μας διακομιστή χωρίς να ξαναγράψουμε το παιχνίδι.
- Τι κάναμε
- Κάθε online λειτουργία μιλά σε μία διεπαφή βάσης. Ο διακομιστής μας εφαρμόζει το ίδιο αρχείο κανόνων με την ίδια σημασία, και μία σουίτα ελέγχων με ολόκληρες παρτίδες και πάνω από 180 εγγραφές που επιτρέπονται ή απορρίπτονται τρέχει και στα δύο backends.
Αποτέλεσμα Τα δεδομένα του παιχνιδιού βρίσκονται πλέον στον δικό μας διακομιστή, και η αλλαγή backend γίνεται με δύο ρυθμίσεις του build.
Γρήγορα στο πρώτο χτύπημα
- Το πρόβλημα
- Ένα casual παιχνίδι έχει λίγα δευτερόλεπτα να κερδίσει τον παίκτη, συχνά σε αργή σύνδεση κινητού.
- Τι κάναμε
- Καμία μηχανή ή πλαίσιο για λήψη, κανένας ήχος πριν από το πρώτο άγγιγμα, και ένα τεστ απόδοσης που τρέχει το τελικό build σε περιορισμένη σύνδεση.
Αποτέλεσμα Πρώτη φόρτωση σε 3 s ή λιγότερο σε περιορισμένο Fast 3G.
Δοκιμασμένο σαν προϊόν, όχι σαν demo
- 396 δοκιμές μονάδας και 150 δοκιμές browser, η καθεμία σε μέγεθος κινητού, tablet και υπολογιστή με στιγμιότυπα αναφοράς (πάνω από 400 εκτελέσεις)
- Δοκιμές ισορροπίας bot εναντίον bot και monkey test
- Σουίτα εξομοιωτή που παίζει ολόκληρες online παρτίδες απέναντι στους κανόνες της βάσης
- Χτυπήματα που προσομοιώνονται χωρίς οθόνη σε δοκιμές μονάδας, χάρη στη ντετερμινιστική φυσική
Τεχνολογία
- TypeScript
- Vite
- Canvas 2D
- Node.js
- MongoDB
- WebSocket
- Capacitor
- Firebase Auth
- AdMob
- Vitest
- Playwright
- nginx
- Cloudflare
- systemd
Θέλετε ένα παιχνίδι ή μια εφαρμογή πραγματικού χρόνου φτιαγμένη έτσι;
Σχεδιάζουμε, φτιάχνουμε και λειτουργούμε παιχνίδια και πλατφόρμες πραγματικού χρόνου από άκρη σε άκρη: εφαρμογές, διακομιστές, καταστήματα και λειτουργία.