Robocode深度剖析

上传人:无*** 文档编号:122466010 上传时间:2022-07-20 格式:DOC 页数:10 大小:144.50KB
收藏 版权申诉 举报 下载
Robocode深度剖析_第1页
第1页 / 共10页
Robocode深度剖析_第2页
第2页 / 共10页
Robocode深度剖析_第3页
第3页 / 共10页
资源描述:

《Robocode深度剖析》由会员分享,可在线阅读,更多相关《Robocode深度剖析(10页珍藏版)》请在装配图网上搜索。

1、Robocode徐11剖祈07302010015周磊、Robocode曲doc文絆中说明曲包层次HierarchyForAllPackagesPackageHierarchies:wbccgm,robocodecontrol,TobocodeutilClassHierarchyojava.langObjectorobocodeRobotBase(implementsjava.long.Runnable)orobocode_RobotorobocodeRobotsorobocodeAdvancedRobotorobocodeAdvanced尺sdiansRobotorobocodeAdvance

2、dRobotorobocode.TeamRobotorobocode.JuniorKobotorobocode.control.BattlefieldSpeciFicalion(implementsjava.io.SerializablorobocodecontTQ1Bat11oSpocification(implementsjava.io.Wor:i込orobocodeBulletorobocode.Conditionorobocode.GunTurnCouuplotoConditionorobocode.MoYeCompleteConditionorobocode.RaxiarTurnCo

3、mpleteCcnditicnorobocode.TurnComDloteConditionorobocodeEventfimplementsjava,langCompa*b1eT)orobocode.BuiletHitBuiletEventorobocode.BulletHitEventorobocodeBulletMissedEventorobocode.CustomEventorobocode.DealhEvenlorobocode.HitByBui18tEventorobocode.HitRobotEvontorobocode.HitWallEYentorobocode.Mesjsag

4、eEventorobocode.RobotDosthEvontorobocodeScaauedRobotEventorobocode.SkippcdTi】rnEventorobocodeWinEventojava.io.OutputStream(implementsjava.io.Clos&abgjava.io.Flushable)orobocode.RobocodoFileOutputStrerunorobocodeRobocodeorobocode.contro1.RobocodeEngineorobocodecontro】RobolResul18(implenienjava.io.SBr

5、ializable)orobocodecontro1RobotSpecification(implenientsjava.io.Serializablz)orobocodeRulesorobocodeuti1Utilsojava.io.Writer(implementsjaxra.lang.Appemdabl内java.io.Closeabl勺java.io.Flushable)ojava.io.OutputStreamWYitororobocode.Robocode卩i1eWriterInterfaceHierarchyorobocodeDroidorobocode.control.Rcbc

6、ccdeListener从这张图上可以很清楚的看出其包内部类的继承关系和类实现的接口(implements后的东西就是该类实现的接口),还可以看到iobocode._RobotBase,robocode._Robot,iobocode._AdvancedRobot,robocode._AdvancedRadiansRobot这种类名以卜划线开头的类为作者定义的抽象类。lobocode.Robot类是非抽象类,但其子类iobocode._AdvancedRobot为抽象类,通过对Robocode内部类结构的研究可以印证书上很多理论的东西。大家一定能发现,AdvancedRobot类是继承HRob

7、ot类的,因此推荐大家继承AdvancedRobot类,因为Robot类里有的方法AdvancedRobot会继承下来,而且多了许多有用的方法。二、几种出较好的AI算法不耍以为AI算法是离我们很遥远的东西,其实智能算法无处不在,从你吃午饭选择排哪一列队可以先买到饭到企业用最优投资策略大把的捞钱,很多平时被我们忽略的东西其实内部也多多少少包含了一些智能的算法,而我们要做的就是把平时做决策时的感觉转化成机器能读懂的算术公式。其中不可避免的耍用到很多数学以及统计方而的知识,还耍使用很多变量來描述影响结果的不确定因素。Robocode中的得分高低并不取决于你赢了儿局,而在于你有没有有效的躲避敌人的子弹

8、并实行精确的打击,所以大部分的智能坦克都会有鬥己独特的躲子弹和预测敌人走向的算法,比较常见的有以下儿种:躲子弹:1. 因为坦克在开火后h己会消耗0.13的能量,我们可以检测对方的能量变化來进行欺骗性的躲藏(因为开火后子弹的弹道就不会改变,它会朝你原来的位置前进,但你此时已经不在那个地方了)。这个技巧还存在问题。子弹一发射,机器人就移动,所以它最终可能会移回炮弹轨迹之内。最好是在估计子弹耍到达时再移动。2. 据说网上还有一种算法比较繁琐,但有效率比前一种高很多,就是捕获当前界面上的所有子弹并按能量级加权,计算出它们的质心,并远离它,由于没有见过代码,所以我不太了解具体的算法,有兴趣的同学可以上网

9、査找一下。3. 通过复杂的运动让敌人无从下手。有的机器人采用了快速的有规律的运动方式,如Walls,Spmbot等,但敌人用肖线瞄准能轻松搞定Walls,用圆周瞄准枪枪命中Spinbot,当然这是在单挑的时候,群殴时的条件很复杂。但从多场Walls和Spmbot与高级机器人的群殴较量中,Walls和Spinbot还是会被别人做掉,原因很简单,它们的运动方式太简单,太有规律了。4. 使H身不停的摇摆来避开子弹,因为H身的摆动能够很好的减少暴露在敌人枪口下的目标大小。ZelluX前辈就使用了这一招,单挑时非常的有效,群殴的话貌似会使第三方很容易地打到鬥己。预测敌人下一步的住置:1. 直线预判通过取

10、两次敌人的位置,间隔时间以及子弹从发射到到达目标的时间按氏线进行预判,即取两个位置连线的延长线上的一点。2. 圆周瞄准计算做圆周运动的机器人的changemx(x方向上的变化)和changeiny(y方向上的变化)的伪码相当简单,假定您以弧度为单位进行计算:changeinx=cos(uutiallieading)*radius-cos(initialheading+changeiiilieadmg)*radiuschangeinv=sm(initialheading+cliangeiiilieadmg)*radius-sin(imtialheading)*radius式中uiitiamead

11、rng是敌方机器人在初始位置的方向,子弹飞行期间的方向变化为changenilieading,我们假定它以radius为圆周半径运动。计算必耍的数据图1说明了我们需耍的大部分数据:r是机器人运动所绕的圆周半径,方向变化为a,而v则是敌方机器人运动的即时速度。InitialPosition为了耍准确瞄准敌人,我们需要某些特定的数据:机器人当前的方向,每转的方向变化,当前的速度,我们的子弹到达的时刻。我们可以使用这些数据计算出敌人转圈的圆半径,以及它最后的方向(即,我们的子弹到达敌人的瞬间敌人的方向)。我们计算子弹击中位置的方法如下:每转的方向变化:我们用lieadingchangepertum=

12、(heading2-headingl)/tinie得到这个值,其中time是两次测量的间隔时间。您还必须使结果标准化,如下而代码中所示。子弹时间:我们使用简单的tmie=getTime()+(iange/(20-(3*firepowei)就可以满足需要了。其中range是发射时我们和敌人之间的距离,而fiiepower是我们计划使用的射击火力。假定子弹击中时,目标到我方的距离不变,这个假设并不合适,但是我们在本文后而的内容中开发出迭代之前,有它就足够了。半径:我们用radius=velocity/headingcliangepeiluin得出这个值。具饰代码殴详8!介毘请见另外,我还整理了一些

13、基本的策略,诱见移动和射击策略.pdf三、关于Robocode里的1力能间题相信不少人都会问Robocode内部的类能够告诉我们那些信息,下面我们来研究一下。RobocodeAdvancedRobot类下有如下的移动方法:* setAlieadQ和ahead。:让机器人向前移动一定距离。* setBackQ和back():让机器人向后移动一定距离。* setMaxTuniRateO:设置机器人最大的旋转速度。* setMaxVelocityQ:设置机器人最大的运动速度。* setStopQ和stop。:停止移动或暂停机器人,并记住停止的位置。* setResume()和resume():重新开

14、始移动停止的机器人。* setTuniLeftQ和tuinLeftO:向左旋转机器人。* setTuniRight()和tumRight():向右旋转机器人。更多的方法请参阅API文档,在Robocode安装目录下的javadoc文件夹下。API文档中每一个Event如HitByBulletEvent,HitRobotEvent,HitWallEvent,ScannedRobotEvent等的方法都是很值得研究的。还可以添加IT定义的事件CustomEvent來做出更复杂的机器人。由此看來,学会看API文档是非常重耍的。H关于Ftoto匸口血里的坐标间题在Robocode里使用了坐标系和两种方

15、向系:绝对方向系和相对方向系,许多人搞不清这两者的区别,下面来简要的阐述一下。首先看看一段舷及说晾heading-absoluteangleindegreeswith0facingupthescreen,positiveclockwise0二heading360.bearing-relativeangletosomeobjectfromyourrobot,sheading,positiveclockwise-180bearing=180heading:是机器人方向与屏幕正上方的角度差,方向在0到360之间.bearing:是机器人的某个部件如雷达发现的目标与方向的角度差,顺时针为正角度在-18

16、0到180之间看了这段文字大家可能还是不太明白,整个屏幕哪个是0度角,整个是坐标原点呢?顺时针与逆时针的方向如何区分?在开始说明之前大家先得清楚儿个在Robocode中很重要的概念:坐标系:Robocode整个坐标系都是战场屏幕以左下角为原点绝对方向系:Robocode中不管机器人在哪个方向都是以静态战场屏幕为参照的绝对角度(也即大家说的Heading),正上方为0度角。也即不管是Robot,Gun,Radar向北为0,向东为90,向南为180,向西为270o相对方向系:相对方向是Robot,Gun,Radar以机器人的动态heading角度为参照的角度差不再以整个静态屏幕为参照了,叫它相对因

17、为机器人的heading是随着机器人移动而不停的在改变,heaing只是个相对物体。下图很清楚的说明了坐标系统及绝对方向jGdegi*270啊%?wrzJ118Q五、游难中的各顶爹数以及规则耍玩好Robocode就耍先知道它的规则以及参数,下面罗列了一部分的规则。(1-20为基本规则,21-29为高级规则)1. 距离的单位是像素(Pixels),所以在setAliead(lOO)中是让机器人向前走100个像素。2. 时间的单位是帧(flame)或滴答(ticks)(有点像时钟滴答),或时间周期(turns),或单独的时间片(simplytuneslices)getTuneQ返回每个回合的帧(f

18、lame),开始值为0。(一帧就是一个静态的画面)3. 机器人最大的速度(Velocity)为8,可以H己设定最大速度,但不能大于8。4. 机器人的加速度为1像素(pixel)/帧,减速度为2像素(pixel)/帧。5. 机器人最大的旋转速率(jate)是10-0.75*getVelocity()o6. 炮管的旋转速率为20度/帧。7. 雷达的旋转速率为45度/帧。&旋转过程中机器人/炮管/雷达会相互影响,如果你左转炮,右转雷达,那么雷达只会右转(45-20)=25度,如果两者都向右转,雷达将右转(45+20)=65度。当然,炮在机器人上原理相同。9. 机器人,炮,雷达旋转时立即达到最大速度,

19、不需耍加速。10. 机器人撞到墙会停止,并受到损伤。损伤度:Math.abs(velocity)*0.5-lo11. 机器人撞到另一机器人,如果你面对它,你的移动将会停止,并且会扣除1.2分,每个机器人都会损伤6点能量。12. 被子弹打中的损伤为damage=4*power(0powei=1)o如果(lpowerRobotJuiuorRobot还有一个TeaniRobot类,可以用来创造一个机器人团队。七、Robocode考代码packagetest;unportrobocode.*;unportjava.awt.Color;publicclasstestextendsAdvancedRobo

20、tdoublemovementDirection=1;/定义躲避时的方向doublepieviousEneigv=100;/定义敌人的初始能最值Enemytarget;/定义敌人finaldoublePI=Math.PI;/创建常吊.PIintdirection=1;/向前方向值为1,向后为1doublefirePower;/定义开火时使用的火力publicvoid11111()target=newEnemyO;/创建一个敌人的实例taiget.distaiice=100000;初始化敌人的距离,以便选择目标setBodyColor(Color.wlute);/设置坦克主体的颜色setGunC

21、olor(Color.white);设置炮管的颜色setRadarColor(Color.wlute);/设置雷达的颜色setBulletColor(Color.white);/设置子弹的颜色setScaiiColor(Color.white);/设置雷达扫描区域的颜色setAdjustGunForRobotTum(tnie);使枪和坦克独立开setAdjustRadarForGunTuin(ti-ue);/使枪和雷达独立开nnnRadaiRightRadians(2*PI);使雷达转过一圈看是否有别的坦克此处的避墙功能没做完/*addCustoniEvent(newCondition(,rN

22、eaiWaHH)publicbooleantest()if(getXO=getBattleFieldWidthO-5O)|(getYOgetBattleFieldHeight()-5O)out.pimthi(Mti-uen);returntme;elseout.println(,falseH);returnfalse;);*/while(tme)doMovement();移动坦克doFirePowerQ;/选择适肖的火力doScaimerO;扫描别的坦克doGun();把枪移动到敌人预计会出现的地方/out.pnntlii(taiget.distaiice);fu-e(fiiePowei);/

23、根据距离选择火力并开火executeQ;执行以上所有的命令voiddoFuePowei()fuePower=400/taiget.distaiice/基J目标的远近程度改变子弹的能贾voiddoMovement()if(getTmie()%20=0)每20个时间间隔执行一次duection*=-1;反向运动setAhead(direction*300);/前后运动setTuiiiRightRadians(taiget.bearing+(PI/2);voiddoScamiei()doubleradaiOffset;if(getTmie()target.ctime4)如果4秒内在小区域中没有发现目

24、标radarOffset=360;/雷达转一圈寻找II标elseradarOffset=getRadarHeadingRadiansQ-absbearmg(getX(),getY(),target.x.target.y);/找到目标后使搜索范围扩大以至于不丢失目标if(ladaiOffsetPI)aiig-=2*PI;if(ang2*PI)aiig-=2*PI;if(ang0&yo0)retuinMath.asiii(xo/h);if(xo0&yo0)retuinMath.PI-Math.asiii(xo/h);if(xo0&yo0)retuinMath.PI+Math.asiii(-xo/h

25、);if(xo0)reuiin2.0*Math.PI-Math.asin(-xo/h);retuin0;publicvoidonScaiinedRobot(ScamiedRobotEvente)if(e.getDistanceQ0&changeIiiEnergy=3)movementDuection=-movementDirectiony/Iz向躲避setAhead(e.getDistaiice()/4+25)*direction);/移动微小的距离previousEnergy=e.getEnergyO/初始化炖手的能磺publicvoidoiiRobotDeath(RobotDeatliEv

26、ente)if(e.getNaine()=taiget.name)taiget.distaiice=10000;/设置搜索坦克的初始距离此处的避墙功能没做完/*publicvoidonCustoniEvent(CustoniEventevent)if(event.getCondition().getNaine().equals(HNeaiWair)doublecenteiy=getBattleFieldHeightO/2;doublecentei-x=getBattleFieldWidthQ/2;doublenowx=getX();doublenowy=getY();doubletuinToC

27、enter=absbeaimgow.nowycentei,centeiy);setTuniLeftRadians(NoinialiseBeaimg(niinToCentei);out.piintlii(NoimaliseBeaimg(niinToCenter);setAhead(200);executeQ;removeCustoniEvent(event.getConditionQ);*/创建了一个代表敌人的类,用来保存对手的相关信息classEnemyStrmgname;/定义坦克的名字以卜定义敌人的各项参数,以便预测敌人走向,实行打击publicdoublebearing;publicdoublehead;publiclongctmie;记录打描到该坦克的时间publicdoublespeed;publicdoublex,y;publicdoubledistance;publicdoubleguessX(longwhen)longdiff=when-ctune;returnx+Math.sin(head)*speed*diff;publicdoubleguessY(longwhen)longdiff=when-ctune;returny+Math.cos(head)*speed*diff:2007-11-30AH

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!