Ce jeu du roi de la colline est un jeu de stratégie dans lequel vous devez lancer un ballon d'eau et éviter d'être éclaboussé par l'eau. L'objectif est d'obtenir le plus de points. Vous recevrez une carte du terrain et l'emplacement du ballon d'eau. Vous pouvez soit retourner que vous voulez frapper le ballon d'eau (si vous êtes assez près) dans une certaine direction ou que vous voulez vous déplacer dans une certaine direction.
Plus précisément: le ballon d'eau commencera à (0, 0)
30 unités de haut et baissera. Si le ballon d'eau touche le sol, un joueur sera choisi au hasard pour perdre 4 points, avec plus de poids accordé à ceux qui sont plus proches du ballon. De plus, le joueur qui a touché le ballon pour la dernière fois gagnera 3 points. Par conséquent, si vous frappez le ballon directement vers le bas, vous perdrez probablement 1 point.
Vous écrirez une classe qui s'étend Player
. Vous devez implémenter le constructeur. Le constructeur ressemblera à:
public Player1() {
super(/* Some numbers */ 3, 3, 4)
}
Ces chiffres sont l' double
art. Le premier nombre représente la vitesse du joueur, le second représente la force et le troisième représente la chance. Les nombres doivent totaliser 10 ou moins et aucun nombre ne peut être inférieur ou égal à zéro.
Deuxièmement, vous devez implémenter la move
méthode. Ceci est un exemple de move
méthode:
@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));
}
}
Il y a un certain nombre de choses importantes ici. Tout d'abord, notez que le champ est transmis en tant que Map<Player, Point2D>
. Le champ est infini - il n'y a aucune limite à jusqu'où vous pouvez aller. Ce n'est pas un tableau à 2 dimensions ou quelque chose comme ça. De plus, cela signifie que vous aurez des coordonnées non entières comme emplacement. C'est parfaitement correct.
Une autre conséquence est que les joueurs et le ballon peuvent se chevaucher. En fait, deux joueurs peuvent être exactement au même endroit!
The balloon has a certain velocity and direction. In general, it will fall at a rate of 3 units/step. It also moves in an x
direction and y
direction. When you return a Hit
, you pass the x, y, and z directions that you are pushing the balloon. You cannot hit a balloon whose height is greater than 10 or whose distance from you (only on two dimensions) is greater than 4. In addition, if it is true that x^2 + y^2 + z^2 > s^2
where s
is your strength, and x
, y
, and z
are the directions that you hit, your action is discarded. The force of your hit is amplified by a random number between 0
and luck
(which means it could go down if your luck is low).
De même, vous pouvez renvoyer un Movement
avec les coordonnées x
et y
que vous déplacez (notez que vous ne pouvez pas sauter en l'air). Si x^2 + y^2 > s^2
où s
est votre vitesse, votre action est défaussée.
Si le ballon d'eau touche le sol, un joueur aléatoire est choisi, avec plus de poids accordé à ceux qui sont les plus proches - mais moins de poids à ceux qui ont plus de chance. Le joueur choisi perd 4 points.
Contrôleur: https://github.com/prakol16/water-balloon-wars/tree/master
Le jeu dure 1000 étapes. À la fin, il y aura un fichier appelé log.out
. Copiez et collez les données dans ce violon pour voir le jeu: https://jsfiddle.net/prankol57/s2x776dt/embedded/result/
Ou encore mieux, visualisez-le en 3D: http://www.brianmacintosh.com/waterballoonwars (merci à BMac)
Le joueur avec la somme de scores la plus élevée après 100 parties (peut être plus, mais pas moins) gagne.
Si vous souhaitez soumettre une solution, vous voudrez peut-être lire les détails vraiment spécifiques sur https://github.com/prakol16/water-balloon-wars/tree/master .
Modifier 3/8 :
Ce sont les scores finaux pour l'instant (1000 itérations, sans inclure les joueurs 1 et 2). Si vous modifiez votre message, vous pouvez commenter, et je vais refaire les scores:
{
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
}
Le vainqueur était Weakling
avec une moyenne de 39 points. La deuxième place était Repeller
avec 21 points.
speed
et strength
dans le constructeur Player.
dirX
, dirY
et dirZ
(amplifié par votre chance) sont simplement ajoutés aux vitesses du ballon. Si plusieurs personnes l'atteignent (quelque peu improbable), alors le joueur qui pourrait obtenir trois points est décidé par chance (voir les détails spécifiques)