Você provavelmente conhece o Jogo da Vida de Conway , o famoso autômato celular inventado pelo matemático John Conway. A vida é um conjunto de regras que, juntas, permitem simular uma placa bidimensional de células. As regras decidem quais células no quadro vivem e quais morrem. Com alguma imaginação, você poderia dizer que Life é um jogo de zero jogadores: um jogo com o objetivo de encontrar padrões com comportamentos interessantes, como o famoso planador.
Um jogo de zero jogadores ... Até hoje. Você deve escrever um programa que jogue o Jogo da Vida - e jogue para vencer, no estilo King of the Hill. Seu oponente (singular), é claro, tenta fazer o mesmo. O vencedor é o último bot com células vivas ou o jogador com mais células vivas após 10000 gerações.
Regras do jogo
As regras são quase as mesmas da vida normal (B3 / S23):
- Uma célula viva com menos de dois vizinhos amigos morre de fome.
- Uma célula viva com dois ou três vizinhos amigos sobrevive.
- Uma célula viva com mais de três vizinhos amigos morre de superpopulação.
- Uma célula morta com exatamente três vizinhos do mesmo jogador ganha vida para lutar por esse jogador, desde que não haja vizinhos inimigos .
... mas após cada geração, você e seu oponente têm a oportunidade de intervir. Você pode acordar até um máximo de 30 células para lutar por você. (Quem vai primeiro é decidido pelo servidor.)
O quadro é um quadrado de células (x, y). Todos os quadrados estão inicialmente mortos. As bordas não se enrolam (não é um mundo em forma de toro) e estão permanentemente mortas.
Este é um concurso no espírito de Battlebots e Core Wars . Existe um servidor central que irá executar bots e pode ser encontrado aqui
Protocolo
O servidor arena fala um protocolo JSON simples comunicado através do argv
Onde Valores é uma sequência codificada em JSON
y_size
: o máximo de y cordões de peças antes que desapareçamx_size
: o máximo x cordões de peças antes que desapareçamtick_id
: o número atual do tickboard
: um dicionário com chaves no formato '(y, x)' e valores no formatobot_id
(int)bot_id
: as peças no quadro com esse ID são suas
Exemplo:
{"y_size":2000,"x_size":2000,"board":{},"bot_id":1,"tick_id":1}
Dizendo ao servidor sua escolha:
- Envie ao servidor uma lista de peças para mudar para a sua cor.
- Somente aqueles que estão vazios serão alterados
- Formato de lista de cordas aninhadas
[[0,0], [0,1], [100,22]...]
NOTA: Seu bot não precisa atualizar os blocos - o servidor faz a atualização por si só
Regras da competição
- Se sua implementação falhar em seguir o protocolo, a sua vez será perdida; O servidor não assumirá nenhuma mudança de estado
- Você não tem o direito de tirar proveito de uma falha no servidor da arena.
- Faça sua IA decidir sobre os movimentos em um momento são. Envie sua próxima jogada o mais rápido possível.
- Por fim, seja gentil com o servidor. Está lá para sua diversão.
- Não seguir estas regras pode levar à desqualificação.
- Em caso de empate, os dois jogadores têm 1 vitória adicionada ao total
Executando o controlador você mesmo
A fonte do controlador pode ser encontrada aqui . Existem 2 maneiras de executar o controlador:
- Modo de competição (terminal)
- Setup with
python3 get_answers.py
- Execute uma competição all v all com cada bot colocando-o um contra o outro.
- Setup with
- Modo de teste (GUI)
- Corre
python3 nice_gui.py
- Clique
Pull Answers
- Se você quiser adicionar sua própria resposta para experimentá-la antes de postar, clique
File -> Add manual answer
e encontre o arquivo e escolha o idioma em que está escrito. - Se o seu idioma não estiver presente, envie-me um ping e tentarei instalá-lo no servidor em que o executarei (as instruções de instalação e execução também serão boas!)
- Escolha 2 bots para jogar um contra o outro
- Clique
Run
- Assista o jogo...
- Corre
- Instalação
- Requer python3
- get_answers requer bs4 e html5lib
- O controlador requer uma maneira de executar arquivos .sh (MinGW no Windows)
Pontuação
O bot com mais vitórias a partir de 12/07/2016
(12 de julho)14/07/2016
(14 de julho, não conseguia descobrir como executar um bot) vence.
Ajuda com o controlador / GUI pode ser solicitada nesta sala de bate-papo
Esta pergunta está em desenvolvimento desde 2014 e foi a pergunta mais votada na sandbox. Agradecimentos especiais a Wander Nauta (autor e conceito original), PPCG Chat (comentários e ajuda) e a qualquer pessoa que tenha comentado na caixa de areia (mais comentários).
Respostas:
Python 3, Exploder
Coloca pequenos explosivos ao redor do local, sem levar em conta se já existe um bloco lá.
fonte
Ruby, InterruptingBlockMaker
Em vez de inicializar planadores como o TrainingBot, ele tenta criar uma máquina de troca de blocos 5x5, como mencionado na Wikipedia, em um ponto aleatório no labirinto. Então, com as ativações restantes, ele apenas encontra pontos inimigos e tenta apimentar a área próxima com suas células, na tentativa de impedi-los de crescer e possivelmente atrapalhar seus padrões. Suas células morrerão na próxima geração, mas talvez elas também parem um pouco de crescimento para desacelerar seu oponente!
v2: Otimizado ligeiramente (?) para tentar minimizar o tempo limite.
v3: Código de interrupção otimizado para pré-amostrar um subconjunto de blocos ativos antes de rejeitar nossas próprias localizações de células, para evitar tempos limite ainda mais com o custo de alguma eficácia nos ataques de interrupção de células.
fonte
bot_score
mostram quantas vitórias cada bot tem contra outros bots #Python 2, TrainingBot
Porque todo mundo precisa de um desses!
fonte
Java, Troll Bot
Troll Bot pensou nisso, e ele percebe que NÃO se importa com o inimigo. Na verdade, ele apenas usa essas fábricas para produzir mais de seus homens aleatoriamente em todo o mapa. Depois de um tempo, ele percebeu que qualquer célula adicional é melhor usada em aglomerados. Esses blocos de quatro células irão se unir e parar planadores em suas trilhas! Ele não acha que apenas briga. Ele também é um grande defensor da programação detalhada de objetos. O troll também assume que as cordas estão no formato y, x, e ele está pedindo para ser testado. Basta colocá-lo em um arquivo chamado "TrollBot.java" e ele estará pronto!
fonte
Python 3, RandomBot
Esse bot tem problemas para tomar decisões inteligentes, mas pelo menos sabe não tentar colocar as coisas em cima de outras. Criará aleatoriamente planadores, barcos, C / 2 Orthagonal s e blocos 2x2 com várias orientações, garantindo que, quando colocados, não se sobreponham a algo mais, aliado ou inimigo.
Este bot não foi testado, pois estou recebendo todos os tipos de erros quando tento executar a GUI. Além disso, usei o TrainingBot como base e apenas editei, portanto, qualquer semelhança no código provavelmente é por causa disso.
fonte
print(sys.argv[1])
linha 3, que atrapalha a saída (o simulador espera apenas a sequência de coordenadas que você deseja ativar). Além disso, a última linha do seu programa está faltando um ponto final.html5lib
, depois não encontrar a pasta que contém todos os bots (eu tive que alterar o código para ambos) e, desde então, a execução de qualquer bot Python resultou em um código de retorno diferente de 0 1.Python, GuyWithAGun
Ele é um cara, ele tem uma arma; ele é louco. Ele apenas despeja armas de planador em todos os lugares, sem considerar o que os outros estão fazendo
fonte
Python 3, SquareBot
Coloca quadrados em todos os lugares - talvez
Quadrados são objetos estáticos na Vida - eles não se movem. Portanto, se eu colocar objetos inertes suficientes ao redor do local, os planadores e explosões que outros criam poderão ser bloqueados ou pelo menos umedecidos.
-Adaptado do TrainingBot
Embora eu esteja tendo problemas para testá-lo
fonte