99 votes

Vous cherchez un algorithme de génération de carte bon monde

Je suis en train de travailler sur une Civilisation-comme le jeu et je suis à la recherche d'un bon algorithme pour générer de la Terre-comme les cartes du monde. J'ai expérimenté avec quelques variantes, mais n'ont pas touché à un vrai gagnant encore.

Une option est de générer une heightmap en utilisant le bruit de Perlin et ajouter de l'eau à un niveau tellement qu'environ 30% de la production mondiale de terres. Alors que le bruit de Perlin (ou similaire fractale basée sur des techniques) est fréquemment utilisé pour le terrain et est raisonnablement réaliste, il n'offre pas beaucoup de contrôle sur le nombre, la taille et la position de la résultante des continents, que j'aimerai l'avoir dans une perspective de gameplay.

Perlin noise

Une deuxième option est de commencer avec un au hasard placé une tuile de la graine (je suis en train de travailler sur une grille de tuiles), déterminer la taille souhaitée pour le continent et chacun son tour ajouter une tuile qui est à l'horizontale ou à la verticale adjacente à l'existant continent jusqu'à ce que vous ayez atteint la taille désirée. Répétez l'opération pour les autres continents. Cette technique est la partie de l'algorithme utilisé dans Civilization 4. Le problème est que après avoir placé les premiers continents, il est possible de choisir un point de départ qui est entouré par d'autres continents, et donc ne correspondent pas à la nouvelle. Aussi, il a tendance à se frayer continents trop rapprochés, résultant en quelque chose qui ressemble plus à une rivière qu'continents.

Random expansion

Est-ce quelqu'un connaîtrait un bon algorithme pour la génération réaliste continents sur une grille à la carte tout en gardant le contrôle sur leur nombre et leur taille relative?

38voto

David Johnstone Points 10565

Vous pourriez prendre un repère de la nature et de modifier votre deuxième idée. Une fois que vous générez votre continents (qui sont tous à environ la même taille), le faire de façon aléatoire déplacer et faire pivoter et de collision et de déformer les uns des autres et de la dérive en dehors les uns des autres. (Note: cela peut ne pas être la chose la plus facile que jamais de mettre en œuvre.)

Edit: Voici une autre façon de le faire, avec une mise en œuvre - Polygonal de la Génération de la Carte pour les Jeux.

11voto

Norman Ramsey Points 115730

Je vous suggère de sauvegarder et de

  1. Pensez à ce qui fait "bon" continents.
  2. Écrire un algorithme qui permet de dire une bonne continental de la mise en page d'un mauvais.
  3. Affiner l'algorithme de sorte que vous pouvez quantifier la qualité d'une bonne mise en page est.

Une fois que vous avez mis en place, vous pouvez commencer à mettre en œuvre un algorithme qui devrait être en forme comme ceci:

  • Générer de merde continents et ensuite de les améliorer.

Pour amélioration, vous pouvez essayer toutes sortes de standard d'optimisation des trucs, si c'est le recuit simulé, la programmation génétique, ou quelque chose de complètement ad hoc, comme le déplacement d'une choisie au hasard à bord carré à partir de là où il se trouve sur le continent le bord opposé du continent et le centre de masse. Mais la clé est d'être capable d'écrire un programme qui permet de dire bonne continents, de mauvaises. Commencer avec dessinés à la main les continents ainsi que votre test continents, jusqu'à ce que vous obtenez quelque chose que vous aimez.

11voto

nathanchere Points 2707

J'ai écrit quelque chose de semblable à ce que vous êtes après pour automatiser l'économiseur d'écran de style clone de la Civilisation 1. Pour l'enregistrement, j'ai écrit ceci en VB.net mais puisque vous n'avez rien dit au sujet de la langue ou de la plate-forme dans votre question, je vais garder un niveau abstrait.

La "carte" spécifie le nombre de continents, d'un continent à l'écart de taille (par exemple 1.0 permettrait de garder tous les continents, avec le même approximative de la superficie des terres, jusqu'à 0,1 permettrait continents avec 1/10e de la masse du plus grand continent), le maximum de la superficie des terres (en pourcentage) pour générer, et la centrale des terres biais. Une "graine" est distribué de façon aléatoire autour de la carte pour chaque continent, pondérée vers le centre de la carte, comme par la centrale de biais (par exemple, un faible biais de produit distribué continents de plus en plus semblables à la Terre, où, comme d'un centre, haut de biais ressemblent plus à une Pangée). Ensuite, pour chaque itération de la croissance, les "graines" attribuer des cases de terre selon un algorithme de répartition (plus sur cela plus tard) jusqu'à un maximum de superficie a été atteint.

La distribution des terres de l'algorithme peut être aussi précis que vous voulez, mais j'ai trouvé plus intéressant des résultats de l'application de différents algorithmes génétiques et de lancer les dés. Conway "Jeu de la Vie" est vraiment facile à démarrer avec. Vous aurez besoin d'ajouter un peu de prise de conscience mondiale de la logique pour éviter des choses comme les continents croissante dans les uns des autres, mais pour la plupart des choses de prendre soin d'eux-mêmes. Le problème que j'ai trouvé avec plus de fractale basée sur des approches (ce qui était mon premier inclinaison) a été le résultat de regardé trop de motifs, ou conduire à un trop grand nombre de scénarios nécessitant hacky-sentiment solution de contournement des règles pour obtenir un résultat qui ne me sentais toujours pas assez dynamique. Selon l'algorithme que vous utilisez, vous pouvez appliquer un "flou" sur le passage de résultat pour éliminer des choses comme abondante unique-carré de l'océan de tuiles et de carreaux côtes. Dans le cas de quelque chose comme un continent d'être pondus, entouré par plusieurs autres et avoir de nulle part à gauche pour pousser, déplacer les graines pour un nouveau point sur la carte et poursuivre la croissance passe. Oui, on peut dire que vous souvent plus de continents que prévu, mais si c'est vraiment quelque chose que vous fermement ne veux pas puis un autre moyen d'éviter cela est d'influencer la croissance des algorithmes ils sont favorables à la croissance dans la direction avec moins de proximité à d'autres graines. Au pire (à mon avis en tout cas), vous pouvez marquer une série non valide lorsqu'une graine a nulle part à gauche de croître et de générer une nouvelle carte. Assurez-vous de fixer un nombre maximum de tentatives de quoi que ce soit si irréaliste est spécifié (comme raccord 50, même pondérée continents sur une 10x10 conseil d'administration), il ne passe pas toujours en essayant de trouver une solution valable.

Je ne peux pas garantir combien de Civ etc le faire, et bien sûr ne pas cacher les choses, comme le climat, l'âge de la terre, etc, mais en jouant avec les graines de la croissance de l'algorithme, vous pouvez obtenir assez intéressante des résultats qui ressemblent à des continents, archipels, etc. Vous pouvez utiliser la même approche pour produire " bio " à la recherche des rivières, des montagnes etc trop.

9voto

mems Points 519

De forme polygonale génération de la carte article décrit étape par étape de génération de carte unsing polygones de Voronoi.

Ce mec donne également tous les codes source. C'est du Flash (ActionScript 3 / ECMAScript), mais transposable à tout autre langage orienté objet

Ou essayez d'utiliser des algorithmes mis en œuvre dans certains fractale de l'environnement des logiciels comme TerraJ

5voto

dmckee Points 50318

Il suffit de penser hors de la manchette ici:

Choisissez des points de départ, et attribuer à chacun un tirées au hasard (espéré) de la taille. Vous pouvez peut maintenir séparé de la taille de tirage prévu continents et prévu îles, si vous le souhaitez.

En boucle sur la terre des éléments, et où ils ne sont pas encore à la taille prévue ajouter un carré. Mais la partie la plus amusante est de pesage de la chance que chacun voisins de l'élément. Certains ont suggéré la chose qui pourrait facteur:

  1. La Distance à la plus proche des "autres terres". Plus loin c'est mieux génère de larges espaces océaniques. Plus proche est mieux fait d'étroits canaux. Vous devez décider si vous allez laisser les bits de fusion.
  2. Distance de la graine. Plus proche est le meilleur moyen compact masses de terre, plus loin est le meilleur moyen long strung out bits
  3. Le nombre des carrés de terres adjacentes. Pondération en faveur de beaucoup de cases adjacentes vous donne en douceur de la côte, préférant quelques vous donne beaucoup de criques et de péninsules.
  4. La présence de "ressources" carrés à proximité? Dépend des règles du jeu, lorsque vous générez des ressources carré, et si vous voulez le rendre facile.
  5. Allez-vous permettre de bits à l'approche ou de rejoindre les pôles?
  6. ??? ne sais pas quoi d'autre

Continuer jusqu'à ce que toutes les masses de terre ont atteint la taille prévue ou ne peut pas croître de plus pour une raison quelconque.

Notez que diddling le paramètre de ces facteurs de pondération permet de régler le type de monde généré , qui est une fonctionnalité que j'ai aimé à propos de certains de la Civs.

De cette façon, vous aurez besoin de faire de génération de terrain sur chaque parcelle séparément.

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