II – 1) Les débuts 2) Déplacements Dans les jeux, les GPS, les guides routiers en ligne qui permettent de déterminer un itinéraire le plus court selon le temps, la distance, les frais ou autres… est basé sur un algorithme. Dans les systèmes complexes comme les jeux vidéos ou un personnage se déplace selon une grille tel un jeu d’échec, on utilisera le procédé de l’A* (à prononcer « A star » ou « A étoile ») dans les autres cas cités concernant la route, on pourra utiliser Dijkstra, A* étant plus lent dans un système simple. Ces procédés seront expliqués dans les parties suivantes. - A* Cet Algorithme est très utilisé dans le domaine du jeu vidéo 2D, 2D isométrique mais aussi 3D. Celui-ci permet de déterminer le chemin le plus cours séparant deux cellules en évitant les obstacles qui peuvent être des objets : mur, arbre, ... mais aussi dans le cas d’un jeu en ligne, les autres joueurs. Voici un exemple d’application de cet algorithme : Nous voyons donc que cette zone noire est divisée en carrés : les cellules. Ce sont les zones ou un personnage ou élément de jeu peut être placé. Les cellules noires sont praticables, c'est-à-dire que les déplacements y sont autorisés, tandis que les cellules bleues représentent un obstacle tel un mur. La cellule verte est le point de départ du déplacement, c’est actuellement ici que se situe le personnage. La cellule rouge est l’endroit ou le personnage doit se rendre, par exemple après un clic sur ce lieu avec la souris, ou parce que l’Intelligence Artificielle du serveur dirige ce personnage a cet emplacement. Nous allons rechercher par le procédé de A* le chemin le plus court reliant ces deux cellules. Voyons maintenant le fonctionnement du début de la recherche grâce à A*. Tout d’abord, nous allons créer deux listes de cellules : l’une dite « fermée » contiendra les cellules traitées (vide au départ), l’autre liste dite « ouverte » contiendra celles à traiter. On commence alors par ajouter la cellule de départ à la liste ouverte, et on la traite : on ajoute toutes les cellules qui ont un coté ou un point commun à la liste ouverte en indiquant leur parent et leur poids. Le parent de ces cellules est celle actuellement en cours de traitement, ici la case de départ. Le poids d’une cellule, noté F, est la somme de la distance qui la sépare de la cellule de départ (noté G) et de la distance qui la sépare de la cellule d’arrivée à « vol d’oiseau », distance de Manhattan, c'est-à-dire que l’on fait la somme de la distance en abscisse et de la distance en ordonnée. On note cette dernière distance H. Enfin, une fois toutes les cellules traitées, on met la cellule de départ dans la liste fermée après l’avoir retirée de la liste ouverte. On disposera ces valeurs sur les schémas explicatifs de la manière suivante : On admet dans les schémas explicatifs suivant que la largeur d’une cellule vaut 10 et que sa diagonale vaut 14 lors des calculs de distances. Nous pouvons donc illustrer notre étape, une fois terminée, de la manière suivante : La cellule de départ est encadrée en bleu turquoise pour indiquer qu’elle est dans la liste fermée, les cellules de la liste ouverte étant encadré de vert. L’étape suivante consiste à rechercher la cellule à traiter et lui faire subir la même chose qu’à la cellule de départ. Pour choisir parmi les différentes cellules, nous prendrons la cellule qui a la poids F le plus faible, car cela signifie que cette cellule se trouve sur le chemin le plus court séparant le départ de l’arrivée puisque c’est la somme des distance Départ -> Cellule + Cellule -> Arrivée. Nous retirons cette cellule de la liste ouverte et l’ajoutons à la liste fermée. Nous allons analyser les cellules adjacentes à celle en cours de traitement, pour les ajouter à la liste ouverte si et seulement si elles ne sont ni des obstacles, ni dans la liste fermée. Si une cellule adjacente est déjà dans la liste ouverte, on met à jour G, H et F ; sinon, on calcule ces valeurs et on l’ajoute à la liste ouverte. Nous obtenons ceci : Cette étape terminée, on la répète… si deux cellules ont un poids F égal, on peut prendre l’une ou l’autre, cela n’a pas d’importance. On arrivera à ceci : Lorsque la cellule d’arrivée est ajoutée à la liste ouverte, cela signifie qu’on a trouvé le chemin, on a alors plus qu’à retrouver les parents des cellules à parcourir pour passer par le chemin le plus court. Voici un schéma pour une meilleure vision des choses, le chemin est tracé de points rouges : Si jamais il arrive un moment ou la liste ouverte est vide, cela signifie qu’il n’y a pas de solution, par exemple si un personnage est dans un enclos, il ne peut en sortir. - Dijkstra C’est un algorithme plutôt lourd à mettre en place car il nécessite plus d’informations notamment sur les distances qui séparent les lieux les uns des autres. C’est pour cela qu’il est plutôt utilisé dans les GPS et autres permettant de créer des itinéraires routiers. Il va lui aussi utiliser le principe des listes, mais il ne sera pas détaillé ici. Voici une illustration d’une situation : Imaginons qu’un voyageur souhaite aller de Paris à Strasbourg, l’algorithme essayera de passer par Lyon, puis essayera par Arras et choisira le meilleur chemin selon la distance parcourue. Cet algorithme sera plus long et demandera plus de ressources à la machine car il va tester toutes les solutions, mais sera plus précis qu’A*. La différence avec celui-ci est la manière de calculer le poids, ici F = poids de la ville parente + le poids (la distance) qui sépare la ville actuelle de la ville parente.