IA de combat réaliste pour jeu 2D

image

Bien que Close Quarters soit principalement un jeu multijoueur, des robots IA complexes doivent toujours y être présents pour que les joueurs continuent à jouer lorsque leur connexion Internet est mauvaise ou qu'il n'y a pas d'autres joueurs en ligne. De plus, les bots jouent un rôle de soutien important dans certains modes de jeu. Par conséquent, ils doivent se comporter de manière crédible et faire preuve d'un ensemble de comportements complexes, notamment l'utilisation d'abris, l'utilisation d'objets au bon moment, contourner les flancs, lancer des grenades et s'enfuir.

Environnement et restrictions


L'environnement de jeu se compose de polygones. La plupart des polygones bloquent le mouvement, la visibilité et la prise de vue, mais il existe également des polygones «bas» qui bloquent uniquement le mouvement. L'environnement est étroitement recouvert d'obstacles et d'abris.

L'IA est également limitée par plusieurs facteurs techniques. Le plus important d'entre eux: le serveur qui exécute les bots lorsqu'il y a peu de joueurs en ligne, devrait rapidement travailler sur un VPS peu coûteux avec au moins dix bots. En outre, la charge du processeur doit rester suffisamment faible pour autoriser plusieurs instances de serveur sur le même VPS sans dépasser la limite du processeur et sans entraîner de sanctions de la part du fournisseur de services VPS.


Figure 1: environnements


Figure 2: vue depuis le visage du joueur des obstacles qui bloquent la vue (les zones grises lui sont invisibles)

Maillage de navigation et de visibilité, recherche tactique d'un chemin


Les robots utilisent un maillage de navigation dense composé de points discrets. Le maillage est généré comme suit: tout d'abord, les polygones qui composent l'environnement sont développés et combinés . Des nœuds supplémentaires sont ajoutés près des coins, car ces endroits sont le plus susceptibles d'être des positions d'abri appropriées. L'espace de mouvement résultant est ensuite triangulé pour générer un maillage.


Figure 3: maillage de navigation

Étant donné que les robots doivent effectuer une recherche tactique du chemin , le maillage de navigation doit contenir des données de visibilité qui nous permettent de vérifier rapidement si le nœud contient un abri contre l'ennemi sélectionné. Par conséquent, chaque nœud contient un tableau de 24 octets, chacun représentant une distance approximative pré-calculée entre le nœud et l'obstacle le plus proche bloquant le champ de vision dans une certaine direction.


Figure 4: Données de visibilité stockées dans le nœud (lignes bleues). Chaque ligne représente une valeur à un octet qui définit la visibilité dans une direction donnée.

Grâce à ces données, vous pouvez rechercher les graphiques en utilisant l'algorithme A *sur le maillage de navigation, dans lequel les nœuds pouvant être ouverts à des ennemis connus reçoivent une priorité inférieure sans contrôles coûteux de la ligne de vue. Pour vérifier si un certain nœud est ouvert à l'ennemi, nous déterminons la direction et la distance du nœud à l'ennemi, puis vérifions si cette distance est inférieure à la distance stockée dans l'élément de tableau le plus proche de cette direction. De plus, nous pouvons vérifier si l'ennemi regarde le nœud. Ensuite, nous pouvons appliquer le facteur de pénalité au coût de déplacement à travers des nœuds ouverts aux ennemis, et le chemin résultant aura tendance à éviter de tels nœuds.

Les mêmes données de visibilité, en plus de trouver le chemin entre deux points donnés, peuvent être utilisées pour d'autres actions «tactiques». Par exemple, le bot cherche un abri en effectuant une recherche en profondeur et s'arrête dès qu'il trouve un site protégé. Des tests de visibilité sont utilisés pour vérifier que le site fournit réellement un abri. De même, nous pouvons générer des chemins d'attaque à partir des flancs en recherchant A * la cible; en même temps, des amendes élevées sont infligées aux nœuds ouverts dans le cône de tir cible. La recherche s'arrête dès que nous atteignons un nœud ouvert à l'extérieur de ce cône de tir. (L'un des problèmes de cette approche est que les bots qui sortent du cadre essaient constamment de se rapprocher de l'objectif, et par conséquent semblent trop agressifs; cela peut probablement être corrigé en définissant l'heuristique A * afinde sorte que le bot ne se déplace pas directement vers la cible, mais vers tous les nœuds situés à une distance sélectionnée de la cible).

Sentiments et mémoire des bots


Pour que les bots se comportent de manière convaincante, ils ne doivent pas ressembler à des tricheurs. En d'autres termes, les informations avec lesquelles le bot travaille doivent être similaires à celles que possède le joueur. Par exemple, l'ennemi derrière l'obstacle doit être invisible pour le bot tout comme il n'est pas visible pour le joueur.


Il y a deux façons dont un joueur peut détecter la position d'un ennemi: il peut voir l'ennemi ou entendre comment il se déplace, tire ou exécute une autre action.

Chaque bot conserve une liste de "faits" connus sur les positions et la direction du regard des ennemis. Sans mises à jour, ces faits sont supprimés après dix secondes. Un fait lié à un ennemi spécifique est mis à jour lorsque le bot peut entendre ou voir cet ennemi. Lorsqu'un bot entend un ennemi, pour simuler l'incertitude, la position du fait correspondant est décalée de la position réelle de l'ennemi dans une direction et une distance aléatoires, selon la distance à laquelle le bot était proche (voir vidéo, 1:28).


Figure 5: faits (cercles roses) dans la mémoire du bot

Arbre de comportement


Dans une version antérieure de Close Quarters, AI utilisait STRIPS, une solution popularisée par FEAR en 2005. Dans STRIPS, la relation entre les différents comportements de l'IA n'est pas prédéfinie par le programmeur. Au lieu de cela, chaque comportement contient une liste de conditions et de résultats binaires. Chaque bot a un état du problème dans le monde et utilise la recherche dans le graphique A * pour trouver la séquence de comportement de sa réalisation. Cette solution fonctionnait bien, mais je pensais qu'elle était trop complexe pour mon application et mieux adaptée à l'IA, qui devait développer des plans complexes impliquant de nombreux comportements différents. Dans la plupart des cas, je connaissais déjà les circonstances dans lesquelles le bot devait exécuter tel ou tel comportement, donc utiliser A * pour cet algorithme était un gaspillage inutile de ressources CPU.

Par conséquent, les robots utilisent désormais un arbre de décision et un comportement simples. Dans chaque mesure, le bot fait le tour de l'arbre, en partant de la racine, jusqu'à ce qu'il atteigne le comportement. Si ce comportement est le même que celui déjà effectué, le bot continue ce comportement. Sinon, le bot initie le comportement et commence à l'exécuter.

Certains comportements peuvent «bloquer», c'est-à-dire empêcher le bot de traverser l'arbre à plusieurs reprises jusqu'à ce qu'une certaine condition soit remplie. C'est utile, par exemple, pour s'assurer que les bots se mettent à couvert avant de décider d'attaquer. De plus, les comportements peuvent «s'annuler» les uns les autres, forçant le bot à contourner l'arbre et à relancer le comportement. Cela est utile, par exemple, lorsqu'un bot s'échappe d'une grenade et qu'une autre grenade apparaît qui compromet certaines positions d'évacuation.


Figure 6: L'arbre de décision et de comportement actuellement utilisé

Certains comportements secondaires sont codés dans d'autres comportements plus généraux. Par exemple, si un bot essaie d'attaquer un ennemi et découvre que l'ennemi n'est pas dans la position attendue, alors il suppose où l'ennemi peut être maintenant et calcule un nouveau chemin d'attaque sans quitter le comportement d'attaque.

Répartition de la charge


Chaque bot n'a pas besoin d'être mis à jour dans chaque cadre de la physique, c'est-à-dire 40 fois par seconde. Pour réduire les coûts de CPU, chaque bot "pense" seulement 20 fois par seconde (ce nombre peut être réduit si nécessaire). Par conséquent, seule la moitié des robots sont mis à jour dans chaque cycle de physique.

Travailler avec des grenades


Un problème grave était l'utilisation significative des grenades par les robots. Travailler avec des grenades est beaucoup plus difficile que de tirer, car les grenades peuvent voler des murs, avoir un rayon de destruction et du temps pour lancer. Heureusement, les robots ne sont pas tenus d'utiliser parfaitement les grenades, suffisamment de persuasion.

La solution traditionnelle à ce problème consiste à pré-calculer les chemins des grenades dans les nœuds de navigation , mais quand il est implémenté, quelques secondes sont ajoutées au temps de chargement de chaque carte, ce qui contredit mon objectif: Close Quarters devrait jeter les joueurs dans la bataille en quelques secondes après le démarrage du jeu.

Par conséquent, les robots recherchent des possibilités d'utiliser des grenades, calculant les trajectoires des grenades à la volée. Dans chaque cycle, le bot attaquant vérifie plusieurs trajectoires possibles dans une direction donnée à 60 degrés de la direction de la cible sélectionnée. Si une grenade lancée le long d'un chemin prouvé peut tuer la cible et que la cible est hors de portée, le bot lance une grenade. La direction vérifiée est bouclée dans chaque horloge AI.


Figure 7: directions vérifiées par le bot pendant une seconde (lignes rose pâle) et trajectoires testées (cercles bleus) le long de la direction sélectionnée dans la mesure actuelle (ligne rose vif).

Autrement dit, les robots utilisent des grenades dans la mesure du possible et ne se déplacent pas spécifiquement pour lancer une grenade. Cependant, le chemin choisi par le bot pour attaquer l'ennemi est souvent un chemin raisonnable à partir duquel lancer une grenade.

Un inconvénient important d'un tel système est qu'en raison du nombre limité de directions contrôlées, les robots ratent l'occasion de lancer des grenades pour rebondir sur de petits obstacles. Le plus notable, c'est à côté des portes, où les bots ne reconnaissent généralement pas la possibilité d'utiliser une grenade. Ce problème peut être résolu en testant plusieurs directions dans une trame et en réduisant ainsi l'angle entre la direction contrôlée et la suivante.

Mouvement vers un comportement plus humain


Un tel problème devient rapidement apparent: les robots sont trop rapides pour appuyer sur la gâchette, car il est très difficile de les vaincre dans une bataille en tête-à-tête. Le temps de réaction humain moyen aux stimuli visuels est de 250 millisecondes, mais à 20 battements par seconde, le temps de réaction maximum du bot n'est que de 50 millisecondes!

Pour résoudre ce problème, j'ai délibérément ajouté un délai entre le moment où le bot a l'opportunité de tirer et le tir lui-même, afin que son temps de réaction soit comparable au temps de réaction d'une personne.

Améliorations supplémentaires


Les systèmes présentés ci-dessus fournissent une IA fondamentale solide, mais n'offrent pas de possibilités d'améliorations majeures. Par exemple, maintenant la pensée spatiale du bot est limitée par son environnement immédiat.Par conséquent, bien que le bot essaie généralement de contourner l'ennemi du flanc, il manque souvent les voies d'évitement du flanc autour des grands obstacles. De plus, les bots ne connaissent que la présence de coéquipiers, donc ils s'accumulent parfois au même endroit, au lieu d'être divisés et contournés des flancs.

All Articles