C'est une question pour les débutants, mais la voici:
Ma carte est une grille 2D, et je veux générer des routes et des rivières. L'itinéraire du point de départ au point d'arrivée ne doit pas être l'itinéraire optimal en nombre de tuiles. Au lieu de cela, ils devraient avoir un certain niveau d'aléatoire (tours).
Existe-t-il un algorithme standard pour ce genre de chose?
À votre santé!
MISE À JOUR:
Ceci est le résultat de jouer avec des poids sur la grille et d'appliquer un algorithme de chemin le plus court (Bellman-Ford) à l'aide de la bibliothèque jgrapht. Je suis allé avec la réponse de Donutz après tout.
Réponses:
Vous pouvez générer le chemin optimal en utilisant A *, puis le déformer avec un déplacement au milieu.
Cela garantira que vos points d'extrémité sont atteints et vous permettra de contrôler le caractère aléatoire dans une large mesure. Par exemple, je ne randomiserais pas autant les routes que les rivières. Quelle que soit l'intelligence qui construit des routes, elle tente généralement d'être optimale.
Veillez à ce que si votre carte comporte des obstacles, vérifiez après chaque itération que vous ne traversez pas ces obstacles.
Une autre méthode serait de générer du bruit Perlin après avoir trouvé le chemin optimal, puis de déplacer vos points en fonction du bruit généré. Par exemple, en utilisant ce bruit:
Ensuite, montrez avec le chemin optimal en rouge et le chemin décalé en bleu:
Remarquez comment le chemin décalé s'est «installé» dans les zones les plus sombres du bruit. De la même manière, une rivière peut traverser une vallée.
Un avantage du choix du bruit Perlin est que vous pouvez prendre en compte vos obstacles et les éviter dans le cadre de l'algorithme.
la source
L'algorithme A * vous permettra également d'attribuer des valeurs aux tuiles indiquant leur pertinence. Par exemple, vous pouvez attribuer les scores de coût les plus bas aux terres basses pour les rivières, aux terres plates (mais pas aux marais) pour les routes, et générer en fonction de cela. Cela ne vous donne pas l'itinéraire le plus court, mais cela vous donne l'itinéraire le plus efficace. Appliquez un peu de hasard à vos valeurs de tuiles et vous pouvez obtenir des itinéraires sous-optimaux.
la source
Et quand la hauteur est un facteur? Je peux faire une carte de hauteur avec l'algorithme carré de diamant. Je pensais ajouter de l'eau au hasard à chaque tuile, puis itérer à travers et déplacer l'eau à des altitudes plus basses jusqu'à ce que tout soit réglé, mais cela ralentirait et ferait probablement des lacs, pas des rivières.
Je pensais aussi à regarder des normales pour chaque tuile. Si 2 normales pointent l'une vers l'autre, cela doit être une vallée. L'eau s'accumulait dans une vallée. S'ils pointent dans la même direction ou s'éloignent les uns des autres, l'eau ne s'accumulera pas. Ce serait probablement plus rapide que la méthode d'itération, mais cela pourrait ne pas faire des lacs, seulement des rivières. Je devrais jouer avec pour éviter de transformer chaque instance de tuiles pointées l'une vers l'autre en une rivière.
la source