Aumentando la probabilità che tessere simili si generino una accanto all'altra


9

Sto lavorando a un sistema di mappe a tessere, che appare così (il verde è erba, l'aria è bianca, la pietra è grigia e il blu è acqua):

piastrelle

Utilizza un semplice generatore di numeri casuali in modo che il 45% di probabilità che la piastrella sia erba, il 30% di probabilità che sia acqua e il 25% di probabilità che sia pietra.

Posso comunque aumentare la tendenza dei blocchi di erba / pietra a raggrupparsi per formare masse terrestri e creare blocchi d'acqua dagli oceani (un po 'come quello che si potrebbe vedere in un gioco come Minecraft)?

Risposte:


17

Potresti usare un algoritmo che controlla vicino ai blocchi e varia la probabilità a seconda di cosa c'è, ma penso che sia in gran parte l'approccio sbagliato.

Quello che vuoi vedere sono i tipi di rumore frattale - in questo caso, rumore perlin o simplex. Se generi rumore, otterrai valori da -1 a 1.

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

È quindi possibile regolare il livello dell'acqua impostando la soglia di ciò che rende l'acqua. Per gli altri blocchi è possibile eseguire un secondo set di rumore per passare da roccia a erba. (in questo modo puoi avere grandi macchie d'acqua, ma piccoli blocchi di pietra).

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
}

Poiché penso che il metodo scan and toss sia eccessivamente complicato e non eccessivamente scalabile, suggerirò un altro metodo che mi è piaciuto:

Posiziona una griglia sulla mappa, suddividendola in grandi quadrati.

Genera un numero casuale ad ogni incrocio (tra 0 e 1 funzionerà per le tue percentuali)

Suddividi tagliando ogni quadrato in 4 quadrati pari - segui le vecchie linee e, dove trovi le linee di suddivisione, genera un numero casuale tra i 2 punti adiacenti, allo stesso modo, per il centro della croce, genera un punto che si trova tra i più alti e valori più bassi.

Risciacqua e ripeti. Otterrai la casualità iniziale dal primo passaggio, ma questi ultimi daranno un po 'di uniformità Ci scusiamo per i numeri psue-casuali:

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

Questo funziona ancora meglio per i triangoli, perché non si ha la barra trasversale persa quando si suddivide.

Naturalmente, il risultato migliore in assoluto verrà dalla combinazione di questi metodi: strato su strato, alcune tecniche ti daranno grandi masse terrestri, altre ti daranno fantastiche grotte, altre lavoreranno per le colline e altre lavoreranno per i sistemi idrici.


+1 Siccome penso che il salto al rumore sia generalmente dove questo porterà .. Mi chiedo se potrebbe essere un po 'troppo grande di un salto, quindi l'iniziale "scan around and alter the percent" mi ha facilitato il voto :)
James,

3

Il rumore è una buona soluzione, come è già stato menzionato. Un'altra opzione è fare un secondo passaggio sui dati per spostarli verso il layout desiderato. La sfocatura gaussiana è uno dei molti modi in cui puoi raggiungere questo obiettivo. Fare un passaggio con questo dovrebbe farti ottenere belle chiazze "rotonde" di ogni tipo.

Indipendentemente dal metodo che segui, una cosa importante da tenere a mente è archiviare i risultati del processo in una nuova posizione. Se modifichi la mappa in atto, le porzioni che hai già elaborato inizieranno a influenzare l'algoritmo e finirai con alcuni strani schemi.


2

Un modo relativamente semplice per farlo sarebbe quello di creare un numero di nuclei in posizioni casuali. Disegna il diagramma Voronoi di questi punti. Assegna un elemento a ciascuna regione del risultato.

Ciò si traduce in qualcosa di piuttosto brutto e dall'aspetto meccanico. Muddy un po 'i bordi e sarai in forma decente.

Se stai generando per una mappa di grandi dimensioni, puoi farlo su due livelli. Crea il tuo diagramma Voronoi iniziale usando, diciamo, 20 nuclei e chiama ogni regione risultante una nazione. Crea un altro diagramma usando 400 nuclei e chiama ogni regione risultante un vicariato.

Tutti i vicariati totalmente contenuti in una nazione avranno l'elemento della nazione. I vicariati parzialmente contenuti in due o più nazioni prenderanno a caso uno degli elementi delle loro nazioni racchiuse.

Questo post merita una foto, ma sono troppo pigro per fornirne uno.



0

puoi farlo usando questo metodo:

  • mettere tutte le tessere in un elenco non specificato
  • mentre c'è un riquadro nell'elenco non specificato
  • inizio
  • scegli una tessera da quella lista
  • controlla i vicini di quel riquadro e seleziona un tipo a seconda dei vicini
  • rimuovere quel riquadro dall'elenco non specificato
  • fine
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.