Robocode优化设计及性能提高_第1页
Robocode优化设计及性能提高_第2页
Robocode优化设计及性能提高_第3页
Robocode优化设计及性能提高_第4页
Robocode优化设计及性能提高_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、robocode优化设计及性能提高 坦克在屏幕上自由移动,有的是规则运动,有的是不规则运动,那么它们是怎么定位的呢?怎样知道自己的、敌方的位置呢? 要回答这些问题,首先要理解这个平台的坐标概念及其方向分布 首先让我们先来了解一下它的坐标表示方法robocode基本原理之坐标锁定robocode平台坐标分布如下图 总的来说有下面几点需要注意: 所有的坐标都为正 坐标原点(0,0)在屏幕的左下角 x的右边为正 y的上面为正 其中,坐标值可以用函数:getx()或gety()得到,robocode基本原理之方向剖析 必须知道的两个概念: heading:是机器人方向与屏幕正上方的角度差,方向在0到3

2、60之间。 bearing:是机器人的某个部件(如雷达)发现的目标与自己的方向的角度差,顺时针为正,角度在-180到180之间。即: bearing = |heading - radarheading|。需要注意的是:heading 是静态角度,屏幕正上方永远是零;而bearing是相对角度差。robocode机器人运动方式分析 robocode发展到目前为止,有如下几种较常用的运动方式: 明显有规律的主动运动; 随机性很强的主动运动; 对瞄准有干扰性的主动运动; 依据对方发弹或者运动而采取的被动运动;明显有规律的主动运动sample中的“wall”就是一种很典型的明显有规律的主动运动!它总是

3、沿着墙壁走。这种方法的优势在于它总是在动,如果没有经过瞄准计算的机器人是很难打到它的。 这种类型的运动方式还有圆周运动、静止、来回运动等。 这种运动要是遇到有提前瞄准的机器人就输定了。(其中来回运动除外)圆周运动的代码实现如下: whil(true) setturnright(10000);/一直旋转 ahead(10000);/一直往前走 来回运动又可以分为等距离来回运动、随机距离来回运动。 随机距离面向敌人的来回运动实现代码如下: if (gettime()%20 = 0)/每20个时间周期一次 direction *= -1; /反转方向 setahead(direction *100)

4、; setturnrightradians(enemy.bearingradian + (math.pi/2); /每一时间周期以敌人为中心绕圆运动随机性很强的主动运动 sample中的crazy就是这种类型的典型代表。它不停的做圆弧运动,这段弧线运动停止后又会开始另一个方向的弧线运动,还会突然改变方向。即通常所说的随机运动。它具有不确定的方向和路径,具有不可预测性。 另外一种不完全随机的随机运动就是直线随机距离来回运动,这是结合了随机运动和来回运动,躲避子弹的能力更强。 随机运动主要思想就是机器自动生成一个目标地址,然后让机器人朝着这个方向运动。 其代码实现如下: double nextx,

5、nexty; nextx = math.random()*getbattlefieldwidth(); nexty = math.random() * getbattlefieldheight(); double turnangle = enemy.getangle( nowx, nowy, nextx, nexty ); turnangle = enemy.normalizebearing( turnangle - getheadingradians() ); double movedistance = point2d.distance( nowx, nowy, nextx, nexty )

6、; double movedirection = 1; if( math.abs( turnangle ) math.pi/2) turnangle = enemy.normalizebearing( turnangle + math.pi );movedirection = -1; setturnrightradians( turnangle ); setahead( movedirection * movedistance );对瞄准有干扰性的主动运动 这是以一种很明显的规律运动,等敌人误认为我是那种方式运动后立刻改变为另一种规律,然后等敌人意识到现在的运动规律后我又改变为原来那种。这中运

7、动规律很难被敌方掌握,所以被命中的概率也很小,正因为如此,探讨怎样对付这种运动才成了更加有趣的活动。而我们要做的就是想出办法来对付这种运动。依据对方发弹或者运动而采取的被动运动 这类运动是在敌人发弹后才开始运动,它根据敌方能量的变化判断是否发射了子弹,并会采用自己的分析策略自动分析生成一个enemybullet对象记录子弹的运动,当子弹对自己有危险的时候就分析哪个方向没有危险就往哪个方向运动,这样如果它分析并生成的enemybullet和真正的敌人的子弹运动方向一致,那么它几乎将永远不会被击中,但这不可能总是一致! dobule preenergy = 100; double changeen

8、ergy = preenergy e.getenergy(); if( changeenergy 0&changeenergy 3) setahead(direction * 100); direction *= -1;四种常用运动方式的总结 后两种运动方式明显比前两种高级很多,它的设计和编码难度比前两种也要难得多,但不一定就比前两种优秀!奇异的运动方式要比复杂的编程效果好很多。 需要注意的是: 没有哪一种运动方式是万能的,它们都是相对而言的; 要是你想出了一种奇异的运动方式,你最好也想出一种能对付这种运动的射击方式!robocode高手规则运动瞄准方法的介绍 其基本原理是: change i

9、n x = cos(initialheading) * radius - cos(initialheading + changeinheading) * radius change in y = sin(initialheading + changeinheading) * radius - sin(initialheading) * radius 其中initialheading是敌方机器人在初始位置的方向,子弹飞行期间的方向变化为 changeinheading,我们假定它以 radius为圆周半径运动。 每转的方向变化:每转的方向变化: headingchangeperturn = (h

10、eading2 - heading1)/time 得到这个值,其中 time是两次测量的间隔时间;子弹运动时间:子弹运动时间:time = gettime()+(range/(20-(3*firepower) ,其中 range是发射时我们和敌人之间的距离,而 firepower是我们计划使用的射击火力;半径:半径:radius = velocity/headingchangeperturn 。 其实现代码如下: double bulletvelocity = 20 - 3 * bulletpower; double headingset = enemy.headingradian - ene

11、my.prevheadingradian + 0.00001; double r = enemy.velocity / headingset; double predictdirection = 0.0; double enemydistance = enemy.distance; for( int i = 0; i 4; i+) double bullettraveltime = enemydistance / bulletvelocity; double predictx, predicty;double predictheadingradian = enemy.headingradian

12、 + headingset * bullettraveltime; predictx = enemy.xcoordinate - r * math.cos( predictheadingradian ) + r*math.cos( enemy.headingradian );predicty = enemy.ycoordinate + r * math.sin( predictheadingradian ) - r * math.sin(enemy.headingradian );predictdirection = enemy.getangle( getx(), gety(), predic

13、tx, predicty );enemydistance = point2d.distance( getx(), gety(), predictx, predicty ); robocode高手躲墙之方法探讨 其实躲开墙壁是一件很容易的事情,只要把目标坐标值限制在场地内就可以,即: 横轴坐标值小于场地宽且大于零; 纵向坐标值小于场地高且大于零。 如果你的机器人是随机运动的话,那么你只要把随机式设成: nextx = math.random() * ( getbattlefieldwidth() - 100 ) + 50 ;nexty = math.random() * ( getbattlef

14、ieldheight() - 100 ) + 50 ; 或者:nextx = math.random() * ( getbattlefieldwidth() - 50 ) ;nexty = math.random() * ( getbattlefieldheight() - 50 ) ;if( nextx 50 ) nextx += 50;if( nexty 0 & changeinenergy=3) movementdirection = -movementdirection; setahead(e.getdistance()/4+25)*movementdirection); 其他要注意的就是: 怎样保存敌方机器人的信息

温馨提示

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

评论

0/150

提交评论