Vamos a jugar Kick The Can!
Aunque Moogie es el ganador actual, si alguien puede llevarse su corona, se les recomienda hacerlo.
Kick the can es un juego para niños. Involucrando a un defensor y múltiples atacantes. ¡Hoy ya no es un juego así! ¡Tu trabajo es escribir un bot que lo juegue, para ganar, al estilo del rey de la colina !
https://en.wikipedia.org/wiki/Kick_the_can
Hay algunas diferencias clave en este juego. La primera diferencia clave es que el juego es multijugador (5v5). ¡La segunda diferencia clave es que ambos conjuntos de bots pueden matar y eliminar a los jugadores enemigos con minas y bombas arrojadas! ¡Los bots no pueden ver minas (independientemente de la distancia) o jugadores a más de cinco cuadras de distancia!
El mapa es un laberinto de la siguiente manera.
Este laberinto se genera procesalmente creando primero un laberinto utilizando un algoritmo de retroceso recursivo de profundidad primero. Y luego colocando los agujeros mostrados en (además de hacer que el laberinto sea más "imperfecto". El laberinto mide 65x65 bloques de ancho y está indexado a cero. Por lo tanto, la bandera azul (can) está en 1,1 y la bandera roja (can) es en 63,63 El equipo azul se genera en 2,2 y 3,3 4,4 etc. El equipo rojo se genera en 62,62 y 61,61, 60,60 etc. Los bloques en cian son bots en el equipo azul, y los bloques en magenta son bots rojos. El juego es siempre cinco contra cinco. Cada bot del equipo usará su código (pero puede almacenar otras variables de instancia (o crear archivos locales) para realizar un seguimiento del estado y diferenciar los roles).
Como se Juega
Las minas se pueden colocar como se puede ver en gris. Y se pueden lanzar bombas a una distancia máxima de hasta cuatro bloques. Estos viajan por hasta cuatro bloques a través de paredes y otros jugadores matando solo a los enemigos que se interponen en tu camino. Después de cada paso tienen un 40% de posibilidades de caerse. Por lo tanto, tienen una probabilidad del 100% de 1 rango 60% en 2 rango 36% en 3 rango y 21.6% en tres rango Colocar una mina o lanzar una bomba requiere munición de un equipo. Esto comienza en 0 y se puede aumentar recogiendo los cuadros naranjas. Tenga en cuenta que cuatro (4) de estos depósitos de munición estarán convenientemente centrados. Los Bots están alineados en una serie de dos rojos y dos azules. IE RRRRRBBBBB. Está permitido vigilar la bandera, pero tenga en cuenta que estar cerca de la bandera (es decir, menos de cinco bloques) resulta en lentitud y solo permite el movimiento. cada tres turnos La Arena elige un iniciador aleatorio para cada turno. YO.
Objetivo
Programe sus cinco bots (cada uno tiene el mismo archivo de clase) para navegar con éxito por el laberinto y tocar la lata opuesta, teniendo cuidado de no golpear accidentalmente la propia lata o pisar una mina.
Programación
Las entradas de arena y bot están actualmente en Java, sin embargo, existe un contenedor stdin / out para otros idiomas.
El código de arena estará disponible, pero aquí están los detalles relevantes.
Clase bot
public class YourUniqueBotName extends Bot{
public YourUniqueBotName(int x , int y, int team){
super(x,y,team);
//optional code
}
public Move move(){//todo implement this method
//it should output a Move();
//A move has two paramaters
//direction is from 0 - 3 as such
// 3
// 2-I-0
// 1
// a direction of 4 or higher means a no-op (i.e stay still)
//And a MoveType. This movetype can be
//MoveType.Throw
//MoveType.Mine
//MoveType.Defuse defuse any mine present in the direction given
//MoveType.Move
}
}
Métodos clave disponibles
Tenga en cuenta que el uso de cualquier técnica para modificar o acceder a datos a los que generalmente no debería tener acceso no está permitido y dará lugar a la descalificación.
Arena.getAmmo()[team];//returns the shared ammo cache of your team
Arena.getMap();//returns an integer[] representing the map. Be careful since all enemies more than 5 blocks away (straight line distance) and all mines are replaced with constant for spaces
//constants for each block type are provided such as Bot.space Bot.wall Bot.mine Bot.redTeam Bot.blueTeam Bot.redFlag Bot.blueFlag
Arena.getAliveBots();//returns the number of bots left
getX();//returns a zero indexed x coordinate you may directly look at (but not change X)
getY();//returns a zero indexed y coordinate (y would work to, but do not change y's value)
//Although some state variables are public please do not cheat by accessing modifying these
Especificación de interfaz del contenedor StdIn / Out
La interfaz consta de dos modos: inicialización y ejecución.
Durante el modo de inicialización, se envía una única trama INIT a través de stdout. La especificación de este marco es la siguiente:
INIT
{Team Membership Id}
{Game Map}
TINI
Donde: {Team Membership Id} es un solo personaje: R o B. B significa equipo azul, R significa equipo rojo.
{Game Map} es una serie de filas de caracteres ascii que representan una fila del mapa. Los siguientes caracteres ASCII son válidos: F = bandera azul G = bandera roja O = espacio abierto W = pared
El juego luego procederá a enviar marcos de juego sobre stdout a cada bot de la siguiente manera:
FRAME
{Ammo}
{Alive Bot Count}
{Bot X},{Bot Y}
{Local Map}
EMARF
Dónde:
{Munición} es una cadena de dígitos, el valor será 0 o mayor {Alive Bot Count} es una cadena de dígitos, el valor será 0 o mayor {Box X} es una cadena de dígitos que representa la coordenada X del bot en el mapa del juego. El valor será 0 <= X <Ancho del mapa. {Box Y} es una cadena de dígitos que representa la coordenada Y del bot en el mapa del juego. El valor será 0 <= Y <Altura del mapa. {Mapa local} es una serie de filas de caracteres ascii que representan el mapa completo que rodea al bot. Los siguientes caracteres ASCII son válidos: F = bandera azul G = bandera roja O = espacio abierto W = pared R = equipo rojo bot B = equipo azul bot M = mina A = munición
El Controlador espera que su bot genere una respuesta de línea única en el formato:
{Action},{Direction}
Dónde:
{Acción} es uno de: Move Defuse Mine Throw
{Dirección} es un solo dígito entre 0 y 4 inclusive. (ver información de dirección anteriormente)
NOTA: todas las cadenas estarán delimitadas por \ n carácter de fin de línea.Este será un torneo de eliminación. Mis robots de muestra participarán como rellenos, pero no me otorgaré la victoria. En el caso de una victoria de uno de mis bots, el título va para el segundo miembro y continuará hasta que haya un bot que no sea mío. Cada partido consta de 11 rondas de patear la lata. Si ninguno de los equipos ha ganado un solo partido, entonces ambos serán eliminados. Si hay un empate que no sea cero, se jugará un partido de desempate. Si queda un empate, ambos son eliminados. Las rondas posteriores pueden consistir en más partidos. La distribución del torneo se basará en el número de votos al 31/07/16 (fecha sujeta a cambios).
Cada partido dura 4096 turnos. Una victoria otorga un punto. Un empate o pérdida otorga cero puntos. ¡Buena suerte!
Siéntase libre de mirar el código o criticarlo en este repositorio de GitHub.
https://github.com/rjhunjhunwala/BotCTF/blob/master/src/botctf/Arena.java
Tenga en cuenta que no tengo intérpretes para demasiados idiomas en mi computadora, y es posible que necesite voluntarios para ejecutar la simulación en su computadora. O puedo descargar el intérprete de idiomas. Por favor, asegúrese de que sus bots.
- Responda en un tiempo razonable (digamos 250 ms)
- No dañará mi máquina host
fuente
Respuestas:
NavPointBot, Java 8
El bot es blanco / azul
Este bot nomina a un líder de bots amigos cada cuadro que luego asignará puntos de navegación para que cada bot navegue.
Inicialmente, todos los bots están en servicio de búsqueda de depósito de munición, luego se asignan dos bots como guardias y el resto busca munición y luego ataca la bandera enemiga.
He descubierto que el juego depende mucho de la ubicación inicial de los depósitos. Como tal, realmente no puedo decir que este bot sea mejor que cualquier otro.
Corre con
java NavPointBot
fuente
Pathfinder optimizado JAVA
Gracias a @Moogie por ayudarme a optimizar mi desordenado camino de inundación. Aquí está la fuente del bot. Este tipo sabe lo importante que es defender su bandera. Aloca a tres defensores y dos atacantes. Los defensores retroceden y defienden / recogen munición, los dos atacantes toman un camino (bastante recto) hacia la bandera (y recogen la munición en el medio). Él dispara a cualquiera que ve, y debería ser una competencia feroz. Los defensores colocan minas alrededor de la bandera y acampan hasta que no quede oposición para que puedan ir y patear la lata.
fuente