Benzer karoların yan yana oluşma olasılığını artırmak


9

Şu şekilde görünen bir kiremit harita sistemi üzerinde çalışıyorum (yeşil çim, hava beyaz, taş gri ve mavi su):

Fayans

Basit bir rasgele sayı üreteci kullanır, böylece karonun çim olma olasılığı% 45, su olma olasılığı% 30 ve taş olma şansı% 25'dir.

Zaten çim / taş blokların kara kütleleri oluşturmak için bir araya gelme ve su bloklarını okyanuslar haline getirme eğilimini artırabilir miyim (Minecraft gibi bir oyunda bir nevi görülebilir)?

Yanıtlar:


17

Blokları kontrol eden ve orada ne olduğuna bağlı olarak olasılığı değiştiren bir algoritma kullanabilirsiniz - ama bence bu büyük ölçüde yanlış bir yaklaşım.

Bakmak istediğiniz şey fraktal gürültü türleridir - bu durumda perlin veya simpleks gürültü. Gürültü üretirseniz, -1 ile 1 arasında değerler alırsınız.

http://en.wikipedia.org/wiki/Perlin_noise

Daha sonra su seviyesini ayarlayarak su seviyenizi ayarlayabilirsiniz. Diğer bloklar için kaya ve çim arasında geçiş yapmak için ikinci bir gürültü seti çalıştırabilirsiniz. (bu şekilde büyük su yamalarınız olabilir, ancak daha küçük taş kümeleri olabilir).

getTerrain(x,y) {
if(perlin_noise(x,y) > 0) {
    if(perlin_noise(x * scale,y * scale) > 0) {
        return rock
    } else {
        return dirt
    }
} else {
    return water
}

Tarama ve atma yönteminin aşırı karmaşık olduğunu ve aşırı derecede sağlam ölçeklenebilir olmadığını düşündüğüm için, beğendiğim başka bir yöntem önereceğim:

Haritayı büyük karelere ayırarak haritanıza bir ızgara yerleştirin.

Her kavşakta rastgele bir sayı oluşturun (0 ile 1 arasında yüzdeleriniz için çalışır)

Her kareyi 4 çift kareye keserek alt bölümlere ayırın - eski çizgileri takip edin ve alt bölüm çizgilerini bulduğunuz yerde, birbirine bitişik 2 nokta arasında rastgele bir sayı oluşturun, benzer şekilde, haç merkezi için, en yüksek arasında bir nokta oluşturun. ve en düşük değerler.

Durulayın ve tekrarlayın. İlk geçişten ilk geçişi alacaksınız, ancak ikinci geçişler bazı tekdüzelik verecektir Psuedo-rastgele sayılar için özür dileriz:

0-------5  0---3---5 0-1-3-4-5 011233455
|       |  |   |   | | | | | | 012344555
|       |  |   |   | 0-2-4-6-5 002445665
|       |  |   |   | | | | | | 123445666
|       |  2---5---7 2-4-5-7-7 234455777
|       |  |   |   | | | | | | 233455688
|       |  |   |   | 2-3-5-5-9 223455589
|       |  |   |   | | | | | | 233455589
2-------9  2---4---9 2-4-4-5-9 234445579

Bu, üçgenler için daha da iyi çalışır, çünkü alt bölündüğünüzde çapraz çubuğunuz yoktur.

Tabii ki, mutlak en iyi sonuç bu yöntemleri birleştirmekten gelecek - katman üzerine katman, bazı teknikler size büyük kara kütleleri verecek, diğerleri size harika mağaralar verecek, diğerleri tepeler için çalışacak ve daha fazlası su sistemleri için çalışacak.


+1 Gürültüye atlamanın genel olarak bunun yol açacağını düşündüğüm gibi .. Bunun bir atlamadan biraz fazla büyük olup olmayacağını merak ediyorum, bu yüzden ilk 'etrafta tarama ve yüzdeleri değiştirme' beni oylamaya kolaylaştırdı :)
James

3

Gürültü, daha önce de belirtildiği gibi iyi bir çözümdür. Başka bir seçenek, istediğiniz düzene doğru itmek için verilere ikinci bir geçiş yapmaktır. Gauss Bulanıklığı , bunu başarabilmenin birçok yolundan biridir. Bununla bir geçiş yapmak size her tür güzel "yuvarlak" lekeler almak gerekir.

Hangi yöntemle giderseniz gidin, akılda tutulması gereken önemli bir şey, sürecin sonuçlarını yeni bir yerde saklamaktır. Haritayı yerinde değiştirirseniz, önceden işlemiş olduğunuz bölümler algoritmayı etkilemeye başlar ve bazı garip desenler elde edersiniz.


2

Bunu yapmanın nispeten basit bir yolu, rastgele konumlarda bir dizi çekirdek oluşturmak olacaktır. Bu noktaların Voronoi diyagramını çizin . Sonucun her bölgesine bir öğe atayın.

Bu oldukça çirkin ve mekanik bir görünüme neden olur. Sınırları biraz çamurlayın ve iyi durumda olacaksınız.

Büyük bir harita oluşturuyorsanız, bunu iki düzeyde yapabilirsiniz. Örneğin 20 çekirdek kullanarak ilk Voronoi diyagramınızı oluşturun ve ortaya çıkan her bölgeye bir ulus deyin. 400 çekirdek kullanarak başka bir diyagram oluşturun ve ortaya çıkan her bölgeyi bir zafer olarak adlandırın.

Bir ulus içinde tamamen bulunan tüm zaferler ulusun unsuruna sahip olacaktır. İki veya daha fazla ülkede kısmen yer alan zaferler, çevreleyen ulusların öğelerinden birini rastgele alacaktır.

Bu yazı bir resmi hak ediyor, ancak bir tane sunmak için çok tembelim.


2

Poligonal Harita Oluşturucu , size daha iyi oluşturulmuş haritalar verecek farklı 'bölgeler' ile harita oluşturmak için iyi bir okuma olacaktır. Voronoi diyagramlarına dayanıyor, ancak sanırım bu içine iyi bir başlangıç ​​olacak.


0

bu yöntemi kullanarak yapabilirsiniz:

  • tüm karoları belirtilmemiş listeye koy
  • belirtilmemiş listede bir kutucuk varken
  • başla
  • bu listeden bir kutucuk seç
  • o kutunun komşularını kontrol edin ve komşularına bağlı olarak bir tür seçin
  • bu kutucuğu belirtilmemiş listeden kaldır
  • son
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.