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.
fuente
speed
ystrength
en el constructor Player.dirX
,dirY
ydirZ
(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)Respuestas:
Simulador
Espero que esto esté bien, ya que en realidad no es una entrada. Realmente me gustó la idea del simulador visual y quería crear el mío para que fuera un poco más fácil ver todo a la vez (3D completo).
2/28 9:06 AM PST : actualización con los siguientes controles, colores
3/4 8:47 AM PST : actualizar con un control deslizante para la velocidad de simulación, y hacer que comenzar un nuevo juego realmente funcione sin actualizar la página (use Ctrl-F5 para volver a cargar el script en caché)
Visualizador de ThreeJS en línea
fuente
De ida y vuelta
Este bot intenta acercarse y golpear el globo hasta que su altura es demasiado baja y trata de escapar.
fuente
AngryPenguin
Este pingüino está enojado porque no puede volar hasta el globo, por lo que intenta golpear el globo en la cara de las personas que lo rodean.
fuente
Alfeñique
Este bot solo puede tocar el globo ya que es muy débil, en cambio solo depende de su gran suerte. Por lo tanto, funciona de manera similar a LuckyLoser (del cual está inspirado este bot).
Parece que supera a todos los bots actuales, incluido Repeller.
EDITAR: velocidad reducida a favor de la suerte
fuente
Hidrófobo
Este es uno de los bot más simples posibles, pero como es competitivo, lo publicaré.
Estrategia: bueno ... este robot odia el agua, así que simplemente desaparece.
Como el bot se salpicará muy raramente, su puntaje será inferior a 0 puntos en promedio La suma de las puntuaciones de todos los bots es -1 * [globo golpeando el suelo], por lo que Hydrophobe probablemente obtendrá una puntuación superior a la media.
fuente
Manténgase alejado
Este jugador persigue el globo siempre que su altura sea> 2. Tan pronto como puede golpear el globo, golpea el globo lejos del jugador más cercano. Cuando la altura del globo es <2, este jugador se escapa.
Editar: estaba jugando con Player1 y Player2 incluidos. Este jugador gana en ese caso, pero pierde cuando los elimino. Booooo
fuente
Lucky Loser
Este bot se basa en su alto puntaje de suerte. Si no está cerca del globo, corre hacia el globo. Una vez cerca del globo, si hay al menos otros 2 jugadores dentro del alcance del globo, lo clavará al suelo. De lo contrario, lo golpeará hacia arriba.
EDITAR: Se corrigió un error de movimiento que realmente me hacía huir no hacia el globo> _ <Ahora solo corro directamente hacia el globo si no puedo golpearlo.
fuente
Repelente
Este bot depende solo tiene un movimiento real y es seguir empujando el globo lejos de sí mismo. es decir, repele el globo.
Parece funcionar bien contra la actual cosecha de bots (LuckyLoser, AngryPenguin, Hydrophobe, BackAndForth) casi siempre ganando. Sin embargo, Hydrophobe, por inacción, siempre está listo para ganar si los otros bots logran obtener una puntuación negativa: P
fuente