توليد الأبراج المحصنة في ربط إسحاق



تجليد إسحاق وطبعته الجديدة ملزم إسحاق: إعادة الميلاد هي بعض ألعابي المفضلة. إنهم ينتمون إلى نوع roguelite twin stick shooter ويشبهون إلى حد كبير Enter the Gungeon .



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



على الرغم من أنني اضطررت إلى تفكيك وتحديث معرفتي المتسخة ببرنامج Flash (لقد كتبت ذات مرة برنامج فك تشفير Actionscript الخاص بي) ، إلا أنني كنت محظوظًا جدًا: المطور Isaacفلوريان هيمسل وأحد مطوري Rebirth ، Simon Parser ، أجابوا بسعادة على أسئلتي. في الواقع ، سجل فلوريان مؤخرًا مقطع فيديو يصف الخوارزمية. على قناته ، يمكنك أيضًا معرفة تفاصيل تطوير لعبته الجديدة Squid Invaders.



نظرًا لوجود قصته ، يمكن اعتبار مقالتي زائدة عن الحاجة ، ولكن إذا كنت تريد تفاصيل دموية ، فاستمر في القراءة.



الخوارزمية الأساسية



استوحى مطورو Isaac بشدة من الألعاب ثنائية الأبعاد في سلسلة Zelda وقاموا بإنشاء خرائط مشابهة لأبراجهم المحصنة.





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



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



تم تطوير الإصدار الأول من Isaac في أقل من 3 أشهر ، لذلك اضطر Himslu إلى استخدام وقته بكفاءة لا تصدق. التصميم الأساسي للعبة أنيق وبسيط. أولاً ، يتم إنشاء مخطط طابق (مستوى). ثم يتم اختيار بعض الغرف على أنها خاصة. ثم يتم تحديد الجزء الداخلي لكل غرفة من المسبح المقابل.



مخطط الطابق



يتم إنشاء Isaac على شبكة 9x8. للراحة ، يتم الإشارة إلى الخلايا بالأرقام - تشير الأرقام إلى الموضع X ، والعشرات - الموضع Y. وهذا يعني أنه يمكنك التحرك لأعلى ولأسفل ولليسار ولليمين ، ببساطة إضافة +10 و -10 و +1 و -1. لا يتم استخدام الخلايا ذات الموضع X 0 (فارغة دائمًا) ، مما يعني أن معظم الكود لا داعي للقلق بشأن حدود الخريطة. أي أن الخلية العلوية اليسرى من الخريطة هي 01 ، والجزء السفلي الأيمن 79.



تحدد مخطط الأرضية فقط الخلايا التي ستحتوي على الغرف - يتم تحديد محتويات الغرفة لاحقًا.



أولاً ، random(2) + 5 + level * 2.6تحدد الصيغة عدد الغرف. أولئك. تبدأ المستويات بـ 7 أو 8 غرف وتزداد بمقدار 2 أو 3 غرف في كل مرة.



ثم تضع اللعبة غرفة البداية (الخلية 35) في قائمة الانتظار. ثم تتخطى قائمة الانتظار دوريًا. لكل خلية في قائمة الانتظار ، يتنقل عبر الاتجاهات الأربعة الرئيسية ويقوم بما يلي:



  • تحدد الخلية المجاورة بإضافة + 10 / -10 / + 1 / -1 إلى الخلية الحالية.
  • إذا كانت الخلية المجاورة مشغولة بالفعل ، فلن تفعل اللعبة شيئًا.
  • إذا كانت الخلية المجاورة نفسها بها أكثر من جار واحد ممتلئ ، فلن تفعل اللعبة شيئًا.
  • إذا كان هناك بالفعل غرف كافية على المستوى ، فإن اللعبة لا تفعل شيئًا.
  • اللعبة لا تفعل شيئًا مع احتمال 50٪.
  • خلاف ذلك ، تحدد اللعبة الخلية المجاورة على أنها تحتوي على الغرفة وتضيفها إلى قائمة الانتظار.


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



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



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



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



غرف خاصة



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



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



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



غرف عادية



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



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



بالنسبة للغرف العادية ، يوجد ثلاثة حمامات سباحة: سهلة ومتوسطة وصعبة. يتم تحديد المرحلة الأولى من الفصل من الغرف البسيطة والمتوسطة ، والثانية من المتوسطة والصعبة. يحتوي الفصل الأول (القبو) على 174 غرفة عادية في حمامات سباحة. تحتوي "الفصول البديلة" مثل القبو ، الذي يحل محل الطابق السفلي بشكل عشوائي ، على مجموعة مختلفة قليلاً من الغرف.



لعنة المتاهة



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



  • 80٪ غرف عادية أكثر (بحد أقصى 45)
  • يتم استخدام 6 غرف بعيدة فقط للغرف الخاصة
  • تحدد المستويات غرفًا من حمامات السباحة ذات الغرف البسيطة والمتوسطة والمعقدة.
  • يتم إضافة غرف عادية إضافية بشكل عشوائي إلى مخطط الأرضية مع منطق وضع مماثل للغرف السرية.


تجريبي



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





ولادة جديدة





تجليد إسحاق: إعادة الميلاد هو نسخة جديدة من التجليد الأصلي لإسحاق الذي أنشأه نيكاليس ، والذي اشتهر في ذلك الوقت بمنافذ VVVVV و Cave Story . تم نقل اللعبة إلى C ++ وتم إعادة تصميم جميع الأصوات والرسومات. على مر السنين ، تلقت اللعبة العديد من DLC ، مضيفة عناصر وأعداء جددًا إلى القائمة الأصلية المثيرة للإعجاب بالفعل.



في حين أن Rebirth لديها الكثير من الابتكارات المثيرة للاهتمام ، فإن المساهمة الرئيسية في جيل المستوى كانت إضافة غرف أكبر غير منتظمة.





مع مجموعة كاملة من DLC (في وقت كتابة هذا التقرير ، هذا هو Afterbirth +) ، تحتوي اللعبة على 11 غرفة كبيرة: 2 × 2 ، 2 × 1 ، ممرات على شكل حرف L وممرات ضيقة في خيارات دوران مختلفة.





غرفة نموذجية على شكل حرف L ، ثلاثة أضعاف حجم الغرفة العادية. تم تنفيذه بواسطة Simon Parser من خلال تعديل دقيق لكود مصدر Himsla.



بدلاً من المرور عبر كل الاتجاهات ، تتجاوز الخوارزمية جميع المخارج من الغرفة. في غرفة 2 × 2 ، يمكن أن يكون هناك ما يصل إلى ثمانية منهم.



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



إذا لم تكن هناك مساحة كافية للغرفة ، فستحاول الخوارزمية إدراج مرشح آخر. إذا تم إدخال الغرف الكبيرة بنجاح ، فهناك فرصة بنسبة 95٪ لإزالتها من المسبح.



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



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





في إسحاق ، من المستحيل عادة عبور الفجوات



انتاج |



إن برنامج Isaac Level Generator ليس الأكثر تعقيدًا الذي رأيته ، ولكن على الرغم من هذا القدر الصغير من التعليمات البرمجية ، فإنه يعمل بشكل جيد للغاية. ربما هذا هو سبب محاولتهم إعادة إنشائه كثيرًا. تسمح بساطته بالتغييرات والتمديدات ، كما نرى في مثال إعادة الميلاد. نتيجة مذهلة.



يمكنك أيضًا ملاحظة أن هذه اللعبة تواصل اتجاه إنشاء مخططات الطوابق بشكل منفصل عن تفاصيل الغرفة. في مقالاتي حول Diablo 1 [ ترجمة إلى Habré ] و Enter the Gungeon [ ترجمة إلى Habré ] ، قلت لماذا يمكن أن يكون هذا النهج قويًا للغاية.



عند فك الشفرة ، لم أجد أي تفاصيل مثيرة للاهتمام بشكل خاص. الشيء الأكثر إثارة للاهتمام الذي يمكنني قوله هو أن موقع غرفة الكنز مخزن في متغير يسمى "boner" - ربما يكون اختصارًا لـ Bonus Room. هناك أيضًا بعض التفاصيل الدقيقة في الكود فيما يتعلق بالآثار الجانبية البسيطة للعناصر المختلفة ، لكنني سأترك هذا الموضوع للمحللين .



بعد ذلك ، يمكنك مشاهدة سلسلة فيديو Himsla على الأجزاء الداخلية للعبة ، أو حتى لعب Isaac ومشاهدة جميع المستويات مباشرة. سمعت أن محتوى Repentance الجديد سيصدر هذا العام. أوصي أيضًا بلعب ألعاب أخرى من قبل Chief Designer Edmund McMillen (خاصة Super Meat Boy).



All Articles