Oyunun başında oluşturulan, ızgaralarla temsil edilen birkaç alandan oluşan (8x8, 9x6, boyutlar ideal olarak keyfi olurdu) prosedürel olarak oluşturulmuş bir dünyayla bir oyun yapıyorum. Bu alanların bir bağımlılık listesi aracılığıyla birbirine bağlanması gerekiyor.
Bu ızgaranın en az 3 alanı bu iki alan arasında açığa çıktığında bir bağlantı vardır. Bu 3 boşluk bağlantı alanının orta hücresinde alanlar arasındaki giriş kapısı bulunur:
Onları birleştirmenin bir yolunu bulmaya çalışıyorum, ancak aynı anda dikkate almanız gereken daha fazla alan giderek daha karmaşık hale geliyor.
Bazı kağıt prototipleme denedim ve görsel olarak yaparken çok basit bir süreç olsa da, ben aynı kod ile oda yerleştirmek için izin veren iyi bir matematiksel ifadeler seti bulamadım.
İşte şu anda mücadele ettiğim "basit" bir örnek:
- 'A' alanının 'b' ve 'c' ile bağlantılı olması gerekir
- 'B' alanının 'a' ve 'd' ile bağlantılı olması gerekir
- 'C' alanının 'a' ve 'd' ile bağlantılı olması gerekir
- 'D' alanının 'b' ve 'c' ile bağlantılı olması gerekir
Basitlik açısından, odaları listedeki görünüm sırasına göre yerleştiriyoruz (başkalarını denedim). Bu yüzden standart prosedürel Dungeon Generation algoritmanız olarak yaklaşıyorum.
İlk alan olduğu için tahtada herhangi bir yere 'a' yerleştiriyoruz. Sonra, rastgele bir duvar seçiyoruz ve o duvara hiçbir şey bağlı olmadığından, oraya 'b' yerleştirebiliriz:
Şimdi 'c' koymalıyız, ama 'a' zaten tahtada ve işgal edilmiş bir duvarı var, bu yüzden başka bir duvara koymaya karar veriyoruz. Ancak her yerleşim gerçekleşmeyecek, çünkü 'd' geliyor ve 'b' ve 'c' ile de bağlanması gerekiyor:
Aynı bağımlılık kümesine sahip 2 odanın karşı duvarlarda olamayacağı, ancak bu bile başarıyı garanti etmeyecek olası bir sınırlama denedim:
Ve alanların farklı boyutlara sahip olduğu diğer durumlarda, karşıt duvarlarda olmak işe yarayabilir:
Ayrıca, kullanılan bir duvarı düşünmemek, geçerli çözümleri dışladığı için kusurlu bir varsayımdır:
Optimal Dikdörtgen Paketleme ve Grafik Düzeni algoritmaları gibi diğer Prosedür Üretimi algoritmaları veya benzeri araştırmalar yapmaya çalıştım, ancak genellikle bu algoritmalar bu sorunun her kısıtlamasını dikkate almaz ve birlikte karıştırılması zordur.
Uygun bir yerleşim bulunana kadar bir alan ve backtrack yerleştirmeyi de içeren bir dizi yaklaşımı düşündüm, ancak deneme ve yanılmaya çok bağlı ve hesaplama açısından maliyetli görünüyorlar. Ancak, bahsettiğim son iki sorun hakkında kapsamlı bir araştırma yapıldığında, bu tek / en iyi çözüm olabilir mi?
Birisinin geçmişte benzer problemleri olup olmadığını veya algoritma ile nereden başlamam gerektiğine dair birkaç ipucu vermeme yardımcı olup olmadığını görmek istedim. Ya da başarısız olursa, belirlediğim kısıtlamaları gevşetmek zorunda kalacağım.