Este é um desafio do Rei da Colina em um round robin. É uma batalha para encontrar o melhor atirador do oeste!
Para poder competir neste concurso, você precisa fazer duas funções. O primeiro define os atributos do seu atirador e o segundo é a principal função lógica do atirador.
Função de Atributo
function () {
var bot = {
name: "testBot",
numbOfBullets: 7,
reloadSpeed: 1,
shotsPerTurn: 1,
moveSpeed: 2
}
return bot
}
A função de atributo inclui 5 variáveis que você precisará definir de acordo com algumas regras (com a exceção de name
que pode haver qualquer sequência). Você deve gastar exatamente 15 pontos no seu atirador - homens que não gastam todos os 15 pontos não são elegíveis. Aqui está como os atributos funcionam:
numbOfBullets
- define quantas balas sua arma contém.O valor inicial e mínimo de
numbOfBullets
é 1. Cada marcador adicional custa 1 ponto, com no máximo 16 marcadores com 15 pontos gastos.reloadSpeed
- define quantas voltas o pistoleiro precisa para recarregar a arma depois que ele ficou sem balas.O valor base e máximo é 4, sendo o mínimo 1. Diminuir esse atributo em 1 custa 2 pontos.
shotsPerTurn
- define quantas vezes seu atirador pode atirar em um turno.O valor base e mínimo é 1. Cada aumento de 1 custa 3 pontos, para que você possa ter no máximo 6 tiros por rodada com 15 pontos gastos. Aumentar esse atributo acima
numbOfBullets
é contraproducente, já que você não pode disparar mais balas, então sua arma pode aguentar.moveSpeed
- define quantos espaços seu atirador pode executar em um turno.O valor base e mínimo é 1. Cada aumento de 1 custa 3 pontos, com um máximo de 6 velocidades, com 15 pontos gastos. O atirador pode correr tanto para a esquerda quanto para a direita a cada turno, até o máximo de sua velocidade de movimento. Ele também pode ficar parado, o que lhe dá um bônus (mais sobre isso mais tarde).
A função de exemplo acima tem 6 pontos gastos em marcadores, 6 pontos gastos em velocidade de recarga e 3 pontos gastos em movimento.
Função principal
function main(bulletsLeft, yourShots, enemyShots, yourMovement, enemyMovement) {
var shots = [];
shots.push(Math.floor((Math.random() * 24) + 1));
var move = yourMovement[yourMovement.length - 1] + 2
var play = [];
play.shots = shots;
play.move = move;
play.reload = false;
return play;
}
Parâmetros:
bulletsLeft
, número de balas restantes na sua armayourShots
, essa é uma variedade de matrizes de todas as posições anteriores em que seu atirador disparou.Exemplo para um atirador que pode disparar 1 bala por rodada:
[[12],[4],[22],...]
Exemplo para um atirador que pode disparar 3 tiros por rodada:
[[12,13,14],[11,15,16],[9,14],...]
enemyShots
- o mesmo que acima, mas para o seu inimigoyourMovement
- uma matriz de todas as suas posições de movimento anterioresenemyMovement
, o mesmo que acima, mas para o seu inimigo
O que você precisa retornar:
Você é obrigado a retornar uma variável que possui 3 atributos:
shots
- uma série de números que determinam em que espaço seu atirador dispararámove
- um número único que determina para que espaço o atirador tentará se mover parareload
- um valor verdadeiro / falso com o qual você pode recarregar o atirador
O duelo
O concurso segue um round robin 1 versus 1 sistema. Cada atirador tem 50 tiros contra todos os outros atiradores. Uma rodada dura até que alguém seja atingido por uma bala ou até 66 turnos terem passado (uma vez é quando os dois jogadores disparam).
O atirador pode ganhar 2 pontos matando seu oponente, 1 ponto se ambos morrerem no mesmo turno ou 0 pontos se atingirem o limite de 66 turnos. O campo de disparo tem 24 espaços de largura (1-24 inclusive). Para acertar um jogador e vencer uma rodada, você precisa atirar no mesmo espaço em que ele está atualmente.
Aqui está um guia passo a passo sobre como funciona um duelo. Isso também abrange todos os comandos inválidos e regras especiais:
- No início de cada duelo, ambos os jogadores são colocados no espaço 12 e seus revólveres estão totalmente carregados
- A função principal é chamada e o atirador faz seu primeiro comando de movimento e escolhe onde quer atirar.
- Primeiro os pistoleiros se mudam para seu novo local. Se qualquer entrada inválida for feita no comando mover (posições inferiores a 1 ou superior a 24 ou moverem mais espaços, também serão permitidas) elas permanecerão na mesma posição.
- A próxima recarga é marcada, se você ficou sem balas no turno anterior ou se chamou de recarregar a si próprio, seu atirador entra no ciclo de recarga. Ele está recarregando por quantas vezes você definir seu
reloadSpeed
valor. Se você decidiu ficar parado (retornando o mesmo número inteiro de espaço em que estava antes ou apenas retornando um valor inválido), o contador de recarga diminui por 2 turnos em vez de um. - Agora vem a verificação dos seus valores de tiro, a cada turno, você pode inserir quantos locais de tiro quiser, sempre serão cortados para a quantidade válida real que é determinada por: O número de tiros por turno e o número de balas no seu revólver ( o que for mais baixo). Seu
shotsPerTurn
valor é aumentado em 1 se você decidir ficar parado neste turno, para poder fazer um arremesso extra se decidir ficar parado. Se você estiver no ciclo de recarga, terá 0 disparos. Agora vem o tiroteio real, existem duas maneiras pelas quais isso pode acontecer. Se ambos os pistoleiros tiverem o mesmo status de velocidade de movimento, ambos atirarão ao mesmo tempo e poderão se matar ao mesmo tempo. No caso de terem estatísticas de velocidade de movimento diferentes, o bot com a estatística de velocidade de movimento mais alta começa a atirar primeiro e se ele matar seu oponente, ele vence esta rodada. Se o atirador puder disparar uma ou mais balas em uma rodada, seguirá as mesmas regras acima, exceto em mais ciclos como um exemplo: Digamos que o bot1 tenha 3 marcadores e seja mais rápido e o bot 2 tenha 2 marcadores, seria assim :
Bot1 shoots, Bot2 shoots cycle 1 Bot1 shoots, Bot2 shoots cycle 2 Bot1 shoots cycle 3
Isso teria a mesma aparência se eles tivessem a mesma velocidade de movimento apenas que se agora o Bot1 atingisse o Bot2 no mesmo ciclo, o Bot2 também atingisse o Bot1 e seria um empate.
REGRAS
Primeiro, copio algumas regras da entrada de Calvin's Hobbies que também se aplicam aqui.
Ao declarar uma nova variável JavaScript, você deve usar a palavra-chave var. Isso ocorre porque uma variável declarada sem var se torna global em vez de local, portanto, seria fácil mexer acidentalmente (ou intencionalmente) com o controlador ou se comunicar livremente com outros jogadores. Tem que ficar claro que você não está tentando trapacear.
Ao declarar funções, é melhor usar também a palavra-chave var, ou seja, usar em var f = function(...) {...}
vez de function f(...) {...}.
não sei ao certo por que, mas às vezes parece fazer a diferença.
No seu código, você não pode ...
- tente acessar ou modificar o controlador ou o código de outro jogador.
- tente modificar qualquer coisa incorporada no JavaScript.
- faça consultas na web.
- faça coisas maliciosas.
Minhas regras adicionais:
- Os usuários podem criar quantos pistoleiros quiserem e mudar suas funções por qualquer período de tempo
- Vou remover qualquer entrada do jogo que demore muito ou tente trapacear da maneira que achar melhor
- Os nomes dos atributos que sua função precisa retornar devem ser os mesmos dos exemplos com a mesma estrutura!
Sua resposta deve estar neste formato, a primeira função sendo a função de atributo e a segunda sendo a função lógica. Observe que eu usei um ponto de exclamação porque, se você apenas criar novas linhas entre os blocos de código, o analisador não verá dois blocos de código diferentes; portanto, você precisará usar qualquer símbolo (basta usar um ponto de exclamação) para separá-los:
var bot = {
name: "testBot",
numbOfBullets: 7,
reloadSpeed: 1,
shotsPerTurn: 1,
moveSpeed: 2
}
return bot
var shots = []
var testBot_moveUp = true
if(Math.random() * 2 > 1)
testBot_moveUp = false
shots.push(Math.floor((Math.random() * 24) + 1))
var move = 0
if (testBot_moveUp)
move = yourMovement[yourMovement.length - 1] + 2
else
move = yourMovement[yourMovement.length - 1] - 2
move = 12
var play = []
play.shots = shots
play.move = move
play.reload = false
return play
E aqui está o controlador: GAME CONTROLLER . Basta abrir o link e aguardar o carregamento dos bots, selecionar o que você deseja na luta (provavelmente todos) e pressionar o botão Iniciar.
Eu também coloquei um testbot como minha resposta que competirá, mas também serve como um exemplo de como deve ser a estrutura da resposta. Como observação, se você cometer um pequeno erro e editar sua resposta, o algoritmo stackexchanges poderá não pegá-lo imediatamente e o site que o controlador usa, gerado pelo stackexchange, não será atualizado (mas será mais tarde ou se você fizer alterações maiores, sugiro apenas adicione algum texto no final). Aqui está o site: codelink
<!---->
para separar os bloqueios de código "invisivelmente" (sem o !
).