Este desafio terminou. Para ver a pontuação final dos competidores, clique aqui
Nesse desafio, cada envio é um bot. Cada bot deve ser uma função Javascript. Bots lutarão para obter o maior valor total em ouro. O ouro pode ser cultivado ou ganho com a morte de outros bots e é usado para melhorar a cura, o ataque, a proteção e a agricultura.
Objetivo:
Em várias rodadas que contêm até 1000 turnos (termina quando resta apenas um bot), o bot com o valor total mais alto (a soma de todo o ouro obtido) é o vencedor.
Voltas:
Em cada turno, todo bot que estiver vivo (> 0 HP) será executado uma vez. Pode retornar uma movimentação, que pode ser uma das seguintes:
- Cura: Recupera HP
- Ataque: Remove HP de outro bot
- Escudo: Defende-se contra ataques posteriores
- Atordoar: Ignora o próximo turno de outro bot
- Fazenda: ganha ouro ao custo da HP
- Atualização: faça certas jogadas melhor
Todos os bots retornarão sua jogada antes que qualquer seja executado, portanto, atordoamento, cura, ataque, escudo etc. não afetarão nenhum bote em movimento mais tarde nesse turno. Por exemplo, se o Bot A atordoa o Bot B, e o Bot B está atrás do Bot A na ordem do turno, o Bot B ainda se moverá mais tarde nesse mesmo turno e o atordoamento ocorrerá no próximo turno.
Combate, agricultura e atualização:
Cada bot tem um HP máximo de 100 e um UID atribuído entre 0 e 99. Esse UID muda após cada rodada e é assim que os bots se controlam.
A cura é um dos movimentos mais simples, adicionando uma quantidade de HP determinada pelo seu nível (começa em 5 HP). Um bot não pode curar mais de 100 HP.
Atacar um bot por seu UID é outro movimento possível, com um dano base de 5 HP no nível 0. Os bots também podem ser atordoados, pulando o próximo turno, que também usa UIDs.
Bots possuem escudo adicional HP, que não tem limite. Este escudo HP absorve dano de ataques diretos de outros bots e é adicionado por blindagem. No nível 0, a blindagem adiciona 5 de HP de escudo.
A agricultura ganhará 5 de ouro no nível 0, ao custo de 2 PV. Este 2 HP não pode ser protegido. O único uso do ouro (além da vitória) é atualizar os movimentos. Cura, ataque e proteção têm um valor base de 5 HP, e a agricultura começa com 5 de ouro. Cada uma dessas jogadas possui níveis individuais, que começam em 0. Essas fórmulas determinarão o valor em HP ou ouro de uma jogada, onde L é o nível:
- Cura:
L + 5
- Atacante:
1.25L + 5
- Blindagem:
1.5L + 5
- Agricultura:
2L + 5
O custo da atualização de qualquer movimento é o mesmo para um determinado nível e é determinado por 2.5L² + 2.5L + 10
onde L é o nível atual. Um bot pode usar a função cost(currentLevel)
como um atalho para determinar isso.
Os bots começam com 25 de ouro, permitindo que eles atualizem rapidamente dois movimentos para o nível 1 ou um para o nível 2. Esse ouro inicial não conta para um valor total de bots. Matar um bot dá a você metade do seu valor total em ouro, arredondado para cima, e se dois bots matam outro no mesmo turno, ambos recebem a recompensa.
Entrada / Saída:
Para se comunicar com o controlador, o valor de retorno da função é usado para enviar informações de movimentação. Um destes deve ser retornado:
- Curar:
heal()
- Ataque:
attack(uid)
- Escudo:
shield()
- Atordoar:
stun(uid)
- Fazenda:
farm()
- Melhorar:
upgrade("heal" / "attack" / "shield" / "farm")
Para pular um turno (não fazer nada), não retornar nada ou retornar um valor falso.
Para obter o número da curva atual (começa em 1), use turn()
.
Os argumentos de sua função incluirão informações sobre seu bot, UIDs de outros bots e armazenamento entre turnos. O primeiro argumento é um objecto com as seguintes propriedades: uid
, hp
, gold
, e shield
. Estas são cópias das informações atuais do seu bot. Há também um objecto aninhada levels
, com os números de nível de heal
, attack
, shield
, e farm
.
O segundo argumento é um conjunto aleatório de todas as outras do que a sua bots vivos, formatado como um objecto contendo propriedades uid
, hp
(mais blindagem), worth
e attack
(nível de ataque). O terceiro argumento é um objeto vazio que pode ser usado para armazenamento entre turnos.
Bots de exemplo:
Este bot irá cultivar até que possa atualizar seu ataque para o nível 5, depois atacará um bot aleatório a cada turno até morrer (ou vencer). Não é muito eficaz devido à falta de cura / blindagem.
function freeTestBotA(me, others, storage) {
if (me.levels.attack < 5) {
if (me.gold < cost(me.levels.attack))
return farm();
return upgrade("attack");
}
return attack(others[0].uid);
}
Este bot tem dois modos: ofensivo e defensivo. Atordoará um bot aleatório ou curará quando estiver no modo defensivo, e atacará ou protegerá quando estiver no modo ofensivo. Ele tentará atualizar seus ataques sempre que possível.
function freeTestBotB(me, others, storage) {
if (me.gold >= cost(me.levels.attack))
return upgrade("attack");
if (me.hp < 50)
if (Math.random() < 0.5)
return stun(others[0].uid);
else
return heal();
else
if (Math.random() < 0.5)
return attack(others[0].uid);
else
return shield();
}
Regras:
- Lacunas padrão proibidas
- Os bots não podem ler, modificar ou adicionar variáveis fora do seu escopo, não podem tentar trapacear e não podem chamar nenhuma função DOM ou definida pelo controlador
- O valor de retorno deve ser falso, ou uma das funções da função acima
- Os bots não devem ser projetados para atingir um bot específico, mas podem ser projetados para tirar proveito de estratégias comuns
- Os bots podem não se atacar (descobertos devido a um comentário de @Ness)
- Os bots devem ser suficientemente diferentes dos outros bots para que possam ser considerados razoavelmente entradas separadas
- Agora, o agrupamento não é permitido
- O controlador pode ser encontrado aqui
- Sala de bate-papo
Nova depuração de controlador:
Usando o arquivo gold-battle-log.js
, você pode definir o valor da debug
propriedade de um bot botData
como 0 (sem registro), 1 (movimentos do log) ou 2 (movimentos do log, hp, ouro, níveis, etc.)
O desafio termina às 1700 UTC na sexta-feira, 9 de agosto
fonte
[closed]
no final, é provável que os espectadores casuais deixem de ler o meu desafio, pois eles assumem que é de baixa qualidade ou fora de tópico.Respostas:
Inábil
bifurcada de Undyable .
Dados os custos exponenciais das atualizações, também podemos melhorar a agricultura se não pudermos melhorar a cura, permitindo que o bot colete ouro com mais eficiência.
fonte
if
declaração for usada<=
- atualmente ele nunca se recuperará completamente.ThanosBot
Existem muitos bots, não há ouro suficiente para circular. Este bot propõe uma solução.
Genocídio, sim, mas aleatório, desapaixonado, justo para ricos e pobres.
Eles o chamavam de louco.
ThanosBot quer o melhor para a comunidade de bot e está disposto a ir todo o caminho. No começo, ele atualizará seu ataque, agricultura e cura, para reunir recursos com mais eficiência e vencer batalhas. Prograssivamente, ele começará a atacar pessoas aleatoriamente enquanto ainda reúne recursos, para as próximas batalhas. Ele continuará melhorando seu exército, suas armas e ele próprio.
Assim que 50% da população for eliminada, os bots nascidos conhecerão apenas a barriga e o céu limpo, ele se retirará para uma vida agrícola e assistirá o sol nascer em um universo agradecido. Ele se tornará completamente pacifista, apenas se curando com sopas de legumes e agricultura.
fonte
Ladrão da Matança
Agora, não apenas rouba mata, mas rouba também mata!
Esse bot não faz muito, exceto a fazenda, e quando percebe a possibilidade, se une para dar o golpe final a um inimigo moribundo e, de alguma forma, consegue ser muito bom.
fonte
O Equalizador
Este bot procura restaurar a paz na comunidade de bot. Ele implacavelmente mira nos bots com o ataque mais alto, desistindo apenas se a cura do bot for melhor que o seu próprio ataque. Uma vez que nenhum robô com cura pior do que seu ataque é deixado, ele se retirará para uma vida de agricultura pacífica.
fonte
Otimista
Supõe que ele será capaz de gastar 80% de seu tempo cultivando pacificamente, então começa maximizando a agricultura e só então começa a prestar atenção em suas habilidades de combate. Certamente nada vai dar errado!
fonte
Kill Assist
Por que atualizar o valor do ataque quando você pode causar dano de plink e ainda obter crédito total?
Mais uma vez voltando às costas do Kill Stealer. Consegui simplificar vários blocos de código em que as declarações sempre eram verdadeiras e mexiam em alguns números que resultavam em ganhos maciços em relação ao original.
Eu tenho que entregá-lo a @dzaima por perceber que atordoar um oponente rico que provavelmente estará envolvido em uma assistência no turn antes que uma matança aconteça é bastante inteligente. Uma das (muito) poucas vezes
Stun()
tem um resultado positivo de soma. Mais uma vez, fui capaz de aprimorar a ideia, pois, sabendo que o Kill Stealer estará executando uma lógica semelhante, o Kill Assist procura um "segundo melhor" alvo (com alguma discrição) e atordoa-os.Atualização menor para evitar atordoar o bot-prestes-a-morrer e evitar atordoar o bot mais provável de matar.
Resultados de amostra (top 5 truncado após 1000 jogos)
fonte
runGame(1) results: [...] captFarmer: 13768
Bot Indyable (v3)
fonte
PatientStrategistBot
Eu tentei escrever um bot que começa a enquadrar e defender conforme necessário e depois muda para matar outros bots de alto valor posteriormente no jogo.
Atualmente, isso parece não funcionar corretamente, pois é morto por uma gangue de assassinos no início do jogo ou fica preso em algum lugar no seu modo ofensivo.
Ainda muito feliz por esse ser meu primeiro código JS, então ... (roubei trechos de código daqui e de lá, porque isso foi mais rápido do que pesquisar todas as sintaxes básicas do JS)
fonte
Suíça
Como o nome sugere, este bot é
neutro,principalmente neutro (agora ajuda a matar bots que vão morrer) e apenas fazendas e cura, lentamente construindo seu ouro (como a Suíça)fonte
O bot que cultiva, ataca, protege e até cura, mas nunca atordoa
(O nome abreviado é TBTFASAEHBNS , não deve ser confundido com TBTPTGCBCBA )
Este bot basicamente:
Editar 1: Corrigido um problema e aprimorado algumas pequenas coisas no bot com base em testes com muitos jogos.
Edit 2: Atualizações de escudo reduzidas.
fonte
SniperBot
Esse bot só será eficaz se alguém começar a adicionar bots que realmente atacam regularmente. SmartFarmer é minha atual solução otimizada
abutres não precisam de um ataque
fonte
int
) na linha 2. ReferenceError: a saúde não está definida.me.hp
?if(me.hp <30 && ...)
pode ser simplificado para apenas a primeira cláusula por precisar de um nível absurdo de cura para que isso importe (lvl 65)BullyDozerBot
Mashup do BullyBot e alguns outros bits. O Optimist tinha um pequeno e doce pedaço de ataque oportunista que eu vinculei (embora outros bots façam cálculos semelhantes).
Em vez de intimidar o alvo atordoando-o, ele o mata por seu doce, doce saque. Ele também tem como alvo os mais fracos no rebanho para o bullying, mas desistirá e continuará a cultivar se o HP do alvo mais fraco for muito alto.
fonte
FizzBuzz
Bot principalmente ofensivo. Extremamente chateado pelo fato de que ele não pode realmente usar o FizzBuzz, apenas vibra com raiva. Quando não é Fizzing ou Zumbido, ele corta outro bot por 30 turnos e desiste e escolhe outro bot para mirar se não estiver progredindo.
Executa extraordinariamente inconsistentemente.Não importa, atualizou o controlador, agora parece estar sempre no meio do pacote.fonte
bullyBot
Experimente online!
Pode não ganhar, mas certamente tentará o máximo possível para garantir que seu alvo também não. O bullyBot também faz agricultura no primeiro turno, para que, se não houver influência externa, ele derrote o alvo por 5-0 ou empate em 5-5.
fonte
JustFarm
Eu pensei que começaria simples.
fonte
ScavengerBot (V2)
Percebeu que não era muito um limpador antes. A nova estratégia é esperar até que ele possa matar outro bot. Se ninguém pode ser morto, ele se senta e constrói um escudo.
fonte
me.levels.attacl
?temperamental
A estratégia padrão da Moody's é atualizar a agricultura e a cura por um tempo e remover os outros bots em ordem decrescente de valor. No entanto, se for atacado, ficará com medo e se concentrará na cura por um tempo. Se atacar e "falhar", porque a vítima estava curando ou protegendo com mais eficácia do que o ataque, ela fica com raiva e sai para melhorar suas habilidades de ataque.
fonte
Bandido
Primeira tentativa de um robô de aprendizado por reforço. Puramente defensivo, por enquanto, para diminuir o espaço de pesquisa. Uma espécie de spinoff mais inteligente do FizzBuzz - ele repete uma série específica de cinco ações repetidas vezes; as cinco ações são as escolhidas pela RL.
Mas, na maioria das vezes, é baseado na enumeração - acabei de gerar todas as permutações de 3 ^ 5 = 243 de séries de cinco ações defensivas que se repetiam repetidamente e armazenava suas pontuações médias (divididas por 200, para obter o ganho médio cinco turnos) mais de 100 iterações na
storage.prior
matriz. Então, durante o jogo, ele implementa uma abordagem gananciosa para atualizar essas listas de pontuação, para que fique mais à prova de futuro. (Também porque o uso do epsilon = 0.3 foi muito melhor que o epsilon = 0.1, eu apenas o mantive.)Está tudo bem, consistentemente colocando entre scavengerBot e Optimist. Atualmente, estou treinando um pouco mais em jogos reais e procurando maneiras melhores de estruturar a estratégia, para ver se posso melhorá-la.
fonte
O Oportunista
Este empresta um pouco de alguns outros (principalmente o ScavengerBot (V2) e o Unkillable), pois eles tinham as mesmas idéias que eu tinha em mente, mas geralmente gosto mais de estilo arredondado e de pau para fora, do que focar apenas em uma ou duas coisas. Isso provavelmente significa que eu não vou ganhar, mas deve estar no meio do caminho (o que acontece comigo na maioria das vezes em muitas coisas).
Por isso, rouba mortes suculentas; cura, se necessário; atualiza fazenda, ataque e cura nessa ordem; e fazendas de outra forma.
fonte
others
ScaredBot
highest attack * (25% of bots)
, ou se chegar perto da extremidade inferiorHP + shield
, ele fará o escudo< 50
, ela cura.A idéia é manter-se vivo o maior tempo possível e, caso contrário, tente conseguir ouro de uma maneira segura e barata para poder atualizar.
As prioridades de atualização provavelmente devem ser ajustadas, bem como a condição ao determinar se deve ser blindado.
fonte
SmartFarmer
Fazendas, melhora a agricultura, cura se a saúde é baixa. A agricultura parecia dominada até que os robôs verdadeiramente ofensivos chegassem. Agora meu bot é morto :-(
fonte
Mort
A cada turno, compara o lucro amortizado de matar cada bot ao da agricultura e da cura e escolhe a melhor opção. Realmente, ele deve usar state para descobrir quanto tempo levará para matar um bot, mas, por enquanto, ele assume que todo bot cura ou protege uma média de 5 pontos por turno, líquido dos danos que outros bots causam.
fonte
Bot amigável
others[0].hp
é emhp + shield
vez dehp
...fonte
O contador
Esse bot prático calcula a jogada economicamente mais benéfica, mas ele gosta de manter o perfil de ataque baixo para evitar problemas de todos os bots vigilantes. Ele não tenta ajudar os indefesos ou atacá-los. Em vez disso, ele faz o que mais o ajuda.
fonte
reallyCommittedTurtle
Aqui está a coisa. Ficou realmente perigoso por aí. Cultivar aumenta o seu valor, fazendo de você um alvo. Portanto, não é realmente seguro cultivar até que você construa um escudo enorme e toda a violência diminua. Então você pode tirar a cabeça da casca e começar a cultivar. Ou ajudar na matança. O que paga melhor.
fonte
Guardião
Eu posso ter mais de uma submissão, certo?
Um garfo do CampBot. Não protege, concentrando-se em atacar. Mostra uma preferência por atacar jogadores com estatísticas de ataque mais altas, em vez de atacar aleatoriamente como o CampBot. Concentra-se em melhorar sua agricultura, em vez de curar.
fonte
let victim=potentialVictims[Math.floor(Math.random()*potentialVictims.length)]
Rando
Esse cara tolo escolherá ações com base na aleatoriedade uniforme com alguns vieses. Se uma ação escolhida aleatoriamente não funcionar, ela será direcionada para a próxima opção.
Então, em média, ele deve atacar quase 2/9 das vezes e cultivar quase 3/9 das vezes. O restante tem cerca de 1/9 de chance se ele puder atualizar, ou se a cura / proteção vale a pena, etc.
Ele provavelmente não terá um bom desempenho, mas pelo menos há uma pequena chance de que ele reine supremo. E esse é o objetivo de Rando. Ele só precisa acreditar em si mesmo! Todas as opções são colocadas na frente dele. Ele precisa apenas escolher o que é necessário para qualquer situação.
(Eu sei que "padrão" é desnecessário, mas acho que é uma boa prática de codificação para código robusto.)
fonte
Kill Bot
Um bot simples, o Kill Bot só quer matar seus inimigos. Como proteger é muito mais eficiente que curar (especialmente quando nivelado), Kill Bot apenas tenta ser sempre um alvo desagradável, protegendo-se sempre que atacado. Kill Bot se sai muito bem entre os robôs fracos e pacifistas por aqui (você pode sentir seu desprezo por eles).
fonte
o.attack
é o nível de ataque, não o danoFarmHeal Bot
Bifurcada de @Anonymous 'JustFarm bot
fonte
Indestrutível
Uma modificação do bot de Draco18, usando escudos (mais eficaz contra outros bots)
fonte