Robocode 参数大揭密 |
级别: 初级 2002 年 12 月 02 日 下面天翼.李(Skyala.Li)就和大家一起来看看Robocode中重要的参数并分析分析这些参数的来龙去脉以及它们之间千丝万缕的关系。 很多人不太明白,当自己撞到墙时,为什么生命点会下降?为什么发射子弹时生命点也会下降?为什么有时候自己没有被消灭而不能发射子弹了,为什么子弹打到敌人时总不那么精确?为什么自己突然在战斗中一动不动了?其实这一切都是Robocode中存在的参数在起作用。比如静态的参数:屏幕高宽,坦克车的高宽,绝对方向,相对方向等等;动态的参数:速度,加速度,炮管冷却时间,能量,损伤,子弹速度,旋转速度等等。在物理学原理中”运动的物体是变化的,变化的物体是相互影响的”。这些许许多多的参数也验证了这一规律。任何一个参数方的变动都会影响到其它参数的作用。所以就产生了很多让人迷惑的现象。要想真正了解Robocode,想成为Robocode机器人的顶级玩家,我想我们必须对这些参数及其相互作用力要精确的了解,并应用到我们的战争中来。下面天翼.李(Skyala.Li)就和大家一起来看看Robocode中重要的参数并分析分析这些参数的来龙去脉以及它们之间千丝万缕的关系。让我们一起走向Robocode机器人专家之路。
系统系数中最重要的是要清楚整个坐标系统和方向系统。
整个战场是以屏幕正上角为0度,按顺时针排列的方向。详情可见” Robocode基本原理之方向剖析”.
整个战场的坐标是以屏幕左下角为原点,高为Y坐标,宽为X坐标。详情可见”Robocode基本原理之坐标锁定”.
比赛回合是比赛中由用户自己设置的比赛次数,默认值为10,用户可利用函数getRoundNum()返回当前正在进行的比赛回合,并可利用函数getNumRounds()返回自己设置的总回合数。用户可在战场环境下选择菜单Battle->New Battle 在中间的Number of round选项中输入自己想要进行的回合。
可能有些朋友对比赛的速度不太满意,想以更慢的速度观察比赛的每一个细节,好仔细研究机器人的性能;也有人想以更快的速度结束比赛来进行联赛。没关系,你只要在Option->>Preferences->frame per second下的列表框中输入你想要的速度或选择你要的默认速度。注意:最小为1,最大为10000,数字越小战争比赛速度就越慢。当然这些都是我们自己所预设的值,实际上在战争中它会依据仿真引擎的处理时间而稍有不同。好,让我们选择10,再回到战场,呵呵,是不是像放慢镜头。注:FPS也就是每秒内Robocode仿真引擎能播放多少帧。 图1显示了战争速度的设置及战争中比赛回合,战争速度的组合 图1 1 to rounds 10 代表着10个回合中的第一个回合,22 FPS就是我们当时的比赛速度,你把屏幕最小化你会发现FPS变大了。仔细想想你会明白为什么的?对,它少了静态图片的播放了.仿真器不再需要加载静态图片,处理速度当然快了。
不少初学者说看不到机器人雷达扫描的蓝光,由此怀疑自己创造的机器人雷达系统不完善。其实这是由于你的系统扫描器开关没有打开。选择Option->Preferences->Visible Scan Arcs(Cool,but May slow down game).你就可打开你的扫描器了,连Robocode的作者自己都说Cool,but May slow down game(可能会影响速度),不要担心速度会慢下来,现在的PC速度足以处理这一切了。
所有回合比赛结束你都会看到自动弹出一个对话框,里面显示了一些数字,如下图2所示: 图2 这就是记分牌,也即你设置的回合比赛结束后的成绩单。它可是你分析数据及参加联赛的重要依据。Robot Name 是比赛机器人的名字。Total Scroe为这次比赛你的总共得分;Survival是你存活率的得分;Last Survivor Bonus:你是赢的次数相对对手的分红得分;Bullet Dmg:是你的子弹损失得分也即发射的子弹数的得分;Bonus:是子弹数的分红得分;Ram Dmg *2是你的撞击得分;Bonus:是你撞击得分分红;最后两项Survival 1sts,是你赢的次数,不算做分数。所有分数加起来就是你的总分。记住在联赛并不是总分越高越好,它是算综合平均分的。其中撞击分和子弹损失分就要越少越好。你如果观察两大高手比赛的记分牌,你会发现他们的Ram Dmg 和Ram Dmg中的Bonus一般都为0。
战争的机器人身上会打出字幕'disabled',这是为什么?其实这是警告你机器人不能动了也意味着你的生命点值为0,但是你没有死。如果你的子弹已经打中了别的机器人,你能够从这个状态中恢复过来。
方向是用角来表示,角在数学中有弧度表示法和角度表示法,所以在我们的Robocode中也有两种表示方向的方法。弧度表示法要在角度表示的函数后加上”Radians”字符。详细的见下面说明:
在战争中方向和坐标是最重要两个参数了。只要清楚了这两个参数。其他的都好解决。 每一个行动中的机器人在屏幕中都有它自己的位置,也即坐标。我们可分别用函数getX,getY得到机器人精确的位置,再辅以距离就可定位到屏幕上的任何机器人。
我们可分别用下面函数得到:getHeight,getWidth,getName机器人本身有关的静态参数。
每一场战争,机器人的每一动作都是由事件机制而触发的。了解其中的事件,并能动态得到每一个事件对于决定我们的行动很重要。函数getAllEvents()就提供了此功能。下面代码打印出了比赛中的所有事件。
Robocode中存在的事件列表如下:
对于事件的处理我们要注意下面几点:
说到事件,我们不得不提优先级别.每一个Robocode系统事件都有其自身的优先级别我们从下表可以看到从低到高排列的事件优先级,高优先级别的事件可中断低优先级别的事件. ScannedRobotEvent: 10 HitRobotEvent: 20 HitWallEvent: 30 HitByBulletEvent: 40 BulletHitEvent: 50 BulletHitBulletEvent: 50 BulletMissedEvent: 60 RobotDeathEvent: 70 CustomEvent: 80 SkippedTurnEvent: 100 WinEvent: 100 DeathEvent: 100 如果你想让某一事件先处理,我们就要利用函数setEventPriority()改变事件的优先级,事件的优先级别在0-99之间,100为保留的数字。
整个战斗中数生命点最重要,你的一切都是为了它而存在,当生命点没有了,也代表着你输了这场战斗。 我们可以用函数getEnergy()得到我们机器人的生命点数.
由于子弹对生命力的影响很大,我们的每一个子弹要用到要害处,精确计算子弹及其能量值就变得很重要了。
子弹由炮管发射,炮管的方向决定了子弹的方向,炮管的热量也决定着子弹的发射。炮管还会发热?很多人都会很惊奇,不错。真实战争中我们的大炮不一样也会发热吗?Robocode也就是别一个真实的战场,战争中能用到的知识都可应用在Robocode中。方向参数从我们上面的战争静态参数说明中可看到。下面我们来看看炮管的其他参数:
雷达,是我们在战争中的双眼,它能看到并告诉我们敌人的一举一动,知已知彼才能百战不贻!
好了,回到我们的机器人本身了。我们来看看它又有些什么参数。
在Robocode中每一个部件都不是单独起作用的,都会影响到其他部件。上面的部分例子已经说明了这点,下面我们用旋转过程再来验证一下:雷达 安装在炮上,炮安装在机器人上,它们会相互影响。如果我们向左转动炮管,而使雷达向右转动,那么雷达只会向右转动(45-20) =25度;如果两者都向右转动,雷达将向右转(45+20)=65度。同样的道理炮和机器人也是方向同相加,方向反相减。 有的人会问,坦克车在前进时,按照物理中的说法:如果一个物体在另一物体之上,如都向同一方向运动,上面的物体会继承下面物体的速度。那么子弹是不是也可以继承坦克车的速度。答案是错误的。这里我们注意 一点,子弹本身又是一种特殊的能量它的速度不符合能量的转换定理,不可以继承坦克车的速度的。
看了上面的例子,我想大家对每一个单独的参数可能有一定的印象了,对于联系起来的错综复杂的参数可能还有点模糊。我们就用图来理理。 图4单一关系转换图 图4 红线是能量的转换关系,生命能下降转化为子弹能,子弹能下降转化为热能作用于炮管;当坦克车被击或撞击,生命能下降;当子弹击中目标生命能上升。 黑色是方向的相互作用力。当坦克车,雷达,炮管三者中两两方向相同方向角度相加,反之则相减。 其实Robocode中各个运动的参数都遵守物理学的基本规律。而其中起关键作用的是能量转换守恒定理。只要大家把他们之间的能量转化理清楚了。相信参数的秘密也不是什么秘密了。本文章中我们揭示了大部分在实际战斗中用到的参数,有部分没有列出的大家可参考Robocode API文档说明。我们不仅要知道参数的存在及他们的关系还要用到我们的机器人战斗中去。这样才能真正明白个中之理。
|