Rogue benzeri 2D zindan üretimi için bazı ideal algoritmalar nelerdir? [kapalı]


Yanıtlar:


27

Bu daha önce ya da daha az cevaplandı. İlk durak yeriniz http://pcg.wikidot.com/ Olması gerektiğinden

, bu sorunun hiç yardımcı olmadığından (gerçekten mi? Biri bir kaynak istedi ve ben de konuyla ilgilenen bir wiki için bir bağlantı yayınladım?) ), wiki'deki bu sayfa özellikle Zindan jeneratörleri ile ilgilidir ve konuyla ilgili çeşitli makalelere link vermektedir.
http://pcg.wikidot.com/pcg-algorithm:dungeon-generation

Prosedürel içerik oluşturma sadece çok yaratıcı bir yaklaşım olduğundan ve tüm fikirler geçerli olduğundan, tüm wikiye göz atmanızı öneririm. Bu, yanal bir düşünme mücadelesidir - ve eğlencelidir.


"Tüm fikirler geçerli" için +1, ancak şunu açıklığa kavuşturmak isterim: Tüm fikirler geçerlidir, ancak bazıları diğerlerinden daha iyi çalışacaktır. Size ait <buraya belirsiz bilgisayar jargon> Fikir olacak işlev ve muhtemelen istediğini olmak, ama ya olmadıkça, bunların, daha uyumlu, daha rasgele, daha verimli, daha özelleştirilebilir veya herhangi bir kombinasyon olacaktır bunu yapmak için başka yolları da vardır gerçekten iyi ya da gerçekten şanslı.
Nic Hartley,

20

Bir kare ızgaraya dayanarak aşağıdaki algoritmayı kullanarak oldukça iyi görünümlü seviyeler elde etmeyi başardım:

İlk önce, bir oda grubu oluşturun. Rastgele parametreler odaların büyüklüğünü ve sayılarını tanımlayacaktır. Uyarlanabilir bir algoritma, büyük koridorlardan yapılmış bazı bölgeleri ve çok küçük odalardan bazılarını tanımlayabilir.

Ardından, tüm odaların birbirine bağlı olduğundan emin olmanız gerekir. Bunun için, her oda çiftinin arasında koridorları (diyelim ki A *) kazmak için bir yol gösterici kullanın, oyulmuş değil (duvarlar) ile karşılaştırıldığında mevcut alanlara (odalar veya diğer koridorlar) rastgele seçilmiş bir ağırlık verin. Ağırlıktaki fark küçükse, o zaman yeni koridorları kazmak makul derecede ucuz olacaktır ve algoritma bir odadan diğerine gitmek için birçok olasılıkla odalar arasında birçok koridor yapacaktır. Ağırlıktaki fark yüksek ise, algoritma mevcut odalardan ve koridorlardan geçmeyi tercih eder, yolları daha zorlaştırır ve belirli bir varış noktasına ulaşmak için daha az seçenekle tercih eder.

Bu, az sayıda parametreden, birbirlerini birbirine bağlayan odaların kovan görünümlü bir labirentine bağlayan küçük koridorlu seyrek masif salonlardan çok farklı görünüm seviyeleri yaratmanıza izin verir.

İşte oluşturulan seviye örneği.

görüntü tanımını buraya girin

Bu algoritmaya dayanarak, bölgeye bağlı duvar dekorasyonu ekleyebilir, koridorları küçültebilir veya büyütebilir, özel odalar yapabilir ve benzeri işlemleri yapabilirsiniz.


10

Kod okumayı seviyorsanız ve C # 'ı ayrıştırabilirseniz, roguelike Amaranth'in kullandığı zindan jeneratörünü önerebilir miyim? O var burada . Bağlantılı odaları, genişletilebilir özellikleri ve diğer bazı güzel şeyleri işler.

Projenin tamamını aşağı çekip inşa ederseniz, zindanları üretecek ve çizecek bağımsız bir araç var, böylece onu ince ayarlayabilir ve nasıl çalıştığını görebilirsiniz.


1
Amaranth'la aylar önce nasıl göründüğümle karşılaştım, ama zindan nesline girdiğimde adını unuttum. Bağlantı için teşekkürler!
Gabriel Isenberg

2
Journal.stuffwithstuff.com/2014/12/21/rooms-and-mazes adresindeki yazınız da gerçekten çok iyi, farklı koridor gen motorları vb. Gibi ekstra özelliklerle birlikte değiştirilmiş bir sürümünü kullanıyorum.
Tobsta

3

Bütün bunlar harika fikirler. RogueBasin ve pcg.wikidot.com'dan biraz aldım ve kendi uygulamamı C # ile yazdım.

Hücresel otomata yöntemi kullanılarak üretilebilecek mağaraya benzer seviyelerin 'doğal' görünümünü gerçekten beğendim. Hücresel otomat yöntemi ile ne demek istediğimi anlamak için Conway'in Yaşam Oyunu'nu hayal edin. Kodum, 4-5 yöntemi olarak adlandırılanları kullanır; bu, bir duvar ve dokuz komşusunun 4 veya daha fazlası duvar olduğu veya bir duvar olmadığı ve bir duvar olmadığı ve 5 veya daha fazla komşunun duvar olduğu anlamına gelen bir fayansın duvar olacağı anlamına gelir. Haritayı rasgele duvarlarla veya boşluklarla doldurarak başlarım, sonra her x / y pozisyonunu tekrarlayarak ziyaret edip 4-5 kuralını uygularım. İzole mağara oluşturma problemini hafifletmek için, haritayı rastgele doldurduktan sonra, her bir döşemeye 4-5 kuralını uygulamadan önce, her döşemeyi duvar yerine bir boşluğa yerleştirerek harita boyunca yatay bir çizgi çiziyorum.

Harita işleyici sınıfımın kodunu ve burada yaptığım tüm gelişmeleri görüntüleyebilirsiniz.

veya burada bir arşivlenmiş versiyonu .


2
Bu sorunun çok fazla oyu var ve bu cevabı biraz daha açabilirseniz daha iyi olur. Bağlantılar eninde sonunda ölme eğilimindedir, bu yüzden yanıtlamaya çalışın, bağlantıları tıklamaya gerek kalmaz. Bu nasıl çalışıyor? Ana fikir nedir? Diğer algoritmalardan farkı nedir?
Katu

1
Bağlantı aslında öldü.
htmlcoderexe

2

Bunu bulmak için en doğrudan yer aslında kaynak koduna bakmak olduğunu düşünüyorum. Sahadaki iki büyük oyuncu, Angband ve Nethack, ikisi de açık kaynak.


3
Her ne kadar açık kaynak kodlu olsa da, ne hatırladığımdan çok iyi bir şekilde belgelenmiş kaynak ya da şeffaf kaynak ya da kaynağa göre öğrenmek için yazılmadı. Onlar tweaks hack kolay, ama genel olarak grok çok zordur.
Tom Hudson,

Belki orijinaller harika referanslar değildir, ancak bazıları mükemmel olan çok sayıda değişken vardır. Örneğin, UnAngband geliştiricisi, zindan neslinde bir takım geliştirmeler yaptı ve bir dizi mükemmel blog yazısı yazdı , bu yüzden kesinlikle kod değilse, fikirleri kullanabilirsiniz.
congusbongus

NetHack kaynağının bilinmesi zor bir şeydir. Zindan jeneratörü (bunlardan BİRİ) THREE C dosyalarından daha az olmayan ve yaklaşık 15 fonksiyona
yayılmış
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.