Comment nous avons fusionné la programmation finale d'IT-Planet

Nous ne sommes pas mauvais, mais il y a beaucoup de bugs. Développement de l'intelligence artificielle pour le jeu «Hockey» en ~ 7 heures.

Initialement, l'article était prévu sur les stratégies des participants, sur ce qu'ils ont réussi à faire pendant la compétition et s'ils étaient satisfaits du travail accompli, mais, après avoir interviewé huit finalistes, il est devenu clair que rien ne s'en passerait et un besoin urgent de changer de direction.

Le fait est que nous avons reçu un maximum de 6 mots pour les questions qui nous intéressent, puis nous avons immédiatement entendu le mécontentement des bugs rencontrés par les participants. Une seule personne a écrit:
Je ne veux rien écrire de négatif, je pense que c'est incorrect, et les organisateurs eux-mêmes devraient être tristes. Par conséquent, je dirai que l'idée de la mission est assez intéressante, même si personnellement je n'aime pas vraiment ce format de compétitions (Anna Prozorova).

D'après le titre de l'article, il est clair que nous n'avons rien gagné. Et oui, c'est «nous». Pendant les jours du concours, je me suis fait beaucoup de bons amis, dont Anna ( odrus ), qui est la co-auteure de cet article. Au dernier moment également, nous avons parlé avec Leo ( zadamantiy ) et avec sa permission, nous avons décrit la participation à la finale.

Personnellement, je suis membre du mouvement «Un monde sans plaintes», mais je vais accrocher mon bracelet d'autre part et je vais me plaindre, quoique sous une forme comique, parce que, d'autre part, ce sont les conditions de la compétition et vous devez être un bon spécialiste pour gagner et faire face aux défauts! Nous n'avons rien à redire, au contraire - merci beaucoup!

Sous la coupe, en plus de décrire les règles du jeu, les règles de la compétition et les bugs trouvés, nous partagerons avec vous nos montants, ce que nous avons personnellement rencontré et comment nous avons résolu tel ou tel problème, comment nous nous sommes préparés pour la compétition. Peut-être quelque part où vous vous reconnaissez si vous avez participé à de telles compétitions.

Le but de l'article est de collecter les fichiers du concours tant du côté des participants que des organisateurs, de les hacher sur le nez et de ne plus jamais marcher sur le même râteau. Nous espérons que l'article augmentera le niveau du prochain concours.



Présentation


Quelques mots sur nous


Ilya


Le participant annuel de la Coupe AI russe et de la Mini Coupe AI depuis 2017. Je suis également Codingame et Halite. Je n'ai pas de réalisations spéciales, mais j'ai beaucoup appris des autres. Pour moi, l'essentiel n'est pas la participation, pas la victoire, mais de donner mon 100% et enfin de dire: "J'ai fait tout ce que je pouvais, réalisé tout ce que je voulais, appliqué tout ce que je savais." Je ne connais pas le langage de programmation Java. Pour moi, c'est déjà une pratique courante de la compétition à la compétition pour étudier pleinement la nouvelle pile technologique.

Anna


Un étudiant simple avec peu d'expérience dans la résolution de problèmes algorithmiques, mais sans beaucoup d'expérience dans la participation à des olympiades et à des concours similaires. Plus précisément, dans l'IT-Planet, j'ai décidé de participer afin de tester mes connaissances et mes capacités, acquérir de l'expérience, communiquer avec des personnes intéressantes. Elle a étudié le langage de programmation Java à l'université, mais n'a pas eu d'expérience pratique avec lui depuis longtemps.

Lion


Il a participé à toutes sortes de sélections ICPC, des hackathons comme «Build University 20.35» et «Digital Breakthrough». Eh bien, les petites choses dans certaines olympiades universitaires.
En conséquence, notre université envoyait généralement de nombreux participants au concours de sql, mais cette année ce n'était pas le cas. On m'a proposé de participer à Java, j'ai dû faire face à un nouveau langage pour moi dans un temps assez court en parallèle de la session. Dans It-planet avant cela n'a pas participé.

Description du concours


Position générale


IT-Planet est un concours pour les étudiants et les jeunes professionnels de la sphère informatique, dont le but est d'identifier et de soutenir les gars compétents. Tenu chaque année depuis 2007. La participation est une chance de faire ses preuves.

La nomination «Programmation Java» aide à trouver une application pratique des connaissances acquises dans le processus d'apprentissage.

La première étape de qualification était par défaut et était un test en ligne pour les étudiants des établissements d'enseignement enregistrés. Les questions étaient assez compliquées et intéressantes, mais pour être honnête, la majorité contenait du code qui pouvait être relu et exécuté.

La deuxième étape qualificative, comme la première, s'est déroulée par contumace. Il vise à résoudre les problèmes de programmation sportive. Deux jours ont été consacrés à la résolution de 10 problèmes, ce qui a permis de bien se préparer à la résolution d'un problème spécifique, pour étudier l'algorithme / l'approche. Cependant, personne n'a fait face à toutes les tâches. L'état de certaines tâches a changé pendant le concours. Il y avait des écoles dans les tests.

Finales internationales à plein temps. Il fallait écrire une IA pour le jeu «Hockey sur glace». ~ 7 heures ont été accordées. Rapprochement en raison du manque de «feu vert» du départ et de l'incompréhensibilité avec le déjeuner. Le temps était en caoutchouc et le public n'a pas fermé, mais plus sur cela ci-dessous.

Tâche


La tâche a été développée par les spécialistes de SimbirSoft LLC. Vous trouverez ci-dessous le contenu du fichier .pdf (avec des révisions minimales pour l'article) que chaque participant a reçu.

Tâche
Description de la tâche

Quelque part dans un pays mystérieux, dont tous les habitants sont de petits robots, il y avait 2 équipes pour jouer au hockey. Les deux équipes ont leur propre entraîneur de robot personnel, qui surveille constamment le jeu et indique à tous les joueurs où ils doivent aller. Tout irait bien, mais les joueurs robotiques ne comprennent que des actions simples comme aller, frapper la rondelle, aller au point fixé par l'entraîneur.

Vous devez devenir entraîneur de l'équipe rouge de joueurs. Une équipe bleue jouera contre vous, qui est contrôlée par un algorithme qui bat déjà avec succès d'autres équipes. Sur le terrain en même temps 2 équipes jouent. L'équipe est composée de 4 joueurs: attaquant, 2 défenseurs et gardien de but.

Votre tâche consiste à écrire un algorithme de gestion des robots rouges. Pour contrôler les personnages, vous aurez 3 méthodes, décrites ci-dessous. Il existe également une méthode qui reçoit des informations sur tous les joueurs sur le terrain et les coordonnées de la rondelle.

Limitations du jeu

Le gardien de but ne peut atteindre le milieu du terrain qu'à partir du but. Les défenseurs et les attaquants peuvent rouler partout sur le terrain, à l'exception de la zone du gardien de but (demi-cercle rouge près du but).

Description de la structure d'application

L'application est présentée comme un client et un serveur. Le serveur sera compressé dans un fichier jar et lancé en arrière-plan. Le serveur contient toute la logique de base du mouvement des personnages et de la rondelle, stockant des informations sur tous les personnages, la rondelle, le temps et le score.

Lorsque l'application démarre, le client établit une connexion avec le serveur et, avec une fréquence donnée, reçoit des données du serveur. Il est également responsable du rendu de tous les personnages, du but et de la rondelle sur le terrain de hockey.

Tout le code du programme doit être écrit dans la classe Algoritm dans le dossier algoritm de l'application cliente (toutes les modifications des autres fichiers ne seront pas prises en compte).

Les méthodes suivantes sont présentes dans cette classe:

  • move (playerType, x, y) - Une méthode pour déplacer un joueur vers un point spécifié sur la carte.
  • kick (playerType) - Méthode pour frapper la rondelle par un joueur spécifique.
  • turn (playerType, angle) - Une méthode pour tourner un joueur spécifique.
  • getInfo () - Obtenez des informations sur tous les joueurs et rondelles sur la carte.

Il existe également un niveau de variable statique, responsable du niveau de complexité de l'algorithme. Les niveaux suivants seront disponibles pour les participants à l'Olympiade:

  1. l'équipe bleue est debout;
  2. l'équipe bleue marche au hasard sur le terrain;
  3. l'équipe bleue joue selon «l'algorithme faible»;
  4. l'équipe bleue joue selon un algorithme avancé (pour les tests internes).

Toutes les méthodes qui acceptent playerType ne fonctionnent que pour les joueurs de l'équipe rouge.
La variable playerType est une instance de la classe PlayerType et contient
des valeurs telles que gardien de but, défenseur1, défenseur2, attaquant.

Dans la classe Playground, les valeurs constantes du jeu sont écrites (par exemple, milieu de terrain, zone de gardien de but, etc.).

La méthode getInfo () renvoie un objet de la classe GameInfo.

Raffinements

  • Si vous envoyez la méthode de déplacement plusieurs fois, le point de terminaison où le personnage doit atteindre changera (par conséquent, si vous devez atteindre le point de terminaison, vous devez attendre que le personnage l'atteigne avant de l'envoyer à un autre point).
  • La méthode du coup de pied ne peut être utilisée que pour un joueur qui possède la rondelle.
  • La méthode de virage prend un angle, tandis que pour le côté inférieur du champ, l'angle prend des valeurs de 0 (regarde vers le but de l'ennemi) à 180 (regarde vers sa propre porte), et pour le demi-cercle supérieur, l'angle prend des valeurs de 0 à -180.




Critères d'évaluation


Extrait également d'un fichier .pdf. Seul le code de la classe Algoritm sera utilisé. L'algorithme de chaque participant sera exécuté tour à tour contre tous les niveaux de difficulté. Selon les résultats de la course, des points seront fixés pour les résultats du match et des points pour les opportunités implémentées dans l'algorithme seront également attribués.

Liste des critères
  1. Les attaques au but doivent être effectuées sous différents angles. Par exemple: juste devant un joueur, un gardien de but ennemi - une attaque au but doit être effectuée sous un angle.
  2. Le joueur passe le ballon à un joueur de hockey libre pour effectuer une attaque sur le but.
  3. La passe ne doit être donnée que dans les cas où le joueur ne peut pas effectuer l'attaque lui-même (tous les angles d'attaque du but sont fermés).
  4. La passe ne doit être donnée qu'à un joueur libre de passer. Les joueurs de hockey avec un but ouvert à l'attaque sont prioritaires.
  5. Si une attaque est impossible, l'équipe doit battre en retraite et se regrouper.
  6. Ajouter. Points s'ils partent par virement.
  7. Ajouter. Points si vous utilisez le gardien de but pour le regroupement.
  8. En défense, la possibilité de passer à un autre joueur de l'adversaire doit être bloquée.
  9. L'équipe du joueur adhère aux stratégies. Par exemple: 1 défenseur garde toujours toujours un peu plus loin, en cas de contre-attaque ennemie.
  10. L'algorithme prend en compte le tableau de bord. Par exemple: joue plus agressivement en cas de perte et vice versa est plus prudent dans une situation gagnante; avec un match nul augmente l'agressivité vers la fin du match.

Des points de pénalité seront accordés pour:

  1. Le joueur marque des buts dans son propre but.
  2. Les joueurs de hockey se bloquent. (ne vous laissez pas passer).
  3. Blocage intentionnel du jeu. Par exemple: pousser la rondelle contre la rondelle jusqu'à la fin de la partie.


Corps principal


Préparation au concours


Ilya


Au départ, ils ont écrit que lors de la finale, il y aura le «développement industriel». Je m'attendais à un travail normal avec la base, le développement de l'interface graphique. Une application pour comptabiliser quelque chose, par exemple. Avec un chagrin de moitié, j'ai accepté la finale, car je n'étais pas très content de ce que je devais faire. Cependant, le 17 septembre, une lettre arrive avec les règles pour les finales, et ce qui suit y est rapporté: «Il y a un jeu informatique 2D« Hockey »dans lequel les robots informatiques jouent selon un algorithme. Il faut implémenter un algorithme dans le langage de programmation Java selon lequel les personnages des participants agiront »(il a été écrit sur le site que la tâche pouvait être modifiée). Je me suis immédiatement souvenu de la Coupe de Russie AI 2014 dans ma tête. J'étais ravi et j'ai réalisé que ce n'était pas en vain que j'avais accepté de participer.

La première chose que je suis allée encore une fois a été de lire l’ article du gagnant . En général, je me souvenais de ce qui était là, mais tous les moments n'étaient pas clairs. Ensuite, je suis allé sur le site Web du concours et j'ai lu les règles. Je me suis arrêté à cela, car toute modification des règles peut changer complètement le jeu. Je ne savais pas combien de physiciens seront dans leur jeu, je ne savais pas comment la sélection du coup de poing et de la rondelle, etc. Le jeu pourrait être grandement simplifié, que même les coins ne seraient pas nécessaires. J'ai donc commencé à attendre ...

Attendu et attendu! L'après-midi du 27 septembre arrive une lettre sur le webinaire! 28 septembre à 19h00. C'était une journée et une heure parfaites pour moi. Cependant ... Cependant, 4 heures avant le lancement prévu, une autre lettre est arrivée avec un transfert à 17h00! La lettre de transfert est arrivée une heure avant le départ ... J'ai volé du mieux que j'ai pu et j'étais en retard d'environ 15 minutes (je ne m'attendais pas à ce que Flash Player doive encore être installé).

Lors du webinaire, il a posé des questions et obtenu une image générale du jeu. Il y avait suffisamment de données, même pour écrire les miennes et bien me préparer. Cependant, jusqu'à la dernière fois, il n'était pas clair comment le coup se produisait, les développeurs n'ont pas divulgué certains points, et à certains endroits, ils n'avaient pas encore décidé eux-mêmes de la fin.

Ayant écrit tous les plus précieux, je suis allé parler avec les membres actifs familiers de l'IRAC. Bonjour et merci m0rtido , DragoonXen , oreshn1k . Après avoir décrit la situation, il est devenu clair qu'il est nécessaire de coder en dur ifa et ne peut pas parler de simulations du monde pendant une telle période. oreshn1k a partagé le livre de bombardement "Programming Game AI by Example", dont le quatrième chapitre a parlé de la conception de l'IA pour le football. J'ai tellement aimé le livre que j'ai décidé de peindre pour moi toute la stratégie que j'allais écrire lors du concours, et j'ai complètement oublié le délai. Ce que j'allais écrire ne convenait pas à ce concours ...

Ma préparation inutile est disponible sur quire (proprement, il y a déjà 168 tâches. Dans certains endroits avec une description). Inutile pour ce concours, mais en général c'est une excellente systématisation des connaissances acquises du livre. J'ai également pensé à simuler la rondelle pour trouver son emplacement après un certain temps, trouver le bon angle pour le tir au but, la logique de transfert de la rondelle entre les joueurs et un tas de choses intéressantes.

J'ai déjà écrit ci-dessus que sans savoir comment écrire en Java, donc, en plus de la stratégie, j'ai commencé à étudier la syntaxe du langage. Cela a été aidé par un excellent site, que j'utilise depuis plus que la première fois - Learn X en Y minutes . Après être entré dans IntelliJ IDEA, j'ai réalisé que l'écriture dessus est exactement la même chose que l'écriture sur C #.

Avec une telle préparation, je suis allé à Moscou.

Anna


Quand j'ai appris le thème de la finale, la première chose que j'ai décidé de répéter était le géoma. Et pour que tout cela soit amusant, je ferais tout avec Processing : j'ai regardé des exemples de développeurs liés au mouvement, au calcul des angles, de la vitesse et de l'accélération, puis j'ai pratiqué mes petits croquis.

J'ai décidé de ne pas perdre de temps à rafraîchir certaines subtilités de Java, car, comme il me semblait, la tâche impliquait des compétences en rédaction de stratégies et des connaissances en mathématiques. J'ai donc décidé de lire l' article du vainqueur de l'IRAC 2014 . L'article était intéressant, mais pas particulièrement utile spécifiquement pour ce concours, car la physique pourrait différer radicalement et beaucoup moins de temps serait accordé.

Le webinaire des développeurs était intéressant et utile, a donné une image globale du jeu. Mais, malheureusement, je n'ai pas pu la regarder complètement, car l'émission a été réalisée en utilisant Flash et mon ordinateur portable a décidé à ce moment précis de jouer avec l'écran bleu de la mort.

Par conséquent, juste avant la finale, je n'avais pas de stratégie élaborée à l'avance: il était difficile de planifier quelque chose lorsque les détails de la physique du jeu n'étaient pas divulgués. Il y a eu des réflexions sur ce qu'il vaut la peine de prêter attention tout d'abord, sur les méthodes auxiliaires à écrire immédiatement, mais pas plus. J'ai décidé que l'essentiel avant la finale était de se détendre, de dormir suffisamment et d'y venir de bonne humeur.

Lion


[Préparé] Environ 16 à 20 heures. En conséquence, j'ai considéré la géométrie, avec laquelle, malheureusement, je ne suis pas très en désaccord. Préparé des formules et des calculs à l'avance, testé tout. J'ai apprécié la zone à partir de laquelle vous pouvez marquer selon les conditions données par les organisateurs lors du webinaire, puis j'ai écrit un émulateur de certaines actions et obtenu à quoi ressemblerait la zone lors de la simulation directe des tirs à partir de différents points et de la stratégie optimale du gardien de but. En conséquence, presque rien ne m'a été utile et j'ai dû écrire des béquilles sur des béquilles.



Distribution du temps


Ilya


J'ai toujours eu des problèmes avec la répartition du temps lors des compétitions et des olympiades. Je suis monté sur un râteau pour la troisième fois. Après le premier, il a dit qu'il ne permettrait jamais cela. Encore une fois, il s'est assis sur une tâche, pendant longtemps n'a pas basculé sur une autre.

Nous avons passé beaucoup de temps, toute la première partie de la compétition avant le déjeuner, sur la mise en œuvre de toutes sortes de wrappers pour les joueurs d'équipe, les classes d'état, les messages entre eux, les rôles internes. En général, j'ai poursuivi les tâches que j'avais formées avant le concours en oubliant complètement les conseils de participants expérimentés sur les ifs en code dur et les méthodes auxiliaires. Il a simplement écrit sans penser au temps.

Je suis revenu à moi au dîner. J'ai compris que la moitié de la compétition était terminée, et j'ai encore 10 heures de travail pour qu'au moins quelque chose commence à bouger. Il a été décidé de tout quitter et de recommencer depuis le tout début. Ce furent les dernières heures fascinantes du concours, lorsque j'ai cessé de me sentir triste et de rire avec le comportement de mes robots. Très rapidement a commencé à passer d'une tâche à l'autre. Il n'y va pas - il est passé à un autre, puis il est revenu. Il n'y avait qu'un seul désir - marquer au moins d'une manière ou d'une autre. Par conséquent, on a complètement oublié la propreté du code et de la POO, des commentaires intéressants ont été laissés par endroits.

Anna


Au début, j'ai décidé de comprendre comment fonctionnent généralement les méthodes de base du jeu: le mouvement des joueurs de hockey, la capture de la rondelle, les virages et les passes. J'ai passé environ une heure là-dessus. J'ai également étudié les données et les méthodes dont disposaient les joueurs de hockey et la rondelle. J'ai alors décidé que ce serait bien d'apprendre à trouver l'angle entre deux objets (en particulier, entre un joueur de hockey et une rondelle). J'ai eu de grandes difficultés avec cela: au début, j'ai compris la méthode Math.atan2 pendant longtemps, puis j'ai essayé de convertir les données reçues en un système d'angles de développeurs. Avec tout cela, j'étais tourmenté avant le dîner et j'étais très contrarié d'avoir passé beaucoup de temps sur une petite tâche, même si pendant ce temps je pouvais écrire une stratégie pour au moins le premier niveau.

Après le déjeuner, j'ai décidé d'allouer du temps de manière plus rationnelle. A rapidement terminé la méthode de détermination de l'angle, puis a écrit une stratégie pour le premier niveau. Elle est ensuite passée en douceur à la stratégie pour le deuxième niveau, qu'elle a finalement appliquée au troisième. En fait, cela et en restant dans la façon dont mes joueurs de hockey se comportent étrangement, je l'ai fait jusqu'à la fin de la finale. Le code s'est avéré terrible, illisible, avec un tas d'if et de copier-coller, mais il a plus ou moins fait face à sa tâche: mes joueurs de hockey ont marqué des buts.

Lion


Pour le temps donné (7 heures, ce qui est incroyablement petit pour une telle compétition), il a créé un algorithme simple qui était capable de gagner constamment 1-2 niveaux avec un score d'écrasement. Et puis, en fonction d'événements aléatoires de 3e niveau, l'algorithme a émis un score de 0-2 à 6-0. Malheureusement, il n'a pas été possible de regarder le quatrième niveau. En même temps, je suis sûr que pendant ce temps, vous pouvez écrire une bien meilleure option, mais pour cela, vous devez comprendre comment fonctionne une sorte de retournement, mais ici les organisateurs ont haussé les épaules, disant que nous ne comprenons pas pourquoi il en est ainsi.

La plupart du temps, il a fallu comprendre comment et ce qui fonctionne dans le projet était particulièrement exaspéré de ne pas travailler .equals () et deux champs .TypeOfPlayer et .PlayerType, qui ont retourné des choses complètement différentes. Eh bien, il y a des comportements étranges de joueurs que les organisateurs ne pouvaient vraiment pas expliquer (et nous ne savons pas pourquoi votre personnage roule ici avec le dos pour la seule équipe donnée, et les tours déjà mentionnés :)). Puis, à un moment donné, il s'avère qu'il y a des constantes dans le projet pour les tailles des différents objets de jeu et leurs positions, qui, semble-t-il, auraient dû être dans le matériel de référence au départ, mais non, au final, cela a tué le temps de les compter à la main.

Nos jambages


Ilya


  • Mon principal béguin pour la terrible répartition du temps et l'écriture futile d'abstractions superflues. Lorsque vous avez 7 heures, écrivez un mauvais code non pris en charge si vous voulez gagner.
  • Rofl avec geoma. Je ne sais toujours pas quel angle doit être ajouté et comment le serveur le traite, donc% 360 est pour tout le monde. Peut-être 90 +, peut-être 180, peut-être tous les 270. Je n'y ai pas pensé du tout et je l'ai mis sur n'importe quelle chance ...

    double res = 180 / Math.PI * Math.acos((pp.x - tp.x) / pp.dist(tp)); return (90 + (int) res) % 360; 
  • Environ 40 minutes avant la fin de la compétition, j'ai décidé de comprendre le jeu, qui a eu lieu à la recherche du joueur le plus proche de la rondelle. La chose s'est avérée être que ma méthode squareDist de la classe Paint avait le signe -, au lieu de + entre les carrés de la différence de coordonnées (en passant, dans la tâche sur quire aussi -). Et avec un tel bug, j'ai considéré absolument toutes les distances pendant plusieurs heures ...
  • Au tout début de la compétition, j'ai gardé en tête la réalisation de la position de la rondelle à l'avenir. Cela nécessite sa vitesse. En fin de compte, rien d'utile ne peut être obtenu de l'état du monde (je pense que c'est un montant d'organisateurs, en s'appuyant sur ce que proposent d'autres concours du même format). Par conséquent, la même vitesse de la rondelle devait être obtenue, en fonction de sa position à différents moments du jeu. J'ai passé beaucoup de temps à déboguer et je n'ai pas compris pourquoi les données sont si rares (promis toutes les 5 ms). En général, je n'ai pas pu terminer l'erreur de calcul à ce moment-là, mais ~ une heure avant la fin du concours, j'ai remarqué un morceau de code intéressant dans ma stratégie laissé par les organisateurs:

     try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } 

    En définissant la valeur à 10, j'ai reçu une mise à jour très fréquente des données, décommenté la section de code responsable de l'obtention de la vitesse, et cela a fonctionné! Environ 20 minutes plus tard, j'ai entendu une question du participant aux organisateurs à propos de ce morceau de code, et il lui a expliqué que cela avait été fait spécialement pour nous, afin qu'il soit plus facile à développer. À ce moment, j'ai souri, réalisant que je n'étais pas le seul à l'avoir réalisé si tard.

Anna


  • Comme Ilya, au tout début, je n'ai pas pu allouer correctement mon temps: j'ai passé beaucoup de temps sur une petite tâche, certes utile, mais j'ai dû apprendre aux joueurs de hockey à marquer des buts.
  • Elle a tué beaucoup de temps car elle a oublié la signature de la méthode Math.atan2: vient d'abord y, puis x. J'ai fait le contraire.
  • En écrivant une méthode qui détermine s'il y a des joueurs de hockey ennemis sur une certaine portion du chemin, j'ai fait quelques erreurs, à cause desquelles les joueurs de hockey refusaient parfois de se déplacer n'importe où.
  • Dans l'ensemble, la compétition n'a pas été prise assez au sérieux. On pourrait mieux se préparer et être plus diligent et attentif à la toute fin.

Lion


  • Les deux premières heures dans les journaux ont été répétées au hasard les deux fois sur le commandement des alliés, au lieu de la deuxième fois sur le commandement des bots.

Organisateur Shoals


  • Peu de données pour écrire des stratégies solides et confortables. Tout ce qui nous a été donné était quatre méthodes pour contrôler et positionner les joueurs sur le terrain. Oui, la rondelle avait également son propriétaire. Depuis les constantes, le centre du terrain, le gardien et les zones de but étaient accessibles. Merci pour cela, mais il nous semble que la liste de valeurs suivante était tout simplement nécessaire. Nous venons de les béquiller!

    1. Vitesse des joueurs (chaque rôle avait sa propre vitesse), rondelles;
    2. Information sur le ralentissement de la rondelle;
    3. Positions de départ des joueurs;
    4. Tailles des joueurs, rondelles;
  • Lors du webinaire, les développeurs ont dit clairement qu'il n'y aurait aucun moyen d'obtenir le code source du serveur. À propos de certains emballeurs, il a été dit que .exe glisserait. Le mot "obscurcissement" n'a pas clignoté, mais a fait allusion. En fait, nous avons obtenu un .jar, qui se décompile en quelques secondes et non seulement les constantes et la logique avec la physique du jeu, qui manquaient aux participants, mais aussi leur code source du bot du 3e niveau jouant contre nous, deviennent disponibles. Malheureusement, je l'ai remarqué moi-même à mon arrivée à la maison et j'ai entendu parler de décompilation après le concours par les participants. Ils ont raconté comment quelqu'un l'avait utilisé pendant la finale. Si c'est vrai, c'est très désagréable. À de tels moments, vous commencez à regretter que la bonne soit tout.
    Mais dans ce cas, ce n'est pas très honnête (Alexander Polishchuk boba-alex ).
    Eh bien, bien fait, ils l'ont utilisé, car il n'y avait pas d'interdiction dans les règles, mais ils ont décidé de ne pas passer par l'obfuscateur, donc cela faisait partie des Jeux olympiques (Maxim Pyankov maxzxwd ).

  • Les joueurs de hockey pourraient disparaître à un moment aléatoire du terrain et n'apparaître qu'à la fin de la partie. Vous pouvez pousser le joueur dans la zone du gardien de but.

  • Lors de l'appel de la méthode move (), le joueur de hockey aurait pu tourner dans la mauvaise direction. Pour cette raison, cela pourrait être quelque chose comme un «moonwalk».

    Vidéo

  • La méthode turn () déploie les joueurs sensiblement plus lentement que la méthode move () jusqu'à un certain point (il y a un virage automatique dans la bonne direction). Cela se produit, en règle générale, dans un conflit avec un autre joueur de hockey. Comparaison de deux méthodes:

  • L'angle de réflexion est médiocre. Vitesse énorme après avoir rebondi sur les côtés (vidéo ralentie 4 fois). Les rondelles n'ont pas besoin, même si elle était dans le but.


    A titre de comparaison, un exemple de passage à angle droit, dans lequel tout va bien avec la vitesse et il y a un ralentissement.

    Vidéo

  • L'attaquant de l'équipe ennemie s'est tenu plus près du centre du terrain et a immédiatement intercepté la rondelle au début du tour (la rondelle qui n'est pas au centre de la texture du terrain est également normale).


  • La restriction «le gardien de but ne peut atteindre le milieu de terrain qu'à partir du but» ne s'applique qu'à notre équipe, il n'y a pas de règle pour les ennemis.
  • Pour que les joueurs de hockey puissent effectuer des actions, vous devez d'abord appliquer la méthode move () à l'un d'eux;
  • Les organisateurs du code de stratégie ont laissé un délai d'attente, affectant la fréquence de réception de nouvelles données. Si vous supprimez simplement ce code, tout se fige. Beaucoup n'ont pas compris son objectif et aucune explication n'a été reçue des organisateurs. Dans les règles également, cette partie du code n'apparaissait pas. Beaucoup là-dessus étaient assis dans une flaque d'eau.
  • Un grand nombre de participants ont eu des problèmes pour construire et changer le niveau de la stratégie (il s'est avéré que peu de gens savaient comment travailler avec maven'om).
  • Lors du webinaire, les organisateurs ont déclaré que Java utiliserait la version 8, mais au final, le projet avait besoin d'un minimum de Java 11.
  • Anna: après m'être assis devant un ordinateur qui fonctionnait, il y a eu des problèmes avec la construction en raison d'espaces supplémentaires dans le code qui ont cassé le nom de la variable. Pas critique, mais pas très sympa.
  • Sur certains ordinateurs, au départ, il n'existait aucun fichier de tâches ni Internet, et les dépendances étaient chargées pendant longtemps.
  • Il y avait plus de participants que prévu. C'est arrivé à cause d'une sorte d'extras. Par conséquent, une personne ~ 13 a eu des problèmes avec la recherche d'ordinateurs (certains ont sorti leurs ordinateurs portables) et a commencé le projet à partir de zéro.
  • Le déjeuner n'était pas strictement réglementé. Ils n'ont pas donné un certain temps pour un repas, ils n'ont pas fermé le public. Les personnes affamées ont eu une heure supplémentaire à vendre.
  • Ci-dessus, dans la description du concours, il y a une sous-rubrique avec des critères d'évaluation. Leur problème est ce qu'il dit sur les points, mais il n'est pas écrit combien et pour quoi. En conséquence, nous avons eu l'opacité et un manque général de compréhension de ce qu'il faut faire pour gagner.
    Il serait probablement difficile de comparer les participants de niveau proche, car il n'y avait pas d'attribution claire de points pour les fonctionnalités, il n'y avait qu'une liste. Les participants pouvaient implémenter différentes fonctionnalités, mais il fallait tout de même comparer (Roman).

Conclusion


Conclusion


En général, si vous cessez de prendre la finale trop au sérieux, c'était amusant, intéressant et très collant. Oui, j'ai dû passer du temps non pas à rédiger une stratégie, mais à faire face aux bugs des développeurs. Mais lorsque vous vous adaptez et commencez à jouer selon leurs règles, vous commencez même à vous réjouir du processus. Bien sûr, j'aimerais que les développeurs adoptent une approche plus responsable de cette tâche et mettent un terme à l'affaire sans fournir aux participants finaux du matériel brut et inachevé.

Il convient également de noter que les gagnants de cette finale sont de bons amis: dans des conditions aussi difficiles et inattendues, ils ont pu se réunir, tout comprendre et proposer une solution de haute qualité. Respect à ces garçons.

Remerciements


Tout d'abord, je voudrais remercier les participants qui ont contribué à la rédaction de l'article et ont aimablement accepté de répondre à nos questions. Malheureusement, en raison du changement de direction, beaucoup de matériel n'était pas nécessaire.

Merci à Anna ( odrus ), Leo ( zadamantiy ), Alexander ( boba-alex ), Maxim ( maxzxwd ), Ivan, Roman, Anna, Donat, Alexander.

Je voudrais également remercier les organisateurs du concours IT-Planet lui-même, les organisateurs de la finale Java du concours de programmation SimbirSoft, et en particulier le développeur Edward, qui était présent lors de la finale et a aidé les participants à résoudre des problèmes, pourrait clarifier les moments non évidents dans la logique du jeu.

Merci pour le fait que la compétition n'a pas du tout démarré, comme ils l'ont fait avec le sisharp (Alexander).
L'idée de la finale était bonne, les tours de qualification aussi (Ivan).

PS


Lors de la rédaction d'un article, des photos du concours et des protocoles sont arrivés, ce qui signifie que maintenant nous pouvons annoncer nos places!

Ilya a le plus chanté - 28-32 sur 33
Anna - 16
Lion - 14

Merci d'avoir lu jusqu'ici!

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


All Articles