该“山上之王”游戏是一种策略游戏,您必须在其中扔水气球,并避免被水溅到。目标是获得最多的积分。您将得到一张野外图和水气球的位置。您可以返回要在某个方向上击打水气球(如果距离足够近)或要在某个方向上移动。
具体来说:水气球将从(0, 0)
30个单位的高度开始下降。如果水气球撞到地面,将随机选择一名选手输掉4点,并向靠近气球的人分配更多的重量。此外,最后一次击中气球的玩家将获得3分。因此,如果您直接向下击气球,您很可能会损失1分。
您将编写一个扩展类Player
。您需要实现构造函数。构造函数如下所示:
public Player1() {
super(/* Some numbers */ 3, 3, 4)
}
这些数字是double
s。第一个数字代表玩家的速度,第二个数字代表力量,第三个数字代表运气。这些数字的总和不得超过10,并且任何数字都不得小于或等于零。
其次,您必须实现该move
方法。这是一个示例move
方法:
@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));
}
}
这里有很多重要的事情。首先,请注意,该字段以形式传递Map<Player, Point2D>
。字段是无限的-您可以走多远没有限制。它不是二维数组或类似的东西。此外,这意味着您将使用非整数坐标作为您的位置。完全可以
另一个结果是玩家和气球可能重叠。实际上,两个玩家可能在完全相同的位置!
气球具有一定的速度和方向。通常,它将以3个单位/步的速率下降。它还沿一个x
方向和y
方向移动。返回a时Hit
,您将沿推气球的x,y和z方向传递。你不能打气球的高度大于10或者其距离您(仅在两个维度)大于4.此外,如果这是真的,x^2 + y^2 + z^2 > s^2
哪里s
是你的力量,和x
,y
和z
是你打方向,您的操作将被丢弃。击打的力会被介于0
和之间的随机数放大luck
(这意味着如果运气不好,击打力可能会下降)。
同样,您可以返回Movement
带有x
和的y
坐标(请注意,您不能跳跃)。如果您的速度x^2 + y^2 > s^2
在哪里,s
则您的操作将被丢弃。
如果水气球撞到地面,则将选择一个随机玩家,将更多的体重分配给最亲近的玩家,但减少那些拥有更多运气的玩家的体重。被选中的玩家将失去4分。
管制员:https : //github.com/prakol16/water-balloon-wars/tree/master
游戏持续1000步。最后,将有一个名为的文件log.out
。将数据复制并粘贴到该小提琴中以查看游戏:https : //jsfiddle.net/prankol57/s2x776dt/embedded/result/
甚至更好的是,以3D方式查看:http : //www.brianmacintosh.com/waterballoonwars(感谢BMac)
在100(可能更多,但不是更少)游戏之后,得分总和最高的玩家获胜。
如果您想提交解决方案,则可能需要阅读https://github.com/prakol16/water-balloon-wars/tree/master上的特定细节。
编辑3/8:
这些是目前的最终成绩(1000次迭代,不包括玩家1和2)。如果您编辑帖子,则可以发表评论,我将重做分数:
{
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
}
获胜者Weakling
平均得到39分。第二名是Repeller
21分。
speed
并strength
在播放器的构造函数。
dirX
,KeithRandall dirY
,和dirZ
((根据您的运气放大)只是添加到气球的速度中。如果有多个人击中它(不太可能),那么可能会获得3分的玩家将被认为是幸运的(请参阅详细信息)