2010-05-10 12 views
8

Im mise en œuvre d'un jeu de billard en Java et tout fonctionne bien. C'est un jeu multijoueur, mais néanmoins, il devrait aussi être possible de jouer seul. Pour ce faire, j'essaie de mettre en place un KI simple. À l'heure actuelle, le KI choisit juste au hasard une direction et une intensité aléatoire de l'impulsion (ne pas connaître le mot anglais correct pour cela). Bien sûr, cette IA est très pauvre et peu susceptible de défier un joueur.Pool Billard AI

Alors j'ai pensé à améliorer le KI, mais il y a plusieurs problèmes difficiles à résoudre. J'ai d'abord pensé à choisir la balle la plus proche et à essayer de la placer directement dans le trou le plus proche. Ce n'est pas si grave, mais s'il y a d'autres balles dans la ligne, ça ne marche plus vraiment. De plus, cela ne règle pas le problème du calcul de l'intensité de l'impulsion.

Alors, y a-t-il des conseils généraux? Ou des idées? Les meilleures pratiques?

Répondre

7

Combien de temps CPU et de mémoire faut-il pour calculer les résultats d'un "mouvement" du jeu? Pouvez-vous vous permettre d'analyser plus d'un mouvement? Si c'est relativement bon marché, choisissez N directions/impulsions aléatoires, calculez les résultats et choisissez le meilleur. Vous pouvez éliminer certains cas "difficiles", lorsque la balle va à la poche après trop de collisions. Aussi, pour simplifier, vous pouvez limiter le temps de simulation pour chaque coup (c'est-à-dire n'attendez pas que toutes les balles s'arrêtent, il suffit de calmer les premières secondes T). De cette façon, vous pouvez avoir des lecteurs d'ordinateur de niveau différent - le plus haut N (et T) correspond à un niveau de jeu plus élevé.

+2

Il y a 2 choses que j'aime avec cette solution. D'abord, il est parallélisable, car vous pouvez facilement calculer 3/4 différentes options à la fois. Deuxièmement, au lieu de choisir N, vous pouvez simplement choisir un moment et arrêter le calcul quand il est atteint, garantissant ainsi de ne jamais prendre trop de temps (ce qui est bien). –

+0

-1 tir aléatoire fera une très mauvaise IA. Il ne montre pas non plus un aperçu dans un jeu qui devrait déjà avoir les mathématiques et la physique intégrées. – phkahler

+0

Merci pour la suggestion, mais je pense que plus d'un mouvement ne sera pas possible parce que c'est un appareil vraiment lent;) – RoflcoptrException

0

Je pense que ce n'est guère aléatoire. Vous voudriez un physics engine pour modéliser les interactions de la queue, des balles, des pare-chocs et des poches. Ça ressemble moins à l'IA qu'à la physique.

+0

Peut-être que j'ai mal compris le mot anglais AI;) je veux juste trouver un plus ou un algorithme ou une méthode moins simple pour implémenter un lecteur joué par ordinateur qui n'est pas aussi mauvais qu'un lecteur aléatoire – RoflcoptrException

+2

AI est un acronyme, pas un mot. Et votre jugement sur la simplicité du problème dépend de votre compréhension de la physique et de la fidélité que vous souhaitez intégrer dans le modèle. – duffymo

1

Je peux penser à deux approches générales.

  1. Faites une liste de toutes les positions possibles de repère entourant les niveaux de bille blanche et la force et la recherche puis la liste pour trouver le premier qui vous permet de couler une boule. C'est une assez grande liste, vous pouvez le couper en utilisant un petit nombre de niveaux de force et en excluant tout coup «évidemment» mauvais. Travailler en arrière - regarder chaque boule sur la table, et voir si la boule blanche peut être mise en contact avec elle. Ensuite, travaillez sur la position de repérage et le niveau de force corrects pour le faire aller dans le trou. Vous pouvez développer ceci pour rechercher dans un arbre des photos à plusieurs balles.

J'aime la solution 1 la meilleure; il vous permet de trouver des situations où vous seriez capable de couler deux balles ou plus à la fois.

1

Vous pourriez considérer que l'affichage des billes sous forme de graphique pondéré peut-être. Vous pourriez mettre dans les poches comme des noeuds spéciaux. Vous avez ensuite choisi quelle balle mettre, ou frapper, en fonction du poids du chemin de la boule blanche, à la balle spécifique et à la poche. L'intensité de l'impulsion peut également être définie en utilisant la valeur de ce poids. Vous pouvez ensuite utiliser un moteur physique pour déterminer si le tir est possible. Je n'ai jamais essayé une telle chose, donc tout est théorique et je ne sais pas si c'est pratique. De plus, une telle méthode n'inclut pas le fait de faire rebondir la queue ou les autres balles, donc, fondamentalement, elle ne répondra qu'aux coups droits.

4

Selon le jeu des tables de billard, vous avez généralement deux tâches

Évaluer la situation sur la table (obtenir des photos possibles)

  • Dans le scénario parfait (but parfait, tir parfait) tous les coups possibles sont également durs et si vous ne considérez que des coups directs à une balle, il n'y aura que 6 trous au maximum que vous aurez besoin d'analyser (analyser des canons simples - frapper deux balles nécessite seulement 2 boules supplémentaires x 6 trous situations). Pour chacune de ces situations, établir si elles sont possibles nécessite une analyse simple (sauf si vous réalisez des simulations de collision très réalistes). Donc, dans des simulations très simples, vous pourriez vouloir essayer de construire toutes les situations possibles et les classer. Pour analyser les coups de feu sur la banque, vous pourriez vouloir refléter les boules et les trous.

  • En variante, dans les situations possibles énumérant vous pourriez simplement faire un scan de ligne du tableau, marquant les zones qui sont illégales pour les plans et la construction de coups et l'énumération potentiels comme ...

angle1, ballon1 , POCKET2
angle2, ballon1, POCKET3
Angle3, ballon1, ball2, POCKET1
angle4, cushion2, ball2, POCKET1

  • Pour une AI plus belle, vous voulez simuler des imperfections, par exemple le tir est joué en frappant une balle à un point x (peut-être défini comme un angle de coup direct), supposons qu'il y aura une erreur , ou mauvais coup, ou n'importe quoi) de dx - ceci à son tour provoquera une erreur dans la direction de la balle qui augmentera avec la distance à la poche. Cela donne une façon de classer les tirs par difficulté - la sensibilité du tir en termes d'erreur de but/tir (certains coups sont plus faciles que d'autres). Cela dépend de la longueur du chemin du blanc à la balle et de la balle au trou.

  • Une chose à regarder est le risque de boule blanche va dans le trou, ou d'autres coups de feu illégales

Choisir le tir (non seulement en fonction de la difficulté, mais aussi sur le gain potentiel)

  • vous devez regarder la stratégie et (un coup facile pourrait vous laisser sans rien dans le prochain tour)
  • il est non seulement est-il facile de faire un fi premier coup, mais aussi comment durera le deuxième coup (pour cela, vous pourriez recommencer l'évaluation de cette situation simulée, et ici vous pourriez rendre le joueur plus fort ou plus faible en fonction du nombre de coups qu'il peut aussi regarder en avant; En choisissant la stratégie, vous devez rechercher la combinaison de plans dont la somme des difficultés est minime (vous devrez peut-être évaluer l'importance des plans plus tardifs en prenant en compte la profondeur). probabilité de compte que vous allez manquer)
  • en fonction du jeu que vous pourriez envisager d'introduire des tirs de sécurité qui sont un jeu purement positionnel et le but n'est pas de empocher la balle immédiatement mais de forcer l'adversaire à faire une erreur ou à faciliter une situation pour vous-même (il y a d'autres situations où le fait de jouer de tels coups serait bénéfique - par exemple, quand vous ne pouvez rien toucher mais que vous devez séparer quelques balles ou les éloigner du coussin). Dans ce cas, vous devrez commencer à la fin.
  • tout cela devient beaucoup plus compliqué avec la physique réaliste: spins, collision réaliste, sautille, coussins réalistes, les bordereaux de repère, etc ..