Comment générer un niveau aléatoire à partir d'une graine? [fermé]

46

Comment pourrais-je utiliser une graine aléatoire pour générer un niveau de jeu? La même graine devrait toujours générer exactement le même niveau.

Pour cet exemple, ce serait un niveau de style Worms . Ainsi, chaque niveau aurait un thème (prairies, neige, etc.), un terrain de base, différents objets tels que des arbres.

Alors, où pourrais-je commencer à créer ce genre de générateur de niveau? Quel serait impliqué? Quels concepts utilise-t-il?

Les points bonus pour tous les bons liens (tout bonus de points de bonus pour tout ce qui concerne la façon dont il a été fait dans les vers ou similaires).

Merci.

Adam Harte
la source
La génération de niveau aléatoire est également appelée Génération de contenu procédural (PCG). Et voici un wiki traitant de cela. pcg.wikidot.com devrait vous donner quelques idées! : o)
Kaj
1
Chris Crawford a un article que vous pourriez trouver intéressant. Il a été écrit au début des années 90 mais reste pertinent. Comment construire un monde
Anthony
Si vous utilisez une forme ou un algorithme qui utilise le même générateur de nombres aléatoires (sauf celui qui se faufile en quelque sorte dans un invariant comme le temps du système), la même graine va générer le même niveau, il n'y a vraiment rien autour de lui.
Kaj
1
Oui, mais je pense que le truc consiste à utiliser une graine en premier lieu pour générer le niveau. J'ai déjà construit des générateurs de niveaux aléatoires auparavant, mais ils n'ont pas utilisé une seule graine. Souvent, je choisissais des points aléatoires, puis je choisissais un actif aléatoire pour chaque point. En procédant ainsi, il n’existe PAS UNE SEULE semence qui générera toujours le même niveau, car il existe toute une série de choses qui génèrent leurs propres nombres aléatoires.
Adam Harte
10
Êtes-vous sûr de savoir ce que signifie "graine"? C'est le "vecteur initial" passé via, par exemple srand(int). Les appels ultérieurs à rand()renverront des valeurs séquentielles toujours calculées dans le même ordre, en fonction de cette valeur initiale. Vous définissez la graine une fois dans votre programme. Après cela, si l'algorithme ne dépend que des résultats rand, vous obtiendrez le même résultat à chaque fois.
Heath Hunnicutt

Réponses:

7

La clé consiste à utiliser votre propre générateur de nombres pseudo-aléatoires personnalisé que vous initialisez avec la valeur de départ connue. Le "Mersenne Twister" est un algorithme populaire, voici l’entrée Wikipedia et quelques exemples de sources . Cet algorithme, ainsi que d’autres, PRNG produisent en fait une série (très longue) de nombres fixes pour lesquels la valeur de départ sert de point de départ.

Tant que vous suivez exactement la même procédure pour générer votre monde à chaque fois, chaque valeur représentera un monde reproductible unique.

Jason Morales
la source
4

Voici un générateur de nombres pseudo aléatoires PRNG implémenté dans ActionScript (disponible dans AS2 ou AS3). C'est léger et rapide, idéal pour les jeux: http://lab.polygonal.de/2007/04/21/a-good-pseudo-random-number-generator-prng/

L'implémentation ci-dessus est basée sur le PRNG Park-Miller-Carta . Ce site vous donnera plus d'informations sur les calculs derrière tout cela.

Pour construire un niveau semblable à celui des vers, j’utiliserais probablement une fonction Perlin-Noise . Si vous générez une image de bruit perlin avec une hauteur de 1 px et la largeur de votre monde de jeu, vous obtenez une carte de hauteur, prête à être utilisée. Les fonctions de bruit Perlin génèrent également toujours la même carte avec la même graine.

Vous pouvez ensuite utiliser le PRNG mentionné ci-dessus pour déterminer où placer des objets aléatoires sur la carte ou créer un trou dans le sol. Pour les trous, vous pouvez également profiter du bruit perlin à nouveau. Créez simplement une image de bruit de fond avec la taille de votre carte (x, y), puis créez un trou dans votre carte où la valeur en pixels est inférieure à un seuil donné (par exemple 0,2).

bummzack
la source
J'utiliserais le bruit perlin, mais un peu différemment, l'utiliser pour créer une carte de hauteur 3D, la placer sur une pente et supprimer tous les pixels plus bas que votre seuil. (si pixel.height - (pixel.distanceToBottom * penteFactor) <seuil (pixel) pixel = transparent)
Niels
2

Théoriquement, si vous pouvez utiliser un générateur de nombres pseudo-aléatoires (tel que Perlin-Noise ou Marsenne Twister) pour partager des cartes via

nombre de semences alors vous pouvez également créer des cartes personnalisées et les réduire à des semences, résoudre le problème de ne pas être en mesure de créer

cartes personnalisées lors de l'utilisation de PRNG. Ceci est cependant construit sur quelques présomptions. À savoir que les générateurs de nombres pseudo-aléatoires sont

un processus réversible et que TOUTES les données introduites à l'envers dans un PRNG produiront une graine valide, et encore moins une graine du tout!


la source