→ كل الأعمال
تفاعلي / لعبة

Asteroids

إعادة بناء للعبة الأركيد الصادرة عام 1979 بغير محرّك ألعاب خلفها، مع جدول نتائج عالمي لا تسمح قاعدة البيانات نفسها بتزييفه.

شاهد العرض المباشر ←
المنصة
Vanilla JS + Canvas، بُنيت بـ Claude Code
التقنيات
HTML5 Canvas, ES modules, Supabase (Postgres + RLS)

ما هي

إعادة بناء للعبة الأركيد الصادرة عام 1979، مبنية بلغة JavaScript خالصة فوق لوحة رسم HTML5 Canvas، بغير محرّك ألعاب ولا مكتبة فيزياء. السفينة مرسومة بخطوط متجهية (vector) وتندفع بقصور ذاتي حقيقي، فتواصل الانجراف بعد أن تتوقف عن دفعها. وكل شيء يلتفّ حول حواف الشاشة، والكويكبات تتفتت إلى كويكبات أصغر حين تصيبها، والقفز عبر الفضاء (hyperspace) يلقي بك في مكان عشوائي. تهتزّ الشاشة عند كل انفجار، والحطام دفقة من الجسيمات، ولا يوجد في المشروع كله ملف صوتي واحد: كل صوت يولّده المتصفح بالكود أثناء التشغيل. وخلف اللعبة جدول نتائج عالمي يُحفظ في قاعدة بيانات Postgres حقيقية.

لماذا بدأت من هنا

برمجة الألعاب هي أول ما تعلّمته، وما زالت المجال الذي أشعر فيه بأكبر قدر من الارتياح، فكانت أسهل نقطة بداية وأسرع طريق إلى شيء يمكنك أن تلعبه فعلاً في المتصفح. ومنحتني في الوقت نفسه نظامًا خلفيًا حقيقيًا لتأمينه، وهو الجزء الذي أردت أن أقضي فيه وقتي.

الجزء الذي تطلّب تفكيرًا حقيقيًا

لوحة الصدارة واحدة من تلك الميزات التي يسهل بناؤها بطريقة تنهار فورًا. النسخة المباشرة منها تجعل المتصفح يرسل النتيجة إلى قاعدة البيانات وقاعدة البيانات تسجّلها، ما يعني أن أي شخص يفتح أدوات المطوّر في متصفحه يستطيع كتابة الرقم الذي يحلو له في جدول أعلى النتائج.

لذلك نقلت القرار خارج المتصفح. اللعبة ما زالت تتحقق من النتيجة، لكن ذلك التحقق موجود لالتقاط الأخطاء البريئة فقط؛ أما الفرض الحقيقي فمكتوب على شكل سياسات أمان على مستوى الصف (row-level security) على الجدول نفسه. قاعدة البيانات لا تقبل إلا الإضافة، ولا تقبل التعديل ولا الحذف أبدًا، فلا يستطيع أحد ممن يستخدمون الموقع تغيير النتائج الموجودة أو إزالتها. وهي ترفض كل ما هو مشوّه، وكل ما هو سالب، وكل ما يتجاوز سقفًا أعلى مما يمكن أن تبلغه جلسة لعب حقيقية. ومن يتلاعب بالصفحة يظل يتحدث إلى السياسات نفسها، فيتلقى الرفض نفسه.

ما الذي سأضيفه لاحقًا

أعداء على شكل صحون طائرة يطلقون النار بالمقابل، ووضع عرض تجريبي يلعب من تلقاء نفسه على شاشة العنوان كما كانت تفعل ماكينة الأركيد الأصلية.

وفي لوحة الصدارة أيضًا ثغرة لم أغلقها بعد. لا يوجد حاليًا ما يمنع سكربتًا آليًا من إرسال سلسلة طويلة من النتائج المعقولة، كل واحدة منها شرعية بمفردها، لكنها تصل أسرع مما يستطيع إنسان أن يلعب. تحديد معدّل الإرسال لكل عنوان، أو توقيع الإرسال من اللعبة نفسها، سيعالج ذلك، وهو الشيء التالي الذي سأفعله في هذا المشروع.