Exploration avec plusieurs chemins aléatoires dans un jeu Tower Defense


8

J'ai pensé à trouver un chemin aléatoire pour mon jeu Tower Defense. A * ne fonctionnerait pas pour mes besoins, car j'ai spécifiquement besoin d' un guidage aléatoire .

Imaginez une carte avec des itinéraires, un point de départ et une destination. J'ai plusieurs itinéraires, qui mènent tous du point de départ à la destination, d'une manière ou d'une autre. Cela pourrait ressembler à ceci:


Chemin de deux branches en forme de carré

Description de la couleur: rouge - point de départ; noir - destination; gris - route; blanc - espace libre
(les nombres sont utilisés dans le texte comme référence à certaines tuiles)


J'ai d'abord pensé à calculer le prochain waypoint au hasard, lorsqu'une entité passe une tuile. Mais cela ne fonctionnerait pas. Lorsqu'une entité passe la tuile 1, elle peut monter ou descendre. Quand il s'agit de 2, il peut descendre / monter (par rapport à sa position) ou à droite.
Si elle descend / monte, elle ira à la tuile 1, ce qui signifie qu'elle remonte. Mauvais...

Je voudrais vraiment le rendre dynamique , mais je ne sais pas ce que je peux faire maintenant. Quelqu'un avec des idées ou de l'expérience dans ce domaine?


La plupart des jeux de tower defense que je connais font que les choses rampent le plus court chemin vers la sortie et bloquent tous les mouvements qui invalideraient la sortie ... La partie difficile ici serait de s'assurer de recalculer les chemins lorsque le joueur modifie les dispositions de la tour
James

@James: voulez-vous dire obtenir le chemin le plus court, qui est A *, ou voulez-vous parcourir les points de cheminement pour obtenir des directions valides pour chaque tuile. Je n'ai pas non plus besoin de recalculer le chemin car mes chemins sont fixes et le joueur ne peut pas y placer de tours. Mais en général, vous avez raison.
Marco

Réponses:


4

Au lieu d'avoir tous les carrés adjacents comme prochains points de cheminement possibles, n'incluez que les carrés qui ne reviennent pas au début et les choisissent au hasard. Si vous faisiez cela, il serait impossible de revenir en arrière car revenir en arrière n'est pas une option.

Il s'agit d'un problème de graphe orienté avec chaque point de cheminement comme sommet et chaque chemin comme bord. Vous avez juste besoin de limiter le nombre de cycles, peut-être de les supprimer entièrement.


C'était ma deuxième pensée. Je dois penser à l'implémentation de la chose "le chemin nous ramène maintenant". Limiter le nombre de tuiles à passer ne serait pas dynamique et flexible.
Marco

Vous pouvez résoudre ce problème en créant un graphique dirigé et en gardant une trace des tuiles visitées / non visitées. Assurez-vous ensuite de ne rechercher que les tuiles non visitées. Cela devrait vous construire un graphique qui représente vos chemins. Maintenant, si vous frappez une tuile où une note a plusieurs bords sortants (dans le graphique qui a été construit précédemment), choisissez-en un au hasard.
bummzack

Je voulais écrire "nœud" et non "note" dans mon commentaire précédent. Désolé.
bummzack

@bummzack: Non, cela ne fonctionnerait pas. Imaginez une carte avec 3 chemins. Si je recherche des nœuds non visités, je pourrais aussi simplement retourner au début. Je pense à implémenter un algorithme qui parcourt la carte et choisit au hasard entre les directions. Lorsqu'elle se rend compte qu'elle remonte au début, cette partie est inutilisable. Je pourrais le faire avec un compteur. Lorsque la distance jusqu'au départ diminue, elle recule. Cela serait analysé une fois lors de la création de la carte dans le processus de développement, il n'y a donc pas de problèmes de performances.
Marco

@Marco Pourquoi cela ne fonctionnerait-il pas? Si vous implémentez une première recherche étendue à partir de votre nœud de départ, vous ne visiterez plus les nœuds précédents. Vous ne reviendrez jamais au début, car c'est un peu comme un remblai.
bummzack

7

Vous dites aléatoire, mais combien de caractère aléatoire voulez-vous? Est-ce correct si les ennemis choisissent un chemin 10 fois plus long que le plus court? Est-ce correct si les ennemis entrent dans une impasse et doivent faire marche arrière? Autrement dit, aléatoire sur quel ensemble de chemins et avec quelle distribution de probabilité?

En supposant que vous vouliez que les ennemis préfèrent les chemins courts, vous pouvez utiliser A *, mais varier au hasard les poids des bords qui y sont alimentés. Ensuite, les ennemis choisiront toujours un chemin aléatoire qui visite chaque nœud au plus une fois, avec un biais vers des chemins plus courts. En particulier, si sans randomisation il y aurait plusieurs chemins de même longueur, chacun de ces chemins serait choisi avec une probabilité égale.

Alternativement, dans A *, vous pouvez parcourir les voisins dans un ordre aléatoire. Dans votre exemple, lorsque la recherche de chemin atteint le nœud 1, elle mettrait en file d'attente aléatoire le haut du voisin inférieur en premier, ce qui fera que le chemin du haut ou du bas sera considéré en premier. Cette solution obligerait les ennemis à choisir parmi tous les chemins les plus courts au hasard. Dans votre exemple simple, les deux chemins les plus courts seraient également probables, mais dans une situation comme:

start -+--------+
       |        |
       +--------+
       |        |
       +--------+- end

le chemin du haut serait choisi à la probabilité 1/2, tandis que ceux du bas seraient choisis à la probabilité 1/4 chacun.


Je ne sais pas exactement ce que l'OP signifie par "recherche de chemin aléatoire", mais votre solution pour choisir au hasard parmi tous les chemins les plus courts est ce que je suppose qu'il voulait dire, et votre "alternative etc" est une excellente solution pour ce problème.
jhocking le

0

Juste une preuve de concept:

  1. Choisissez une direction aléatoire.
  2. Si cela devait nous amener à aller quelque part où nous sommes déjà allés, choisissez une autre direction.
  3. Si nous avons manqué de directions, revenons au dernier carré avec une direction inexplorée.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.