Este juego del rey de la colina es un juego de estrategia en el que debes lanzar alrededor de un globo de agua y evitar que te salpique el agua. El objetivo es obtener la mayor cantidad de puntos. Se le dará un mapa del campo y la ubicación del globo de agua. Puede devolver que desea golpear el globo de agua (si está lo suficientemente cerca) en una determinada dirección o que desea moverse en una determinada dirección.
Específicamente: el globo de agua comenzará a (0, 0)
30 unidades de altura y caerá. Si el globo de agua toca el suelo, se elegirá al jugador al azar para que pierda 4 puntos, y se otorgará más peso a quienes estén más cerca del globo. Además, el jugador que golpeó el globo por última vez ganará 3 puntos. Por lo tanto, si golpeas el globo hacia abajo, lo más probable es que pierdas 1 punto.
Escribirás una clase que se extienda Player
. Debe implementar el constructor. El constructor se verá así:
public Player1() {
super(/* Some numbers */ 3, 3, 4)
}
Estos números son double
s. El primer número representa la velocidad del jugador, el segundo representa la fuerza y el tercero representa la suerte. Los números deben sumar 10 o menos y ningún número puede ser menor o igual a cero.
En segundo lugar, debe implementar el move
método. Este es un move
método de ejemplo :
@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));
}
}
Hay una serie de cosas importantes aquí. Primero, observe que el campo se pasa como a Map<Player, Point2D>
. El campo es infinito: no hay límite de cuán lejos puede llegar. No es una matriz bidimensional ni nada por el estilo. Además, esto significa que tendrá coordenadas no enteras como su ubicación. Esto está perfectamente bien.
Otra consecuencia es que los jugadores y el globo pueden superponerse. De hecho, ¡dos jugadores pueden estar exactamente en la misma ubicación!
El globo tiene una cierta velocidad y dirección. En general, caerá a una velocidad de 3 unidades / paso. También se mueve en una x
dirección y y
dirección. Cuando regresas a Hit
, pasas las direcciones x, y y z en las que estás empujando el globo. No se puede golpear un globo cuya altura es superior a 10 o cuya distancia de usted (sólo en dos dimensiones) es superior a 4. Además, si bien es cierto que x^2 + y^2 + z^2 > s^2
cuando s
es su fuerza, y x
, y
y z
son las direcciones que alcanze , tu acción se descarta. La fuerza de tu golpe se amplifica con un número aleatorio entre 0
y luck
(lo que significa que podría disminuir si tu suerte es baja).
Del mismo modo, puede devolver a Movement
con las coordenadas x
y y
que está moviendo (tenga en cuenta que no puede saltar en el aire). Si x^2 + y^2 > s^2
dónde s
está tu velocidad, tu acción se descarta.
Si el globo de agua toca el suelo, se elige un jugador aleatorio, con más peso para los que están más cerca, pero menos peso para los que tienen más suerte. El jugador elegido pierde 4 puntos.
Controlador: https://github.com/prakol16/water-balloon-wars/tree/master
El juego dura 1000 pasos. Al final, habrá un archivo llamado log.out
. Copie y pegue los datos en este violín para ver el juego: https://jsfiddle.net/prankol57/s2x776dt/embedded/result/
O incluso mejor, verlo en 3D: http://www.brianmacintosh.com/waterballoonwars (gracias a BMac)
El jugador con la suma más alta de puntajes después de 100 (puede ser más, pero no menos) juegos gana.
Si desea enviar una solución, puede leer los detalles realmente específicos en https://github.com/prakol16/water-balloon-wars/tree/master .
Editar 3/8 :
Estos son los puntajes finales por ahora (1000 iteraciones, sin incluir a los jugadores 1 y 2). Si edita su publicación, puede comentar y rehaceré las puntuaciones:
{
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
}
El ganador fue Weakling
con un promedio de 39 puntos. El segundo lugar fue Repeller
con 21 puntos.
speed
y strength
en el constructor Player.
dirX
, dirY
y dirZ
(amplificada por su suerte) están simplemente añadido a las velocidades del globo. Si varias personas lo golpean (algo poco probable), entonces el jugador que podría obtener tres puntos se decide por suerte (ver detalles específicos)