43 votes

Question mathématique: génération procédurale d'une galaxie

Je vais faire un espace/trading/jeu de combat qui est complètement sur le plan procédural généré. Mais, je sais que le stockage de tous les détails de l'ensemble de la galaxie dans la mémoire est unfeasable. En conséquence, j'ai pense que je peux utiliser une graine de générer un système solaire, et à partir de ce système solaire, vous pouvez utiliser jumpgates de voyager vers d'autres systèmes solaires. Le problème est que si je saute à un autre système solaire, à partir de l'un, j'ai besoin d'être en mesure de revenir à exactement la même départ du système solaire, avec exactement les mêmes caractéristiques (planètes, astéroïdes, etc.).

Essentiellement, j'ai besoin d'être en mesure de générer une galaxie entière d'un nombre. Et de ce nombre, ce qui génère un système solaire, j'ai besoin d'être en mesure de générer tous les autres systèmes solaires que le lien de la première et de tous les systèmes solaires que le lien de ceux-ci, et ainsi de suite. Et chaque système solaire a rester exactement la même fonctionnalité-sage, si j'y reviens. Aussi, le nombre de liens à partir de chaque système solaire peut être aléatoire ou fixe, votre choix. Aléatoire serait mieux si.

23voto

Gareth Points 42402

Si vous vous sentez courageux, vous pourriez faire pire que de regarder comment Ian Bell l'a fait pour la version originale d'Elite

15voto

TraumaPony Points 6635

7voto

Darius Bacon Points 9741

Voici l'idée de base de ce que je comprends. Dites que vous êtes arrivé dans le système d'étoile #42 et vous avez besoin de savoir ce qui est en elle. Il a nplanets planètes -- un nombre entre 0 et 10, dire:

>>> star_system = 42
>>> nplanets = hash('nplanets%d' % star_system) % (10 + 1)
>>> nplanets
4

OK, donc en plus de par la planète #2, combien de stations spatiales sont en orbite il y a au début du jeu? Trouver un nombre compris entre 0 et 3:

>>> planet = 2
>>> nstations = hash('nstations%d/%d' % (star_system, planet)) % (3 + 1)
>>> nstations
1

Et ainsi de suite. Les chiffres sont chacun d'une fonction de hachage des indices (système d'étoiles #42, planète #2 dans ce cas), réduit à la plage appropriée. Depuis les fonctions de hachage sont déterministes, mais "aléatoire", c'est la même chose à chaque fois, mais au hasard-à la recherche pour le joueur.

Bien sûr, le hachage des chaînes avec de longues séquences comme "nstations' n'est pas la méthode la plus rapide pour aller à ce sujet, mais il montre que l'idée.

6voto

Liam Points 5214

Jetez un oeil à l'original Versle jeu. Je pense qu'il a affirmé avoir environ 4 milliards de niveaux possibles. Chaque niveau est généré sur la base de courts de graines de chaîne de 20 caractères. Cela a déterminé

  • le thème du niveau (de l'arctique, la forêt, etc...)
  • la forme du paysage
  • la glissance du sol
  • le placement des prédéfinis niveau de détails (bonhommes de neige, des rochers,...)
  • le placement de votre équipe de vers de terre, des mines et des caisses de munitions.

Si vous avez aimé un niveau, vous pouvez écrire à la graine de chaîne de caractères, et l'utiliser pour régénérer le même niveau à une date ultérieure.

C'est un exemple de très complexe, mais en fonction déterministe, avec un seul paramètre d'entrée. Je pense que c'est le concept essentiel de ce dont vous avez besoin.

5voto

Tom Gullen Points 20826

Ne pouvez-vous pas juste SHA1 la galaxie ID, par exemple:

Galaxy 1

Sha1(1) = 356a192b7913b04c54574d18c28d46e6395428ab

Galaxy 2

Sha1(2) = da4b9237bacccdf19c0760cab7aec4a8359010b0

Galaxy 3

Sha1(3) = 77de68daecd823babbb58edb1c8e14d7106e83bb

Vous pouvez ensuite segment de code, c'est à dire:

4 premiers Caractères = Nombre de planètes

356a
da4b
77de

Vous auriez besoin d'une sorte de chaîne de caractères pour le numéro de l'algorithme, une solution simple serait de prendre le code ASCII de chaque caractère numérique, puis à multiplier toutes ensemble, ou quelque chose.

Alors maintenant, nous savons combien de planètes dans notre galaxie, comment sur galaxy x,y,z dimensions?

9 chars = Galaxy Dimensions (x,y,z)

Même principe que ci-dessus, mettez le code dans un grand nombre. Avoir une certaine sensibilité des contrôles ainsi, vous ne voulez pas d'une galaxie c'est 10milesx10milesx10miles avec 20 millions de planètes en elle. Avoir une sorte de pondéré de l'algorithme, comme la taille minimale est de nombre de planètes * 10000. Vous aurez besoin de jouer avec les chiffres assurez-vous que les plages sont toutes compatibles et les caractères à partir de la table de hachage en fait vous donner une fourchette raisonnable.

Ou, au lieu de cela, vous pouvez avoir un nombre aléatoire de choisir un nombre entre min et max de la taille de la galaxie, mais l'utilisation d'une constante RNG de graines, tels que le galaxy ID! De cette façon, le galaxy tailles sont essentiellement "aléatoire" pour l'observateur, mais ils seront de la même à chaque fois.

Etc etc!

C'est une façon d'obtenir les propriétés de votre Univers, mais ce que sur la planète propriétés? Comme la population et d'autres choses?

Si vous avez Galaxy 1 avec 20 000 planètes, vous pouvez le faire:

Sha1('1:340') = bc02ab36f163baee2a04cebaed8b141505cc26b5

C'est, galaxy un, planète 340. Vous pouvez ensuite simplement épissure de ce code, si vous voulez. L'avantage d'utiliser une table de hachage est que chaque planète devrait avoir totalement un code unique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X