নিজস্ব প্রোডাক্ট · ক্যারম

আসল ক্যারম, নিজেদের লেখা ফিজিক্সে।

ক্যারম ফোনের জন্য তৈরি একটি বোর্ড গেম — কাঠের বোর্ডে নিখুঁত গুটির ফিজিক্স। এতে পাঁচ ধরনের খেলা আছে, বাংলাদেশ, ভারত ও পাকিস্তানে খেলা ২৯ গেম আর তালগাছসহ — অনলাইনে ১ বনাম ১ ও ২ বনাম ২, বট আর এক ডিভাইসে পালা করে খেলা। একটিই TypeScript কোডবেস চলে ওয়েব, অ্যান্ড্রয়েড ও আইওএসে, আর অনলাইন খেলা চলে আমাদের নিজস্ব রিয়েল-টাইম সার্ভারে।

ওয়েবে চালু। অ্যান্ড্রয়েড ও আইওএস অ্যাপ টেস্টিং ও রিভিউতে — শিগগিরই Google Play ও App Store-এ আসছে।

  • Web (PWA)
  • Android
  • iOS
  • iPadOS
ধরনের খেলা, প্রতিটির নিজস্ব নিয়মের ইঞ্জিন
৫
শট, ভিন্ন ব্রাউজার ইঞ্জিনে হুবহু এক
৪,৩২০
স্বয়ংক্রিয় টেস্ট: ৩৯৬টি ইউনিট ও ১৫০টি ব্রাউজার টেস্ট, প্রতিটি ব্রাউজার টেস্ট তিন স্ক্রিন সাইজে
৫৪০+
ধীর করা Fast 3G-তে প্রথম লোড
≤ ৩ s

অ্যাপের ভেতরে

চালু অ্যাপের আসল স্ক্রিন — স্টোর লিস্টিংয়ে যেমন দেখায়।

খেলোয়াড়েরা যা পান

  • পাঁচ ধরনের খেলা

    ক্লাসিক, ২৯ গেম (প্রথমে ২৯), তালগাছ (১৯ গুটির টাওয়ার ভাঙুন, প্রথমে ১৭০), ডিস্ক পুল আর ফ্রিস্টাইল — সাথে দৈনিক চ্যালেঞ্জ আর টিউটোরিয়াল।

  • অনলাইনে ১ বনাম ১ ও ২ বনাম ২

    রেটিং অনুযায়ী কুইক ম্যাচ — খালি আসনে বট বসে — প্রাইভেট রুম, অ্যাপ খুলে দেওয়া চ্যালেঞ্জ লিংক, খোলা রুমের লবি, রিম্যাচ, ইমোট, ২০ সেকেন্ডের পালার ঘড়ি আর প্রতিটি খেলার ধরনে আলাদা এলো রেটিং।

  • বট ও এক ডিভাইসে খেলা

    ৪টি কাঠিন্যের (ইজি থেকে এক্সপার্ট) আর ৪টি ব্যক্তিত্বের (ভারসাম্যপূর্ণ, আক্রমণাত্মক, রক্ষণাত্মক, ট্রিক-শট) বট — প্রতিটির নিজস্ব নাম ও পতাকা — আর এক ডিভাইসে ২ বা ৪ জনের পালা করে খেলা।

  • অগ্রগতি সব ডিভাইসে

    কয়েন, অ্যানিমেটেড বোর্ড, স্ট্রাইকার ও গুটির সেটের দোকান, অ্যাচিভমেন্ট, পরিসংখ্যান আর দৈনিক স্ট্রিক। Google বা Apple দিয়ে সাইন ইন করলে সব ডিভাইসে থাকে।

  • অপারেটরের টুল

    আমাদের অ্যাডমিন প্যানেলে লাইভ গেম ও খেলোয়াড় দেখা যায়, মডারেশন হয়, যেকোনো খেলোয়াড়ের কয়েন বার্তাসহ বদলানো যায়, আর অ্যাপ রিলিজ ছাড়াই বিজ্ঞাপন, বাধ্যতামূলক আপডেট, রিভিউ অনুরোধ, ম্যাচমেকিং সুইচ, এমনকি ডিজাইনও বদলানো যায়।

  • এক কোডবেসে সব জায়গায়

    একই কোডবেসে ওয়েব, অ্যান্ড্রয়েড, আইফোন ও আইপ্যাড — ওয়েব অ্যাপ হিসেবেও ইনস্টল করা যায়। রুম লিংক অ্যাপ থাকলে অ্যাপ খোলে, না থাকলে ওয়েব গেম।

শূন্য থেকে তৈরি

খেলার নিয়ম থেকে শুরু করে যে সার্ভারে চলে — প্রতিটি স্তর আমাদের নিজেদের তৈরি।

  1. গেম ক্লায়েন্ট

    স্ট্রিক্ট TypeScript, Vite আর Canvas 2D — কোনো গেম ইঞ্জিন বা UI ফ্রেমওয়ার্ক ছাড়াই। ঘোরানো বোর্ড আর তালগাছ টাওয়ারের প্রিভিউ পুরোপুরি CSS 3D।

    • TypeScript
    • Vite
    • Canvas 2D
    • CSS 3D
  2. নিজস্ব ফিজিক্স

    ফ্রেম রেট থেকে স্বাধীন, নির্দিষ্ট ১/১২০ সেকেন্ডের ধাপে ইভেন্ট-চালিত গুটির ফিজিক্স: পকেটের মুখ, যথেষ্ট অংশ গর্তের ওপর এলে তবেই গুটি পড়া, দ্রুত এলে ছিটকে বেরিয়ে আসা আর টাওয়ার ভেঙে পড়া। এটি একটি সাধারণ ফিজিক্স লাইব্রেরির জায়গা নিয়েছে।

    • Deterministic
    • Seeded randomness
    • Headless tests
  3. রিয়েল-টাইম ব্যাকএন্ড

    MongoDB-র ওপর আমাদের নিজস্ব Node সার্ভার, ছোট একটি JSON-ওভার-WebSocket প্রোটোকলে কথা বলে: get, set, compare-and-set, watch আর presence। Firebase Realtime Database যে সিকিউরিটি-রুলস ফাইল মানত, এটি হুবহু সেটিই যাচাই করে।

    • Node.js
    • MongoDB
    • WebSocket
    • esbuild
  4. অ্যাপ ও সাইন-ইন

    অ্যান্ড্রয়েড ও আইওএসের জন্য Capacitor অ্যাপ। Google ও Apple সাইন-ইন হয় Firebase Auth দিয়ে, আর প্রতিটি টোকেন আমাদের সার্ভার নিজে যাচাই করে। বিজ্ঞাপন আসে AdMob থেকে, আসল টাকায় কোনো কেনাকাটা নেই।

    • Capacitor
    • Firebase Auth
    • AdMob
    • App Links

পরিচালনা

সার্ভার আমরা নিজেরাই চালাই

মাঝখানে কোনো গেম-ব্যাকএন্ড সার্ভিস নেই: নিজস্ব সার্ভার, নিজস্ব ডিপ্লয়, নিজস্ব মনিটরিং।

  • নিজস্ব লিনাক্স সার্ভার: Cloudflare-এর পেছনে Let’s Encrypt TLS-সহ nginx গেমটি পরিবেশন করে
  • WebSocket, অ্যাপ কনফিগ আর হেলথ চেক systemd-এ চলা Node সার্ভিসে প্রক্সি করা
  • অ্যাডমিন প্যানেল আলাদা সার্ভিস হিসেবে চলে, আর এমন এক অপারেটর API ডাকে যা শুধু ওই মেশিনেই সাড়া দেয়
  • এক কমান্ডে ডিপ্লয়: বিল্ড, সময়চিহ্নসহ রিলিজ আপলোড, সুইচ, রিস্টার্ট, হেলথ চেক; তাৎক্ষণিক রোলব্যাকের জন্য শেষ ৫টি রিলিজ রাখা
  • বাংলাদেশ থেকে Cloudflare হয়ে গড়ে প্রায় ২১০ ms রাউন্ড ট্রিপ (চালুর সময় মাপা)
  • Google Play ও App Store Connect-এর জন্য স্ক্রিপ্টে অ্যাপ বিল্ড
  • রুমের আমন্ত্রণের জন্য Android App Links ও iOS ইউনিভার্সাল লিংক

যে কঠিন সমস্যাগুলোর সমাধান করেছি

যে অংশ খেলোয়াড়েরা কখনো দেখেন না — আমাদের মাপা সংখ্যাসহ।

  1. প্রতিটি ফোনে হুবহু একই ফিজিক্স

    সমস্যা
    অনলাইন খেলায় প্রতিটি ফোন প্রতিপক্ষের শট নিজেই সিমুলেট করে। দুটি ডিভাইস কখনো একটি সংখ্যাও ভিন্নভাবে হিসাব করলে বোর্ড আলাদা হয়ে যেত, তাই ফিজিক্সকে সব জায়গায় নিখুঁত হতে হয়েছে।
    আমরা যা করেছি
    সিমুলেশন শুধু সেই অপারেশন ব্যবহার করে যা প্রতিটি JavaScript ইঞ্জিনে নিখুঁত — বর্গমূলভিত্তিক নিজস্ব hypot, log, acos, sin ও cos। সব র‍্যান্ডমনেস সিড করা, আর কোর কখনো ঘড়ি পড়ে না।

    ফলাফল Chromium ও WebKit ইঞ্জিনে ৪,৩২০টি শট পরীক্ষা: প্রতিটি বোর্ড বিট-বাই-বিট এক।

  2. একটি ডিসিঙ্ক, খুঁজে বের করে আটকানো

    সমস্যা
    ভিন্ন অ্যাপ সংস্করণের — সামান্য ভিন্ন ফিজিক্সের — খেলোয়াড়দের একসাথে ম্যাচ করা হচ্ছিল, আর তাদের বোর্ড মিলছিল না।
    আমরা যা করেছি
    এখন একটি প্রোটোকল সংস্করণ ম্যাচমেকিং ও রুম নিয়ন্ত্রণ করে, আর সংস্করণ না বাড়িয়ে ফিজিক্স বদলালে একটি ফিজিক্স ফিঙ্গারপ্রিন্ট টেস্ট বিল্ড আটকে দেয়।

    ফলাফল এখন শুধু হুবহু একই ফিজিক্সের খেলোয়াড়েরাই এক বোর্ডে খেলেন।

  3. ন্যায্যভাবে ভাঙা টাওয়ার

    সমস্যা
    তালগাছে প্রথম শটটি ১৯টি গুটির সাজানো টাওয়ারে লাগে। এটি আসল খেলার মতো লাগতে হবে, আবার দুই খেলোয়াড়ের জন্যই ন্যায্য হতে হবে।
    আমরা যা করেছি
    ৭০% বা তার বেশি গতির আঘাতে নিচের এক-দুটি গুটি ছিটকে যায়, টাওয়ার দাঁড়িয়ে থাকে; আস্তে মারলে টাওয়ার ভেঙে পড়ে। র‍্যান্ডমনেস সিড করা, তাই প্রতিটি ডিভাইসে একইভাবে ভাঙে।

    ফলাফল জোরালো আঘাতে ৯০% ক্ষেত্রে নিচের গুটি বেরিয়ে যায় — প্রতিটি স্ক্রিনে একইভাবে।

  4. ম্যাকে সাউন্ড

    সমস্যা
    অ্যাপল-সিলিকন ম্যাকে চলা আইপ্যাড অ্যাপ AAC বা Opus — কোনো অডিওই ডিকোড করতে পারছিল না।
    আমরা যা করেছি
    অ্যাপের সাথে সাউন্ড ও মিউজিকের ১৬-বিট WAV কপি দেওয়া হয়, আর গেম নিজেই সেগুলো ডিকোড করে।

    ফলাফল ম্যাকসহ প্রতিটি ডিভাইসে একই সাউন্ড।

  5. গেমে হাত না দিয়েই ভেন্ডর বদল

    সমস্যা
    অনলাইন খেলা শুরু হয়েছিল Firebase Realtime Database-এ, আর আমরা গেম নতুন করে না লিখে খেলার ডেটা নিজেদের সার্ভারে আনতে চেয়েছিলাম।
    আমরা যা করেছি
    প্রতিটি অনলাইন ফিচার একটিই ডেটাবেস ইন্টারফেসের সাথে কথা বলে। আমাদের সার্ভার একই রুলস ফাইল একই অর্থে প্রয়োগ করে, আর পুরো ম্যাচ ও ১৮০টির বেশি অনুমোদিত বা বাতিল লেখার একটিই চেক স্যুট দুই ব্যাকএন্ডেই চলে।

    ফলাফল খেলার ডেটা এখন আমাদের নিজস্ব সার্ভারে, আর ব্যাকএন্ড বদলাতে লাগে বিল্ডের মাত্র দুটি সেটিং।

  6. প্রথম শট পর্যন্ত দ্রুত

    সমস্যা
    একটি ক্যাজুয়াল গেমের হাতে খেলোয়াড়কে ধরে রাখতে মাত্র কয়েক সেকেন্ড — প্রায়ই ধীর মোবাইল সংযোগে।
    আমরা যা করেছি
    ডাউনলোড করার মতো কোনো ইঞ্জিন বা ফ্রেমওয়ার্ক নেই, প্রথম ট্যাপের আগে কোনো অডিও নেই, আর একটি পারফরম্যান্স টেস্ট প্রোডাকশন বিল্ড ধীর সংযোগে চালিয়ে দেখে।

    ফলাফল ধীর করা Fast 3G-তে প্রথম লোড ৩ সেকেন্ড বা তার কম।

ডেমো নয়, প্রোডাক্টের মতো পরীক্ষিত

  • ৩৯৬টি ইউনিট টেস্ট আর ১৫০টি ব্রাউজার টেস্ট — প্রতিটি ফোন, ট্যাবলেট ও ডেস্কটপ সাইজে, স্ক্রিনশট বেসলাইনসহ (৪০০-র বেশি রান)
  • বট বনাম বট ব্যালান্স টেস্ট আর একটি মাঙ্কি টেস্ট
  • ডেটাবেস রুলসের বিপরীতে পুরো অনলাইন ম্যাচ খেলা একটি এমুলেটর স্যুট
  • ডিটারমিনিস্টিক ফিজিক্সের কারণে ইউনিট টেস্টে স্ক্রিন ছাড়াই শট সিমুলেশন

প্রযুক্তি

  • TypeScript
  • Vite
  • Canvas 2D
  • Node.js
  • MongoDB
  • WebSocket
  • Capacitor
  • Firebase Auth
  • AdMob
  • Vitest
  • Playwright
  • nginx
  • Cloudflare
  • systemd

GPScom: gpscom.gr-এর সম্পূর্ণ নতুন ডিজাইন

আমাদের সব কাজ দেখুন

এভাবে তৈরি একটি গেম বা রিয়েল-টাইম অ্যাপ চান?

আমরা গেম আর রিয়েল-টাইম প্ল্যাটফর্ম শুরু থেকে শেষ পর্যন্ত ডিজাইন, তৈরি ও পরিচালনা করি: অ্যাপ, সার্ভার, স্টোর আর অপারেশন।