如果您曾经玩过《太空大战》!,您知道这是一个有趣的游戏。如果您还没有,那就知道这一点:它曾经是(也是现在)最重要,最重要的计算机游戏之一。而且还是很有趣的!我长大的克隆就是这个克隆,显然,不幸的是,它仅是Windows。所以我重新创建了它!
KotH托管在这里:PPCG-太空大战!山丘之王。我鼓励您以人类的身份与至少另一个机器人进行对抗,以了解游戏的工作原理。
游戏
- 一帧为30毫秒(因此,约为每秒33帧)。
- 场宽为800像素,高为600像素。
- 该场是环形的,这意味着从场外移动的飞船和导弹会重新出现在相反的一侧。
- 有两个宇宙飞船,红色和蓝色。
- 红色位于x = 50,y随机位于50(场高-50)像素之间。
- 蓝色位于x =(视场宽度-50),y随机位于50(视场高度-50)像素之间。
- 双方x =(字段宽度)/ 2。
- 可用的控件有:
- 向左转-每帧逆时针旋转5度。
- 向右转-顺时针每帧5度。
- 射击导弹-除了舰船的速度外,还沿着舰船指向的方向每帧额外传播10个像素。
- 消防车-在飞船指向的方向上以每帧0.30像素的速度加速飞船。
- 超空间跳跃-传送到野外一些随机坐标,爆炸几率25%。这些随机坐标可能在太阳的顶部。
- 在发动机功率下,舰船的最大速度为每帧15像素,而重力提升时则为每帧40像素。
- 当行进速度超过每帧15像素时,引擎推力只能改变方向或放慢速度。
- 关于导弹:
- 导弹成一直线。
- 导弹可以每0.1秒发射1次。
- 导弹的寿命为2.25秒。
- 每艘船最多装有20枚导弹。
- 导弹内部是点粒子。
- 中心处有太阳,这对您的船极为危险。在轻微的接触是致命的。太阳也摧毁了导弹。
- 太阳有重力。结果加速度为5000 /(距离^ 2)像素/帧^ 2,其中距离以像素为单位。飞船和导弹受到影响。
- 两艘战舰都有三个打击区:机头,左翼和右翼。
- 鼻子上的一击就是立即死亡。
- 任一机翼受到撞击都会使飞船的转弯速度和发动机加速度降低一半。
- 如果两个机翼都被破坏,飞船将无法机动,只能发射导弹。
- 船可能会相互碰撞。
- 鼻鼻碰撞对两艘船都是致命的。
- 机翼撞击会破坏机翼。
- 机翼-机翼碰撞会毁坏两个机翼。
- 死船坚固并冻结,直到1秒后爆炸。
- 至少一艘船死亡后,该字段将在3秒后重置。在此之前,太阳和任何剩余的导弹仍然很危险。
原始游戏还具有致命且坚不可摧的小行星,但我将不包括它们。
规则
- 您的漫游器必须使用JavaScript编写。
- 您的漫游器应将其决定限制在10毫秒左右。如果由于您的漫游器而导致出现持续的滞后现象,我将取消其资格,并通知您,以便您进行修复。
- 机器人可以访问以下内容:
- 场宽和场高
- 太阳的位置和半径
- 两艘船的位置,旋转,速度,形状,导弹存量和超空间状态
- 所有导弹的位置和速度
- 出现提示时,您的漫游器应返回字符串列表。
- 这些字符串应该是下列之一:
turn left
,turn right
,fire engine
,fire missile
,hyperspace
。任何其他字符串将被忽略。 - 如果有任何重复项,将仅记录第一个。
hyperspace
优先于所有其他。turn left
并turn right
在同一时间将没有任何效果。fire engine
如果船只有鼻子或死了,将不会有任何作用。fire missile
如果导弹发射太近,将不会有任何效果。
- 这些字符串应该是下列之一:
- 与往常不同的是,您的漫游器被允许利用其他漫游器的行为。我想鼓励一个元游戏。
- 机器人可能不会模仿其他机器人。(即,无需阅读)。
- 机器人不得设置游戏和物理代码使用的任何变量。(即不作弊。)
Bot实施细节
我将把您的机器人存储在其自己的JavaScript文件中,该文件会自动包含在文件名中bot_<name>.js
。因此,请勿在此插入任何空格或字符,以免影响此功能或在JavaScript中命名函数。这是因为您应该定义以下功能:<name>_setup(team)
和<name>_getActions(gameInfo, botVars)
。在页面的下方,有userbot的文本区域,您可以对其进行编辑以测试代码。
<name>_setup(team)
此函数供您定义要保留的任何变量。team
将为"red"
或"blue"
。此函数必须返回一个对象。像这样定义变量:
var vars = {};
vars['example'] = "example";
return vars;
该vars
对象将传递给另一个函数:
<name>_getActions(gameInfo, botVars)
botVars
是由返回的对象<name>_setup(team)
。gameInfo
是一个包含以下变量的对象:
redScore
blueScore
timeLeft
fieldWidth
fieldHeight
sun_x
sun_y
sun_r //sun's radius
gravityStrength //acceleration in pixels/frame^2 at 1 pixel away from the sun's center
engineThrust //acceleration in pixels/frame^2
speedLimit //maximum speed under engine power
maxSpeed //maximum speed from gravity boosts
red_x
red_y
red_rot //rotation in degrees
red_xv //x velocity
red_yv //y velocity
red_shape //one of "full ship", "left wing", "right wing", "nose only"
red_missileStock //the number of missiles red has left
red_inHyperspace //true if red is in hyperspace
red_exploded //until red explodes, it is still solid and hazardous
red_alive
// likewise for blue //
numMissiles
missiles //this is a list of objects, each with the following variables
x
y
xv
yv
您的机器人可以完全访问这些内容。我很确定您可以写它们并且不影响原始变量,但是无论如何不要这样做。关于旋转的注释:船指向 + y方向,向下,因此要与船对齐的任何物体都需要偏移90度。同样,正向旋转是顺时针方向。
此函数必须返回一个字符串列表,代表您的机器人的操作。例如,["turn right","thrust"]
。有关更多详细信息,请参见“ 规则”部分。
额外细节
您还可以使用以下功能:
LineIntersection(L1, L2)
L1和L2是两个元素的数组的两个元素的数组。即L1 := [[x1,y1],[x2,y2]]
和L2 := [[u1,v1],[u2,v2]]
。此函数计算两条线的交点并返回:[[x,y], [a,b]]
。[x,y]
是相交点的坐标,[a,b]
是一对比率,表示相交点沿每条线的距离。如in,a = 0.25
将意味着相交点是从[x1,y1]
到的四分之一[x2,y2]
,同样对于b
。如果没有交集,则返回一个空数组。
window["shipShapes"]
var shipShapes = {
'full ship': [[-8,16],[0,-8],[8,16]],
'left wing': [[-8,16],[0,-8],[4,4],[0,8],[0,16]],
'right wing':[[-4,4],[0,-8],[8,16],[0,16],[0,8]],
'nose only': [[-4,4],[0,-8],[4,4],[0,8]]
};
这些是船只多边形的坐标。为了使获取当前坐标更加容易,您还可以使用...
getShipCoords(<color>)
getShipCoords("red")
将返回Red船的顶点的当前坐标,对于getShipCoords("blue")
Blue和Blue 同样。这些坐标在这样的列表中:[[x1,y1],[x2,y2],[x3,y3],...]
。多边形是隐式封闭的,因此第一个和最后一个坐标对之间有一条线。
您不得访问或更改游戏/网站正在使用的任何其他变量或功能。绝对不要将您的函数命名为相同的名称。我不认为这将是一个问题,但是如果您的机器人破坏了游戏代码,那是一种可能。没有记录或捕获异常。
获奖
- 每对机器人均应至少玩两次10次。(因此,总共至少有20场比赛。)
- 旨在总体上获得最高的赢/输比。如果您的机器人在对抗另一个机器人方面表现出色,但在与其他三个机器人的对抗中却输了,那不如在两个机器人中获胜,而在两个机器人中却输掉(一般的经验法则)。
- 对于每个机器人,将计算(wins + 1)/(loss + 1)的比率,然后将计算这些比率的平均值和标准偏差。较高的均值将具有优先权,如果均值在彼此的1个单位内,则较低的方差将具有优先权。
- 计分将从今天开始的一周内开始,或者在三天后没有新的提交开始。这样一来,我不必重复任何对机器人的配对。
最重要的是,玩得开心!
页首横幅(2016-01-08 05:15):
# Name Mean StdDev
1. Helios 13.625 6.852
2. EdgeCase 8.335 8.155
3. OpponentDodger 8.415 8.186
4. OrbitBot 5.110 6.294
5. SunAvoider 5.276 6.772
6. DangitBobby 3.320 4.423
7. SprayAndPray 3.118 4.642
8. Engineer 3.903 6.315
9. RighthandedSpasms 1.805 2.477
10. AttackAndComeBack 2.521 2.921
11. PanicAttack 2.622 3.102
12. FullSpeedAhead 2.058 3.295
13. UhhIDKWhatToCallThisBot 2.555 3.406
14. MissilesPlusScore 0.159 0.228
15. Hyper 0.236 0.332
16. RandUmmm 0.988 1.329
17. Kamikaze 0.781 1.793
注意:随着我运行更多游戏,这可能会发生变化。另外,排名9到13的排名困扰我,因此我可能会调整计分方法,以更好地符合人们对排名的直觉。
(均值和标准差四舍五入为三个小数位。此外,Hyper
均应为,HYPER
但会使高亮显示混乱。
LineIntersection
在不相交的段上调用将返回一个空数组。