J'essaie d'implémenter un algorithme d'IA pour Bomberman. Actuellement, j'ai une implémentation rudimentaire fonctionnelle mais pas très intelligente (l'IA actuelle est trop zélée pour placer des bombes).
C'est la première IA que j'ai jamais essayé d'implémenter et je suis un peu coincé. Les algorithmes les plus sophistiqués que j'ai en tête (ceux que j'attends pour prendre de meilleures décisions) sont trop compliqués pour être de bonnes solutions.
Quels conseils généraux avez-vous pour mettre en œuvre une IA Bomberman? Existe-t-il des approches radicalement différentes pour rendre le bot plus défensif ou offensif?
Modifier: algorithme actuel
Mon algorithme actuel va quelque chose comme ça (pseudo-code):
1) Essayez de placer une bombe, puis trouvez une cellule à l'abri de toutes les bombes, y compris celle que vous venez de placer. Pour trouver cette cellule, parcourez les quatre directions; si vous pouvez trouver une cellule divergente sûre et l'atteindre à temps (par exemple, si la direction est vers le haut ou vers le bas, recherchez une cellule qui se trouve à gauche ou à droite de ce chemin), alors il est sûr de placer une bombe et de se déplacer dans cette direction.
2) Si vous ne pouvez pas trouver et sécuriser des cellules divergentes, essayez de NE PAS placer de bombe et regardez à nouveau. Cette fois, vous n'aurez qu'à rechercher une cellule sûre dans une seule direction (vous n'avez pas à en diverger).
3) Si vous ne trouvez toujours pas de cellule sûre, ne faites rien.
for $(direction) in (up, down, left, right):
place bomb at current location
if (can find and reach divergent safe cell in current $(direction)):
bomb = true
move = $(direction)
return
for $(direction) in (up, down, left, right):
do not place bomb at current location
if (any safe cell in the current $(direction)):
bomb = false
move = $(direction)
return
else:
bomb = false
move = stay_put
Cet algorithme rend le bot très réactif (il placera des bombes très fréquemment). Il ne se tue pas, mais il a l'habitude de se rendre vulnérable en allant dans des impasses où il peut être bloqué et tué par les autres joueurs.
Avez-vous des suggestions sur la façon dont je pourrais améliorer cet algorithme? Ou peut-être devrais-je essayer quelque chose de complètement différent?
L'un des problèmes de cet algorithme est qu'il a tendance à laisser le bot avec très peu (souvent une seule) cellules sûres sur lesquelles il peut se tenir. C'est parce que le bot laisse une traînée de bombes derrière lui, tant qu'il ne se tue pas.
Cependant, laisser une traînée de bombes laisse peu d'endroits où vous pouvez vous cacher. Si l'un des autres joueurs ou robots décide de placer une bombe quelque part près de chez vous, il arrive souvent que vous n'ayez pas d'endroit où vous cacher et vous mourez.
J'ai besoin d'un meilleur moyen de décider quand placer des bombes.
Réponses:
Le problème auquel vous êtes confronté est que votre IA ne s'arrête jamais pour prendre une décision intelligente sur l'endroit où elle devrait placer sa prochaine bombe, ce qui la laisse simplement larguer des bombes quand elle le peut et ensuite travailler "merde, merde, que dois-je faire maintenant! ? "
Faire une pause pour réfléchir
En ce moment, votre IA ne va nulle part en particulier. Parfois, cependant, il devrait en fait se déplacer vers une cible. Par exemple, s'il voit un bonus et pense qu'il peut l'atteindre avant le joueur, il devrait peut-être trouver un chemin sûr vers cette tuile et s'y déplacer, en gardant un œil sur les bombes et en les évitant en cours de route.
Le même comportement de déplacement vers la cible peut être utilisé lorsqu'il pense à l'endroit où placer sa prochaine bombe .
Lorsque votre IA peut placer une bombe, au lieu de le faire immédiatement, elle doit brièvement utiliser un algorithme de recherche pour choisir parmi les emplacements de placement de bombes disponibles en fonction de critères tels que:
Lorsque cette décision a été prise, l'IA a choisi un emplacement de placement de bombe et un endroit où se cacher de son explosion. Il peut maintenant marcher jusqu'à l'endroit, placer sa bombe, puis marcher jusqu'à sa cachette. Une fois qu'il a atteint sa cachette, il pourrait vouloir continuer à marcher et à trouver des emplacements de bombes (s'il a plusieurs bombes), à condition de garder à l'esprit de se tenir à l'écart de la bombe qu'il a marché ici pour éviter.
En marchant et en trouvant un chemin sûr
Vous pouvez développer pour votre IA une seule méthode de marche au point et l'utiliser à chaque fois que vous voulez qu'elle marche quelque part. Cette méthode pourrait utiliser l' algorithme de recherche A * pour trouver son chemin.
Afin de garder l'IA en sécurité, vous voudrez peut-être lui faire revérifier son chemin à chaque fois qu'une nouvelle bombe est placée. Pour éviter les explosions, il pourrait vérifier le temps jusqu'à ce que la bombe explose et envisager une tuile d'explosion potentielle sûre pour marcher si la bombe n'explose pas pendant qu'elle marche à travers cette tuile - et si ce n'est pas sûr, la traiter comme une tuile infranchissable .
Pour donner des défauts à votre IA (afin qu'elle puisse en fait exploser parfois), il devrait faire des erreurs de calcul: oublier une bombe distraitement, sous-estimer la taille de l'explosion ou le temps jusqu'à ce que la bombe explose, etc.
Remarque: vous pouvez également rendre sa marche aléatoire plus utile en choisissant des endroits au hasard pour marcher, ou en ayant toujours en tête un nouvel emplacement de placement de bombe, au lieu de simplement choisir au hasard une tuile adjacente pour vous promener. De cette façon, il ne se promènera pas d'avant en arrière au même endroit que s'il ne peut pas se décider.
la source