Come generare un livello casuale da un seme? [chiuso]


46

Come farei usando un seme casuale per generare un livello di gioco? Lo stesso seme dovrebbe sempre generare lo stesso identico livello.

Per questo esempio sarebbe un livello di stile Worms . Quindi ogni livello avrebbe un tema (praterie, neve ecc.), Terreno base, oggetti diversi come alberi.

Quindi da dove iniziare a creare questo tipo di generatore di livelli? Cosa sarebbe coinvolto? Quali concetti usa?

Punti bonus per qualsiasi link valido ( punti bonus bonus per qualsiasi cosa relativa a come è stato fatto in worm o simili).

Grazie.


La generazione di livelli casuali è anche nota come Generazione di contenuti procedurali (PCG). Ed ecco una wiki che si occupa proprio di questo. pcg.wikidot.com Dovresti darti alcune idee! : o)
Kaj il

1
Chris Crawford ha un articolo che potresti trovare interessante. È stato scritto nei primi anni '90 ma è ancora rilevante. Come costruire un mondo
Anthony,

Se si utilizza qualsiasi forma o algoritmo che utilizza lo stesso generatore di numeri casuali (tranne uno che si insinua in qualche modo in un invariante, come ora di sistema), lo stesso seme si genererà lo stesso livello, non c'è davvero niente da fare.
Kaj,

1
Sì, ma penso che il trucco stia effettivamente utilizzando un seme in primo luogo per generare il livello. In precedenza ho creato generatori di livello casuale, ma non hanno utilizzato un solo seme. Spesso sceglierei punti casuali, quindi per ogni punto scegliere un oggetto casuale da posizionare lì. In questo modo non esiste UN SOLO vero seme che genererà sempre lo stesso livello, in quanto vi sono un sacco di cose che generano numeri casuali propri.
Adam Harte,

10
Sei sicuro di sapere cosa significa "seme"? Questo è il "vettore iniziale" passato in via, ad es srand(int). Le chiamate successive a rand()restituiranno valori sequenziali che vengono sempre calcolati nello stesso ordine, in base a questo seme. Hai impostato il seme una volta nel tuo programma. Successivamente, se l'algoritmo dipende solo dai risultati rand, otterrai sempre lo stesso risultato.
Heath Hunnicutt,

Risposte:


7

La chiave per questo sta usando il tuo generatore di numeri pseudo-casuale personalizzato che si inizializza con il valore seed noto. Il "Mersenne Twister" è un algoritmo popolare, ecco la voce di Wikipedia e alcune fonti di esempio . Questo e altri algoritmi PRNG producono effettivamente una serie (molto lunga) di numeri fissi per i quali il valore seed serve come punto di partenza.

Finché segui la stessa identica procedura per generare il tuo mondo ogni volta, ogni valore rappresenterà un mondo riproducibile unico.


4

Ecco un PRNG (generatore di numeri pseudo casuali) implementato in ActionScript (disponibile in AS2 o AS3). È leggero e veloce, ideale per i giochi: http://lab.polygonal.de/2007/04/21/a-good-pseudo-random-number-generator-prng/

L'implementazione di cui sopra si basa sul PRNG Park-Miller-Carta . Questo sito ti darà qualche informazione in più sulla matematica dietro tutto questo.

Per costruire un livello simile a worm, probabilmente userei una funzione Perlin-Noise . Se generi un'immagine del rumore perlin con l'altezza di 1px e la larghezza del tuo mondo di gioco, allora fondamentalmente otterrai una mappa di altezza, pronta per l'uso. Anche le funzioni di rumore di Perlin generano sempre la stessa mappa con lo stesso seme.

È quindi possibile utilizzare il PRNG sopra menzionato per determinare dove posizionare oggetti casuali sulla mappa o dove creare un buco nel terreno. Per i buchi potresti anche sfruttare di nuovo il rumore del perlin. Basta creare un'immagine di disturbo perlin con le dimensioni della mappa (x, y), quindi creare un buco nella mappa in cui il valore dei pixel è inferiore a una determinata soglia (ad es. 0,2).


Userei il rumore del perlin, ma un po 'diversamente, lo userei per creare una mappa di altezza 3D, mettere la mappa su un pendio e rimuovere tutti i pixel più bassi della soglia. (if pixel.height - (pixel.distanceToBottom * slopeFactor) <treshold) pixel = trasparente)
Niels

2

Teoricamente se puoi usare un generatore di numeri pseudo-casuale (come Perlin-Noise o Marsenne Twister) per condividere mappe tramite

puoi anche creare mappe personalizzate e ridurle in seed, risolvendo il problema di non poter creare

mappe personalizzate quando si utilizzano PRNG. Questo tuttavia si basa su alcune presunzioni. Vale a dire che sono generatori di numeri pseudo-casuali

un processo reversibile e che QUALSIASI dato alimentato all'indietro in un PRNG produrrà un seme valido, tanto meno un seme affatto!

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.