RoboCode基础知识讲解_第1页
RoboCode基础知识讲解_第2页
RoboCode基础知识讲解_第3页
RoboCode基础知识讲解_第4页
RoboCode基础知识讲解_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

1、RoboCode基础知识讲解软件学社黄仁海1Robocode简介Robocode 是一位IBM的工程师 Mat Nelson 用Java 语言所创造的机器人战斗仿真引擎。Robocode不是一个完整游戏,它是个半成品,一个专为程序员们准备的游戏。它使得你不用不面对一些无聊琐碎但又不得不做的工作,编写界面、处理图像、处理音频,。而是用一种更简单的办法,让我们享受游戏开发的乐趣。 Robocode 它为你处理好一切细节。你所做就是为你的机器人坦克编写智能程序,让它能够移动、进攻、防御、躲避、开火。而它的对手就是跟你一样其他程序员编写机器人程序。这就是Robocode魅力所在,最简单,只用几十行代码

2、,就能立刻创造出一个简单但完整机器人。你可以不停的修改你的程序,设计新射击模型、躲避模型、移动模型,还可以在网上下载由其他程序员编写的水平更高的机器人,与它们比试一下,看看自己的水平到底如何。从2001年7 月诞生之日算起,Robocode发展到如今,已经吸引了全世界无数爱好者参与其中。不仅出现了许多交流Robocode 技术的网站,也有各种规模不等的Robocode 大赛在各地进行。还等什么,赶快进入Robocode 这个有趣的世界。2安装RoboCode平台安装jdk可到 下载用户名:robocode 密码robocode 安装RoboCode运行环境:下载地址:坦克游戏平台/roboco

3、de-setup.jar双击robocode-setup.jar文件进行安装3运行RoboCode进入安装目录,双击robocode.jar文件或robocode.bat文件打开主程序如果有添加桌面图标,可直接双击桌面图标进行新比赛:“Battle”new”robots”在”robots”选项卡里面,点击坦克文件,按”add”按钮进行添加,按”remove”进行删除4运行RoboCode修改”Number of rounds”可以设置比赛场数,默认为场点击”next”可以设置战场的其他的参数,如战场大小、炮管冷却速度。点击”start battle”进行坦克比赛5进行比赛全自动比赛全自动评比比

4、赛结果以程序的评比结果为准按”pause”中断比赛,按”stop”快速结束比赛并评出结果6保存比赛“battle”save”/”save as”进行赛场保存“battle”open”进行重载赛场7创建坦克程序“Robot”Editor”打开编辑器,当然也可以用其他的编辑器,如:JCreator的下载地址:robocode:/pub/java/JCreatorV4.rar“File”New”Robot”输入类名(R04369141),包名(xmu)后,创建一个坦克的模板文件8创建坦克程序编写代码请查看API文档“Help”Robocode API”软件学社FTP上有chm版本的API doc。主

5、要查看Robot类“Compiler”Compile”进行保存、编译系统会自动搜索JDK环境地址(之前已经装好了)保存的路径建议使用默认的路径9打包坦克程序“Robot”Package robot for upload”选择要打包的坦克程序,按”add”加入按”next”进入下一步,在文本区域框中填写程序说明按”next”选择保存路径按”next”进行信息确认最后按”package!”进行打包,本次比赛只要上传这个包文件10导入坦克程序“Robot”Import downloaded robot”选择坦克程序.jar文件,导入进行比赛加载程序的过程和以前一样11Robocode坐标系统【坐标系

6、】:Robocode整个坐标系都是战场屏幕以左下角为原点。【绝对方向系】:Robocode中不管机器人在哪个方向都是以静态战场屏幕为参照物的绝对角度(Heading),正上方为0 度角。即是向北为0,向东为90,向南为180,向西为270。【相对方向系】:相对方向是以机器人的动态heading角度为参照物的角度差,不再以整个静态屏幕为参照了。叫它相对是因为机器人的heading 是随着机器人移动而不停的在改变,heading 只是个相对物体。12坐标系统【Heading】:是机器人方向与屏幕正上方的角度差,方向在0 到360 之间。【Bearing】:是机器人的某个部件如雷达发现的目标与方向的

7、角度差,顺时针为正角度在-180 到180 之间。13坦克结构机器人的结构包含三个部分:Body 车身,Gun 炮,Radar 雷达。14坦克结构车身是一个比较笨重的部分, 负责移动,它的基本操作有:turnLeft(double degree)和turnRight(double degree)分别是使机器人(左右)转过一个指定的角度。ahead(double distance)和back(double distance) )分别是使机器人(前后)移动指定的像素点距离,;这两个方法在机器人碰到墙或碰到另外一个机器人时即告完成。15坦克结构炮是用来发射炮弹攻击敌人的武器,它的基本操作有:turn

8、GunLeft(double degree) 和turnGunRight(doubledegree)分别是使炮可以独立于坦克车的方向(左右)转动指定的角度。fire(double power)发射指定能量的炮弹,能量范围是(0.1 3)。16坦克结构雷达是机器人取得敌人信息的主要器官,它的基本操作有:turnRadarLeft(double degree)和turnRadarRight(double degree)分别是使炮上面的雷达(左右)转动指定的角度,转动的方向也独立于炮的方向(以及坦克车的方向)。17坦克结构默认情况下三个部分的运动是相对锁住的,要使他们能独立运动,Robocode 提

9、供了三个方法来解锁。setAdjustGunForRobotTurn(boolean flag):如果flag被设置成true,那么坦克车转动时,炮保持原来的方向。setAdjustRadarForRobotTurn(boolean flag):如果flag被设置成true,那么坦克车(和炮)转动时,雷达会保持原来的方向。setAdjustRadarForGunTurn(boolean flag):如果flag 被设置成true,那么炮转动时,雷达会保持原来的方向。而且,它执行的动作如同调用了setAdjustRadarForRobotTurn(true)。18获取信息getX()和getY(

10、)可以捕捉到机器人当前所在战场中的坐标。getHeading()、getGunHeading()和getRadarHeading()分别可以得出坦克车、炮或雷达当前的方向,该方向是以角度表示的。getBattleFieldWidth()和getBattleFieldHeight()可以得到当前这一回合的战场尺寸。19战斗事件ScannedRobotEvent通过覆盖onScannedRobot()方法来处理;当雷达检测到机器人时,就调用该方法。HitByBulletEvent 通过覆盖onHitByBullet()方法来处理;当机器人被炮弹击中时,就调用该方法。HitRobotEvent 通过

11、覆盖onHitRobot()方法来处理;当机器人击中另外一个机器人时,就调用该方法。HitWallEvent 通过覆盖onHitWall()方法来处理;当机器人撞到墙时,就调用该方法。20战斗事件BulletHitEvent 通过覆盖onBulletHit ()方法来处理;当机器人发出的子弹击中其他坦克时,就调用该方法。BulletMissedEvent 通过覆盖onBulletMissed ()方法来处理;当机器人发出的子弹没有击中任何坦克时,就调用该方法。BulletHitBulletEvent 通过覆盖onBulletHitBullet ()方法来处理;当机器人发出的子弹击中其他子弹时,

12、就调用该方法。21能量机器人最重要的动参要数能量(生命值)了,没有能量就意味着你输去了这场战斗。我们可以用函数getEnergy()得到我们机器人的生命点数. 能量的损失: 相撞损失:当我们撞到墙时我们的生命点会下降,生命点损伤度=Math.abs(velocity) * 0.5 -1当我们撞到另一个机器人,我们移动将会停止,并且我们会损失生命点6点。同时我们会被扣除积分1.2分。 击中损失 当我们被子弹打中我们的生命点损失是依据对方的能量大小而定的。当子弹能量为1时,我们生命点损失=4 * power,如果子弹能量大于1,那么我们的生命损失+= 2 * (power-1)。22能量发射损失

13、每发射一颗子弹我们的生命能量就会减少。减少的能量等于发射的子弹的能量,炮弹能量范围是:0.1 - 3 。能量的增加 :有失必有得,如果我们的子弹打中别的机器人,我们可以从子弹那窃取到3*power的能量.这是唯一增加生命力的途径。子弹的能量与速度 :子弹的能量与速度与数度成反比 ,速度= 20 - 3 *能量。因此子弹的能量越小,速度就越快,命中率也越高,不过威力也就越小。23炮管参数 炮管热量: 当我们开火时,炮管产生的热量由子弹开火时的能量决定也即:热量=1+(firepower/5),我们可以利用函数getGunHeat()得到炮管当时的热量,只有当getGunHeat恒等于0时,我们才

14、能再次发射子弹。现在你明白了为什么有时候我们生命点非零并且有子弹就是不能开火的原因了吗?炮管过热了! 冷却度: 有热度当然就有冷却度,不冷却我们的炮管会永远不会开火的。系统战斗设定的默认冷却速度是0.1/tick(时间周期),我们可通过函数getGunCoolingRate()得到这个参数值。 24高级机器人以上介绍的是Robot简单机器人,编写时的父类是Robot。还有一种高级机器人AdvancedRobot,前面提到过Robot 是线程阻塞式的,AdvancedRobot是可以使用非阻塞式的调用。如果要使用高级机器人,必须把父类改成AdvancedRobot。当你调用Robot 的ahea

15、d(100)时,机器人就立即 移动100个象素。该动作完成后才执行下一行代码。这样一来就无法实现曲线运动了。在AdvancedRobot中调用setAhead(100)时,将立即返回,并执行下一行的代码,可以看做是将ahead命令压入堆栈等待调用这种异步调用,可以实现多种操作同时进行,比如在前进的同时拐弯可以达到曲线运动。基于AdvanceRobot的机器人具有更加高级的智商。25高级机器人turnRight() setTurnRight() turnLeft() setTurnLeft() turnGunRight() setTurnGunRight() turnGunLeft() setT

16、urnGunLeft() turnRadarRight() setTurnRadarRight() turnRadarLeft() setTurnRadarLeft() ahead() setAhead() back() setback() 阻塞调用与非阻塞调用的对应关系:26探测军情当发现对方坦克时如何得到对方的坐标?public void onScannedRobot(ScannedRobotEvent e)double bearing = (getHeading() + e.getBearing() % 360;double distance = e.getDistance();bear

17、ing = Math.toRadians(bearing);double genyX = getX() + Math.sin(bearing) * distance;double genyY = getY() + Math.cos(bearing) * distance;27雷达锁定如何让它自己的视野之内?雷达锁定为了锁定目标,我们可以把雷达往反方向扫描。因为雷达旋转很快,而雷达的方向与对方坦克方向的偏移量不大,机器人是有一定大小的。于是扫描线在目标身上来回扫动,实现了雷达锁定。double RadarOffset=对方坦克方向-雷达方向setTurnRadarRightRadians( RadarOffset * 1.2 );28躲避攻击坦克对于周围环境的了解非常有限。但是,它看不到子弹。但是由于对方发射子弹时自身的能量会减少,通过判断对方的能量等级的变化,还是可以得知对方是否正在发射子弹。(一般在单挑模式下)public void onScannedRobot(Scanned

温馨提示

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

评论

0/150

提交评论