aBOTcalypse
Projete um bot para competir em um desafio do tipo Rei da Colina! Aqui está uma repetição de um jogo de bot padrão.
O tabuleiro é 2D, como um videogame com rolagem lateral (mas sem rolagem).
Um bot válido deve aceitar uma representação de cadeia de linhas múltiplas da região do quadro que pode ver e gerar uma movimentação para o bot.
Mecânica
Este é um jogo de sobrevivência. O apocalipse chegou, e apenas robôs (e um suprimento infinito de rochas armazenadas no espaço do martelo ) permanecem. Cada bot recebe um local inicial aleatório, na elevação 0. Em um determinado movimento, um bot pode descansar, se mover, atirar uma pedra ou soltar uma pedra. Os bots podem dividir espaço com rochas estacionárias, mas um bot que colide com outro bot ou um meteoro é morto, assim como um bot atingido por uma pedra lançada.
- Gravidade: bots e pedras devem repousar sobre o chão do tabuleiro ou sobre outra pedra; descansar em outra coisa (ar, meteoro, bot, etc.) deixa um "sem suporte". Bots ou rochas não suportados cairão até serem suportados; uma queda maior que um espaço matará um bot, e um bot debaixo de uma pedra ou bot caindo também é morto. Isso significa que tentar mover ou soltar só funcionará se o bot estiver atualmente compartilhando um espaço com uma rocha (caso contrário, o bot / rock voltará a cair 1 espaço). Um espaço pode se tornar "não suportado" se a rocha abaixo dele cair ou for destruída por um meteoro ou projétil .
- Meteoros: A cada turno, um meteoro entra no tabuleiro de cima. Um meteoro tem uma velocidade de magnitude 2, com um ângulo aleatório escolhido uniformemente no intervalo [-180,0] e uma posição x inicial aleatória. Os meteoros caem em uma linha reta ao longo da trajetória determinada até atingirem algo, momento em que desaparecem. Observe que o arredondamento no movimento de um meteoro é na direção de 0 (conforme o de python
int()
). - Projéteis: Um bot pode escolher atirar uma pedra a qualquer distância até sua elevação. Uma pedra jogada se move em linha reta até atingir algo (tudo em um turno, diferente de um meteoro; pedras lançadas não aparecem no tabuleiro), em uma inclinação de
- elevation / max distance
. Observe que as rochas lançadas começam sua trajetória em x + - 1 quadrado. Por exemplo, se um bot está a uma altitude de 5 e joga à esquerda a uma distância de 1, a rocha começará em(x-1,5)
e terminará em(x-2,0)
. A colisão é verificada apenas nas etapas dedx=1
edy
é arredondada para 0 (conforme o pythonint()
).
Entrada
Cada bot pode ver um quadrado de 20 pixels em cada direção (distância de Chebyshev = 20), até os limites do quadro. Existem 8 caracteres diferentes em cada sequência de entrada:
'#'
(limite do quadro)'.'
(ar)'@
'(meteoro)'&'
(Rocha)'e'
/'s'
(um bot inimigo, ou ele próprio)'E'
/'S'
(um bot inimigo, ou ele próprio, compartilhando um espaço com uma rocha)
Aqui está um exemplo de entrada (quebras de linha serão \n
):
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............@...............#
.....................E........#
.....................&........#
.....................&........#
.....................&........#
.....................&........#
...........@.........&........#
....................s&........#
###############################
Resultado
Existem quatro ações que um bot pode executar a cada turno.
rest
(literalmente sente-se e não faça nada)move <direction>
move o espaço um bot em qualquer uma das quatro direcções,up
,down
,left
, ouright
. O movimento faz com que o bot caia se o novo espaço não for suportado pelo chão ou por uma rocha (fall > 1 = bot.kill()
).drop <direction>
coloca ("cai") uma pedra na direção indicada. Soltar uma pedra (colocando uma pedra no quadrado[bot_x, bot_y+1]
) ou para o lado faz com que ela caia até ficar apoiada (possivelmente caindo durante o botdrop up
).drop down
coloca uma pedra na mesma posição que o bot, se já não houver uma pedra.throw <direction> <distance>
lança uma pedra de acordo com a mecânica dos "projéteis" acima, com a distância máxima indicada. A distância máxima é irrelevante para arremessar para cima ou para baixo - o projétil colide com o quadrado abaixo (paradown
) ou tenta colidir com o quadrado acima (paraup
) e depois com o quadrado do bot se não atingir nada (matá-lo) .
Um bot no concurso deve gerar uma sequência escalar com sua ação ao receber a sequência de entrada.
Interface
Um bot deve consistir em um único programa que pode ser chamado via python 2 subprocess
. Quaisquer comandos devem ser indicados e serão salvos em um arquivo chamado command.txt
; antes de um jogo começar, o controlador executará cada comando em command.txt
ordem e, em seguida, o comando final será usado para passar a entrada para o bot a partir de então.
Um bot pode ter um único arquivo de armazenamento chamado storage.txt
em sua pasta; o bot "Default Thrower" mostra um exemplo de implementação, usando json para salvar seu estado durante várias voltas. Além disso, sinta-se à vontade para incluir a saída de depuração em somente gravação errlog.txt
, que transmitirei caso seu bot falhe durante uma execução. Certificarei-me de executar vários testes com cada bot, para tentar encontrar erros antes.
Pontuação
A pontuação total de um bot é igual ao número de turnos em que sobrevive, acumulados em X jogos de duração máxima Y. No momento X,Y = 10, 500
,; se os bots durarem muito, aumentarei Y e, se durarem pouco, aumentarei X.
O código do controlador é encontrado em controller.py ; muito obrigado a Nathan Merrill por seu DDOS koth, do qual adaptei o código do Communicator.
&&&\n&S&\n###
? Eles seriam invulneráveis a meteoros caindo.