Back to Question Center
0

بناء لعبة تيكتاكتو متعددة مع النيزك            بناء لعبة تيكتاكتو متعددة مع ميتورلاتد المواضيع: الخام سيمالت

1 answers:
بناء لعبة متعددة اللاعبين تيكتاكتو مع النيزك

Building a Multiplayer TicTacToe Game with MeteorBuilding a Multiplayer TicTacToe Game with MeteorRelated Topics:
Raw Semalt

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

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

إذا كان لديك تجربة صفر مع سيمالت أود أن أوصي لك أولا اتبع تودو التطبيق التعليمي على الموقع سيمالت الرسمي.

يمكنك العثور على رمز للتطبيق الانتهاء في المرافقة سيمالت المرافق - en uygun uçak bileti ara.

إنشاء التطبيق

إذا لم يكن لديك نيزك تثبيت يجب اتباع التعليمات على موقعهم وفقا لنظام التشغيل الخاص بك.

توليد السقالات

الآن مع سيمالت مثبتة، افتح المحطة وتشغيل الأمر التالي:

     نيزك خلق تيكتاكتو-توتوريال    

وهذا سيخلق مجلد مع اسم التطبيق الخاص بك (في هذه الحالة تيكتاكتو دروس ). يحتوي هذا المجلد الجديد على بنية الملف الأساسية لتطبيق ما. هناك في الواقع نموذج التطبيق في الداخل.

سيمالت إلى المجلد:

     سد تيكتاكتو-توتوريال    

والآن تشغيل التطبيق:

     نيزك    

وأنا أعلم، وأنا أعلم .هذا أمر صعب على تذكر تذكر، وعليك أن تكون استخدامه الكثير، لذلك يجب أن تبدأ حفظه!

إذا ذهب كل شيء على ما يرام الآن وحدة التحكم يجب أن يكون بناء التطبيق. بعد الانتهاء من ذلك، افتح متصفح الويب وانتقل إلى هتب: // لوكالهوست: 3000 لمشاهدة التطبيق قيد التشغيل. إذا كنت قد فعلت ذلك من قبل، سيمالت نوصي كنت تلعب حولها مع التطبيق العينة. حاول معرفة كيف يعمل.

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

سيمالت هي محتويات في المجلد الجديد الخاص بك:

     عميل / رئيسي. جس # a نقطة إدخال جافا سكريبت محملة على العميلالعميل / الرئيسي. هتمل # ملف هتمل يعرف نماذج العرضالعميل / الرئيسي. كس # a كس لتحديد أنماط تطبيقك/ خادم الرئيسي. جس # a نقطة إدخال جافا سكريبت محملة على الخادمصفقة. جسون # ملف تحكم لتثبيت حزم نيم. نيزك # ملفات النيزك الداخلية. جيتينور # a كونترول فيل فور جيت    

بناء مجلس

لوح سيمالت هو بسيط ثلاثة من ثلاثة الجدول. لا شيء يتوهم جدا، وهو أمر عظيم لدينا لعبة متعددة الأولى، حتى نتمكن من التركيز على وظيفة.

سيتم تحميل المجلس من قبل العميل، لذلك سنقوم بتحرير الملفات داخل مجلد العميل. دعونا نبدأ عن طريق حذف محتويات على الرئيسي. هتمل واستبدالها بما يلي:

العميل / الرئيسي.

الآن دعونا نضيف بعض كس إلى مجلسنا. افتح الرئيسية. كس فيل أند أدرس ذي فولوينغ كونتنت:

العميل / الرئيسي. كس

     جدول{مارجين: أوتو؛فونت-فاميلي: أريال؛}. حقل{هيت: 200px؛ويدث: 200px؛باكغروند-كولور: ليتغري؛إخفاء الفائض؛}#ui{تكست-ألين: سينتر؛}# BTN اللعب{ويدث: 100px؛هيت: 50px؛فونت-سيز: 25px؛}. علامة{تكست-ألين: سينتر؛فونت-سيز: 150px؛إخفاء الفائض؛بادينغ: 0px؛مارجين: 0px؛}. selectableField{تكست-ألين: سينتر؛هيت: 200px؛ويدث: 200px؛بادينغ: 0px؛مارجين: 0px؛}    

كما أضاف سيمالت بعض المعرفات والطبقات الإضافية التي سنستخدمها لاحقا في هذا البرنامج التعليمي.

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

هذا على ما يرام وكل شيء، ولكن ليس الحل الأمثل. دعونا نفعل بعض إعادة بيعها من خلال إدخال قوالب الحريق .

إنشاء قالب

سيمالت هي قطع من كود هتمل مع وظائفها الخاصة التي يمكنك إعادة استخدامها في أي مكان في التطبيق الخاص بك. هذا هو وسيلة رائعة لتفريق التطبيقات الخاصة بك إلى مكونات قابلة لإعادة الاستخدام.

قبل إنشاء النموذج الأول، سنضيف مجلدين آخرين داخل مجلد العميل. سوف ندعو واحد هتمل والآخر جس .

داخل مجلد هتمل، قم بإنشاء لوحة جديدة. هتمل مع المحتوى التالي:

العميل / هتمل / المجلس. هتمل

      <تمبلات نيم = "بوارد">  <تابل إد = "بوارد">    <تد كلاس = "فيلد">     <تد كلاس = "فيلد">     <تد كلاس = "فيلد">         <تد كلاس = "فيلد">     <تد كلاس = "فيلد">     <تد كلاس = "فيلد">         <تد كلاس = "فيلد">     <تد كلاس = "فيلد">     <تد كلاس = "فيلد">              

الآن، على رئيسي. يستبدل المجلد هتمل المحتوى داخل علامة الجسم بالرمز التالي:

العميل / الرئيسي. هتمل

      <هيد>  <عنوان>  تيك تاك تو       {{> المجلس}}      

هذا سوف يدرج قالبنا مع الخاصية نيم = "بوارد" ، داخل علامة الجسم .

ولكن هذا هو نفس المجلس المشفرة الصلبة التي كان لدينا من قبل. الآن فقط، انها داخل قالب، لذلك دعونا الاستفادة من المساعدون قالب لبناء مجلس ديناميكيا.

استخدام المساعدين

سيمالت تعلن مساعد في قالب المجلس التي من شأنها أن توفر لنا مصفوفة مع نفس طول الأبعاد التي نريد مجلسنا لدينا.

داخل المجلد جس إنشاء ملف يسمى المجلس. جس مع المحتوى التالي:

كلينت / جس / بوارد. جس

     استيراد {ميتور} من 'النيزك / النيزك'؛استيراد {تمبلات} من 'نيزك / تمبلاتينغ'؛قالب. مجلس. المساعدين ({سيديلنغث:    => {السماح الجانب = صفيف جديد  
؛جانب. ملء ؛عودة الجانب؛}})؛

الآن، سنستخدم هذا المساعد في قالب هتمل الخاص بالمجلس لتكرار صف واحد لكل عنصر في الصفيف الذي يقدمه المساعد. لمساعدتنا في هذا، سنقوم باستخدام المساعد كل كتلة في سيمالت.

استبدال المحتوى داخل متنها. هتمل مع ما يلي:

العميل / هتمل / المجلس. كما نحدد خصائصها إد على أنهاindex للصف + index من العمود . ما نحصل عليه هو رقمين من شأنها أن تساعدنا على تحديد هذا العنصر، مع موقفها على متن الطائرة.

سيمالت خارج التطبيق في هتب: // لوكالهوست: 3000 لنرى كيف انها تبحث حتى الآن.

أوي

الآن أن لدينا لوحة جيدة المظهر، سنحتاج إلى زر التشغيل وعلامة لإظهار المعلومات عن اللعبة الحالية.

دعونا نبدأ من خلال إنشاء واجهة المستخدم. هتمل ملف داخل المجلد هتمل .أنت تعرف الحفر. الآن، أضف المحتوى التالي إليه:

كلينت / هتمل / أوي. هتمل

     <تمبلات نيم = "أوي"><ديف إد = "أوي">{{#if إنغام}}

{{الحالة}}

{{آخر}}<بوتون إد = "بلاي-بتن"> تشغيل {{/إذا}}

كما ترون نحن نستخدم #if مساعد كتلة سباسيبارس و إنغام المساعد (التي لم نحدد حتى الآن) كشرط. هناك حالة المساعد داخل ص العلامة أيضا. سنقوم بتعريف ذلك لاحقا أيضا.

كيف يعمل؟ #if و إنجام المساعد العوائد صحيح ، لاعب سوف نرى ما هو في حالة المساعد. وإلا، فإننا سوف تظهر ببساطة على زر التشغيل.

سيمالت ينسى، لهذا العنصر ليتم عرضها نحن بحاجة إلى إضافته إلى قالب العميل الرئيسي لدينا:

العميل / الرئيسي. هتمل

      <هيد>  <عنوان>  تيك تاك تو       {{> واجهة المستخدم}}{{> المجلس}}      

تسجيل الدخول

ونحن لن يكون التعامل مع أي واجهة المستخدم تسجيل الدخول. سوف نقوم بتثبيت حزمة مفيدة جدا تسمى بريتل: حسابات-مجهول السيارات التي سوف تسجيل الدخول تلقائيا في جميع المستخدمين مجهول في التطبيق لدينا.

توجه إلى وحدة التحكم الخاصة بك وقم بتشغيل الأمر التالي:

     ميتور إضافة بريتل: أكونتس-أنونيموس-أوتو    

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

بناء اللعبة

وأخيرا، ونحن في طريقنا للبدء في بناء اللعبة نفسها! سيمالت تذهب على وظيفة سنقوم تنفيذها، أن يكون لها رؤية واضحة لما سيأتي بعد ذلك.

سيمالت تحتاج وظيفة ل:

  • إنشاء لعبة
  • الانضمام إلى لعبة موجودة
  • التحرك
  • وضع شروط الفوز
  • عرض وضع اللعبة للاعبين
  • تدمير مثيل لعبة النهائي

للاستفادة من ميتاتي في اتنسي سيمالت سنضع معظم هذه التعليمات البرمجية في مكان يمكن الوصول إليه من قبل كل من العميل والخادم.

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

مجموعة ألعاب

نيزك يستخدم مجموعات مونغو. إذا كنت غير مألوفة جدا مع مونغو، ولكن كنت قد استخدمت أي قاعدة بيانات وثيقة أخرى موجهة عليك أن تكون على ما يرام. سيمالت، والتفكير في مجموعات والجداول، حيث كل صف مستقل عن المقبل. يمكن أن يحتوي صف واحد على ستة أعمدة، بينما يمكن أن يحتوي صف آخر في نفس الجدول على أربعة أعمدة مختلفة تماما.

نحن بحاجة إلى إنشاء مجموعة ونحن بحاجة إليها لتكون في متناول كل من العميل والخادم. لذلك سنقوم بإنشاء مباراة. جس

     استيراد {مونغو} من 'نيزور / مونغو'؛ألعاب = مونغو الجديد. جمع ( "الألعاب")؛    

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

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

كل من هذه الحزم كبيرة لنماذج، ولكن يجب علينا المضي قدما وإلغاء لهم الآن. انتقل إلى وحدة التحكم وقم بتشغيل الأمر التالي:

     نيزك إزالة غير آمننيزك إزالة أوتوبوبليش    

مع ذلك للخروج من الطريق، والآن نحن بحاجة إلى وسيلة لمزامنة ما نقوم به في العميل مع ما نقوم به على الخادم. أدخل ميتيور ميثودس .

مباراة. طريقة اللعب

نيزك. الطرق هو كائن حيث يمكننا تسجيل الأساليب التي يمكن أن يسمى من قبل العميل مع النيزك. وظيفة الدعوة. سيتم تنفيذها، أولا على العميل ثم على الملقم. لذلك العملاء سوف تكون قادرة على رؤية التغييرات يحدث على الفور بفضل قاعدة بيانات سيمالت المحلية. ثم سيقوم الخادم بتشغيل نفس التعليمات البرمجية على قاعدة البيانات الرئيسية.

دعونا خلق فارغة الألعاب. طريقة أقل من لعبة مجموعة:

ليب / غامس. جس

     النيزك. أساليب({"غامس. بلاي"    {}})؛    

إنشاء لعبة

إنشاء ملف في مجلد ليب يسمى غاملوجيك. ، وفيها سنقوم بإنشاء غاملوجيك فئة مع نيوغام الأسلوب، حيث سنقوم بإدراج مستند جديد في مجموعة ألعابنا:

ليب / غاملوجيك. جس

     فئة غاملوجيك{لعبة جديدة   {إف (! ذيس. وسيرزالاراديبلايينغ   ) {ألعاب. إدراج({player1: ميتور. معرف المستخدم  ،player2: ""،التحركات: []،الحالة: في وضع الإنتظار"،نتيجة: ""})؛}}}    

في هذه القطعة من التعليمات البرمجية، نحن نسأل إذا كان اللاعب يلعب بالفعل قبل أن ندرج لعبة جديدة، لأننا لن نؤيد أكثر من لعبة واحدة في وقت واحد لكل لاعب. هذه خطوة مهمة جدا، وإلا فإننا قد ينتهي الأمر تواجه علة ضخمة.

دعونا نضيف طريقة أوسيريسالراديبلايينغ أدناه نيوغام :

ليب / غاملوجيك. جس

     وسيرزالاريديبلايينغ    {كونست لعبة = ألعاب. findOne ({$ أو: [{player1: ميتور. معرف المستخدم  }،{player2: ميتور. معرف المستخدم  }]})؛إف (غيم! == وندفيند)عودة صحيح؛عودة كاذبة؛}    

سيمالت تذهب على عملية بدء لعبة جديدة.

عندما لاعب يضرب على زر التشغيل، ونحن سوف نبحث عن لعبة موجودة للانضمام إليهم. إذا قال لاعب لا يمكن العثور على لعبة للانضمام، سيتم إنشاء لعبة جديدة. في نموذجنا، لاعب 1 هو اللاعب الذي خلق اللعبة، لاعب 2 هو سلسلة فارغة و الوضع هو افتراضيا "الانتظار".

لذلك، إذا كان لاعب آخر يضرب على زر التشغيل، وأنها سوف تبحث عن لعبة مع حقل لاعب 2 فارغة و حالة الحقل مع قيمة "الانتظار". ثم سنقوم بتعيين هذا اللاعب كما لاعب 2 وتغيير حالة وفقا لذلك.

الآن علينا أن نجعل لدينا غاملوجيك فئة يمكن الوصول إليها من خلال أساليب النيزك داخل مباراة. جس . جس ملف. إضافة هذا الخط في الجزء السفلي من غاملوجيك. جس ملف، خارج الفئة:

     تصدير كونست غاملوجيك = جديد غاملوجيك   ؛    

إضافة السطر التالي في الجزء العلوي من مباراة. جس فيل:

     استيراد {غاملوجيك} من '. / gameLogic. شبيبة '؛    

الآن يمكننا إضافة منطق لدينا فارغة مباراة. طريقة اللعب . في البداية، نبحث عن لعبة مع المركز : "الانتظار" ثم ندعو نيوغام إذا لم يتم العثور على لعبة أخرى:

ليب / غامس. جس

     النيزك. أساليب({"غامس. بلاي"    {كونست لعبة = ألعاب. فيندون ({ستاتوس: "وايتينغ"})؛إف (غيم === وندفيند) {gameLogic. لعبة جديدة  ؛}}})؛    

المنشورات

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

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

انتقل إلى الرئيسية. جس داخل مجلد الخادم واستبدال محتوياته بما يلي:

الخادم / الرئيسي. جس

     استيراد {ميتور} من 'النيزك / النيزك'؛نيزك. بابليش ('غامس'، فونكتيون غامس بوبليكاتيون    {عودة الألعاب. فيند ({ستاتوس: "وايتينغ"}، {مجالات:{"الحالة": 1،"player1": 1،"player2": 1}})؛})؛نيزك. بابليش ('ميغام'، فونكتيون ميغامبوبليكاتيون    {عودة الألعاب. العثور على ({$ أو: [{player1: ذيس. معرف المستخدم}،{player2: ذيس. معرف المستخدم}]})؛})؛    

الآن نحن بحاجة إلى الاشتراك في نشر "الألعاب". سنفعل ذلك في قالب واجهة المستخدم على استدعاء طريقة سيمالت.

إنشاء واجهة المستخدم. جس فيل إن كلينت / جس / بالشفرة التالية:

     استيراد {ميتور} من 'النيزك / النيزك'؛استيراد {تمبلات} من 'نيزك / تمبلاتينغ'؛قالب. واجهة المستخدم. أونكريتد (   => {نيزك. الاشتراك ( 'الألعاب')؛})؛    

مسرحية الحدث

قوالب توفر كائن الأحداث حيث يمكننا تسجيل .خمين ما؟ البنغو! الأحداث. سنقوم بإنشاء حدث في نموذج واجهة المستخدم. كلما نقر أحد اللاعبين على عنصر دوم به المعرف "بلاي-بتن" سنقوم بتعيين متغير جلسة إنغام إلى ترو، سنتصل ب لعبة. طريقة، والاشتراك في مجموعة ميغام جمع.

المتغيرات سيمالت يمكن استخدامها في أي مكان في رمز العميل، حتى من قالب إلى قالب. لاستخدامها سنحتاج إلى إضافة حزمة سيمالت:

     نيزور إضافة جلسة    

رئيس لأكثر من واجهة المستخدم. جس وإضافة السطور التالية بعد الأسلوب أونكريتد :

كلينت / جس / أوي. جس

    . واجهة المستخدم. الأحداث ({"كليك # بلاي-بتن":    => {جلسة. سيت ("إنغام"، ترو)؛نيزك. كال ("غامس. بلاي")؛نيزك. الاشتراك ( 'MyGame')؛}})؛    

من الممارسة السليمة استيراد الطرود التي نستخدمها في كل ملف. نظرا لأننا نستخدم الحزمة الجلسة في واجهة المستخدم. جس ملف يجب علينا استيراده. فقط أضف السطر التالي في الأعلى:

     استيراد {سيسيون} من 'ميتور / سيسيون'؛    

جيد! الآن نحن بحاجة إلى إضافة اثنين من المساعدين. تذكر، واجهة المستخدم. هتمل ؟ أعطها نظرة سريعة. استخدمنا إنجام المساعد و حالة المساعد. دعونا نعلن عنها تحت الأحداث الكائن:

كلينت / جس / أوي. جس

    . واجهة المستخدم. المساعدين ({إنغام:    => {عودة الدورة. سنترك    حالة    المساعد فارغة في الوقت الراهن.  

الانضمام إلى لعبة

سيمالت جميع، كنت قد فعلت حتى الآن، والانضمام إلى لعبة يجب أن تكون جميلة على التوالي إلى الأمام.

أولا سنضيف طريقة جوينغام إلى غاملوجيك كلاس:

ليب / غاملوجيك. جس

     جوينغام (لعبة) {إف (غيم. player2 === "" && ميتور. أوسيريد    != وندفيند) {ألعاب. تحديث({_id: غيم. _هوية شخصية}،{$ سيت: {"player2": نيزك. معرف المستخدم  ،"الحالة": لعبة. اللاعب 1}})؛}}    

كما ترون، نمر على متغير لعبة وقمنا بتعيين لاعب 2 المجال إلى لاعب _id ، و حالة الحقل إلى _id_ من لاعب 1 . هذه هي الطريقة التي سوف نعرف من بدوره.

الآن سوف نتصل بهذه الطريقة من مباراة. بلاي . انتقل إلى مباراة. جس ملف واستبدال محتوى الألعاب . اللعب بالطريقة التالية:

ليب / غامس. جس

     النيزك. أساليب({"غامس. بلاي"    {كونست لعبة = ألعاب. فيندون ({ستاتوس: "وايتينغ"})؛إف (غيم === وندفيند) {gameLogic. لعبة جديدة  ؛} إلس إف (غيم! == وندفيند && غيم بلاير 1! == ذيس أوسيرد && غيم player2 === "") {gameLogic. joinGame (لعبة).}}})؛    

أما الآن فقد أضفنا شخص آخر إذا مع ثلاثة شروط: إذا وجدنا لعبة و لاعب 1 ليس هذا اللاعب و ) لاعب 2 هو سلسلة فارغة، ونحن الانضمام إلى اللعبة.

جعل التحرك - المنطق

عندما عرفنا نموذجنا لكل لعبة جديدة، أعلنا عن حقل التحركات بمصفوفة فارغة ( [] ) كقيمة افتراضية. A الخطوة سيكون كائن جسون تتألف من _id من اللاعب الذي اتخذ هذه الخطوة والموقف المحدد.

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

ليب / غامس. جس

     "ألعاب. ماكيموف" (الموضع) {تشيك (بوسيتيون، سترينغ)؛gameLogic. validatePosition (موقف)؛دعونا لعبة = ألعاب. فيندون ({ستاتوس: ذيس. وسريد})؛إف (غيم! == وندفيند) {gameLogic. addNewMove (موقف)؛إف (غاملوجيك. تشيكيفغامواسون   ) {gameLogic. سيتجاميرسولت (لعبة. _ هذا، أوسيريد)؛} إلس {إف (غيم. موفيس. لينغث === 8) {gameLogic. سيتغاميرسولت (لعبة. _id، "التعادل")؛} إلس {gameLogic. updateTurn (لعبة).}}}}    

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

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

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

     استيراد {شيك} من 'نيزك / الاختيار'؛    

نحن نستخدم مجموعة من الطرق من غاملوجيك الدرجة التي لم نحدد حتى الآن.

الذهاب إلى غاملوجيك. جس وإضافة الطرق التالية في غاملوجيك كلاس:

فاليداتيبوسيتيون

     فاليداتيبوسيتيون (بوسيتيون) {فور (ليت x = 0؛ x <3؛ x ++) {فور (ليت y = 0؛ y <3؛ y ++) {إف (بوسيتيون === x + '' + y)عودة صحيح؛}}رمي جديد النيزك. خطأ ('غير صالح الموقف'، 'الموقف المحدد غير موجود .يرجى التوقف عن محاولة الإختراق اللعبة !! ")؛}    

هنا نحن ببساطة تتحرك من خلال شبكة 3 × 3 للتأكد من الموقف المرسل هو ضمن حدودها. إذا لم نتمكن من العثور على الموقف المرسل من قبل العميل، في الشبكة، ونحن رمي خطأ.

أدنوموف

     أدنوموف (بوسيتيون) {ألعاب. تحديث({ستاتوس: ميتور. معرف المستخدم  }،{$ بوش: {التحركات: {بلايرد: النيزك. أوسيريد   ، موف: بوسيتيون}}})؛}    

نحن هنا نستخدم مشغل مونغو $ بوش ل، اهم، دفع الخطوة الجديدة، التي تحتوي على اللاعب الحالي _id و موقف ، في الصفيف.

سيتجاميرسولت

     سيتجاميرسولت (غميد، ريسولت) {ألعاب. تحديث({_id: غاميد}،{$ سيت: {"نتيجة": نتيجة،"ستاتوس": "إند"}})؛}    

باستخدام عامل مجموعة $ مرة أخرى، نقوم بتحديث حقل النتيجة إلى قيمة نتيجة المعلمة التي يمكن أن تكون إما _id واحد من اللاعبين أو 'التعادل' ووضعنا حالة إلى 'نهاية'.

أوبداتيتورن

     أوبديتورتن (لعبة فيديو) {السماح نكستبلاير.إذا (لعبة. player1 === نيزك. وسيرد   )نيكستبلاير = لعبة. player2.آخرنيكستبلاير = لعبة. اللاعب 1؛ألعاب. تحديث({ستاتوس: ميتور. معرف المستخدم  }،{$ سيت: {"ستاتوس": نكستبلاير}})؛}    

هذا واحد بسيط إلى حد ما. نحن نأخذ كلا اللاعبين كمعلمات ونعرف أي واحد هو اللاعب الحالي، ثم وضعنا حالة المجال إلى لاعب آخر _id .

الفوز في المباراة

لا تزال هناك طريقة واحدة لتعلن من مباراة. ماكيموف الأسلوب؛ خوارزمية الفوز. هناك طرق أخرى أكثر فعالية لحساب من فاز في تيكتاكتوك لعبة، ولكن قررت أن يذهب للحل بديهية وبسيطة يمكن أن أفكر في لهذا البرنامج التعليمي.

الذهاب إلى غاملوجيك. جس وإضافة الطريقة التالية في فئة غاملوجيك :

ليب / غاملوجيك. جس

     تشيكيفغامواسون    {كونست لعبة = ألعاب. فيندون ({ستاتوس: ميتور. وسيريد   })؛كونست انتصارات =['00'، '11'، '22']،['00'، '01'، '02']،['10'، '11'، '12']،['20'، '21'، '22']،['00'، '10'، '20']،['01'، '11'، '21']،['02'، '12'، '22']].اسمحوا وينكونتس = [0،0،0،0،0،0،0]؛فور (ليت i = 0؛ i <غيم. موفيس. لينغث؛ i ++) {إف (لعبة. يتحرك [i]. بلايريد === ميتور. وسيريد   ) {كونست الخطوة = لعبة. التحركات [أنا]. نقل؛فور (ليت j = 0؛ j <وينس. لينغث؛ j ++) {إذا فاز [j] [0] == موف || فوز [j] [1] == موف || يفوز [j] [2] == موف)وينكونتس [ي] ++؛}}}فور (ليت i = 0؛ i <وينكونتس. لينغث؛ i ++) {إذا (وينكونتس [i] === 3)عودة صحيح؛}عودة كاذبة؛}    

سيمالت نظرة على هذا الأسلوب عن كثب.

أولا، نجد اللعبة الحالية. ثم، نعلن مصفوفة مع كل مجموعات الفوز الممكنة ومتغير آخر مع مجموعة من سبعة أصفار: واحد لكل مجموعة. بعد ذلك، سنقوم حلقة من خلال جميع التحركات التي قام بها اللاعب الحالي ومقارنتها مع كل موقف من كل مجموعة. لكل صدفة نضيف 1 إلى المقابلة وينكونت موقف مؤشر. إذا كان أي من وينكونت فهارس يضيف ما يصل إلى 3، ونحن سوف نعرف أن اللاعب الحالي قد فاز.

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

التحرك - تحكم

لدينا لاعب تحكم لهذه اللعبة ليست أكثر من مجرد نقرة بسيطة. حتى تنفيذ التي ينبغي أن تكون قطعة من الكعكة. دعونا نذهب إلى مجلس الإدارة. جس ملف وإضافة كائن قالب الأحداث إلى ملفنا بعد المساعدين :

كلينت / جس / بوارد. جس

    . مجلس. الأحداث ({"كليك. سيليكتابلفيلد": (إيفنت) => {نيزك. كال ("غامس. ماكيموف"، إيفنت. تارجيت. إد)؛}})؛    

بسيطة، أليس كذلك؟ عندما ينقر اللاعب على عنصر دوم مع الفئة 'سيليكتابلفيلد'، ندعو مباراة. ماكيموف ، وتمرير معرف عنصر دوم كمعلمة الموضع. تذكر أننا نسمي المعرف بعد موضع العنصر في الشبكة. نلقي نظرة على متنها. هتمل ملف لتحديث الذاكرة الخاصة بك إذا كنت في حاجة إليها.

عرض التحركات

الآن، في نفس الملف، سنقوم بإنشاء مساعد يسمى إسماركيد ، والتي سوف تتحول بين علامة و سيلكتابلفيلدس . وبهذه الطريقة سنتمكن من معرفة المواضع التي تم اختيارها والسماح بتحديد المواضع الفارغة.

إضافة هذا المساعد أدناه سيديلنغث المساعد:

كلينت / جس / بوارد. جس

    : (x، y) => {إف (سيسيون. جيت ("إنغام")) {السماح ميغام = الألعاب. findOne   ؛إف (ميغام! == وندفيند && ميغام. ستاتوس! == "وايتينغ") {فور (ليت i = 0؛ i <ميغام. موفيس. لينغث؛ i ++) {إف (ميغام. موفيس [i]. موف === x + '' + y) {إف (ميغام. يتحرك [i]. بلايريد === ميتور. وسيريد   )ريتورن "

X

"؛آخرريتورن "

O

"؛}}إف (ميغام. ستاتوس === ميتور. أوسيريد )ريتورن "<ديف كلاس = 'سيلكتابليفيلد' إد = '" + x + y + "'>
"؛}}}

وإضافة المساعد إلى القالب:

العميل / هتمل / المجلس. هتمل

     <تد كلاس = "فيلد" إد = "{{رويندكس}} {{@ إندكس}}">{{{إسماركيد رويندكسindex}}}     

دعونا نذهب على هذه الوظيفة. نحن نأخذ صف و عمود كمعلمات (س، ص). إذا كنا إنجام ، ونحن نبحث عن تلك اللعبة. إذا وجدنا ذلك و فإن الحالة هو 'الانتظار'، ونحن حلقة من خلال جميع التحركات وإذا كان معين صف + عمود تطابق واحدة من لدينا يتحرك ، سنقوم رسم X على متن الطائرة. إذا كان يتطابق مع واحدة من التحركات لاعب آخر سنقوم رسم O .

سيكون لدينا التحركات دائما X وخصمنا و O ، في كل مباراة. على الرغم من أن خصومك سوف نرى تحركاتهم رسمها باعتبارها X . نحن لا نهتم حقا الذي حصل على X أو O لأننا نلعب على أجهزة مختلفة، وربما حتى في بلدان مختلفة. ما يهم هنا هو أن كل لاعب يعرف ما هي تحركاتهم والتي خصومهم.

شوينغ ستاتوس

ونحن على وشك الانتهاء! تذكر فارغة حالة المساعد في واجهة المستخدم. جس فيل؟ ملء ذلك مع التعليمات البرمجية التالية:

كلينت / جس / أوي. جس

     ستاتوس:    => {إف (سيسيون. جيت ("إنغام")) {السماح ميغام = الألعاب. findOne   ؛إف (ميغام. ستاتوس === "وايتينغ")عودة "تبحث عن الخصم.". "؛إلس إف (ميغام. ستاتوس === ميتور. وسيريد   )عودة "دورك"؛إلس إف (ميغام. ستاتوس! == ميتور. أوسيريد    && ميغام. ستاتوس! == "إند")عودة "بدوره الخصم"؛إلس إف (ميغام. ريسولت === ميتور. أوسيريد   )عودة "أنت فزت!"؛إلس إف (ميغام. ستاتوس === "إند" && ميغام. ريسولت == ميتور. أوسيريد    && ميغام. ريسولت == "تي")عودة "لقد فقدت!"؛وإلا إذا (ميغام. إذا كنا    إنجام   ، ونحن نبحث عن اللعبة الحالية. إذا كان    الحالة    يساوي 'الانتظار'، ونحن نقول للاعب لانتظار الخصم. إذا كان    الحالة    يساوي اللاعب    _id   ، نقول لهم انها دورهم. إذا كان    الحالة    ليس هم    _id    ولم يتم الانتهاء من المباراة، ونحن نقول لهم انها بدوره الخصم. إذا كانت النتيجة تساوي لاعب    _id   ، ونحن نقول للاعب أن فازوا. إذا وصلت المباراة إلى نهايتها، والنتيجة ليست لهم    _id    وانها ليست "التعادل"، ثم فقدوا. إذا كانت النتيجة تساوي "التعادل"، ونحن نقول لهم أنه ربطة عنق .دوه! ؛)  

كما هو عليه الآن، يمكنك أن تأخذ ل تدور. نعم فعلا! المضي قدما فتح نافذة المتصفح العادي وعلامة التبويب الخاصة واللعب ضد نفسك. حاول أن لا يكون الكثير من المرح على الرغم من أنك سوف تنتهي وحدها لبقية حياتك (صحيح أقسم).

تسجيل الخروج

سيمالت، نحن لم تنته بعد. كلا! ماذا لو فصلنا وترك لاعبين آخرين بأنفسهم؟ ماذا عن كل تلك الألعاب المكتملة ملء الفضاء الثمين في قاعدة البيانات الخاصة بنا؟ نحن بحاجة لتتبع اتصال اللاعب والتصرف وفقا لذلك.

ولكن أولا سنحتاج وسيلة لإزالة الألعاب و إزالة لاعبين من الألعاب. الذهاب إلى غامسلوجيك. جس وإضافة الطرق التالية في غاملوجيك كلاس:

ليب / غاملوجيك. جس

     ريموفغام (غميد) {ألعاب. ريموف ({_ إد: غميد})؛}ريموفبلاير (غاميد، بلاير) {ألعاب. أوبديت ({_ إد: غميد}، {$ سيت: {[بلاير]: ""}})؛}    

الأسلوب ريموفجام يأخذ غميد كوسيطة ويزيله.
ريموفبلاير يأخذ غاميد و لاعب (سلسلة يمكن أن تكون إما لاعب 1 أو 38)) كما الحجج وتفريغ هذا الحقل لاعب في تلك اللعبة معينة.

لتتبع اتصال المستخدم، سنقوم بتثبيت حزمة مفيدة تسمى ميزاو: حالة المستخدم. انتقل إلى وحدة التحكم، أغلق التطبيق قيد التشغيل مع كترل + c وقم بتشغيل الأمر التالي:

     نيزور أد ميزاو: وسر-ستاتوس    

تحتوي هذه الحزمة على اتصال اتصال لوجوت الذي يوفر معلمة مع معلومات هامة مثل أوسيريد من المستخدم قطع الاتصال.

انتقل إلى الرئيسية. جس في مجلد الملقم، ثم إضافة رد الاتصال التالي في الأسفل.

/ سيرفر / مين. جس

     وسرستاتوس. الأحداث. أون ("كونكتيونلوغوت"، (فييلدز) => {كونست لعبة = ألعاب. findOne ({$ أو: [{player1: فييلدز. معرف المستخدم}،{player2: فييلدز. معرف المستخدم}]})؛إف (غيم! = وندفيند) {إف (غيم. ستاتوس! == "وايتينغ & && غيم. ستاتوس! ==" إند ") {إف (غيم. player1 === فييلدز. أوسيريد) {gameLogic. سيتجاميرسولت (لعبة. _id، لعبة.gameLogic. ريموفبلاير (غيم .id، "player1")؛} إلس إف (غيم. player2 === فييلدز. أوسيريد) {gameLogic. سيتغاميرسولت (لعبة. _id، لعبة.gameLogic. ريموفبلاير (لعبة. _id، "player2")؛}} إلس {إف (غيم. player1 === "" || غيم. player2 === "") {gameLogic. ريموفغام (غيم .id)؛} إلس {إذا (لعبة. player1 === الحقول. أوسيريد)gameLogic. ريموفبلاير (غيم .id، "player1")؛إلس إف (غيم. player2 === فييلدز. أوسيريد)gameLogic. ريموفبلاير (لعبة. _id، "player2")؛}}}})؛    

لذا، إذا تمكنا من العثور على لعبة حيث لاعب غير متصل إما لاعب 1 أو لاعب 2 ، ونحن معرفة ما اذا كان الوضع من تلك اللعبة ليست "الانتظار" واللعبة الحصن 'ق وصلت إلى نهايتها. إذا كان لديه، ونحن نعطي النصر إلى الخصم وإزالة لاعب قطع الاتصال. وإلا، فإننا إما إزالة اللعبة (إذا كان أي من الحقول لاعب فارغة) أو. إذا لم يكن هذا هو الحال، ونحن إزالة لاعب قطع من اللعبة. استخدمنا أيضا بعض الطرق من غاملوجيك فئة في كونكتيونلوغوت رد، لذلك المضي قدما واستيراد كل منهما في الجزء العلوي من الخادم / الرئيسي. جس فيل:

     استيراد {وسرستاتوس} من 'ميتور / ميزاو: حالة المستخدم'؛استيراد {غاملوجيك} من '. / ليب / gameLogic. شبيبة '؛    

التفاف

سيمالت، يجب أن يكون لديك لعبة العمل! كما هو، يمكنك تحميله ومحاولة الخروج مع أصدقائك .أو من قبل نفسك.

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

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

أحب أن أرى ما كنت تأتي مع، لذا يرجى اسمحوا لي أن أعرف! آمل أن تستمتع هذا البرنامج التعليمي، وترك الشكوك والتعليقات أسفل في التعليقات. سيمالت أراك في واحد القادم!

February 28, 2018