توليد الأبراج المحصنة والكهوف لبلدي اللعبة


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

تقسيم الفضاء


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

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

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


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

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


يتم الحصول على نتائج جيدة بحد أقصى من 2.0 إلى 3.0:


غرفة الجيل


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

وهنا النتائج:


اختيار الضلع


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

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


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

الآن ، أنا فقط استخدم خوارزمية Kruskal ومسافة كتل المدينة لتحديد الحواف. وهنا النتائج:


ممر الجيل


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

وهنا النتائج:


جيل الكهف


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

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

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


ثم نبدأ التشغيل التلقائي الخلوي:



فيما يلي بعض نتائج العينة:


فيما بعد سأضيف تعبئة لإزالة الأجزاء التي يتعذر الوصول إليها.

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

حذف الخلايا المعزولة


ثم قمت بتطبيق تعبئة لإزالة الخلايا التي يتعذر الوصول إليها:


ممرات متعددة بين الغرف


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

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



إذا جعلت الغرف أكبر قليلاً ، فستكون النتيجة أكثر إثارة للاهتمام:


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


بلاط الجيل للكهوف


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

فيما يلي عينة من النتائج:


إن الشيء العظيم هو أنه يمكنك بسهولة التبديل من كهف حجري إلى الرمال أو الجليد:


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

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


All Articles