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.
speed
e strength
no construtor Player.
dirX
, dirY
e dirZ
(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)