*English summary: sorry I'm not native English speaker (writer 😊) and I do not want to translate this post. I explain how I've created a (not yet finished) AI for Blood Bowl. I'm sharing current work and wonder if one day an API would be available to integrate it into the official version. You still can have a small idea of its current behaviour looking at the joined pdf file. Feel free to ask some questions 😊

Il y a de ça déjà quelques années (!), après avoir testé la version 1 de Blood Bowl, j'en étais resté assez frustré de la qualité de l'IA. Et ayant peu de moment où je suis certain de pouvoir rester connecté une demi heure non stop, je n'ai jamais été trop intéressé par le multi... Donc j'ai construit ma propre IA (en Java).

Evidemment, pour pouvoir faire ça, il fallait une interface graphique - qui a pris d'ailleurs proportionnellement bien plus de temps que l'IA elle-même 🙂
J'ai voulu d'abord utiliser une application Java existante (AIBowl) qui faisait exactement tout ce que je voulais: interface graphique, avec API pour construire sa propre IA ! Mais conceptuellement la partie graphique n'était pas du tout découplée du reste du code -> il n'était par exemple pas possible de réduire les temps d'animation à 0 seconde en cas de match AI vs AI.

C'est important car si je voulais faire un championnat avec d'autres IA, je ne voulais pas 'simuler' arbitrairement les scores des autres matchs, je voulais qu'ils se jouent réellement et rapidement, sans être couplé à l'interface graphique. Avec des vrais gains d'expérience pour les joueurs, blessures, etc. Bref, comme ça ne me convenait pas, j'ai tout refait de scratch.

La version actuelle n'est d'ailleurs pas finie - à ce sujet, je tiens surtout à ne PAS remercier ma famille sans qui j'aurais déjà fini tout ce boulot depuis belle lurette 🙂 (oui des enfants en bas âge, ça n'aide pas pour le développement sur temps libre). Car si je disais que j'avais dû mal à avoir du temps une demi-heure de suite pour jouer, forcément il en fut de même pour programmer ! Ce qui explique que après quelques années ce n'est tjs pas fini (d'autant qu'il y a eu aussi des années où je n'ai pas touché une seule ligne de code :-))

Ceci dit, je n'ai graphiquement rien réalisé moi-même. Le problème c'est que je ne me souviens plus précisément d'où j'ai pris les différents éléments/images/icônes. Sans doute à la fois de ce AIBowl.jar, mais aussi d'une autre application Java qui existait avant la version Cyanide, peut-être même de Fumbbl... En tout cas c'est simplement du 2D. A la vitesse où je vais, le 3D est prévu pour environ dans 15, 20 ans 🙂 (non en réalité il n'est pas prévu)

La raison de ce post est double:

  1. Partager ce qui a été fait, car c'est un peu frustrant tous ces développements juste pour une personne 🙂 Ca fait beaucoup de temps de développement pour peu d'utilisation ! Même si essentiellement, j'ai fait ça aussi pour apprendre des choses. Mais comme expliqué plus loin, je ne compte pas faire de release à court terme;
  2. poser la question suivante : est-ce qu'il est possible qu'un jour Cyanide mette au point une api qu'on puisse intégrer notre propre IA ? Ca serait cool, ça permettrait d'avoir une meilleure IA pour tout le monde, à peu de frais pour Cyanide.

Voici maintenant une petite illustration du fonctionnement. Le choix de chaque action est guidé par sa probabilité de réussite. Comme tout joueur, elle va donc commencer par les actions sûres, puis par celles de plus en plus risquées. Avec évidemment certaines priorités, comme par exemple faire un TD si c'est possible 🙂 Le point fort de l'IA par rapport à l'humain, c'est qu'elle sait exactement (au bug près :-)) la probabilité de réussite de telle ou telle action - par exemple pour un bloc, elle connaît la probabilité de turnover, de mettre l'autre au sol, d'un push, etc, en tenant compte des skills, assists, etc. Son point faible est le positionnement stratégique des joueurs : par exemple elle sait faire une cage serrée autour du porteur du ballon (un homme à chaque coin), mais moins facilement faire une cage moins serrée, ou éviter un trou dans la défense. Ca pourrait évidemment s'améliorer dans le futur. A noter qu'elle tient aussi en compte le nombre de tours restants, ou le nombre de Relances restants, ça peut influencer son comportement.

La version actuelle n'est pas terminée : environ 80% des règles (LRB6) sont implémentées. Y a même une règle fondamentale qui ne l'est toujours pas : y a pas encore moyen de lancer la balle ! J'avoue que je repousse tjs l'implémentation de cette dernière bien que techniquement je ne vois pas de difficulté, j'ai clairement en tête ce qu'il faut faire. Mais jusqu'à présent je m'attelle à corriger les bugs existants, rajouter certains skills manquants, etc. Et même sans cette option, je suis 100% certain que mon IA est plus amusante à jouer (et plus forte) que celle de Cyanide 🙂 Je pense qu'elle est meilleure aussi que celle de AIBowl. Certes moins forte qu'un bon (voire moyen) joueur, mais elle se débrouille quand même.

Voici ci-joint dans le pdf une petite séquence illustrant un peu son fonctionnement:

0_1543617423964_BloodBowl_IA_Sequence.pdf

Voilà un petit aperçu, mais l'air de rien y a plein de décisions à prendre tout le temps (et donc à coder) : utiliser une relance ou pas, suivre un joueur ou pas, où pousser le joueur adverse, utiliser tel skill ou pas (genre 'stab'), ...

Voici par exemple le résultat d'un tournoi entre 21 équipes IA (chaque équipe se rencontrant une fois) :
(points, win, draw, loss)

Team NORSE_19: 20(P); 14(W); 2(D); 4(L); 30 points; 36 goals; 9 received
Team LIZARDMAN_21: 20(P); 14(W); 2(D); 4(L); 30 points; 41 goals; 14 received
Team VAMPIRE_9: 20(P); 12(W); 4(D); 4(L); 28 points; 25 goals; 14 received
Team ORC_2: 20(P); 12(W); 3(D); 5(L); 27 points; 29 goals; 12 received
Team NECROMANTIC_10: 20(P); 10(W); 4(D); 6(L); 24 points; 28 goals; 14 received
Team AMAZON_16: 20(P); 10(W); 4(D); 6(L); 24 points; 22 goals; 15 received
Team KHEMRI_15: 20(P); 10(W); 4(D); 6(L); 24 points; 23 goals; 17 received
Team DWARF_17: 20(P); 10(W); 4(D); 6(L); 24 points; 22 goals; 16 received
Team CHAOS_DWARF_8: 20(P); 10(W); 3(D); 7(L); 23 points; 20 goals; 18 received
Team NURGLE_11: 20(P); 7(W); 7(D); 6(L); 21 points; 18 goals; 14 received
Team UNDEAD_1: 20(P); 8(W); 4(D); 8(L); 20 points; 23 goals; 20 received
Team HIGH_ELF_20: 20(P); 7(W); 6(D); 7(L); 20 points; 22 goals; 19 received
Team DARK_ELF_6: 20(P); 7(W); 5(D); 8(L); 19 points; 21 goals; 23 received
Team CHAOS_12: 20(P); 8(W); 3(D); 9(L); 19 points; 16 goals; 22 received
Team SKAVEN_5: 20(P); 6(W); 6(D); 8(L); 18 points; 23 goals; 23 received
Team ELF_4: 20(P); 5(W); 8(D); 7(L); 18 points; 23 goals; 24 received
Team WOOD_ELF_3: 20(P); 5(W); 5(D); 10(L); 15 points; 17 goals; 28 received
Team HALFLING_7: 20(P); 2(W); 7(D); 11(L); 11 points; 11 goals; 29 received
Team HUMAN_14: 20(P); 3(W); 4(D); 13(L); 10 points; 11 goals; 32 received
Team OGRE_18: 20(P); 3(W); 2(D); 15(L); 8 points; 6 goals; 36 received
Team GOBLIN_13: 20(P); 2(W); 3(D); 15(L); 7 points; 8 goals; 46 received

On voit que comme pour des matchs entre humains, les Ogres ne sont pas des foudres de guerre ! Les vampires sont un peu trop bien classé, c'est car 'Blood Lust' n'est pas encore implémenté 🙂 Et les elfes sont actuellement privés d'un beau jeu de balle !

Actuellement, un match IA vs IA sans l'animation dure entre 1s et 2 secondes et demi. Ca pourrait être beaucoup plus rapide, mais je n'ai pas optimisé ça car ça me suffit pour l'instant.

A noter que je ne compte pas faire de release publique à courts/moyens termes, pour plusieurs raisons:

  1. La version actuelle n'est pas finie, et contient tout une série de bugs que je connais. Sortir une version publique avec un site de bugtracking m'amènerait à devoir faire tout un boulot de suivi de bugs, et je n'ai pas de temps à ça pour l'instant.
  2. Point de vue Copyrights Blood Bowl et tutti quanti, je ne sais pas si je peux légalement, même en étant 100% gratuit. A noter que s'il le fallait, je pourrais sortir une version qui ne permettrait pas de créer son équipe, sauf via la version officielle de Blood Bowl de Cyanide. J'avais y a longtemps implémenté la possibilité d'importer des fichiers sauvegardés de BB (du 1, j'ai jamais acheté le 2 🙂 ). Ca demande juste un peu de boulot de mettre tout ça d'équerre.
  3. Faudrait aussi que je retrouve d'où viennent toutes les images/icônes et vérifier si j'ai pas de prob de copyrights là-dessus...

Voilà, je viens de me faire plaisir en montrant un travail de l'ombre 🙂
J'espère quand même un jour pouvoir publier une version (gratuite bien sûr) pour partager tout ça ! Sans me prendre un procès de Games Workshop 🙂