Crear un bot para participar en el CodeBall ruso de la Copa AI 2018



Se ha convertido en una tradición que después de las competiciones de programación deportiva, el ganador o simplemente un jugador publique un artículo sobre Habré para contar lo bueno que fue participar en la competencia y como una opción para ganarla. Por supuesto, se puede extraer mucho de su artículo para futuras competiciones.

Pero creo que hay pocos artículos sobre la participación en la competencia actual en la etapa de prueba beta, está claro que no puedes publicar el código de decisión, aún se desconoce qué tan buena es esta decisión y aún se desconoce mucho, porque ahora, de hecho, es solo el comienzo del torneo, pero ese es el encanto. El autor le da al lector la oportunidad de subir a un tren que sale y disfrutar de un viaje de Año Nuevo al mundo de las estrategias de juego.

En primer lugar, gracias por abrir el artículo, quiero compartir un secreto de inmediato: esta será una serie de artículos en los que espero tocar algoritmos genéticos y redes neuronales. Mientras tanto, como ya se escribió anteriormente, bienvenido a un viaje al Code AI Ball ruso de la Copa AI.

Enlace a la página de inicio rápido del campeonato.

En el enlace anterior, el lector podrá encontrar las reglas del campeonato, las reglas del juego en sí y la parte principal del aparato matemático necesario para crear el bot. También en la página de inicio rápido hay ejemplos de bots ya escritos para varios lenguajes de programación, lo que facilita enormemente el inicio inicial.

Comencemos con un título simple de campeonato CodeBall.

Una buena combinación de las palabras código y pelota, casi fútbol. Las reglas y la lógica del juego también son similares al fútbol, ​​pero con cada ronda se vuelven más complicadas, por lo que tomaremos como base las condiciones iniciales de los juegos.

La esencia del juego, como se indica en una canción reciente: los jugadores deben anotar, y el portero para golpear las bolas.

Campo de juego esquemático:



Tenga en cuenta que los robots se mueven en el plano del piso de la arena XZ, el eje Y es responsable de la altura del objeto del juego.

También esquemáticamente objetos del juego (pelota y bots (los organizadores los llaman robots))



Ahora algo de texto para apoyar las imágenes. El campo de juego es un espacio cerrado tridimensional, ni la pelota ni los robots pueden ir más allá. En este espacio, hay dos áreas de la "puerta" cuando se golpea en la que uno de los jugadores considera que la pelota es anotada. Para que se cuente el gol, es necesario que la pelota esté completamente detrás de las líneas de gol (indicado por una línea punteada en la figura).

Para simplificar los cálculos de colisiones (colisiones) de los objetos del juego (arena, pelota, bots), los bots y la pelota se consideran esferas ideales (bolas), que se describen mediante los siguientes valores: radio de la esfera, coordenadas del centro de la esfera, masa, velocidad. La arena también se describe mediante primitivas matemáticas ideales, por lo que se prescinde del cálculo de colisión sin la participación de polígonos, lo que simplifica enormemente la tarea. Si te desplazas por las reglas del campeonato hasta el final, allí el lector encontrará un programa en pseudocódigo, que solo es responsable de los cálculos anteriores. Este pseudocódigo, después de un pequeño esfuerzo físico, se traduce al lenguaje de programación de su elección y es bastante viable. Pero más sobre eso más tarde.

Algunas palabras sobre la física del mundo del juego. Para dar credibilidad a lo que está sucediendo en la arena, se introduce la gravedad, es decir, los bots y la pelota se ven constantemente afectados por la fuerza de gravedad dirigida hacia abajo en relación con el piso de la arena. Los organizadores ignoraron las otras formas de interacción física, como la fricción o las velocidades angulares (rotación) de los objetos, a favor de la simplicidad de la descripción del mundo físico. Al golpear las paredes de la arena, la pelota pierde parte de su energía, pero esto no complica mucho el mundo y es comprensible desde el exterior que no hay forma de crear una máquina de movimiento perpetuo en forma de pelota.

Para hacer que el mundo parezca aún más plausible, se ha aplicado un esquema de cálculos con Ticks y Mikrotiks. En su primer artículo, el autor se refirió en detalle al concepto de tiempo de juego de la teca. En esta competencia, podemos ver el motor físico en los códigos fuente, como él dijo, nos será útil en el futuro, y descubrir que para los jugadores hay Tics, y dentro del motor todo sucede en Mikrotik, por defecto 100 Mikrotik en un tic, lo que hace posible una mayor precisión describa colisiones de objetos y evite cosas tan desagradables como la falla de los objetos fuera de la arena o la falla de los objetos entre sí que conducen a errores en la interacción entre ellos.



De alguna manera descubrimos el mundo (arena) y el tiempo de juego, echemos un vistazo a los objetos del juego: los bots y la pelota. La pelota que ya descubrimos de las reglas de la competencia es una esfera. Para ser breve, un bot es una bola de un radio más pequeño y una masa más grande, a la que se le pueden dar comandos: indique la velocidad deseada (este es un vector tridimensional que contiene tanto la dirección como la longitud o magnitud de la velocidad) y la fuerza del salto si el salto es actualmente aconsejable desde el punto de vista La lógica del juego. En esta etapa de la competencia, se ha introducido una simplificación de que si el bot está en vuelo (no toca las paredes de la arena), entonces no tiene la capacidad de ejecutar comandos para cambiar la velocidad.

Pasamos a lo más difícil o viceversa, todo depende de la experiencia del lector al trabajar con vectores tridimensionales. Descripción de la ubicación de los objetos del juego. Imagen de soporte



Vayamos a la botánica.

En cada tic del juego, su estrategia recibirá los siguientes objetos:

Pelota:

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

y una lista de bots, con datos para cada 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 

Puede ver de inmediato que es inconveniente trabajar con estos datos, es conveniente introducir un vector 3D de clase (objeto) y un vector 2D de clase. Mucho dependerá del lenguaje de programación que elija. Por lo general, estas clases ya están escritas y se encuentran fácilmente en Internet para el lenguaje de programación deseado. El autor ahora está escribiendo un bot en c ++, pero intentará limitarse al pseudocódigo. Si introduce clases completas de vectores, las operaciones de suma, resta, multiplicación, normalización y otras operaciones de vectores permanecerán dentro de la clase, lo que simplificará enormemente el trabajo en la estrategia.

También hay una clase de jugador que indica qué bots de la lista son tuyos, cuáles son:

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

Después de transmitir datos sobre el mundo del juego a la entrada de su estrategia, el motor del juego le da control e inicia un temporizador para los cálculos, el tiempo para los cálculos es limitado, en promedio, unos 20 milisegundos para todas las acciones dentro de la marca. Existe la sospecha de que en este momento también incluye tiempo para deserializar los datos recibidos y serializar los datos enviados por su estrategia al servidor. Pero como el número de bots es 4 (tus oponentes 2 y 2, entonces, en la ronda final, el número total de bots aumentará a 6), el tiempo para estas operaciones puede ser descuidado.

Ha llegado el momento de los equipos.

Por ejemplo, queremos darle al bot una orden de moverse hacia la pelota. Para encontrar el vector deseado de la dirección de la velocidad es necesario restar la posición del bot de la posición de la pelota, obtenemos el vector de dirección de la pelota, luego se puede normalizar y multiplicar por la velocidad máxima del bot de las constantes del mundo. En la foto mas



Probablemente, el lector notó en la diapositiva que los cálculos se pueden realizar tanto para vectores 3D como para vectores 2D. Si tenemos en cuenta el hecho de que el bot pasa más tiempo en el plano del piso de la arena, entonces simplificar los cálculos a dos coordenadas no afectará la precisión de los cálculos para interceptar la pelota. Por supuesto, no debes olvidarte de la altura de la pelota, pero teniendo en cuenta la gravedad, tarde o temprano se hundirá en el bot.

Un salto bot es la suma de la velocidad vertical (velocidad vertical), la dirección del salto del bot coincidirá con la dirección de la velocidad actual del bot con la adición de un componente a lo largo del eje Y.

Si agregamos una lógica de movimiento más compleja a las palabras anteriores, entonces podemos obtener el siguiente comportamiento de los bots:


Ahora hay un sandbox en el sitio donde puedes ver los juegos, pero nada se siente si escribes tu estrategia y sigues sus juegos. Se ha establecido experimentalmente que incluso la estrategia más simple que consiste en varias decenas de líneas de código puede jugar bastante bien.

De las formas simples de estrategias que vienen a la mente, la estrategia de asignar un bot para proteger la puerta, el segundo bot para hacer un atacante. La tarea principal del atacante es perseguir la pelota y, si tiene éxito, golpear hacia la meta del oponente. Un bot que juega como portero generalmente tiene un movimiento limitado en el campo y opera principalmente en el área de portería. Todas estas cosas se describen fácilmente utilizando construcciones if-else de su idioma elegido. En cualquier caso, mi lector tendrá que idear y crear una estrategia en esta etapa. De acuerdo con los términos de la competencia, no puede publicar el código fuente de la estrategia. Pero creo que no está prohibido discutir enfoques para diseñar una estrategia.

Me parece que los organizadores del concurso eligieron un tema interesante para el torneo, el único sitio es un poco lento, pero espero que se solucione pronto.

Algunos hermosos momentos del juego del participante del campeonato:


Estoy esperando comentarios en los comentarios sobre el artículo, en qué pensar con más detalle.
En el próximo artículo trataré de describir métodos para predecir el comportamiento de la pelota a tiempo para un juego de bots más significativo en tu estrategia.

Mientras tanto, ¡felicidades por el próximo año nuevo 2019!

Continuará

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


All Articles