Çözülecek sorun: Tüm odaların bağlı olduğu karo tabanlı bir oyun için rastgele bir 2B zindan haritası oluşturun.
Şu anda sahip olduğumdan daha iyi çözümler arıyorum.
Mevcut çözümüm iki algoritmayı çalıştırmam. Birincisi odalarıyla zindan üretir. İkincisi, tüm odaların birbirine bağlı olduğundan emin olun. Başka ne tür çözümler olabileceğini merak ediyorum. Daha hızlı ve / veya daha kolay vb. Hız gerçekten bir endişe değildir, ancak hız gerçek bir ücret ödemeden kazanılabilirse, bu iyi bir şeydir. Daha önemlisi, ben ve okuyan başkalarının soruna yaklaşmanın ve çözmenin farklı yollarını öğrenebilirim.
Benim şimdiki uygulamam. Odaların şu anda herhangi bir 2, 3 veya 4 yönünde çıkış veya çıkışı yoktur.
Zindan odalarının oluşturulması
Kurulum: Geçerli odayı sol üst odaya ayarlayın.
- Oda için geçerli bir oda tipi edinin (burada geçerli oda tipi, zindandan çıkışı olmayan ve odanın çıkışları ile odanın solundaki odanın çıkışları ile eşleşen bir çıkış tipidir. aşağıdaki 2. adımdan dolayı kaldı).
- Odayı yere koy ve x koordinatını bir adım ilerlet. X koordinatı zindan genişliğini aşarsa, x koordinatını 0 olarak ayarlayın ve y koordinatını bir adım ilerletin. Y koordinatı zindan yüksekliğini aşarsa, biz yapılır.
- # 1'den tekrarlayın.
Daha sonra bütün odaların bağlı olup olmadığını kontrol ediyorum. Eğer hepsi birbirine bağlı değilse, zindan yerleşimi açısından, seksi olmayan fakat kesinlikle iyi bir şekilde, odaların içinden geçen ve onları değiştirecek şekilde değiştiren ikinci bir algoritma kullanıyorum. bağlı olmak.
Tüm odaların bağlı olup olmadığını kontrol etme
Kurulum: Yolları temsil eden 2 boyutlu bir tamsayı haritası oluşturun ve girişleri "işlenmemiş" (henüz geçilmemiş) bir değere göre ilklendirin, -1. Geçerli yolu takip eden 1 olan bir başlangıç yolu dizini tamsayısı ayarlayın. Geçerli odayı kontrol etmek için bir oda yığınına ekleyerek sol üst odaya ayarlayın.
- Yığın denetlenecek odalar içeriyorsa, odanın yol dizinini geçerli yol dizinine ayarlayın. Yığın oda içermiyorsa, yol dizinini artırın ve henüz işlenmemiş bir oda elde edinceye kadar, satır sütun satır sütun ilerleterek oda elde etmeye çalışın. Eğer yer bulunamazsa işimiz biter.
- Odanın sola doğru çıkışı olup olmadığını kontrol edin. Zaten orada değilse, sol odayı yığına eklerse.
- Aşağı, sağ ve üst yönler için 2. adımı tekrarlayın (odaların üst yöne doğru başlayarak saat yönünde döndürüldüğü anlamına gelen bir yığın kullanıyoruz).
- 1. adımdan itibaren tekrarlayın.
- Yol endeksleri sayısı birden fazla ise, bağlantısı kesilmiş odalar vardır.
Bağlantısız odalar varsa, o zaman odaları yol dizinine göre gruplarım, en büyük yolun dizinini alın ve diğer tüm odaları bu odalara bağlayın. Bu devam etmekte olan bir çalışma, ancak (şimdiki "brutish") planım, bir oda grubundaki her odadan geçiyor (ilk hariç), büyük grup odasına yatay veya dikey bir yol olup olmadığını kontrol etmek ve öyleyse, aralarında odaları enjekte ederek / güncelleyerek yatay / dikey bir yol oluşturun. Durulayın ve tekrarlayın. Çirkin, evet, ama görsel desen açısından farkedilmeyecek bir şey bu yüzden bu anlamda çalışır.