Prosedürel Zindan Üretimi: Bu odaların hepsinin minimal koridorlar kullanılarak bağlandığından emin olmak için basit bir algoritma var mı?


9

Çok fazla koridor olmadan tüm odaları birbirine bağlayan kovan benzeri bir yapı elde etmek mümkün müdür? (Çok fazla tek kişilik odadan 3-4 + koridor geliyor)

Odalarımın nasıl göründüğünün çıktısı, temelde rastgele yerleştirilmiş.

rastgele yerleştirilmiş ızgara odalarının çıktısı

Koridordan almayı umduğum şey.

http://i.imgur.com/9GUi6Yy.png


Ben 3 veya 4 "çok fazla koridor" olduğunu sanmıyorum. Özellikle zindanınızda 9 odanız varsa. Ayrıca, "kovan benzeri yapı" ile ne kastettiğinizden emin değilim, ne aramaya çalıştığınız hakkında ayrıntılı bilgi verebilir misiniz?
fnord

Belki ilginizi çeken şeyleri göstermek için "tamamlanmış" bir harita ekleyin.
MichaelHouse

Ah evet, her odadan en fazla 3 veya 4 koridor geliyordu.
Blenderer

Koridorlara kadar çalıştığım şeyin bir görüntüsünü ekledim.
Blenderer

2
Herhangi bir odadan 3 koridorunuz yoksa, sadece odaların basit bir doğrusal birleşimini yapabileceksiniz ve böylece birini seçip en yakın birleştirilmemiş komşularına katılabileceksiniz.
Nick

Yanıtlar:


6

Düşünebileceğim en basit yol, tüm odaların en az 1 koridorla bağlı olduğundan emin olmakla başlıyor:

  1. En son ya da ilk oda ile başlayın.
  2. Zaten bazı odalara bağlı olmayan 1 mesafe içinde rastgele bir oda alın (tüm odalarda bağlantı kesilir, böylece gittiğinizde bunu takip edersiniz).
  3. Böyle bir oda yoksa +1 mesafesine gidin. Başka bir odanın üstünde / altında tünel yapmak uygunsa, koridorları bağlamak istemediğinizi varsayarsak bu daha kolaydır.
  4. Tüm odalar birbirine bağlanana kadar sözde rastgele çalışın.

Şimdi tüm odalara ulaşabileceğinizi biliyoruz, ancak şimdi bu kesinlikle lineer labirentten daha fazlasını istiyorsanız, odalarınıza adım atabilir ve odaları bağlamak için rastgele yeni bir yol oluşturabilirsiniz, oda başına 2-3'e kadar bir sınır veya odaların belirli bir yüzdesi maksimum bağlantılara ulaşana kadar - vb.

Son adım olarak, çeşitli durumlara göre sonuçlarınızı değiştirecek kurallar ekleyebilirsiniz. Örneğin, sadece 1 koridoru olan herhangi bir odanın tanım gereği çıkmaz sokak olduğunu gözlemleyebilirsiniz; Daha fazla çıkmaz yol açabilir veya her şeyin en az 2 bağlantıya sahip olduğundan emin olarak hepsini ortadan kaldırabilirsiniz. Çıkmaz sokakların gizli bir geçidi olmasını sağlayabilirsiniz. Bir patron odasının çıkmaz bir yer olduğundan emin olabilirsiniz. Başlangıç ​​odanızın çıkmaz bir yer olduğundan emin olun, ancak ikinci odanın minimum X bağlantısına sahip olduğundan emin olun. Sonsuza dek.

Her varsayım ve kural, seviyelerinizin görünümünü radikal bir şekilde değiştirebilir, ancak bu eğlencenin bir parçasıdır! Bu en azından başlatmak için kovan / mağara benzeri oda olsun gerekir.


Bu oldukça yakın Kruskal en Yayılma algoritması - Bu değiştirir "zaten bağlı olmayan den 2'de durum bazı " zaten bağlı değil oda " Aynı kümede bir olabilir nereye yukarıda açıklanan kurallara oluşan hatayı düzeltir" her odada bağlandığı durum bazı bir bütün damıtma olarak odaya ancak zindan birden bağlantısız adaları oluşturur. Kruskal'ın minimum toplam koridor uzunluğuna sahip bir bağlantı grafiği bulması garanti edilir.
DMGregory

3

Sadece bağlı odalarınızı inşa edin. Bir oda ile başlayın, sonra diğer odalara 1-3 koridor oluşturun. Sonra yeterli oda ekleyene kadar tekrarlayın.


2

Bu odalar 2d düzlüğünde gömülü Grafik köşeleri olduğundan, bu teorik olarak gezici satıcı problemini çözerek yapılabilir (sadece birkaç oda ile iyi olurdu). Açıkçası, basit bir sezgisel tarama iyi olur ve makul ölçeklenebilirliğe izin verir.

Tüm odalar arasındaki kenarları (koridor uzunlukları) hesaplarsınız. Onları uzunluğa göre sıralıyorsunuz. Bir döngü oluşturmadıkça veya tepe noktasının (oda) istenen maksimum değerin (3-4) üzerine çıkmadığı sürece en kısa koridoru eklersiniz (Tekrar). Döngüleri kontrol etmek için UnionFind uygulayabilir veya küçük veriler üzerinde hızlı bir BFS yapabilirsiniz.


Bu cevap kabul edilen cevaptan daha iyidir. İlk önce en kısa bağlantı koridorlarını seçmenin açgözlü bir stratejisi işe yaramalıdır. Döngüleri önlemek için, zaten kendilerine bağlı bir koridor bulunan odalara bağlantı yapmayın.
Jelle van Campen

@JellevanCampen Teşekkürler. ;) İki yalıtılmış bağlı bileşene sahip olabilirsiniz. Bu nedenle, muhtemelen iki düğümün bağlı olup olmadığını BFS ile sendika bulma veya kontrol etme özelliğini kullanmak istersiniz.
AturSams

Ah evet, bu konuda hakkın, benim hatam.
Jelle van Campen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.