Robocode坦克大战源码

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
RoboCode基础知识讲解
山东师创实训文件:
Robocode简介
• Robocode 是一位IBM的工程师 Mat Nelson 用Java 语言所创造 的机器人战斗仿真引擎。Robocode不是一个完整游戏,它是个半成 品,一个专为程序员们准备的游戏。它使得你不用不面对一些无聊琐 碎但又不得不做的工作,编写界面、处理图像、处理音频,。而是用 一种更简单的办法,让我们享受游戏开发的乐趣。 Robocode 它为你 处理好一切细节。你所做就是为你的机器人坦克编写智能程序,让它 能够移动、进攻、防御、躲避、开火。而它的对手就是跟你一样其他 程序员编写机器人程序。 • 这就是Robocode魅力所在,最简单,只用几十行代码,就能立 刻创造出一个简单但完整机器人。你可以不停的修改你的程序,设计 新射击模型、躲避模型、移动模型,还可以在网上下载由其他程序员 编写的水平更高的机器人,与它们比试一下,看看自己的水平到底如 何。 • 从2001年7 月诞生之日算起,Robocode发展到如今,已经吸引 了全世界无数爱好者参与其中。不仅出现了许多交流Robocode 技术 的网站,也有各种规模不等的Robocode 大赛在各地进行。还等什么, 赶快进入Robocode 这个有趣的世界。
战斗事件
ScannedRobotEvent-通过覆盖onScannedRobot()方法 来处理;当雷达检测到机器人时,就调用该方法。 HitByBulletEvent - 通过覆盖onHitByBullet()方法来 处理;当机器人被炮弹击中时,就调用该方法。 HitRobotEvent -通过覆盖onHitRobot()方法来处理;当 机器人击中另外一个机器人时,就调用该方法。 HitWallEvent -通过覆盖onHitWall()方法来处理;当机 器人撞到墙时,就调用该方法。
能量
• 机器人最重要的动参要数能量(生命值)了,没有能量就意 味着你输去了这场战斗。 • 我们可以用函数getEnergy()得到我们机器人的生命点数. 能量的损失: 相撞损失: 当我们撞到墙时我们的生命点会下降,生命点损伤度 =Math.abs(velocity) * 0.5 -1当我们撞到另一个机器人, 我们移动将会停止,并且我们会损失生命点6点。同时我 们会被扣除积分1.2分。 击中损失 当我们被子弹打中我们的生命点损失是依据对方的能量大 小而定的。当子弹能量为1时,我们生命点损失=4 * power,如果子弹能量大于1,那么我们的生命损失+= 2 * (power-1)。
安装RoboCode平台
安装jdk 可到 ftp://59.77.6.144 下载 用户名:robocode 密码robocode 安装RoboCode运行环境: 下载地址: ftp://robocode:robocode@59.77.6.144/pub/Rob ocode坦克游戏平台/robocode-setup.jar 双击robocode-setup.jar文件进行安装
能量
发射损失 每发射一颗子弹我们的生命能量就会减少。减少的能量等 于发射的子弹的能量,炮弹能量范围是:0.1 - 3 。 能量的增加 : 有失必有得,如果我们的子弹打中别的机器人,我们可以 从子弹那窃取到3*power的能量.这是唯一增加生命力的途 径。 子弹的能量与速度 : 子弹的能量与速度与数度成反比 ,速度= 20 - 3 *能量。 因此子弹的能量越小,速度就越快,命中率也越高,不过 威力也就越小。
坦克结构
• 雷达是机器人取得敌人信息的主要器官, 它的基本操作有: • turnRadarLeft(double degree)和 turnRadarRight(double degree)分别是使炮 上面的雷达(左右)转动指定的角度,转 • 动的方向也独立于炮的方向(以及坦克车 的方向)。
坦克结构
战斗事件
BulletHitEvent -通过覆盖onBulletHit ()方法来处理;当 机器人发出的子弹击中其他坦克时,就调用该方法。 BulletMissedEvent -通过覆盖onBulletMissed ()方法来处 理;当机器人发出的子弹没有击中任何坦克时,就调用该 方法。 BulletHitBulletEvent -通过覆盖onBulletHitBullet ()方法 来处理;当机器人发出的子弹击中其他子弹时,就调用该 方法。
坦克结构
• 车身是一个比较笨重的部分, 负责移动,它 的基本操作有: turnLeft(double degree)和turnRight(double degree)分别是使机器人(左右)转过一个 指定的角度。 ahead(double distance)和back(double distance) )分别是使机器人(前后)移动指 定的像素点距离,;这两个方法在机器人碰 到墙或碰到另外一个机器人时即告完成。
• 默认情况下三个部分的运动是相对锁住的,要使 他们能独立运动,Robocode 提供了三个方法来 解锁。 • setAdjustGunForRobotTurn(boolean flag):如果 flag被设置成true,那么坦克车转动时,炮保持原 来的方向。 • setAdjustRadarForRobotTurn(boolean flag):如 果flag被设置成true,那么坦克车(和炮)转动时, 雷达会保持原来的方向。 • setAdjustRadarForGunTurn(boolean flag):如果 flag 被设置成true,那么炮转动时,雷达会保持原 来的方向。而且,它执行的动作如同调用了 setAdjustRadarForRobotTurn(true)。
打包坦克程序
• “Robot””Package robot for upload” 选择要打包的坦克程序,按”add”加入 • 按”next”进入下一步,在文本区域框中填 写程序说明 • 按”next”选择保存路径 • 按”next”进行信息确认 • 最后按”package!”进行打包,本次比赛只 要上传这个包文件
保存比赛
• “battle””save”/”save as”进行赛场 保存 • “battle””open”进行重载赛场
创建坦克程序
• “Robot””Editor”打开编辑器,当然 也可以用其他的编辑器,如: JCreator的下载地址: ftp://robocode:robocode@59.77.6.144/pu b/java/JCreatorV4.rar
坦克结构
• 炮是用来发射炮弹攻击敌人的武器,它的 基本操作有: • turnGunLeft(double degree) 和 turnGunRight(doubledegree)分别是使炮可 以独立于坦克车的方向(左右)转动指定 的角度。 • fire(double power)发射指定能量的炮弹, 能量范围是(0.1 - 3)。
炮管参数
• 炮管热量: 当我们开火时,炮管产生的热量由子弹开火时的能量决定 也即:热量=1+(firepower/5),我们可以利用函数 getGunHeat()得到炮管当时的热量,只有当getGunHeat恒 等于0时,我们才能再次发射子弹。现在你明白了为什么 有时候我们生命点非零并且有子弹就是不能开火的原因了 吗?炮管过热了! • 冷却度: 有热度当然就有冷却度,不冷却我们的炮管会永远不会开 火的。系统战斗设定的默认冷却速度是0.1/tick(时间周期), 我们可通过函数getGunCoolingRate()得到这个参数值。
• “File””New””Robot”
输入类名(R04369141),包名(xmu)后,创建一个 坦克的模板文件
创建坦克程序
• 编写代码请查看API文档 “Help””Robocode API” 软件学社FTP上有chm版本的API doc。
• 主要查Baidu NhomakorabeaRobot类
• “Compiler””Compile”进行保存、编译 系统会自动搜索JDK环境地址(之前已经装好了) 保存的路径建议使用默认的路径
高级机器人
以上介绍的是Robot简单机器人,编写时的父类是 Robot。还有一种高级机器人AdvancedRobot,前面提到过 Robot 是线程阻塞式的,AdvancedRobot是可以使用非阻塞 式的调用。如果要使用高级机器人,必须把父类改成 AdvancedRobot。 当你调用Robot 的ahead(100)时,机器人就立即 移动100 个象素。该动作完成后才执行下一行代码。这样一来就无法 实现曲线运动了。在AdvancedRobot中调用setAhead(100) 时,将立即返回,并执行下一行的代码,可以看做是将 ahead命令压入堆栈等待调用.这种异步调用,可以实现多 种操作同时进行,比如在前进的同时拐弯可以达到曲线运 动。 基于AdvanceRobot的机器人具有更加高级的智商。
运行RoboCode
a. 进入安装目录,双击robocode.jar文件或 robocode.bat文件打开主程序 如果有添加桌面图标,可直接双击桌面图标
b. 进行新比赛: “Battle””new””robots” • 在”robots”选项卡里面,点击坦克文件, 按”add”按钮进行添加,按”remove”进
坐标系统
• 【Heading】:是机器人方向与屏幕正上方 的角度差,方向在0 到360 之间。 • 【Bearing】:是机器人的某个部件如雷达 发现的目标与方向的角度差,顺时针为正 角度在-180 到180 之间。
坦克结构
• 机器人的结构包含三个部分:Body -车身, Gun -炮,Radar -雷达。
导入坦克程序
• “Robot””Import downloaded robot” 选择坦克程序.jar文件,导入 • 进行比赛 加载程序的过程和以前一样
Robocode坐标系统
• 【坐标系】:Robocode整个坐标系都是战场屏幕 以左下角为原点。 • 【绝对方向系】:Robocode中不管机器人在哪个 方向都是以静态战场屏幕为参照物的绝对角度 (Heading),正上方为0 度角。即是向北为0,向 东为90,向南为180,向西为270。 • 【相对方向系】:相对方向是以机器人的动态 heading角度为参照物的角度差,不再以整个静态 屏幕为参照了。叫它相对是因为机器人的heading 是随着机器人移动而不停的在改变,heading 只 是个相对物体。
获取信息
• getX()和getY()可以捕捉到机器人当前所在战场中 的坐标。 • getHeading()、getGunHeading()和 getRadarHeading()分别可以得出坦克车、炮或雷 达当前的方向,该方向是以角度表示的。
• getBattleFieldWidth()和getBattleFieldHeight()可 以得到当前这一回合的战场尺寸。
turnRadarLeft() setTurnRadarLeft() ahead() setAhead() back() setback()
高级机器人
阻塞调用与非阻塞调用的对应关系:
turnRight() setTurnRight() turnLeft() setTurnLeft() turnGunRight() setTurnGunRight() turnGunLeft() setTurnGunLeft()
turnRadarRight() setTurnRadarRight()
运行RoboCode
• 修改”Number of rounds”可以设置比赛 场数,默认为10场 • 点击”next”可以设置战场的其他的参数, 如战场大小、炮管冷却速度。
• 点击”start battle”进行坦克比赛
进行比赛
• 全自动比赛
• 全自动评比 比赛结果以程序的评比结果为准
• 按”pause”中断比赛,按”stop”快速结 束比赛并评出结果
相关文档
最新文档