Création d'un bot pour participer à la Russian AI Cup 2018 CodeBall



C'est devenu une tradition qu'après les compétitions de programmation sportive, le vainqueur ou simplement un joueur publie un article sur Habré pour dire à quel point c'était formidable de participer à la compétition et comme option de gagner. Bien sûr, beaucoup peut être glané de son article pour de futures compétitions.

Mais je pense qu'il y a peu d'articles sur la participation à la compétition actuelle au stade des tests bêta, il est clair que vous ne pouvez pas publier le code de décision, on ne sait toujours pas à quel point cette décision est bonne et beaucoup est encore inconnu, car maintenant, en fait, ce n'est que le début du tournoi, mais c'est le charme. L’auteur donne au lecteur la chance de prendre un train au départ et de profiter d’un voyage du Nouvel An dans le monde des stratégies de jeu.

Tout d'abord, merci d'avoir ouvert l'article, je veux partager un secret tout de suite: ce sera une série d'articles dans laquelle j'espère aborder les algorithmes génétiques et les réseaux de neurones. En attendant, comme déjà écrit ci-dessus, bienvenue dans un voyage au Russian AI Cup CodeBall.

Lien vers la page de démarrage rapide du championnat.

Au lien ci-dessus, le lecteur pourra trouver les règles du championnat, les règles du jeu lui-même et la partie principale de l'appareil mathématique nécessaire pour créer le bot. La page de démarrage rapide contient également des exemples de robots déjà écrits pour divers langages de programmation, ce qui facilite considérablement le démarrage initial.

Commençons par un simple titre de championnat CodeBall.

Une belle combinaison des mots code et ballon, presque du football. Les règles et la logique du jeu sont également similaires au football, mais à chaque tour, elles deviennent plus compliquées / nous allons donc prendre les conditions initiales des jeux comme base.

L'essence du jeu, comme indiqué dans une chanson récente: les joueurs doivent marquer, et le gardien de but pour frapper les balles.

Terrain de jeu schématique:



Veuillez noter que les bots se déplacent dans le plan du sol de l'arène XZ, l'axe Y est responsable de la hauteur de l'objet de jeu.

Également des objets schématiques du jeu (balle et bots (les organisateurs les appellent robots))



Maintenant, du texte pour soutenir les images. Le terrain de jeu est un espace clos en trois dimensions, ni le ballon ni les robots ne peuvent le dépasser. Dans cet espace, il y a deux zones de la «porte» lorsque frappé dans lesquelles le ballon est considéré comme marqué par l'un des joueurs. Pour que le but soit compté, il est nécessaire que le ballon soit complètement derrière les lignes de but (indiqué par une ligne pointillée sur la figure).

Pour simplifier les calculs de collisions (collisions) d'objets de jeu (arène, balle, bots), les bots et la balle sont considérés comme des sphères idéales (balles), qui sont décrites par les valeurs suivantes: rayon de la sphère, coordonnée du centre de la sphère, masse, vitesse. L'arène est également décrite par des primitives mathématiques idéales, de sorte que le calcul de collision est supprimé sans la participation de polygones, ce qui simplifie considérablement la tâche. Si vous faites défiler les règles du championnat jusqu'à la fin, le lecteur trouvera un programme sur le pseudo-code, qui est juste responsable des calculs ci-dessus. Ce pseudo-code, après peu d'efforts physiques, est traduit dans le langage de programmation de votre choix et est tout à fait réalisable. Mais plus à ce sujet plus tard.

Quelques mots sur la physique du monde du jeu. Pour donner de la crédibilité à ce qui se passe dans l'arène, la gravité est introduite, c'est-à-dire que les robots et la balle sont constamment affectés par la force de gravité dirigée vers le bas par rapport au sol de l'arène. Les autres formes d'interaction physique telles que le frottement ou les vitesses angulaires (rotation) des objets ont été ignorées par les organisateurs au profit de la simplicité de la description du monde physique. Lorsqu'elle frappe les murs de l'arène, la balle perd une partie de son énergie, mais cela ne complique pas beaucoup le monde et il est compréhensible de l'extérieur qu'il n'y a aucun moyen de créer une machine à mouvement perpétuel sous la forme d'une balle.

Pour rendre le monde encore plus plausible, un schéma de calculs avec Ticks et Mikrotiks a été appliqué. Dans son premier article, l' auteur s'est attardé sur le concept du temps de jeu en teck. Dans cette compétition, nous pouvons regarder le moteur physique dans les codes sources, comme il l'a dit, cela nous sera utile à l'avenir, et constater que pour les joueurs il y a des Tics, et à l'intérieur du moteur tout se passe dans Mikrotik, par défaut 100 Mikrotik en une seule fois, ce qui permet de mieux décrire les collisions d'objets et éviter des choses désagréables comme la défaillance d'objets en dehors de l'arène ou la défaillance d'objets les uns dans les autres conduisant à des erreurs dans l'interaction entre eux



Nous avons en quelque sorte compris le monde (arène) et le temps de jeu, regardons les objets du jeu: les robots et la balle. Le ballon que nous avons déjà découvert à partir des règles de la compétition est une sphère. Pour être bref, un bot est une balle d'un rayon plus petit et d'une masse plus grande, à laquelle des commandes peuvent être données: indiquez la vitesse souhaitée (c'est un vecteur tridimensionnel contenant à la fois la direction et la longueur ou l'amplitude de la vitesse) et la force du saut si le saut est actuellement conseillé du point de vue la logique du jeu. À ce stade de la compétition, une simplification a été introduite: si le bot est en vol (ne touche pas les murs de l'arène), il n'a pas la possibilité d'exécuter des commandes pour modifier la vitesse.

Nous nous tournons vers le plus difficile ou vice versa simple, tout dépend de l'expérience du lecteur à travailler avec des vecteurs tridimensionnels. Description de l'emplacement des objets du jeu. Image de support



Passons à la botanique.

A chaque tick du jeu, votre stratégie recevra les objets suivants:

Balle:

class Ball: x: Float //     y: Float z: Float velocity_x: Float //    velocity_y: Float velocity_z: Float radius: Float //   

et une liste de bots, avec des données pour chaque bot:

 class Robot: id: Int player_id: Int is_teammate: Bool // true,      x: Float //     y: Float z: Float velocity_x: Float //    velocity_y: Float velocity_z: Float radius: Float //    nitro_amount: Float //     touch: bool // true,      touch_normal_x: Float //        touch_normal_y: Float ( null,   ) touch_normal_z: Float 

vous pouvez voir immédiatement qu'il n'est pas pratique de travailler avec ces données, il est souhaitable d'introduire un vecteur 3D de classe (objet) et un vecteur 2D de classe. Tout dépendra du langage de programmation de votre choix. Habituellement, ces classes sont déjà écrites et se trouvent facilement sur Internet pour le langage de programmation souhaité. L'auteur écrit actuellement un bot en c ++, mais va essayer de se limiter au pseudo-code. Si vous introduisez des classes complètes de vecteurs, les opérations d'addition, de soustraction, de multiplication, de normalisation et d'autres opérations vectorielles resteront à l'intérieur de la classe, ce qui simplifiera considérablement le travail sur la stratégie.

Il existe également une classe de joueurs qui indique quels bots de la liste sont les vôtres, lesquels sont:

 class Player: id: Int me: Bool // true,      strategy_crashed: Bool score: Int //    

Après avoir transmis des données sur le monde du jeu à l'entrée de votre stratégie, le moteur de jeu vous donne le contrôle et démarre un chronomètre pour les calculs, le temps pour les calculs est limité, en moyenne, à environ 20 millisecondes pour toutes les actions à l'intérieur du tick. On soupçonne qu'à ce stade, cela inclut également le temps de désérialiser les données reçues et de sérialiser les données envoyées par votre stratégie au serveur. Mais comme le nombre de bots est de 4 (vos 2 et 2 adversaires, alors dans le tour final le nombre total de bots passera à 6) le temps pour ces opérations peut être négligé.

Le temps est venu pour les équipes.

Par exemple, nous voulons donner au bot l'ordre de se déplacer vers la balle. Pour trouver le vecteur souhaité de la direction de la vitesse, il est nécessaire de soustraire la position du bot de la position de la balle, nous obtenons le vecteur de la direction de la balle, puis il peut être normalisé et multiplié par la vitesse maximale du bot des constantes du monde. Dans l'image plus



Le lecteur a probablement remarqué sur la diapositive que les calculs peuvent être effectués à la fois pour les vecteurs 3D et pour les vecteurs 2D. Si nous prenons en compte le fait que le bot passe plus de temps sur le plan d'étage de l'arène, la simplification des calculs à deux coordonnées n'affectera pas la précision des calculs d'interception de la balle. Bien sûr, vous ne devez pas oublier la hauteur de la balle, mais compte tenu de la gravité, elle tombera tôt ou tard dans le bot.

Un saut de bot est l'addition de la vitesse verticale (vitesse verticale), la direction du saut du bot coïncidera avec la direction de la vitesse actuelle du bot avec l'ajout d'une composante le long de l'axe Y.

Si nous ajoutons une logique de mouvement plus complexe aux mots ci-dessus, nous pouvons obtenir le comportement suivant des bots:


Maintenant, il y a un bac à sable sur le site où vous pouvez regarder les jeux, mais rien ne ressemble à si vous écrivez votre stratégie et suivez ses jeux. Il a été établi expérimentalement que même la stratégie la plus simple composée de plusieurs dizaines de lignes de code peut très bien jouer.

Parmi les formes simples de stratégies qui viennent à l'esprit, la stratégie d'allouer un bot pour protéger la porte, le deuxième bot pour faire un attaquant. La tâche principale de l'attaquant est de poursuivre le ballon et, en cas de succès, de frapper vers le but de l'adversaire. Un bot jouant en tant que gardien de but est généralement limité dans ses mouvements sur le terrain et opère principalement dans la zone de but. Toutes ces choses sont facilement décrites en utilisant des constructions if-else de votre langue choisie. Dans tous les cas, mon lecteur devra trouver et créer une stratégie à ce stade. Selon les termes du concours, vous ne pouvez pas publier le code source de la stratégie. Mais je pense qu'il n'est pas interdit de discuter des approches de conception d'une stratégie.

Il me semble que les organisateurs du concours ont choisi un sujet intéressant pour le tournoi, le seul site est un peu lent, mais j'espère qu'il sera bientôt corrigé.

quelques beaux moments de jeu du participant du championnat:


J'attends des commentaires dans les commentaires concernant l'article, sur quoi m'attarder plus en détail.
Dans le prochain article, je vais essayer de décrire les méthodes de prédiction du comportement de la balle dans le temps pour un jeu de bots plus significatif dans votre stratégie.

En attendant, félicitations pour la prochaine nouvelle année 2019!

À suivre.

Source: https://habr.com/ru/post/fr434838/


All Articles