Este jogo do rei da colina é um jogo de estratégia no qual você deve jogar um balão de água e evitar ser atingido pela água. O objetivo é obter o maior número de pontos. Você receberá um mapa do campo e a localização do balão de água. Você pode retornar que deseja bater no balão de água (se estiver próximo o suficiente) em uma determinada direção ou que deseja se mover em uma determinada direção.
Especificamente: O balão de água começará com (0, 0)
30 unidades de altura e cairá. Se o balão de água atingir o chão, um jogador será escolhido aleatoriamente para perder 4 pontos, dando mais peso àqueles que estão mais próximos do balão. Além disso, o jogador que acertar o balão pela última vez ganhará 3 pontos. Portanto, se você acertar o balão para baixo, provavelmente perderá 1 ponto.
Você escreverá uma classe que se estende Player
. Você é obrigado a implementar o construtor. O construtor será parecido com:
public Player1() {
super(/* Some numbers */ 3, 3, 4)
}
Esses números são double
s. O primeiro número representa a velocidade do jogador, o segundo representa força e o terceiro representa sorte. Os números devem somar 10 ou menos e nenhum número pode ser menor ou igual a zero.
Segundo, você deve implementar o move
método. Este é um move
método de exemplo :
@Override
protected Action move(Map<Player, Point2D> map, Balloon b) {
// Get my own location
Point2D myself = map.get(this);
// If I'm close enough to the balloon
// then hit the balloon
if (myself.distanceSq(b.getLocation()) <= 16) {
double d = (r.nextDouble() - 0.5) * 3;
// Random y direction, z direction is what's left
return new Hit(0, d, Math.sqrt(9 - d*d));
} else {
double diffX = b.getLocation().getX() - myself.getX(),
diffY = b.getLocation().getY() - myself.getY();
// Move towards the balloon
return new Movement(Math.signum(diffX)*3/Math.sqrt(2), Math.signum(diffY)*3/Math.sqrt(2));
}
}
Há várias coisas importantes aqui. Primeiro, observe que o campo é passado como a Map<Player, Point2D>
. O campo é infinito - não há limite para o quão longe você pode ir. Não é uma matriz bidimensional ou algo assim. Além disso, isso significa que você terá coordenadas não inteiras como sua localização. Isso está perfeitamente bem.
Outra consequência é que os jogadores e o balão podem se sobrepor. De fato, dois jogadores podem estar exatamente no mesmo local!
O balão tem uma certa velocidade e direção. Em geral, ele cairá a uma taxa de 3 unidades / etapa. Ele também se move em uma x
direção e y
direção. Ao retornar a Hit
, você passa pelas direções x, ye z que estão pressionando o balão. Você não pode bater um balão cuja altura é superior a 10 ou cuja distância de você (apenas em duas dimensões) é maior do que 4. Além disso, se é verdade que x^2 + y^2 + z^2 > s^2
onde s
é a sua força, e x
, y
e z
são as direções que você atingidas , sua ação é descartada. A força do seu acerto é amplificada por um número aleatório entre 0
e luck
(o que significa que pode diminuir se a sua sorte estiver baixa).
Da mesma forma, você pode retornar a Movement
com as coordenadas x
e y
que você está movendo (observe que você não pode pular no ar). Se a sua velocidade estiver x^2 + y^2 > s^2
onde s
, sua ação será descartada.
Se o balão de água atinge o chão, um jogador aleatório é escolhido, com mais peso dado aos que estão mais próximos - mas menos peso aos que têm mais sorte. O jogador escolhido perde 4 pontos.
Controlador: https://github.com/prakol16/water-balloon-wars/tree/master
O jogo dura 1000 etapas. No final, haverá um arquivo chamado log.out
. Copie e cole os dados neste violino para visualizar o jogo: https://jsfiddle.net/prankol57/s2x776dt/embedded/result/
Ou melhor ainda, veja-o em 3D: http://www.brianmacintosh.com/waterballoonwars (graças ao BMac)
O jogador com a maior soma de pontuações após 100 (pode ser mais, mas não menos) jogos vence.
Se você deseja enviar uma solução, leia os detalhes realmente específicos em https://github.com/prakol16/water-balloon-wars/tree/master .
Editar 3/8 :
Essas são as pontuações finais no momento (1000 iterações, sem incluir os jogadores 1 e 2). Se você editar sua postagem, poderá comentar, e eu refiz a pontuação:
{
class players.BackAndForth=-75.343,
class players.Hydrophobe=-0.800,
class players.KeepAway=-53.064,
class players.Weakling=39.432,
class players.Repeller=21.238,
class players.LuckyLoser=-30.055,
class players.AngryPenguin=-49.310
}
O vencedor ficou Weakling
com uma média de 39 pontos. O 2º lugar ficou Repeller
com 21 pontos.
fonte
speed
estrength
no construtor Player.dirX
,dirY
edirZ
(amplificado por sua sorte) são simplesmente adicionados para as velocidades do balão. Se várias pessoas atingi-lo (pouco provável), então o jogador que pode conseguir os três pontos é decidido na sorte (ver detalhes específicos)Respostas:
Simulador
Espero que esteja tudo bem, já que não é realmente uma entrada. Gostei muito da ideia do simulador visual e queria criar o meu próprio que tornasse um pouco mais fácil ver tudo de uma só vez (3D completo).
28/2 9:06 PST : atualização com controles a seguir, cores
04/4 8:47 PST : atualize com um controle deslizante para velocidade de simulação e faça com que o início de um novo jogo funcione sem atualizar a página (use Ctrl-F5 para recarregar o script em cache)
Visualizador Online ThreeJS
fonte
Vai e volta
Esse bot tenta se aproximar e acertar o balão até sua altura estar muito baixa e tentar fugir.
fonte
AngryPenguin
Este pinguim está com raiva porque ele não pode voar até o balão, então ele tenta acertar o balão na cara das pessoas ao seu redor.
fonte
Fraco
Este bot só pode tocar o balão, pois é tão fraco, em vez disso, depende apenas de sua alta sorte. Portanto, ele tem desempenho semelhante ao LuckyLoser (do qual esse bot é inspirado).
Ele parece executar todos os bots atuais, incluindo Repeller.
EDIT: velocidade reduzida em favor da sorte
fonte
Hydrophobe
Este é um dos bot mais simples possível, mas como é competitivo eu o publicarei.
Estratégia: bem ... esse bots odeia água e desaparece.
Como o bot será espirrado muito raramente, ele pontuará um pouco abaixo de 0 pontos em média. A soma das pontuações de todos os bots é -1 * [balão atingindo o solo], portanto o Hydrophobe provavelmente terá uma pontuação acima da média.
fonte
Mantenha-se afastado
Este jogador persegue o balão desde que sua altura seja> 2. Assim que consegue atingi-lo, ele bate no balão para longe do jogador mais próximo. Quando a altura do balão é <2, este jogador foge.
Editar: eu estava jogando com o Player1 e o Player2 incluídos. Esse jogador ganha nesse caso, mas perde quando eu o tiro. Booooo.
fonte
Perdedor sortudo
Este bot depende de sua pontuação de alta sorte. Se não estiver perto do balão, ele corre em direção ao balão. Uma vez perto do balão, se houver pelo menos 2 outros jogadores no alcance do balão, ele o arremessará no chão. Caso contrário, ele vai acertar.
EDIT: Corrigido o erro de movimento que na verdade me fazia fugir, não em direção ao balão> _ <Agora eu corro direto em direção ao balão, se não consigo atingi-lo.
fonte
Repeller
Esse bot conta com apenas um movimento real e é continuar empurrando o balão para longe de si. ou seja, repele o balão.
Parece ter um bom desempenho em relação à atual safra de bots (LuckyLoser, AngryPenguin, Hydrophobe, BackAndForth) quase sempre vencendo. No entanto, Hydrophobe, por inação, está sempre pronto para vencer se todos os outros bots conseguirem uma pontuação negativa: P
fonte