माफिया ऑन गो, वनिला JS और WebSocket'ah



यह लोकप्रिय कार्ड गेम " माफिया " के वेब-कार्यान्वयन के बारे में होगा। यह खेल के विकास में मज़ा और अनुभव के लिए लिखा गया था। पहले संस्करण को काम से दो सप्ताह के खाली समय में लिखा गया था और उसी समय में दूसरे संस्करण को फिर से लिखा गया था। इस खेल का लाभ एक मेजबान की अनुपस्थिति है।

विकास के लक्ष्यों के आधार पर, मैंने सुविधाओं के कार्यान्वयन / गैर-कार्यान्वयन पर निर्णय लिया।
वास्तव में क्या करने की आवश्यकता है:

  • क्लासिक खेल के नियमों को दोहराते हुए न्यूनतम खेल
  • ग्राहक उपकरणों पर नेता के आदेश की आवाज
  • ब्राउज़र टैब को रिबूट करने के बाद भी गेम की निरंतरता

क्या योजना नहीं थी या स्थगित किया जा सकता है:

  • खेल पंजीकरण
  • प्रशासन इंटरफ़ेस
  • एक डेटाबेस में खेल डेटा का स्थायी भंडारण
  • उपकरणों के बीच समय सिंक्रनाइज़ेशन

बैकएंड


https://github.com/mrsuh/mafia-backend
गो में लिखा। यह खेल की स्थिति को संग्रहीत करता है और इसके तर्क के लिए जिम्मेदार है।

खेल के दौरान, आप पूरी जानकारी जानने के लिए सर्वर से संपर्क कर सकते हैं:

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 test mafia-backend/src -cover ok mafia-backend/src 1.315s coverage: 70.7% of statements 

दृश्यपटल


https://github.com/mrsuh/mafia-frontend
यह शुद्ध जेएस में लिखा गया है और ग्रंट का उपयोग करके बनाया गया है।
इसमें कोई तर्क नहीं है।

जब बैकएंड के साथ कोई ईवेंट होता है, तो यह वांछित पेज को रेंडर करता है, यह भेजे गए डेटा को प्रदर्शित करता है और नए ईवेंट की ध्वनि को चलाता है।

फ़्रंटेंड गेम और प्लेयर आईडी को लोकलस्टोरेज या ब्राउज़र क्वेरी स्ट्रिंग में स्टोर करता है (यदि आपको अलग-अलग खिलाड़ियों के लिए एक ब्राउज़र में कई टैब चलाने की आवश्यकता है)। तर्क की पूर्ण कमी, साथ ही खेल के बुनियादी मापदंडों का भंडारण खेल की स्थिति को बहाल करने के लिए पृष्ठ को फिर से लोड करने के बाद भी संभव बनाता है।

ब्राउज़र उपयोगकर्ता के हस्तक्षेप के बिना ध्वनियों के ऑटो-प्ले को प्रतिबंधित करता है (उदाहरण के लिए, एक बटन दबाकर)। बैकएंड के साथ आने वाली प्रत्येक घटना के लिए ध्वनियों को खेलने के लिए, केवल 1 जावास्क्रिप्ट ऑडियो ऑब्जेक्ट बनाया गया था। प्रत्येक खिलाड़ी को खेल शुरू करने के लिए एक बटन दबाना होगा और उसी क्षण ऑडियो ऑब्जेक्ट सक्रिय (प्लेबैक के लिए उपलब्ध) हो जाता है, और बाद में वह उपयोगकर्ता के हस्तक्षेप के बिना विभिन्न ध्वनियों को चलाने के लिए src पैरामीटर को बदल सकता है।

इसके अलावा, खेल का परीक्षण करने के लिए, एक "बॉट" लिखा गया था जो खुद के साथ खेल सकता है।
बस ब्राउज़र टैब खोलें, जहां पैरामीटर इंगित करते हैं कि आप परीक्षण चलाना चाहते हैं

 http://127.0.0.1?master=1&test=1&sound=0&testUsersCount=5 

और इस डोमेन के लिए जावास्क्रिप्ट से नए टैब खोलने की अनुमति दें।
खेल शुरू होने के बाद, खिलाड़ियों के साथ 5 और टैब खुलेंगे और वे आपस में खेलना शुरू करेंगे।

इंटरेक्शन प्रोटोकॉल


बैकएंड और फ्रंटएंड और दोनों भाषाओं में इसके समर्थन के बीच निरंतर दो-तरफ़ा डेटा विनिमय की आवश्यकता के कारण वेबसॉकेट प्रोटोकॉल को चुना गया था।

खेल की घटनाओं


पूरा खेल घटनाओं में विभाजित है:

घटनाओं
  • खेल
    • बनाने
    • में शामिल होने के
    • प्रारंभ
    • ऊपर
    • पुनः कनेक्ट

  • दिन
    • प्रारंभ

  • रात
    • प्रारंभ

  • नागरिकों-ग्रीटिंग
    • प्रारंभ
    • भूमिका
    • अंत

  • माफिया ग्रीटिंग
    • प्रारंभ
    • खिलाड़ियों
    • अंत

  • कोर्ट
    • प्रारंभ
    • खिलाड़ियों
    • अंत

  • माफिया
    • प्रारंभ
    • खिलाड़ियों
    • अंत

  • चिकित्सक
    • प्रारंभ
    • खिलाड़ियों
    • अंत

  • लड़की
    • प्रारंभ
    • खिलाड़ियों
    • अंत

  • शरीफ
    • प्रारंभ
    • खिलाड़ियों
    • अंत



घटनाओं की शुरुआत, अंत और सामग्री होती है।
घटना की शुरुआत और अंत में, सभी सक्रिय खिलाड़ियों को एक अधिसूचना भेजी जाती है, जिसकी पुष्टि की जानी चाहिए। सभी सक्रिय खिलाड़ियों द्वारा इस घटना की पुष्टि के बाद ही खेल जारी है (उदाहरण के लिए, केवल साउंड फ़ाइल चलाने के बाद)।

डाक में काम करनेवाला मज़दूर


पूरे खेल को डोकर का उपयोग करके उठाया जा सकता है:
डोकर-compose.yml

 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-compose up 

उसके बाद, आप ब्राउज़र में गेम टैब खोल सकते हैं:

 http://127.0.0.1:9080 

निष्कर्ष


यहां आप देख सकते हैं कि परिणाम क्या निकला (प्लेबैक गति 1.5 गुना बढ़ गई)।


अपने खाली समय में लगभग एक महीने के विकास के बाद, मुझे एक सुंदर स्थिर खेल मिला जिसे आप दोस्तों के साथ खेल सकते हैं। पृष्ठ के साथ खेल पुनः लोड होता है या अस्थायी नेटवर्क आउटेज होता है। उपकरणों पर होने वाली घटनाओं का स्वर अभिनय, समय के बिना तुल्यकालन के काम करता है। खेल के आगे के विकास की योजना नहीं है।

पुनश्च: खेल की आवाज अभिनय के लिए लैरा को धन्यवाद।

Source: https://habr.com/ru/post/hi423821/


All Articles