Rastgele harita oluşturma - rastgele düğümleri dağıtma / kümeleme stratejileri


10

Uzayda basit bir 4X strateji oyunu yapıyorum, her düğüm bir ilgi çekici nokta (bir gezegen, bir asteroit vb.)

Rasgele bir harita oluşturmak için aşağıdaki adımları uygularım

  1. Haritanın her bir düğümünün kaç türüne sahip olacağına karar verin (belki de diyelim ki 5 Dünya benzeri gezegen, 10 kısır gezegen vb.)

  2. Her düğüm türünü haritaya yerleştirin.

Adım 2 için her bir düğüm tipinin eşit bir şekilde yayılmasını istiyorum. Örneğin, tüm dünya benzeri gezegenleri yerleştirerek başlardım. Konumu belirlemek için basitçe bir rand (map.width, map.height) yaparsam, o toprakta başlayan oyuncuya avantaj sağlayacak olan dünya benzeri gezegenlerin birlikte kümelenmesine son verebilirim.

Birbirinden yayılmış (x, y) koordinat dizisi oluşturabilen farklı grafik fonksiyonları veya gürültü fonksiyonu gibi herhangi bir yöntem var mı? Benzer şekilde, birbirine yakın koordinatlar oluşturmanın herhangi bir yolu var mı?


1
Lütfen yanıtı benim ya da başka birinin yanıtını kabul edilmiş olarak işaretleyin. Teşekkürler.
Mühendis

Yanıtlar:


8

Karşılaştığınız sorun, rastgele seçimin ayrımcılık yapmaması ve bu, yapmanız gerekenler için idealden daha az uygun olduğu anlamına gelebilir. Ancak, bu sorunu çözmenin en az bir kolay yolu vardır:

  1. Alanınızı sektörlere ayırın (örneğin 100 ile 100 arasında bir alanınız varsa ve bu güneş sistemlerinden 100'ünü oluşturmanız gerekiyorsa, ardından alanınızı 10 ila 10 sektör ızgarasına ayırın)

  2. Her Sektörde döngü yapın ve 3. adımı tekrarlayın (bu da 4. adımı birden çok kez tekrarlar)

  3. Mevcut güneş sistemi için gezegen sayısını rastgele belirleyin (örneğin, 3 ila 7 gezegen aralığı için, sadece 0 ila 4 arasında rastgele bir sayı elde edin ve 3 ekleyin) (birden fazla güneş enerjiniz varsa) bir sektörde, başka bir döngü oluşturduğunuz yer)

  4. Gezegenlerinizi, döngünüz tarafından tanımlanan geçerli Güneş Sistemi'ne rastgele atayın (gezegenler arasındaki minimum mesafeleri artırmak için rastgele sayılar da kullanabilirsiniz); Burası, çeşitli ağırlıklarla veya kullanmayı tercih ettiğiniz herhangi bir yöntemle rastgele belirlenebilen gezegen türlerine karar vereceğiniz yerdir.

Ayrıca, komşu sektörlerden gezegenlerin birbirleriyle doğrudan temas etmelerini önlemek için (rastgele rasgele yan yana konumlandırılmış olmaları durumunda), her bir sektörün kenarı çevresinde bir "sınırların dışında" alan tanımlamak isteyebilirsiniz veya. ..

Başka bir çözüm, komşu sektörlere karşı hızlı bir yakınlık kontrolü yapmak ve buna göre ayarlamak için her güneş sisteminin ve / veya her gezegenin yerini belirleme noktasında olabilir (örneğin, kenardan minimum mesafe artı rastgele mesafe ile uzaklaşın) ).


Rica ederim! Ve +1, sorununuzu neyin çözdüğüne dair bazı takipler göndermek için. =)
Randolf Richardson

8

Eşit dağılımı sağlamanın en iyi yolu, her bir düğüme bir tür fiziksel parçacık olarak davranmaktır. Önce sürekli (kayan nokta) xy düzleminde rastgele bir dağılım yapın. Düzlemdeki her bir ayrı parçacık çifti arasında itme kuvvetleri uygulayarak, yavaşça dağıldıklarını göreceksiniz. Bir anlamda çarpışma çözümü gibi, sadece konuşacak gerçek bir temas yoktur. O zaman bu düzlemi (onu rasterleştirin) tamsayı dizine alınmış bir ızgaraya dönüştürmek basit bir konudur. Bunu basitçe bir tamsayı dizine alınmış ızgaradan başlayarak yapabilirsiniz, ancak işleri "güzel" hale getirmek biraz daha zor olabilir - bu, ızgaranızın çözünürlüğünün ne kadar yüksek olduğuna bağlıdır ... ne kadar yüksek, o kadar iyi , bu durumda.

Açıkçası, kare düzlemin kenarlarından da bir çeşit kuvvet uygulamak isteyebilirsiniz, aksi takdirde "kıyılarda bulaşan" birçok parçacık bulabilirsiniz. Alternatif olarak, ihtiyacınız olandan çok daha büyük bir alan oluşturabilir, ardından bunun küçük bir alanının anlık görüntüsünü alabilirsiniz - bu, yukarıda belirtilen sorunu önler.

Eğer kümelenme o tersini, yani sağlamak istediğinizde gelmez meydana ardından "standart" veya "Gauss" dağıtım içine bakmak. Bu nedenle rastgele oluşturulan yıldız alanları genellikle sahte görünür; daha doğal bir dağıtım modeli yerine saf rastgele dağılım kullanırlar.


1
"Fizik" modelinden kümeleme davranışı da elde edebilirsiniz, muhtemelen farklı bir kural kümesi kullanmanız gerekecektir, muhtemelen bir çekim ve itme karışımı kullanmanız gerekir. Seçenekler sınırsız, tek yapmanız gereken doğru modeli bulmak.
aaaaaaaaaaaa

6

"Mavi gürültü" dağılımı elde etmek için basit bir Poisson disk dağıtım algoritması kullanabilirsiniz. Bu, düzlemde birbirlerinden kabaca eşit aralıklarla yerleştirilmiş noktalarla sonuçlanır. Bu sadece 2D örneğinizde değil, aynı zamanda 3D'de ve Öklidyen olmayan alanlarda da çalışır, ancak hesaplamalar hızlı bir şekilde hantal olabilir.

Bu algoritmaların temel fikri, bir ilk "tohum" noktasıyla başlamanız, daha sonra kendinizi, noktadan itibaren olmasını istediğiniz maksimum ve minimum mesafeler arasındaki halkada rastgele veya sahte rastgele noktalar ekleyerek ve dışarıda çalışmanızdır. birbirine çok yakın olanlar. Daha sonra algoritmanız, gereken nokta miktarı eklenene (kabaca dairesel bir nokta bulutu verir) veya kullanılabilir alan doldurulana kadar bu şekilde dışarı doğru çalışır.

Bu tür parazitlerin 2D üretimi için hızlı ve zarif bir alternatif algoritmanın yanı sıra özellikleri hakkında kısa bir tartışma , Üniversitenin Daniel Dunbar ve Greg Humphreys tarafından " Hızlı Poisson-Disk Örnek Üretimi için Mekansal Veri Yapısı " nda bulunabilir. Virginia.


2
Poisson disk dağılımlarını hiç duymamıştım - iyi bağlantı!
tenpn
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.