بلوت لنز
تطبيق ويب تقدّمي يقوم مقام الحكم على طاولة بلوتٍ حقيقية: يلعب اللاعبون بورقٍ فعلي، بينما يتابع التطبيق الأدوار، ويكتشف اللعب عبر GPT-4o Vision، ويطبّق قواعد البلوت السعودي (شدّة من 32 ورقة، وحساب الحكم، والمشاريع)، ويحفظ لوحة نتائج حيّة. مبني بـ Next.js وTypeScript وNeon Postgres وDrizzle ORM، ومضبوطٌ لتجربةٍ عربيةٍ أولًا من اليمين لليسار.
محاسبُ نقاطٍ شامل لطاولة البلوت: يجلس أربعة لاعبين بورقٍ حقيقي، فيراقب التطبيق الطاولة عبر كاميرا الهاتف، ويكتشف الورق بـ GPT-4o Vision، ويطبّق قواعد البلوت السعودي (شدّة من 32 ورقة، والحكم، والمشاريع كأبات وتمّ وسوا، ومكافأة البلوت)، ويجمع النقاط تلقائيًا دون إدخالٍ يدوي. صار الحكم برنامجًا.
ما الذي يحلّه
- حساب النقاط يدويًا في البلوت يفتح باب الجدال حول مجاميع الأكلات وحساب المشاريع.
- وللبلوت السعودي قواعدُ دقيقة: شدّةٌ من 32 ورقة، وحساب الحكم، وخمسة أنواعٍ من المشاريع، ومكافأة البلوت؛ ولم يكن له تطبيق حكمٍ من قبل.
- وتطبيقات البلوت إمّا تلعب ضدّ الذكاء الاصطناعي وإمّا أدواتُ تسجيلٍ مملّة؛ ولا أحد منها يراقب طاولةً حيّة ويكتشف اللعب.
الأثر
رؤية GPT-4o (اختيارية)
بلوت سعودي بـ32 ورقة
تتبّعٌ فوري للأكلات والمشاريع

البنية
تدفّق البيانات
- يجلس أربعة لاعبين على الطاولة بورقٍ فعلي
- الإعداد: أسماء اللاعبين والمقاعد → فرق
- توزيع 8 أوراق لكل لاعب (شدّة 32 ورقة)
- إعلان الحكم (يختار اللاعب بدلة الحكم)
- تلتقط كاميرا الهاتف الطاولة (اختيارية)
- كشف الورق بـ GPT-4o Vision ودرجة الثقة
أو إدخال يدوي
- محرّك البلوت يتحقق من الحركة (اتّباع البدلة وإلزام الحكم)
- يُحسَم الفائز بالأكلة ويُخزَّن في Postgres
- بعد 8 أكلات: تحتسب applyProjects() الجولة
أبات وتمّ وسوا ومكافأة البلوت
- تتحدّث لوحة النتائج الحيّة لحظيًا
القرارات الهندسية
محرّك قواعد نقي (بلا آثار جانبية)
محرّك البلوت في lib/baloot/engine.ts بلا أي تبعيةٍ لقاعدة البيانات أو React أو Date، فتُختبَر أنواع المشاريع الجديدة ومتغيّرات القواعد وحدها بمعزل، ويسهل نقل المحرّك إلى تطبيقٍ محمولٍ أصيل لاحقًا.
رؤية GPT-4o لكشف الورق اختياريًا
بدل تدريب كاشفٍ مخصّص، تُستخدَم رؤية GPT-4o لكشف الورق من لقطةِ هاتفٍ مع درجات ثقة؛ وإن لم يُضبَط OPENAI_API_KEY أدخل اللاعبون اللعب يدويًا. لا تبعيةَ صارمة.
إجراءات الخادم لكل تعديلات قاعدة البيانات
لا تتغيّر حالة اللعبة إلّا عبر إجراءات خادم Next.js في lib/actions/game.ts، فيُمنَع الغشّ من جانب العميل (كتغيير النقاط يدويًا) ويبقى المحرّك مصدر الحقيقة.
العربية أولًا وRTL افتراضًا
يضبط جذر التخطيط lang="ar" dir="rtl"، وكل الواجهة بالعربية مع ترجمةٍ إنجليزية، وتتكفّل خصائص Tailwind المنطقية (ms-*, me-*) بقلب الاتجاه تلقائيًا.
يتحمّل العمل دون اتصال مع Postgres اختياري
إن لم يُضبَط DATABASE_URL عمل التطبيق في الذاكرة، وهو مثالي للّعب على الطاولة دون قاعدة بيانات؛ فالحفظ خيارٌ لا إلزام.
معرض الصور


