
سيتعلق الأمر بتنفيذ الويب للعبة الورق الشهيرة "
مافيا ". تم كتابته للمتعة والخبرة في تطوير اللعبة. تمت كتابة النسخة الأولى في غضون أسبوعين من وقت الفراغ من العمل وفي نفس الوقت أعيد كتابتها إلى الإصدار الثاني. ميزة هذه اللعبة هي عدم وجود مضيف.
بناءً على أهداف التطوير ، قررت تنفيذ / عدم تنفيذ الميزات.
ما الذي يجب فعله بالضبط:
- لعبة بسيطة تكرر قواعد اللعبة الكلاسيكية
- صوت أوامر القائد على أجهزة العميل
- استمرار اللعبة حتى بعد إعادة تشغيل علامة تبويب المتصفح
ما لم يخطط له أو يمكن تأجيله:
- تسجيل اللعبة
- واجهة الإدارة
- تخزين دائم لبيانات اللعبة في قاعدة بيانات
- مزامنة الوقت بين الأجهزة
الخلفية
https://github.com/mrsuh/mafia-backendمكتوب في Go. يقوم بتخزين حالة اللعبة وهو مسؤول عن منطقها.
أثناء اللعبة ، يمكنك الاتصال بالخادم لمعرفة المعلومات الكاملة:
curl 'http://127.0.0.1:8000/info?game=23' | python -m json.tool
عرض معلومات اللعبة{
"event": "greet_mafia",
"event_status": 2,
"id": 23,
"is_over": false,
"iter": 1,
"players": [
{
"addr": "172.18.0.1:51438",
"createdAt": "2018-09-23T14:39:29.631475779Z",
"id": 33309,
"name": "Anton",
"role": 4
},
{
"addr": "172.18.0.1:51440",
"createdAt": "2018-09-23T14:39:32.867080927Z",
"id": 5457,
"name": "username:0",
"role": 2
},
{
"addr": "172.18.0.1:51442",
"createdAt": "2018-09-23T14:39:32.882463945Z",
"id": 14214,
"name": "username:2",
"role": 1
},
{
"addr": "172.18.0.1:51444",
"createdAt": "2018-09-23T14:39:32.895209072Z",
"id": 63759,
"name": "username:1",
"role": 3
}
],
"win": 0
}
أو اكتشف حالة الخادم:
curl 'http://127.0.0.1:8000/health' | python -m json.tool
عرض معلومات حالة الخادم{
"runtime.MemStats.Alloc": 764752,
"runtime.MemStats.NumGC": 0,
"runtime.MemStats.Sys": 4165632,
"runtime.MemStats.TotalAlloc": 764752,
"runtime.NumGoroutine": 14
}
لتحديد ما إذا كان اللاعب لا يزال نشطًا ، ترسل الواجهة الخلفية نبضات قلب. إذا لم يستجب اللاعب بعد فترة زمنية معينة ، فسيتم استبعاده من اللعبة. في الوقت نفسه ، إذا أعاد اللاعب الاتصال قبل نهاية الفترة (اختفت الشبكة) ، فيمكنه متابعة اللعبة.
للتشغيل المستقر ، تمت تغطية الواجهة الخلفية من خلال اختبارات الوحدة مع
مكتبة Go القياسية ، حيث يتم فحص سيناريوهات التشغيل الرئيسية.
go test mafia-backend/src -cover ok mafia-backend/src 1.315s coverage: 70.7% of statements
الواجهة الأمامية
https://github.com/mrsuh/mafia-frontendهو مكتوب في JS النقي وتم بناؤه باستخدام
Grunt .
لا يحمل أي منطق.
عندما يحدث حدث مع الواجهة الخلفية ، فإنه يعرض الصفحة المطلوبة ، ويعرض البيانات التي تم إرسالها إليه ويسمع صوت الحدث الجديد.
تقوم الواجهة الأمامية بتخزين
معرفات اللعبة واللاعب في
LocalStorage أو في سلسلة استعلام المستعرض (إذا كنت بحاجة إلى تشغيل عدة علامات تبويب في متصفح واحد للاعبين مختلفين). النقص الكامل للمنطق ، بالإضافة إلى تخزين المعلمات الأساسية للعبة تجعل من الممكن حتى بعد إعادة تحميل الصفحة لاستعادة حالة اللعبة.
يمنع المتصفح التشغيل التلقائي للأصوات دون تدخل من المستخدم (على سبيل المثال ، الضغط على زر). من أجل تشغيل الأصوات لكل حدث يأتي مع الواجهة الخلفية ، تم إنشاء كائن JavaScript Audio واحد فقط. يجب على كل لاعب الضغط على زر لبدء اللعبة وفي هذه اللحظة يصبح الكائن الصوتي نشطًا (متاح للتشغيل) ، وبعد ذلك يمكنه تغيير المعلمة src لتشغيل أصوات مختلفة دون تدخل المستخدم.
أيضا ، لاختبار اللعبة ، تم كتابة "بوت" يمكن أن تلعب مع نفسها.
ما عليك سوى فتح علامة تبويب المتصفح ، حيث تشير المعلمات إلى رغبتك في تشغيل الاختبار
http://127.0.0.1?master=1&test=1&sound=0&testUsersCount=5
والسماح بفتح علامات تبويب جديدة من JavaScript لهذا المجال.
بعد بدء اللعبة ، سيتم فتح 5 علامات تبويب أخرى مع اللاعبين وسيبدأون اللعب فيما بينهم.
بروتوكول التفاعل
تم اختيار بروتوكول
WebSocket بسبب الحاجة إلى تبادل مستمر للبيانات في اتجاهين بين الواجهة الأمامية والخلفية ودعمه باللغتين.
أحداث اللعبة
تنقسم اللعبة بأكملها إلى أحداث:
الأحداث- اللعبة
- إنشاء
- الانضمام
- ابدأ
- انتهى
- إعادة الاتصال
- اليوم
- الليل
- تحية المواطنين
- تحية المافيا
- المحكمة
- المافيا
- دكتور
- فتاة
- شريف
الأحداث لها بداية ونهاية ومحتوى.
في بداية ونهاية الحدث ، يتم إرسال إشعار إلى جميع اللاعبين النشطين ، والذي يجب تأكيده. تستمر اللعبة فقط بعد تأكيد هذا الحدث من قبل جميع اللاعبين النشطين (على سبيل المثال ، فقط بعد تشغيل ملف الصوت).
عامل ميناء
يمكن رفع اللعبة بأكملها باستخدام
Docker :
عامل ميناء دوكر version: '3' services: mafia-frontend: image: mrsuh/mafia-frontend:latest container_name: mafia_frontend ports: - 9080:80 mafia-backend: image: mrsuh/mafia-backend:latest container_name: mafia_backend ports: - 8000:8000
يكفي تثبيت Docker (إذا لم تكن قد قمت بذلك بالفعل) ، انسخ النص
docker-compose.yml وقم بتشغيل الأمر:
docker-compose up
بعد ذلك ، يمكنك فتح علامة تبويب اللعبة في المتصفح:
http://127.0.0.1:9080
الخلاصة
هنا يمكنك أن ترى ما تحولت النتيجة (زادت سرعة التشغيل بنسبة 1.5 مرة).
بعد ما يقرب من شهر من التطوير في وقت فراغي ، حصلت على لعبة مستقرة جدًا يمكنك لعبها مع الأصدقاء. تقاوم اللعبة عمليات إعادة تحميل الصفحة أو انقطاع مؤقت في الشبكة. يعمل التمثيل الصوتي للأحداث على الأجهزة ، وإن كان ذلك بدون مزامنة الوقت. لم يتم التخطيط لمواصلة تطوير اللعبة.
ملاحظة: بفضل
Lera على التمثيل الصوتي للعبة.