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.
la source
speed
etstrength
dans le constructeur Player.dirX
,dirY
etdirZ
(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)Réponses:
Simulateur
J'espère que ça va, car ce n'est pas vraiment une entrée. J'ai vraiment aimé l'idée du simulateur visuel et je voulais créer le mien qui permettrait un peu plus facilement de tout voir à la fois (full 3D).
2/28 9:06 AM PST : mise à jour avec contrôles de suivi, couleurs
3/4 8 h 47 HNP : mise à jour avec un curseur pour la vitesse de simulation, et fait fonctionner un nouveau jeu sans rafraîchir la page (utilisez Ctrl-F5 pour recharger le script mis en cache)
Visualiseur ThreeJS en ligne
la source
D'avant en arrière
Ce bot essaie de s'approcher et de frapper le ballon jusqu'à ce que sa hauteur soit trop basse et qu'il essaie de s'éloigner.
la source
AngryPenguin
Ce pingouin est en colère parce qu'il ne peut pas voler jusqu'au ballon, alors il essaie de frapper le ballon face aux gens qui se tiennent autour de lui.
la source
Faible
Ce bot ne peut que toucher le ballon car il est si faible, au lieu de cela, il repose uniquement sur sa grande chance. Il fonctionne donc de manière similaire à LuckyLoser (dont ce bot est inspiré).
Il semble surpasser tous les bots actuels, y compris Repeller.
EDIT: vitesse réduite au profit de la chance
la source
Hydrophobe
C'est l'un des robots les plus simples possibles mais comme il est compétitif, je le posterai.
Stratégie: eh bien ... ces bots détestent l'eau donc ça s'en va.
Comme le bot sera éclaboussé très rarement, il marquera un peu moins de 0 point en moyenne. La somme de tous les scores des bots est de -1 * [ballon atteignant le sol], donc Hydrophobe obtiendra probablement un score supérieur à la moyenne.
la source
Tenir à l'écart
Ce joueur poursuit le ballon tant que sa hauteur est> 2. Dès qu'il peut toucher le ballon, il frappe le ballon loin du joueur le plus proche. Lorsque la hauteur du ballon est <2, ce joueur s'enfuit.
Edit: je jouais avec Player1 et Player2 inclus. Ce joueur gagne dans ce cas, mais perd quand je les retire. Booooo.
la source
Chanceux perdant
Ce bot s'appuie sur son score de chance élevé. S'il n'est pas près du ballon, il court vers le ballon. Une fois près du ballon, s'il y a au moins 2 autres joueurs à portée du ballon, il le mettra au sol. Sinon, il va le frapper directement.
EDIT: Correction d'un bug de mouvement qui me faisait en fait fuir pas vers le ballon> _ <Maintenant, je cours juste vers le ballon si je ne peux pas le frapper.
la source
Repeller
Ce bot repose sur un seul mouvement réel et c'est de continuer à repousser le ballon de lui-même. c'est-à-dire repousse le ballon.
Il semble bien performer contre la récolte actuelle de bots (LuckyLoser, AngryPenguin, Hydrophobe, BackAndForth) presque toujours gagnant. Cependant Hydrophobe, par inaction, est toujours prêt à gagner si les autres bots parviennent tous à obtenir un score négatif: P
la source