Cómo fusionamos la programación IT-Planet final

No somos malos, pero hay muchos errores. Desarrollo de inteligencia artificial para el juego "Hockey" en ~ 7 horas.

Inicialmente, el artículo fue planeado sobre las estrategias de los participantes, sobre lo que lograron hacer en el tiempo de la competencia y si estaban contentos con el trabajo realizado, pero, después de entrevistar a ocho finalistas, quedó claro que no surgiría nada y que era urgente cambiar de dirección.

El hecho es que recibimos un máximo de 6 palabras para las preguntas que nos interesan, e inmediatamente escuchamos descontento sobre los errores que encontraron los participantes. Solo una persona escribió:
No quiero escribir nada negativo, creo que esto es incorrecto, y los organizadores mismos deberían estar tristes. Por lo tanto, diré que la idea de la tarea es bastante interesante, aunque personalmente no me gusta mucho este formato de competencias (Anna Prozorova).

Del título del artículo está claro que no ganamos nada. Y sí, somos "nosotros". Durante los días de la competencia, hice muchos buenos amigos, incluida Anna ( odrus ), quien es coautora de este artículo. También en el último momento hablamos con Leo ( zadamantiy ) y con su permiso describimos la participación en la final.

Personalmente, soy miembro del movimiento "A Complaint Free World", pero colgaré mi pulsera por otro lado y me quejaré, aunque sea de forma cómica, porque, por otro lado, estas son las condiciones de la competencia y debes ser un buen especialista para ganar y ganar. hacer frente a los defectos! No tenemos quejas, por el contrario, ¡muchas gracias!

Debajo del corte, además de describir las reglas del juego, las reglas de la competencia y los errores encontrados, compartiremos con ustedes nuestras jambas, lo que encontramos personalmente y cómo resolvimos este o aquel problema, cómo nos preparamos para la competencia. Quizás en algún lugar te reconoces si participaste en tales competiciones.

El propósito del artículo es recolectar las fallas del concurso tanto de los participantes como de los organizadores, cortarlas en la nariz y nunca volver a pisar el mismo rastrillo. Esperamos que el artículo aumente el nivel del próximo concurso.



Introduccion


Unas palabras sobre nosotros


Ilya


El participante anual de la Copa AI rusa y la Mini Copa AI desde 2017. También sigo Codingame y Halite. No tengo logros especiales, pero aprendí mucho de otros. Para mí, lo principal no es la participación, no la victoria, sino dar mi 100% y finalmente decir: "Hice todo lo que pude, me di cuenta de todo lo que quería, apliqué todo lo que sabía". No conozco el lenguaje de programación Java. Para mí, esto ya es una práctica común de la competencia a la competencia para estudiar completamente la nueva pila de tecnología.

Anna


Un estudiante simple con poca experiencia en la resolución de problemas algorítmicos, pero sin mucha experiencia en participar en olimpiadas y concursos similares. Específicamente, en IT-Planet, decidí participar para poner a prueba mis conocimientos y habilidades, adquirir experiencia, comunicarme con personas interesantes. Estudió el lenguaje de programación Java en la universidad, pero no tuvo experiencia práctica con él durante mucho tiempo.

León


Participó en todo tipo de selecciones de ICPC, hackathons como "Build University 20.35" y "Digital Breakthrough". Bueno, las pequeñas cosas en algunas olimpiadas universitarias.
En consecuencia, nuestra universidad generalmente enviaba muchos participantes al concurso por sql, pero este año no fue así. Me ofrecieron participar en Java, tuve que lidiar con un nuevo lenguaje para mí en un tiempo bastante corto en paralelo con la sesión. En It-planet antes de esto no participó.

Descripción de la competencia


Posición general


IT-Planet es una competencia para estudiantes y jóvenes profesionales de la esfera de TI, cuyo objetivo es identificar y apoyar a personas capaces. Se lleva a cabo anualmente desde 2007. La participación en él es una oportunidad de probarse a uno mismo.

La nominación de "Programación Java" ayuda a encontrar una aplicación práctica del conocimiento adquirido en el proceso de aprendizaje.

La primera etapa de calificación fue en ausencia y fue una prueba en línea para estudiantes de instituciones educativas registradas. Las preguntas eran bastante complicadas e interesantes, pero para ser honesto, la mayoría contenía código que podía releerse y ejecutarse.

La segunda etapa de calificación, como la primera, fue en ausencia. Está dirigido a resolver problemas de programación deportiva. Se dieron dos días para resolver 10 problemas, lo que hizo posible prepararse a fondo para resolver un problema específico, para estudiar el algoritmo / enfoque. Sin embargo, nadie hizo frente a todas las tareas. La condición de algunas tareas cambió durante el concurso. Había escuelas en las pruebas.

Finales internacionales a tiempo completo. Era necesario escribir una IA para el juego "Hockey sobre hielo". Se dieron ~ 7 horas. Aproximación debido a la falta de "aprobación" del inicio y la incomprensibilidad con el almuerzo. El tiempo era de goma y el público no cerró, pero más sobre eso a continuación.

Tarea


La tarea fue desarrollada por los especialistas de SimbirSoft LLC. A continuación se muestra el contenido del archivo .pdf (con revisiones mínimas para el artículo) que recibió cada participante.

Tarea
Descripción de la tarea

En algún lugar de un país misterioso, cuyos habitantes son pequeños robots, había 2 equipos para jugar hockey. Ambos equipos tienen su propio entrenador personal de robots, que monitorea constantemente el juego y les dice a todos los jugadores a dónde deben ir. Todo estaría bien, pero los jugadores robóticos entienden solo acciones tan simples como ir, golpear el disco, ir al punto establecido por el entrenador.

Tienes que convertirte en entrenador del equipo rojo de jugadores. Un equipo azul jugará contra ti, que está controlado por un algoritmo que ya derrota con éxito a otros equipos. En el campo al mismo tiempo juegan 2 equipos. El equipo está formado por 4 jugadores: delantero, 2 defensores y portero.

Su tarea es escribir un algoritmo para administrar bots rojos. Para controlar los personajes, tendrá 3 métodos, que se describen a continuación. También hay un método que recibe información sobre todos los jugadores en el campo y las coordenadas del disco.

Limitaciones del juego

El portero solo puede alcanzar el centro del campo desde la portería. Los defensores y los atacantes pueden recorrer todo el campo, excepto el área del portero (semicírculo rojo cerca de la portería).

Descripción de la estructura de la aplicación.

La aplicación se presenta como cliente y servidor. El servidor se empaquetará en un archivo jar y se iniciará en segundo plano. El servidor contiene toda la lógica básica del movimiento de los personajes y el disco, almacenando información sobre todos los personajes, el disco, el tiempo y la puntuación.

Cuando se inicia la aplicación, el cliente establece una conexión con el servidor y, con una frecuencia determinada, recibe datos del servidor. También es responsable de representar a todos los personajes, el gol y el disco en el campo de hockey.

Todo el código del programa debe escribirse en la clase Algoritm en la carpeta algoritm en la aplicación cliente (no se tendrán en cuenta todos los cambios en otros archivos).

Los siguientes métodos están presentes en esta clase:

  • move (playerType, x, y): método para mover a un jugador a un punto específico del mapa.
  • kick (playerType): método para golpear el disco de un jugador específico.
  • turn (playerType, angle): un método para girar a un jugador específico.
  • getInfo () - Obtén información sobre todos los jugadores y discos en el mapa.

También hay un nivel variable estático, que es responsable del nivel de complejidad del algoritmo. Los siguientes niveles estarán disponibles para los participantes en la Olimpiada:

  1. el equipo azul está de pie;
  2. el equipo azul camina al azar por el campo;
  3. el equipo azul juega de acuerdo con el "algoritmo débil";
  4. el equipo azul juega de acuerdo con un algoritmo avanzado (para pruebas internas).

Todos los métodos que aceptan playerType solo funcionan para jugadores del equipo rojo.
La variable playerType es una instancia de la clase PlayerType y contiene
valores como portero, defensor1, defensor2, delantero.

En la clase Playground, se escriben los valores constantes del juego (por ejemplo, centro del campo, zona de porteros, etc.).

El método getInfo () devuelve un objeto de la clase GameInfo.

Refinamientos

  • Si envía el método de movimiento varias veces, entonces el punto final donde el personaje necesita llegar cambiará (por lo tanto, si necesita llegar al punto final, debe esperar hasta que el personaje llegue a él antes de enviarlo a otro punto).
  • El método de patada solo se puede usar para un jugador que posee el disco.
  • El método de giro toma un ángulo, mientras que para el lado inferior del campo, el ángulo toma valores de 0 (mira hacia la meta del enemigo) a 180 (mira hacia su propia puerta), y para el semicírculo superior, el ángulo toma valores de 0 a -180.




Criterios de evaluación.


También tomado de un archivo .pdf. Solo se utilizará el código de la clase Algoritm. El algoritmo de cada participante se ejecutará a su vez contra todos los niveles de dificultad. Según los resultados de la carrera, se establecerán puntos para los resultados del partido y también se otorgarán puntos por las oportunidades implementadas en el algoritmo.

Listado de criterios
  1. Los ataques a la portería deben llevarse a cabo desde diferentes ángulos. Por ejemplo: justo delante de un jugador, un portero enemigo: un ataque a portería debe llevarse a cabo en ángulo.
  2. El jugador pasa la pelota a un jugador de hockey libre para que realice un ataque a la portería.
  3. Los pases deben darse solo en aquellos casos en que el jugador no puede realizar el ataque por sí mismo (todos los ángulos para atacar la portería están cerrados).
  4. El pase solo se debe dar a un jugador que es libre de pasar. Los jugadores de hockey con un objetivo abierto para el ataque son prioritarios.
  5. Si un ataque es imposible, el equipo debe retirarse y reagruparse.
  6. Añadir Puntos si parten mediante transferencias.
  7. Añadir Puntos si usa el portero para reagruparse.
  8. En defensa, la habilidad de pasar a otro jugador del oponente debe ser bloqueada.
  9. El equipo del jugador se adhiere a las estrategias. Por ejemplo: 1 defensor siempre se mantiene un poco más lejos, en caso de un contraataque enemigo.
  10. El algoritmo tiene en cuenta el marcador. Por ejemplo: juega más agresivamente en caso de pérdida y viceversa es más cuidadoso en una situación ganadora; con un empate aumenta la agresión hacia el final del partido.

Se otorgarán puntos de penalización por:

  1. El jugador marca goles en su propia meta.
  2. Los jugadores de hockey se bloquean entre sí. (no se dejen pasar)
  3. Bloqueando intencionalmente el juego. Por ejemplo: empuja el disco contra el disco hasta el final del juego.


Cuerpo principal


Preparación para la competencia.


Ilya


Inicialmente, escribieron que en la final habrá "Desarrollo industrial". Esperaba un trabajo normal con la base, desarrollo de GUI. Una aplicación para contabilizar algo, por ejemplo. Con el dolor a la mitad, acepté la final, porque no estaba muy contento con lo que tenía que hacer. Sin embargo, el 17 de septiembre, llega una carta con las reglas para celebrar la final, y allí se informa lo siguiente: "Hay un juego de computadora en 2D" Hockey "en el que los bots de computadora juegan de acuerdo con algún algoritmo. Es necesario implementar un algoritmo en el lenguaje de programación Java según el cual los personajes de los participantes actuarán "(se escribió en el sitio que la tarea podría modificarse). Inmediatamente me acordé de la Copa AI de Rusia 2014 en mi cabeza. Estaba encantado y me di cuenta de que no era en vano que aceptara participar.

Lo primero que hice una vez más fue leer el artículo del ganador . En general, recordé lo que había allí, pero no todos los momentos fueron claros. Luego fui al sitio web del concurso y leí las reglas. Me detuve en esto, porque cualquier enmienda a las reglas puede cambiar por completo todo el juego. No sabía cuántos físicos estarán en su juego, no sabía cómo seleccionar el puñetazo y el puck, etc. El juego podría simplificarse enormemente, incluso las esquinas no serían necesarias. Entonces comencé a esperar ...

Esperado y esperado! ¡En la tarde del 27 de septiembre llega una carta sobre el seminario web! 28 de septiembre a las 19:00. Fue un día y hora perfectos para mí. Sin embargo ... Sin embargo, 4 horas antes del lanzamiento programado, ¡llegó otra carta con una transferencia a las 17:00! La carta de transferencia llegó una hora antes del inicio ... Volé lo mejor que pude y llegué tarde unos 15 minutos (no esperaba que Flash Player todavía tuviera que estar instalado).

En el seminario web hizo preguntas y obtuvo una imagen general sobre el juego. Había suficientes datos, incluso para escribir los míos y prepararme a fondo. Sin embargo, hasta el final no estaba claro cómo ocurre el golpe, los desarrolladores no revelaron algunos puntos, y en algunos lugares ellos mismos aún no habían decidido el final.

Después de escribir todo lo más valioso, fui a hablar con los miembros activos familiares de RAIC. Hola y gracias m0rtido , DragoonXen , oreshn1k . Después de describir la situación, quedó claro que es necesario codificar ifa y no se puede hablar de ninguna simulación del mundo durante ese tiempo. oreshn1k compartió el libro de bombardeos "Programación del juego AI por ejemplo", el cuarto capítulo del cual habló sobre el diseño de AI para el fútbol. Me gustó tanto el libro que decidí pintar para mí toda la estrategia que iba a escribir en la competencia, y olvidé por completo el límite de tiempo. Lo que iba a escribir no era adecuado para este concurso ...

Mi preparación inútil está disponible en quire (claramente, ya hay 168 tareas. En algunos lugares con una descripción). Inútil para esta competencia, pero en general es una excelente sistematización del conocimiento obtenido del libro. También pensé en simular el disco para descubrir su ubicación después de un tiempo, encontrar el ángulo correcto para el tiro al arco, la lógica de transferir el disco entre los jugadores y un montón de cosas interesantes.

Ya escribí anteriormente que sin tener idea de cómo escribir en Java, por lo tanto, además de la estrategia, comencé a estudiar la sintaxis del lenguaje. Esto fue ayudado por un excelente sitio, que he estado usando por más de la primera vez: aprender X en Y minutos . Después de ingresar a IntelliJ IDEA, me di cuenta de que escribir en él es exactamente lo mismo que escribir en C #.

Con tal preparación, fui a Moscú.

Anna


Cuando supe sobre el tema del final, lo primero que decidí repetir fue el geoma. Y para que todo esto fuera divertido, lo haría todo con Processing : miré ejemplos de desarrolladores relacionados con el movimiento, el cálculo de ángulos, la velocidad y la aceleración, y luego practiqué en mis pequeños bocetos.

Decidí no perder el tiempo en actualizar algunas sutilezas de Java, porque, como me pareció, la tarea involucraba habilidades en estrategias de escritura y algunos conocimientos de matemáticas. Así que decidí leer el artículo del ganador de RAIC 2014 . El artículo fue interesante, pero no particularmente útil específicamente para este concurso, porque la física podría diferir radicalmente y se le daría mucho menos tiempo.

El seminario web de los desarrolladores fue interesante y útil, dio una imagen general del juego. Pero, desafortunadamente, no pude verlo completamente, porque la transmisión se realizó usando Flash y mi computadora portátil decidió en ese mismo momento jugar con la pantalla azul de la muerte.

Como resultado, justo antes de la final, no tenía una estrategia elaborada de antemano: era difícil planificar algo cuando no se revelaban los detalles de la física del juego. En primer lugar, se pensó en qué vale la pena prestar atención, qué métodos auxiliares escribir de inmediato, pero nada más. Decidí que lo principal antes del final era relajarse, dormir lo suficiente y llegar allí de buen humor.

León


[Preparado] Aproximadamente 16-20 horas. En consecuencia, consideré la geometría, con la cual, desafortunadamente, no estoy muy en desacuerdo. Preparó fórmulas y cálculos por adelantado, probó todo. Aprecié el área desde la que puedes anotar de acuerdo con las condiciones dadas por los organizadores en el seminario web, luego escribí un emulador de algunas acciones y obtuve cómo se vería el área al simular directamente tiros desde diferentes puntos y la estrategia óptima del portero. Como resultado, casi nada fue útil y tuve que escribir muletas en muletas.



Distribución del tiempo


Ilya


Siempre tuve problemas con la distribución del tiempo en competiciones y olimpiadas. Pisé un rastrillo por tercera vez. Después del primero, dijo que nunca permitiría esto. Una vez más, se sentó en una tarea, durante mucho tiempo no cambió a otra.

Pasé mucho tiempo, toda la primera parte de la competencia antes del almuerzo, en la implementación de todo tipo de envoltorios para jugadores de equipo, clases estatales, mensajes entre ellos, roles internos. En general, realicé las tareas que había formado antes de la competencia, olvidando completamente los consejos de los participantes experimentados sobre los códigos auxiliares y los métodos auxiliares. Simplemente escribió sin pensar en el tiempo.

Llegué a mis sentidos en la cena. Comprendí que la mitad de la competencia había terminado, y tengo trabajo por otras 10 horas para que al menos algo comience a moverse. Se decidió dejar todo lo que es y comenzar desde el principio. Estas fueron las últimas horas fascinantes del concurso, cuando dejé de sentirme triste y me reí con el comportamiento de mis robots. Muy rápidamente comenzó a cambiar de tarea a tarea. Él no va allí, cambió a otro, luego regresó. Solo había un deseo: marcar al menos de alguna manera, al menos algo. Por lo tanto, se olvidó por completo de la limpieza del código y la POO, se dejaron comentarios interesantes en algunos lugares.

Anna


Al principio, decidí descubrir cómo funcionan en general los métodos básicos del juego: el movimiento de los jugadores de hockey, la captura del disco, los giros y los pases. Pasé aproximadamente una hora en esto. También estudié los datos y métodos que tenían los jugadores de hockey y el disco. Entonces decidí que sería bueno aprender a encontrar el ángulo entre dos objetos (en particular, entre un jugador de hockey y un disco). Tuve grandes dificultades con esto: al principio descubrí el método Math.atan2 durante mucho tiempo, y luego intenté convertir los datos recibidos en un sistema de ángulos de desarrollador. Con todo esto, me atormentaron antes de la cena y estaba muy molesto porque pasé mucho tiempo en una pequeña tarea, aunque durante el mismo tiempo pude escribir una estrategia para al menos el primer nivel.

Después del almuerzo, decidí asignar tiempo más racionalmente. Terminó rápidamente el método con la determinación del ángulo, luego escribió una estrategia para el primer nivel. Luego pasó sin problemas a la estrategia para el segundo nivel, que aplicó al final para el tercero. En realidad, esto y siguiendo el comportamiento extraño de mis jugadores de hockey, lo hice hasta el final de la final. El código resultó ser terrible, ilegible, con un montón de ifs y copiar y pegar, pero más o menos hizo frente a su tarea: mis jugadores de hockey anotaron goles.

León


Para el tiempo dado (7 horas, que es increíblemente pequeño para tal competencia), hizo un algoritmo simple que fue capaz de ganar consistentemente 1-2 niveles con una puntuación aplastante. Y luego, dependiendo de los eventos aleatorios con un tercer nivel, el algoritmo emitió un puntaje de 0-2 a 6-0. Desafortunadamente, no fue posible mirar el cuarto nivel. Al mismo tiempo, estoy seguro de que durante este tiempo puede escribir una opción mucho mejor, pero para esto necesita comprender cómo funciona algún tipo de cambio, pero aquí los organizadores se encogieron de hombros, diciendo que no entendemos por qué es así.

La mayoría de las veces se tardó en descubrir cómo y qué funciona en el proyecto estaba especialmente enfurecido por no funcionar .equals () y dos campos .TypeOfPlayer y .PlayerType, que devolvieron cosas completamente diferentes. Bueno, hay algunos comportamientos extraños de los jugadores que los organizadores realmente no pudieron explicar (y no sabemos por qué su personaje está aquí adelante con el único equipo dado y los turnos ya mencionados :)). Luego, en algún momento, resulta que hay constantes en el proyecto para los tamaños de los diferentes objetos del juego y sus posiciones, que, al parecer, deberían haber estado inicialmente en el material de referencia, pero no, al final, mató el tiempo para contarlos. a mano

Nuestras jambas


Ilya


  • Mi principal no puede ser la terrible distribución del tiempo y la escritura inútil de abstracciones superfluas. Cuando tenga 7 horas, escriba un código incorrecto que no sea compatible si desea ganar.
  • Rofl con geoma. Todavía no sé qué ángulo debe agregarse y cómo lo procesa el servidor, por lo que% 360 es para todos. Quizás 90 +, quizás 180, quizás los 270. No pensé en absoluto y simplemente lo probé ...

    double res = 180 / Math.PI * Math.acos((pp.x - tp.x) / pp.dist(tp)); return (90 + (int) res) % 360; 
  • Unos 40 minutos antes del final de la competencia, decidí resolver el juego, que tuvo lugar en busca del jugador más cercano al disco. Resultó ser que mi método squareDist de la clase Paint tenía el signo -, en lugar de + entre los cuadrados de la diferencia de coordenadas (por cierto, en la tarea también en quire). Y con tal error, consideré absolutamente todas las distancias durante varias horas ...
  • Al comienzo de la competencia, mantuve en mi cabeza la realización de obtener la posición de disco en el futuro. Esto requiere su velocidad. Al final resultó que no se puede obtener nada útil del estado del mundo (creo que es una maraña de organizadores, dependiendo de lo que ofrecen otros concursos de los mismos formatos). Por lo tanto, se debía obtener la misma velocidad de disco, en función de su posición en diferentes puntos del juego. Pasé mucho tiempo depurando y no entendí por qué los datos llegan tan raramente (prometido cada 5 ms). En general, no pude terminar el error de cálculo entonces, pero ~ una hora antes del final de la competencia noté un código interesante en mi estrategia que dejaron los organizadores:

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

    Al establecer el valor en 10, recibí una actualización muy frecuente de los datos, descomenté la sección del código responsable de obtener la velocidad y funcionó. Unos 20 minutos después escuché una pregunta del participante a los organizadores sobre este código, y él le explicó que esto se hizo especialmente para nosotros, de modo que sería más fácil de desarrollar. En ese momento sonreí, dándome cuenta de que no era el único que se dio cuenta de esto tan tarde.

Anna


  • Al igual que Ilya, no pude asignar correctamente mi tiempo desde el principio: pasé mucho tiempo en una tarea pequeña, aunque útil, pero tuve que enseñar a los jugadores de hockey a marcar goles.
  • Mató mucho tiempo porque olvidó la firma del método Math.atan2: primero viene y, y luego x. Yo hice lo contrario.
  • Al escribir un método que determina si hay jugadores enemigos de hockey en cierto tramo del camino, cometí un par de errores, por lo que los jugadores de hockey a veces se negaron a moverse a cualquier parte.
  • En general, la competencia no se tomó lo suficientemente en serio. Uno podría prepararse más a fondo y ser más diligente y atento al final.

León


  • Las primeras dos horas en los registros se repitieron aleatoriamente las dos veces por orden de los aliados, en lugar de la segunda vez por orden de los bots.

Organizador Shoals


  • Poca información para escribir cómodamente estrategias fuertes. Todo lo que nos dieron fueron cuatro métodos para controlar y posicionar a los jugadores en el campo. Sí, el disco también tenía su dueño. Desde las constantes, el centro del campo, el portero y las áreas de portería eran accesibles. Gracias por esto, pero nos parece que la siguiente lista de valores era simplemente necesaria. ¡Los acabamos de mudar!

    1. Velocidad de los jugadores (cada rol tenía su propia velocidad), discos;
    2. Información sobre la desaceleración del disco;
    3. Posiciones iniciales de jugadores;
    4. Tamaños de jugadores, discos;
  • En el seminario web, los desarrolladores dijeron claramente que no habría forma de obtener el código fuente del servidor. Sobre algunos empacadores, se dijo que .exe se deslizaría. La palabra "ofuscación" no brilló, pero insinuó. De hecho, obtuvimos un .jar, que se descompila en un par de segundos y no solo las constantes y la lógica con la física del juego de la que carecían los participantes están disponibles, sino también su código fuente para el bot del tercer nivel que juega contra nosotros. Desafortunadamente, me di cuenta de esto al llegar a casa y escuché sobre la descompilación después del concurso por parte de los participantes. Dijeron cómo alguien lo usó durante el final. Si esto es cierto, entonces es muy desagradable. En esos momentos, comienzas a lamentar que el correcto sea todo.
    Pero en este caso, no es muy honesto (Alexander Polishchuk boba-alex ).
    Bien, bien hecho que lo usaron, ya que no había prohibición en las reglas, pero decidieron no pasar por el ofuscador, por lo que era parte de la Olimpiada (Maxim Pyankov maxzxwd ).

  • Los jugadores de hockey podrían desaparecer al azar del campo y no aparecer hasta el final del juego. Puedes empujar al jugador al área del portero.

  • Al llamar al método move (), el jugador de hockey podría haber girado en la dirección equivocada. Debido a esto, podría ser algo así como un "paseo lunar".

    Video

  • El método turn () despliega a los jugadores notablemente más lento que el método move () hasta cierto punto (hay un giro automático en la dirección correcta). Esto sucede, por regla general, en un conflicto con otro jugador de hockey. Comparación de dos métodos:

  • El ángulo de reflexión es pobre. Gran velocidad después de rebotar en los costados (el video se ralentizó 4 veces). Las arandelas no necesitan, a pesar de que ella estaba en la portería.


    A modo de comparación, un ejemplo de un pase en ángulo recto, en el que todo está bien con la velocidad y hay una desaceleración.

    Video

  • El atacante del equipo enemigo se paró más cerca del centro del campo e inmediatamente interceptó el disco al comienzo de la ronda (el disco que no está en el centro del campo también es normal).


  • La restricción “el portero solo puede alcanzar el centro del campo desde la meta” se aplica solo a nuestro equipo, no existe tal regla para los enemigos.
  • Para que los jugadores de hockey puedan realizar cualquier acción, primero debes aplicar el método move () a cualquiera de ellos;
  • Los organizadores en el código de estrategia dejaron un tiempo de espera, lo que afecta la frecuencia de recibir nuevos datos. Si simplemente elimina este código, todo se congela. Muchos no entendieron su propósito, y no se recibió ninguna explicación de los organizadores. En las reglas, también, esta parte del código no apareció. Muchos en esto se sentaron en un charco.
  • Un gran número de participantes tuvo problemas para construir y cambiar el nivel de la estrategia (como resultó, no mucha gente sabía cómo trabajar con maven'om).
  • En el seminario web, los organizadores dijeron que Java usará la versión 8, pero al final, el proyecto necesitaba un mínimo de Java 11.
  • Anna: después de sentarme en una computadora que funcionaba, hubo problemas con la compilación debido a espacios adicionales en el código que rompieron el nombre de la variable. No es crítico, pero no muy agradable.
  • En algunas computadoras, inicialmente no había archivos de tareas o Internet, y las dependencias se cargaron durante mucho tiempo.
  • Hubo más participantes de lo esperado. Sucedió debido a algún tipo de extras. Por lo tanto, una persona ~ 13 tuvo problemas con la búsqueda de computadoras (algunas sacaron sus computadoras portátiles) y comenzó el proyecto desde cero.
  • El almuerzo no estaba estrictamente regulado. No dieron cierto tiempo para una comida, no cerraron la audiencia. La gente hambrienta tiene una hora extra para vender.
  • Arriba, en la descripción del concurso, hay un subtítulo con criterios de evaluación. Su problema es lo que dice sobre los puntos, pero no está escrito cuánto y para qué. Como resultado, obtuvimos opacidad y una falta general de comprensión de qué hacer para ganar.
    Probablemente sería difícil comparar a los participantes en un nivel cercano, ya que no había asignaciones claras de puntos para las características, solo había una lista. Los participantes podían implementar diferentes características, pero de todos modos era necesario comparar de alguna manera (Roman).

Conclusión


Conclusión


En general, si dejas de tomarte el final demasiado en serio, fue divertido, interesante y muy pegajoso. Sí, tuve que pasar tiempo no escribiendo una estrategia, sino para hacer frente a los errores de los desarrolladores. Pero cuando te adaptas y comienzas a jugar según sus reglas, incluso comienzas a disfrutar del proceso. Por supuesto, me gustaría que los desarrolladores adopten un enfoque más responsable para esta tarea y lleven el asunto al final sin proporcionar a los participantes finales material en bruto e inacabado.

También vale la pena señalar que los ganadores de este final son grandes compañeros: en condiciones tan difíciles e inesperadas, pudieron reunirse, resolver todo y emitir una solución de alta calidad. Respeto a esos muchachos.

Agradecimientos


En primer lugar, me gustaría agradecer a los participantes que ayudaron a escribir el artículo y aceptaron amablemente responder nuestras preguntas. Desafortunadamente, debido al cambio de dirección, no era necesario mucho material.

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

También me gustaría agradecer a los organizadores del concurso IT-Planet en sí, a los organizadores de la final del concurso "Programación: Java" SimbirSoft, y en particular al desarrollador Eduard, que estuvo presente en las finales y ayudó a los participantes con problemas de construcción, pudo aclarar los momentos poco obvios en la lógica del juego.

Gracias por el hecho de que la competencia no pateó en absoluto, como lo hicieron con el sisharp (Alexander).
La idea del final fue buena, las rondas clasificatorias también (Ivan).

PS


Mientras escribía un artículo, llegaron fotos del concurso y los protocolos, lo que significa que ahora podemos anunciar nuestros lugares.

Ilya fue el que más cantó: 28-32 de 33
Anna - 16
Leo - 14

¡Gracias por leer hasta aquí!

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


All Articles