Kit de démarrage

Des IAs de base sont disponibles dans le kit de démarrage. Elles peuvent vous aider à appréhender votre propre IA.

# But du jeu

Dans ce jeu, le but est de détruire l'équipe ennemie tout en gardant au moins l'un de ses bots en vie. Si le temps est écoulé, l'équipe qui a détruit le plus de bots gagne.

# Règles

Vos bots combattent dans une arène carrée dont ils ne peuvent s'échapper. Malheureusement, ils ne sont pas très malins et ne peuvent pas vous fournir des informations aussi précises que les coordonnées cartésiennes des bots ennemies ou leur nombre de points de vie exact. Vous allez donc devoir exploiter le peu d'informations qu'ils pourront vous donner...

Dans cette ligue, vos bots ont réalisé qu'ils pouvaient calculer et vous donner 5 informations supplémentaires. Plus de détails dans la section entrées du jeu.

Beaucoup d'informations sont des distances entre 2 bots. Vos bots utilisent 4 portées différentes pour décrire ces distances :

- 0 : Courte portée (dist ≤ 3 m)

- 1 : Moyenne portée (3 m < dist ≤ 8 m)

- 2 : Longue portée (8 m < dist ≤ 15 m)

- 3 : Hors de portée (dist > 15 m)

Vos bots ont 2 barres de vie :

- Une bleue pour leur bouclier. Si un bot ne prend pas de dégâts pendant 12 tours de jeu, son bouclier commence à se régénérer. Un bouclier complètement vide met 12 tours sans dégâts pour se recharger.

- Une violette pour leurs points de vie. Les points de vie ne se régénèrent pas, mais ne baissent que si le bouclier est vide.

Vos bots ne sont pas assez intelligents pour vous donner des valeurs exactes pour les boucliers et le nombre de points de vie des bots sur la carte. Ils utilisent donc des approximations :

- Pour les points de vie, ils donnent 0 | 25 | 50 | 75 | 100 , 25 correspondant à une santé ≥ 25% mais < 50% du nombre maximal de points de vie
- Pour les boucliers, ils donnent : 0 | 1 | 25 | 50 | 75 | 100 , 1 quand le bouclier est > 0% et < 25% du bouclier maximal et 0 que le bouclier est vide

Vos bots peuvent faire 3 actions différentes :

- ATTACK pour attaquer un bot ennemi. Les dégâts infligés dépendent de la portée à laquelle vous tirez (courte, moyenne ou longue). Les dégâts étant maximaux à courte portée. Notez qu'attaquer un ennemi hors de portée n'inflige aucun dégât. Pour plus de détails, consulter les détails techniques.
- MOVE pour se déplacer vers un groupe de bots. Votre bot se déplacera vers la position moyenne du groupe. Si un groupe n'est composé que d'une seule cible, le bot se déplacera donc dans la direction dudit bot.
- FLEE pour fuire un groupe de bots. Le bot s'éloigne de la position moyenne du groupe.
- IDLE Le bot attend tout en réfléchissant au sens de sa vie.
  "Un bot doit obéir aux ordres donnés par les êtres humains, sauf si de tels ordres entrent en contradiction avec la première loi."
  C'est l'action par défaut qu'exécutera le bot si vous ne lui donnez pas d'ordres.

Les bots sont placés aléatoirement dans l'arène. Les emplacements des deux équipes sont symétriques. La symétrie peut être :

- centrale (par rapport au centre de l'arène)
- horizontale (par rapport à la ligne horizontale passant par le centre de l'arène).

Il y a 2 règles que ces emplacements de départ respecteront toujours :

- La distance entre 2 bots doit être d'au moins 2 mètres
- La distance entre 2 bots d'équipes différentes doit être d'au moins 8.1 mètres

Conditions de Victoire

- Vous avez détruit tous les robots de votre adversaire
- Vous avez plus de robots en vie que votre adversaire après 300 tours.

Conditions de Défaite

- Tous vos bots sont détruits
- Vous envoyez des ordres invalides à vos bots, faisant ainsi exploser leur cerveau positronique.
  Heureusement, ils sont assez intelligents pour vous dire pourquoi ils ont explosé, pensez à passer votre souris sur la petite pastille dans le replay.

# 🐞 Conseils de débogage

Dans ce jeu, il y a beaucoup de fonctionnalités pour vous aider à comprendre ce qui se passe dans l'arène :
Vous pouvez activer le zoom dynamique de la caméra avec l'interrupteur CAMERA MODE.
Les différentes portées sont affichées lorsque vous passez la souris sur un bot.
Vous pouvez aussi voir la cible du bot, son action actuelle. Le tooltip donne plus d'informations sur le bot.
Vous pouvez CLIC GAUCHE sur un bot pour faire apparaître la cible de manière permanente et ALT + CLIC GAUCHE n'importe où sur le lecteur pour supprimer toutes les cibles.
Vous pouvez activer l'overlay de débogage avec l'interrupteur DEBUG OVERLAY pour voir l'id du bot et son action actuelle.
Un marqueur de dégât est affiché lorsqu'un bot est touché par une balle.

# Détails techniques

À chaque tour de jeu, vos bots exécutent leur action pendant 250 ms.
En ce qui concerne l'attaque :

- Pour tirer des balles sur un ennemi, un bot doit attaquer la même cible pendant temps de visée tours. Ensuite, il tirera balles par tir balles chaque tour pendant temps de tir tours.
- À l'instant où une balle est tirée, le moteur de jeu détermine si elle va toucher sa cible ou non en fonction de sa portée actuelle avec une probabilité de précision [portée de la cible]. N'oubliez pas qu'attaquer une cible hors de portée ne peut pas toucher.
- Le jeu est "déterministe", même s'il y a de l'aléatoire dans les tirs, les deux équipes ont la même "seed" de random pour savoir si les tirs vont toucher. À chaque fois qu'un bot tire, il prend la prochaine valeur de la seed de son équipe pour savoir s'il touche.
  Un match entre 2 équipes identiques sera donc toujours un match nul - sauf si l'IA utilise le fait que les ids des bots commencent à 0 pour une équipe et 7 pour l'autre dans ses décisions.

La vitesse des balles est de 20 m/s. Voici les caractéristiques des différentes classes de bots.

Classe de bot | Dommages par balle | Balles par tir | Temps de visée (tour) | Temps de tir (tour) | Précision à courte / moyenne / longue portée | Vitesse (m/s) | Points de vie max | Bouclier max
--- | --- | --- | --- | --- | --- | --- | --- | ---
Assaut | 300 | 3 | 4 | 2 | 95% / 55% / 15% | 1.2 | 5000 | 3000

Vous pouvez consulter le code source du jeu sur mon dépôt GitHub.

# D'où est-ce que vient cette idée ?

Ce challenge est très fortement inspiré du jeu "GLADIABOTS".
On se rapproche en réalité plus de la copie que de l'inspiration, c'est pour cela que j'ai demandé la permission de son développeur indépendant GFX47. Si le jeu vous intrigue ou que vous cherchez de nouvelles stratégies à expérimenter, n'hésitez pas à y jeter un coup d'œil !
Je voudrais remercier eulerscheZahl pour ses précieux conseils lorsque j'ai commencé ce projet, GFX47 qui a accepté que je copie beaucoup de ses idées et DamnSake et Deniw qui m'ont aidé pour les graphismes.

# Entrées du jeu

Entrées d'initialisation
Ligne 1 : un nombre entier botPerPlayer, le nombre de bots contrôlés par joueur au début de la partie
Ligne 2 : un nombre entier mapSize, la taille de la carte en mètre. C'est ici au cas où la taille de la carte vienne à changer durant le challenge.
Entrée dans un tour de jeu
Première ligne : un nombre entier allyBotAlive, le nombre de vos bots qui sont encore en vie.
Ligne suivante : un nombre entier botCount, le nombre de bots dans l'arène
Pour chaque bot, vos bots vous envoient 13 informations : botId, botType, health, shield, action, targets , enemyRange, borderDist , distEnRank, borderDistRank, shieldRank, healthRank, totalRank . Les portées sont données par un entier comme suit : 0 pour COURTE PORTÉE , 1 pour MOYENNE PORTÉE , 2 pour LONGUE PORTÉE et 3 pour HORS DE PORTÉE.
botId est l'id unique du bot, il sera le même pendant toute la partie.
botType indique le type du bot. Cela peut être :

- "ALLY" pour l'un de vos bots
- "ENEMY" pour un bot ennemi

health, shield pour la santé et le bouclier approximatif du bot si c'est un bot, 0 sinon.
action indique l'action réalisée par le bot au tour précédent. Les différentes valeurs possibles sont : "ATTACK" , "MOVE" , "FLEE" , "IDLE".
targets est la liste des ids des bots visés par la dernière action du bot au dernier tour. Les ids sont séparés par des "," : "id1,id2,id3..." (la cible de IDLE étant le bot lui-même).
enemyRange : la portée à laquelle est le plus proche ennemi. Si le bot est dans l'équipe ennemie, c'est la portée du plus proche allié qui est donnée.
borderDist : la portée à laquelle est le plus proche côté de l'arène (entre gauche, droit, haut, bas).
Les données suivantes sont des rangs : les bots sont triés selon les différents attributs par ordre croissant :

- distEnRank : L'attribut considéré est leur distance au bot ennemi le plus proche. Si le bot est dans l'équipe ennemie, la distance considérée est celle à son plus proche allié.
- borderDistRank : l'attribut est la distance au plus proche côté.
- shieldRank : l'attribut est la valeur exacte du bouclier.
- healthRank : l'attribut est le nombre exact des points de vie.
- totalRank : l'attribut est la somme du nombre exact de points de vie et de bouclier

Ensuite, vos bots deviennent chacun leur tour actifs. Un bot actif donne pour chaque bot dans l'arène 7 données calculées selon sa perspective : botId, botType, range, distMeRank , shieldComp, healthComp, totComp . Lors de la première itération, le bot envoie les données le concernant. Donc botType est "ON_AIR" vous pouvez ainsi récupérer l'id du bot actif. Ensuite, le bot vous envoie les informations sur chaque bot.
botId est l'id unique du bot.
botType indique le type du bot. Cela peut être :

- "ALLY" pour un bot allié
- "ENEMY" pour un bot ennemi
- "ON_AIR" pour le bot actif

range la portée à laquelle se trouve le bot par rapport au bot actif
distMeRank le rang du bot dans un classement du plus proche au plus loin du bot actif basé sur la distance exacte les séparant.
shieldComp, healthComp, totComp comparent un attribut entre le bot actif et un autre bot.
shieldComp compare la valeur exacte des bouclier des 2 bots, healthComp compare la santé exacte des 2 bots, totComp compare la somme de la santé et du bouclier des 2 bots.
Ces variables peuvent prendre les valeurs :

- -1 si l'autre bot possède plus d'attributs que le bot actif
- 0 si l'autre bot possède autant d'attributs que le bot actif
- 1 si l'autre bot possède moins d'attributs que le bot actif

Sortie pour un tour de jeu
1 ligne contenant tous les ordres donnés à vos bots séparés par ";" : "ordre1;ordre2;ordre3;...".
Un ordre doit respecter le format suivant idDeVotreBot [ACTION] [CIBLES]

- ACTION doit être une action valide parmi : ATTACK , MOVE , FLEE ou IDLE.
- CIBLES doit respecter le format suivant : cibleID1,cibleID2,cibleID3
  Vous devez aussi respecter certaines règles en fonction de l'action que vous souhaitez réaliser.
  - Si l'action est ATTACK, CIBLES doit contenir 1 id de bot ennemi, ni plus, ni moins. Un bot ne peut ni s'attaquer lui même1 ni attaquer ses alliés.
    1. "Un bot doit protéger son existence dans la mesure où cette protection n'entre pas en contradiction avec la première ou la deuxième loi."
  - Si l'action est MOVE ou FLEE, CIBLES doit contenir au moins un id de bot.
  - Si l'action est IDLE, CIBLES peut contenir tout et n'importe quoi (ou rien du tout), dans tous les cas, cela sera ignoré. Cela vous permet de faire réfléchir vos bots au sens de la vie
- Si vous envoyez 2 ordres différents s'adressant au même bot, vous perdrez la partie, car votre bot subira le même sort que R. Jander Panell , entraînant dans sa chute toute votre équipe.
- Si vous n'envoyez pas de sortie, tous vos bots feront l'action IDLE. Si vous n'envoyez pas d'ordre à un ou plusieurs bots, ils effectueront IDLE.

Contraintes
L'arène est un carré de côté de 40 mètres
Temps de réponse max par tour : 50 ms.
Temps de réponse max pour le premier tour : 1000 ms.