Escassez de alimentos no Snakepit
Pela primeira vez em 35 anos, a serpente está ficando sem comida. As cobras dos habitantes agora precisam lutar entre si para sobreviver a essa escassez de alimentos. Apenas uma cobra pode ficar no topo da cadeia alimentar!
Entre os melhores
Ainda não está aqui!
Última atualização em 24 de fevereiro
Link para visualizações das últimas partidas
Descrição
Se você quer lutar pelas últimas maçãs / cerejas / o que quer que seja, precisa fornecer uma cobra na forma de um programa que aceite uma determinada entrada e retorne seu próximo passo.
A única reviravolta é que você não está sozinho em seu poço. Outra cobra também tentará obter a comida rara! Mas está escuro dentro do poço da serpente, então você só pode ver a si mesmo e a maçã. Colidir com seu oponente resultará em sua morte, assim como morder a si mesmo ou bater em uma parede. Além disso, como as maçãs são raras atualmente, você passa fome se o seu oponente comeu o suficiente para atingir 7.
A serpente é um mapa bidimensional com largura e altura de 15, enquanto os ladrilhos mais externos constroem uma parede intransitável:
0 1 2 . . . c d e
0 # # # # # # # # #
1 # #
2 # x #
. # #
. # #
. # #
c # #
d # #
e # # # # # # # # #
As coordenadas são indexadas a zero, então o ponto onde x
está é 12,2
.
Seu bot será chamado com dois argumentos:
- A localização da comida
- Os locais dos segmentos do seu corpo, separados por
/
Em seguida, ele deve escrever um dos seguintes itens em stdout:
L
por um quarto de volta à esquerda como seu próximo passoR
por um quarto de volta à direita- Qualquer outra coisa para um movimento na mesma direção
Exemplo:
Projects/Snakepit> python bot.py 12,2 4,8/4,9/3,9/2,9
'R'
Projects/Snakepit>
Regras
Seu bot tem permissão para:
- Saída qualquer coisa, porque qualquer coisa é uma jogada válida
- Leia / grave arquivos em seu próprio diretório, localizado em ./snakes/ThisIsYourSnake
- Execute no Ubuntu 14.04 e Windows 7 (ele realmente precisa)
Seu bot não deve:
- Arquivos de leitura / gravação fora de seu próprio diretório
- Use recursos externos, como a Internet
- Ter um tempo de execução acima de 10 segundos por execução
Você deve fornecer na sua resposta:
- O código fonte do bot
- Um nome de bot / cobra
- (Seu próprio nome)
- Um comando para executar seu bot
Se você quiser facilitar minha vida, forneça uma linha como
CoolSnake MyOwnName python bot.py
.
Pontuação
Sua cobra ganha um ponto por ganhar um jogo contra outra cobra. Um jogo é ganho nas seguintes circunstâncias:
- Seu oponente bate em si mesmo, você ou uma parede
- Você atinge o comprimento 7
Além disso, ambas as cobras morrem de fome depois de 200 ciclos.
Cada cobra lutará 10 partidas pela sobrevivência contra a outra.
Bots de exemplo
Só para você ter uma idéia, fornecerei essas duas cobras de exemplo (participantes):
SneakySnake
#!/usr/bin/env python
import sys, random
def main(food, me) :
food = [int(i) for i in food.split(",")]
me = [[int(i) for i in seg.split(",")] for seg in me.split("/")]
head = me[0]
v = [head[0] - me[1][0], head[1] - me[1][1]]
if food[0] < head[0] :
vn = [-1, 0]
elif food[0] > head[0] :
vn = [1, 0]
elif food[0] == head[0] :
if food[1] < head[1] :
vn = [0, -1]
elif food[1] > head[1] :
vn = [0, 1]
if v == vn :
return "..."
elif [-v[1], v[0]] == vn :
return "R"
elif [v[1], -v[0]] == vn :
return "L"
else :
return random.choice(("R", "L"))
if __name__ == "__main__" :
print main(*sys.argv[1:3])
SneakySnake Cipher python bot.py
ViciousViper
#!/usr/bin/env python
import sys, random
def main(food, me) :
food = [int(i) for i in food.split(",")]
me = [[int(i) for i in seg.split(",")] for seg in me.split("/")]
head = me[0]
v = [head[0] - me[1][0], head[1] - me[1][1]]
vn = [food[0] - head[0], food[1] - head[1]]
if 0 not in vn :
vn[v.index(0)-1] = 0
vn[vn.index(0)-1] = vn[vn.index(0)-1] / abs(vn[vn.index(0)-1])
if v == vn :
return "..."
elif [v[0] + vn[0], v[1] + vn[1]] == [0, 0] :
return random.choice(("R", "L"))
else :
return "R" if [-v[1], v[0]] == vn else "L"
if __name__ == "__main__" :
print main(*sys.argv[1:3])
ViciousViper Cipher python bot.py
E os jogos deles:
Programa de controle
Você pode encontrar o programa de controle no github , juntamente com todos os bots e registros de correspondências anteriores.
Requisitos:
- Python 2 + as bibliotecas
numpy
epillow
(você pode verificar se elas estão presentes viapython -c "import numpy, PIL"
, se gera erros, os módulos estão faltando) - É necessário copiar a estrutura completa da pasta para que o controlador funcione
- Registre seus bot (s) no
./snakes/list.txt
arquivo no estilo deCoolSnake MyOwnName Command To Run My Bot
- Coloque seu bot dentro de um diretório com seu nome em
./snakes
- Nem o seu nome nem o do seu bot podem conter espaços em branco!
Uso:
python run.py [-h] [-n int] [-s int] [-l int] [-c int] [-g]
python run.py
irá executar o torneio com todos os bots registrados em list.txt e as propriedades padrão. As opções avançadas são:
-h
exibe uma mensagem de ajuda-n int
rodadas de batalhas para cada combinação de oponentes-s int
determina o tamanho da grade (largura e altura)-l int
define o comprimento necessário para vencer-c int
define o limite de ciclos-g
ou--no-gifs
não cria gifs das correspondências
Respostas:
Zen - C ++
este codémon não está aqui para comer, mas para lutar. Ele sabe que um inimigo morto não roubará suas maçãs.
Name| Author |Launch with
Zen GholGoth21 Zen.exe
Estratégia
Todos (exceto CircleOfLife) correm para as maçãs, mas não Zen, nem sempre. Se o inimigo pode alcançar a comida diante dele, ele simplesmente espera no centro (o quê? Mas o que você está fazendo aqui, CircleOfLife?). Senão, Zen vai até a maçã e se vira enquanto espera que algo aconteça. De fato, ele usa a maçã como isca.
Não codifiquei nada contra a curiosa estratégia do CircleOfLife porque ele só pode vencer com muita sorte.
O código
Este é o código completo do projeto C ++. Corte os 11 arquivos de origem e o Makefile e compile com
make
Ou faça o download do arquivo zip: Zen.zip
Resultados
E algumas batalhas típicas (ViciousViper vs Zen e SneakySnake vs Zen):
Edit : eu adiciono esta batalha muito interessante contra o CircleOfLife:
fonte
CircleOfLife (Java)
CircleOfLife Manu java CircleOfLife
(Compilar comjavac CircleOfLife.java
)Corre para o meio e fica lá. Espero que alguns envios colidam com ele a caminho da comida.
fonte