Suggestions d'IA de personnage PacMan pour une direction optimale

9

Tout d'abord, il s'agit de l' IA pour PacMan et non des fantômes .

J'écris un fond d'écran en direct Android qui joue PacMan autour de vos icônes. Bien qu'il supporte les suggestions des utilisateurs via des touches d'écran, la majorité du jeu sera joué par une IA. J'ai terminé à 99% avec toute la programmation du jeu, mais l'IA pour PacMan lui-même est toujours extrêmement faible. Je cherche de l'aide pour développer une bonne IA pour déterminer la prochaine direction de voyage de PacMan.

Mon plan initial était le suivant:

  1. Initialisez un compteur de score pour chaque direction avec une valeur de zéro.
  2. Commencez à la position actuelle et utilisez un BFS pour traverser vers l'extérieur dans les quatre directions initiales possibles en les ajoutant à la file d'attente.
  3. Retirez un élément de la file d'attente, assurez-vous qu'il n'a pas déjà été "vu", assurez-vous qu'il s'agit d'une position de tableau valide et ajoutez aux directions initiales correspondantes une valeur pour la cellule actuelle en fonction de:

    1. A un point: plus 10
    2. A une mise sous tension: plus 50
    3. A un fruit: plus la valeur du fruit (varie selon le niveau)
    4. A un fantôme qui a peur: plus 200
    5. Un fantôme voyage vers PacMan: soustrayez 200
    6. Un fantôme s'éloigne de PacMan: ne rien faire
    7. Possède un fantôme se déplaçant perpendiculairement: soustrayez 50
    8. Multipliez la valeur de la cellule par un pourcentage en fonction du nombre de pas vers la cellule, plus il y a de pas depuis la direction initiale, plus la valeur de la cellule se rapproche de zéro.

    et mettre en file d'attente les trois directions possibles à partir de la cellule actuelle.

  4. Une fois la file d'attente vide, trouvez le score le plus élevé pour chacune des quatre directions initiales possibles et choisissez-le.

Cela me paraissait bien sur le papier, mais les fantômes entourent PacMan extrêmement rapidement et il se tortille d'avant en arrière dans les mêmes deux ou trois cellules jusqu'à ce que l'on l'atteigne. L'ajustement des valeurs de la présence fantôme n'aide pas non plus. Mon point BFS le plus proche peut au moins atteindre le niveau 2 ou 3 avant la fin du jeu.

Je recherche du code, des réflexions et / ou des liens vers des ressources pour développer une IA appropriée - de préférence les deux premières. Je voudrais le publier sur le marché ce week-end, donc je suis un peu pressé. Toute aide est grandement appréciée.


Pour info, ceci a été initialement publié sur StackOverflow

Jake Wharton
la source
Cela dépend en grande partie de l'IA fantôme. Si vous utilisez exactement le même algorithme d'IA du jeu original, vous pourriez simplement demander à pac-man de suivre l'un des nombreux modèles qui ont déjà été découverts, aucune IA requise sauf une table de recherche. Si les fantômes se rapprochent rapidement de votre pac-man, avez-vous considéré que le problème est que l'IA fantôme est trop bonne, plutôt que l'IA pac-man est trop faible?
Ian Schreiber
@Ian L'IA fantôme est exactement comme elle est dans le jeu, mais la disposition du tableau n'est pas la même. C'est juste une disposition de grille simple qui borde la disposition de vos icônes (4x4, etc.). Le PacMan actuel est juste le point le plus proche qui n'a pas de fantôme entre lui et le point. Il se dirigera directement vers un fantôme tant qu'il y aura des points entre les deux. Il me suffit peut-être de regarder quelques pas plus loin que le point le plus proche et de déterminer si c'est une bonne direction à prendre. Puisque toute cette logique de recherche de direction doit se produire à chaque mouvement de cellule, elle doit également être relativement simple et rapide.
Jake Wharton
Examinez la diffusion collaborative, cela pourrait vous aider d'une manière ou d'une autre.
user712092

Réponses:

3

L'idée de Tandem d'algorithme d'escalade est bonne. Un autre est: une variation sur A * pour voir jusqu'où vous pouvez aller pour voir comment vous pouvez obtenir le score le plus élevé au cours des N tours suivants, où N est réglé pour donner le résultat souhaité.

Les valeurs de score que vous donnez peuvent être considérées comme des «coûts de déplacement» - vous êtes fondamentalement sur la bonne voie, mais vous devrez modifier les valeurs jusqu'à ce que vous obteniez le résultat souhaité.

En termes généraux (non spécifiques à PacMan), vous devez allouer des valeurs appropriées pour

  • Blessé à un autre gars.
  • Tué un autre gars.
  • Atteint un autre objectif (autre que tuer)
  • J'ai été blessé.
  • Été tué.

puis recherchez le mouvement qui conduira au score maximum de N tours à l'avenir. Vous pouvez également éviter les mouvements qui conduisent à un score inférieur à X (disons, le coût de la mort) N se transforme en avenir.

Une fois que vous avez marqué tous les coups possibles, ajouté des bonus pour la façon dont cela pourrait se produire à l'avenir et déduit pour la façon dont cela pourrait se produire à l'avenir, alors vous triez simplement le tableau et prenez le meilleur coup.

Faites-nous savoir comment cela se passe!

Olie
la source
0

Vous allez effectuer une recherche.

  • Noeud / État: emplacement Pacman, emplacements Ghost, emplacements Pellet, score total, nombre total de vies.
  • Transition: Pacman se déplace vers le haut, le bas, la gauche ou la droite. Si Pacman s'installe dans un mur et change d'emplacement, c'est très bien (cela pourrait conduire à des stratégies de décrochage vraiment intéressantes). Si Pacman frappe un fantôme, supprimez une vie et déplacez-le ainsi que les fantômes vers l'origine.
  • Coût: Si Pacman se déplace sur une pastille 1, s'il se déplace sur un espace vide 2.
    Le coût est un peu délicat, car il n'est pas évident. La fonction de coût que j'ai décrite encouragera Pacman à terminer le niveau. Cela empêche une stratégie possible et ne fait que camper en attendant que les fruits bonus apparaissent. Mais je pense que nous voulons que l'IA Pacman termine le labyrinthe même s'il donne un score inférieur.
  • Objectif: score maximum atteint. Cela signifie que tous les granulés, fruits et granulés sont consommés.

A * ou UCS sont parfaits lorsque vous cherchez un objectif. La façon dont j'ai décrit l'état / la transition / l'objectif trouvera un excellent chemin pour Pacman, l'IA n'a pas besoin d'envisager spécifiquement d'éviter la mort ou de chercher des fruits. Il le fera seul. Étant donné que le jeu est complètement déterministe, vous pouvez "rechercher" à partir de l'emplacement de départ de Pacman et trouver le chemin de marche optimal pour terminer (toutes les pastilles consommées) en tant que pré-calcul et simplement avoir AI Pacman parcourir ce chemin, pas d'IA à la volée. L'inconvénient majeur de cette approche est qu'elle pourrait facilement devenir incontrôlable en termes de temps processeur et de consommation de mémoire.

Au lieu de consacrer le processeur et la mémoire à effectuer une recherche complète, vous pouvez effectuer une recherche partielle à la volée.

Vous pouvez toujours utiliser UCS / A * mais arrêtez de rechercher après avoir inspecté les Nnœuds et utilisez simplement le meilleur chemin trouvé jusqu'à présent. Cette approche est agréable en ce sens que vous pouvez régler Npour trouver l'équilibre entre la vitesse et la précision.

Une autre méthode que j'aime particulièrement est la recherche d'arbres de Monte-Carlo. Dans cette méthode, vous laissez Pacman effectuer une marche aléatoire de Nmouvements. Après chaque marche aléatoire, vous enregistrez son mouvement initial et son score final. Effectuez Mdes promenades aléatoires (ou continuez simplement à les faire jusqu'à ce que vous soyez hors du temps ou quoi que ce soit). Choisissez le coup initial avec la meilleure moyenne des marches aléatoires.

Ces recherches partielles présentent un sérieux inconvénient. Si la recherche avec UCS et Pacman ne marque pas du tout dans les premiers Nnœuds inspectés, il restera bloqué et comme tous les mouvements sont également mauvais.
A * n'aurait pas ce problème tant que l'heuristique a pris soin de rapprocher Pacman des pellets non consommés.
Les SCTM pourraient être en mesure d'éviter ce problème si la marche aléatoire est biaisée pour se diriger vers des granules non consommés et que la marche aléatoire ne s'arrête jamais avant de marquer (c.-à-d. Que la marche aléatoire continue si Pacman a un score de 0).

deft_code
la source