Robocode系统实训项目实施方案一、项目Robocode简介Robocode是一位IBM的工程师MatNelson用Java语言所创造的机器人战斗仿真引擎。Robocode不是一个完整游戏,它是个半成品,你所做的就是为你的机器人坦克编写智能程序,让它能够移动、进攻、防御、躲避、开火。只用几十行代码,就能立刻创造出一个简单但完整机器人,你可以立即将它装入Robocode引擎中,再从Robocode自带的那些水平不一的示例机器人中选取一个进行一番对战,还可以在网上下载由其他程序员编写的水平更高的机器人,与它们比试一下,看看自己的水平到底如何。开发Robocode,也是一个极佳的学习Java语言的过程。随着你的机器人的“智力”水平的提高,你的编程能力也就跟着水涨船高了。二、项目目标通过Robocode系统的开发,要求学生:1、进一步熟练java面向对象编程方法的设计与实现;2、如何编写Java代码,如何处理Java中的事件,如何创建内部类;3、全面实践软件工程项目,总结系统开发的基本方法与步骤;并就开发过程中遇到的问题以及解决的方法进行总结与归纳。三、具体实施通常玩的游戏不同的是:参赛者必须利用对机器人进行编程,给机器人设计智能来自动指挥它,而不是由键盘、鼠标简单地直接控制。Robocode是一种有趣的竞赛性编程,使用几行简单的代码,就能够让你创建一个活生生的机器人,一个真正的在屏幕上与其他机器人互相对抗的机器人。你可以看到它在屏幕上四处疾驰,碾碎一切挡道的东西。机器人配有雷达与火炮,选手在躲避对手进攻的同时攻击对手,以此来较量得分的多少。Robocode可以让你在娱乐的同时学习与提高Java技术。1、游戏安装Robocode项目已经成为开源项目,Robocode可以在Robocode首页下载首页:(本项目教师已经下载完毕)提取自中国Robocode第一人,Wave技术的创始人iiley所写的Cigaret机器人中。,进入了解Robocode。下载Robocode在安装过程中,Robocode将问您是否要使用这个外部的JavaVM来编译机器人。您也可以选择使用作为Robocode分发包一部分而提供的Jikes编译器。2、游戏界面与基本角色当激活Robocode时,将看到两个相关的GUI窗口,这两个窗口构成了Robocode的IDE:*战场*RobotEditor战场是机器人之间进行战斗直至分出胜负的场地。主要的仿真引擎被置于其中,并且允许在这里创建战斗、保存战斗以及打开新建的或现有的战斗。通过界面区域内的控件,可以暂停或继续战斗、终止战斗、消灭任何机器人个体或获取任何机器人的统计数据。此外,可以在此屏幕上激活RobotEditor。RobotEditor是一个定制的文本编辑器,它可以用于编辑生成机器人的Java源文件。在它的菜单里集成了Java编译器(用于编译机器人代码)以及定制的Robot打包器。由RobotEditor创建并成功编译的所有机器人都会处于战场上一个部署就绪的位置。(高手认为它所提供的文本编辑器不怎么好,最后还是用jb来编辑,只要在RequirdLibraries加入解压缩后的robocode.jar就可以了)Robocode里的每个机器人都由一个或多个Java类构成。这些类可以被压缩成一个JAR包。为此,Robocode的最新版本提供了一个可以在战场GUI窗口中激活的“RobotPackager”。图2.对Robocode机器人的详细分析Robocode机器人是一个图形化的坦克,请注意,机器人有一门可以旋转的炮,炮上面的雷达也是可以旋转的。机器人坦克车(Vehicle)、炮(Gun)以及雷达(Radar)都可以单独旋转,也就是说,在任何时刻,机器人坦克车、炮以及雷达都可以转向不同的方向。缺省情况下,这些方向是一致的,都指向坦克车运动的方向。3、平台参数方向-整个战场是以屏幕正上角为0度,按顺时针排列,90,180,270...。位置-整个战场的坐标是以屏幕左下角为原点,高为Y坐标,宽为X坐标。距离-游戏中规定的距离是以像素(Pixels)点为单位,如果你把屏幕缩小了,那就是以缩小后的像素点为单位,反之就是放大后的像素点为单位。时间-游戏中规定的时间是以帧(frame)或滴答(ticks)(有点像时钟滴答),或时间周期(turns),或单独的时间片(simplytimeslices)为单位。回合比赛回合是比赛中由用户自己设置的比赛次数,默认值为10。帧速-默认为30。扫描-默认为无。声音-默认为无。4、游戏规则:(1)生命规则:相撞损失:撞到墙时,生命点损伤度=Math.abs(velocity)*0.5-1。撞到另一个坦克时,移动停止,生命点损失6点,扣除积分1.2分。击中损失:当子弹能量为1时,我们生命点损失=4*power,如果子弹能量大于1,那么我们的生命损失+=2*(power-1)。发射损失:如果我们的子弹打中别的坦克,我们可以从子弹那窃取到3*power的能量。(2)炮弹规则:子弹能量:子弹能量是通过函数getPower()得到的。它大于等于0.1,小于等于3。子弹速度:每一颗子弹有着自身的速度,这在处理敌人向你开炮前的移动策略可是很有帮助的。子弹的速度也和它的能量有关:speed=20-3*power。由于能量范围在0.1到3之间我们可求得子弹的速度范围:11=bulletspeed=19.7。(3)炮管规则:旋转速率:炮管在每一个时间周期内旋转速率=20度/帧(frame)炮管热量:当我们开火时,炮管产生的热量由子弹开火时的能量决定。即:热量=1+(firepower/5),利用函数getGunHeat()可以得到炮管当时的热量,只有当getGunHeat恒等于0时,我们才能再次发射子弹。冷却度:有热度当然就有冷却度,不冷却我们的炮管会永远不会开火的。系统设定的默认冷却速度是0.1/tick(时间周期),我们可通过函数getGunCoolingRate()得到这个参数值。(4)雷达规则:旋转速度:雷达以每时间周期45度的速度旋转。也即45degrees/frame.扫描面积:雷达扫描是呈扇形的,它的开始位置到终止位置的长度大约为1200。只要我们放大屏幕可以通过眼睛估算出这个面积。扫描排列:扫描到的数据有墙,目标,子弹等等。这些是按扫描距离来排列,从离雷达最近的物体开始到最后扫描到的物体。(5)运行规则:前进速度:坦克最大的速度(Velocity)为8,函数getVelocity()返回了坦克当前的速度。加/减速度:加速度为1像素(pixel)/帧frame,减速度为2pixel/frame。参考公式:设s为距离,Vt为终速度,Vo为初速度,t为时间,a为加速度:位移公式s=Vo*t+a*t*t/2速度公式Vt=Vo+a*t平均速度公式v=(Vt+Vo)/2=s/t加速度公式a=(Vt-Vo)/t(这些公式高一大家都学过吧?)(6)旋转规则:旋转速度:机器人的旋转速度和当前的速度有关即旋转速度=10-0.75*getVelocity()。相互作用参数:雷达安装在炮上,炮安装在机器人上,它们会相互影响。如果我们向左转动炮管,而使雷达向右转动,那么雷达只会向右转动(45-20)=25度;如果两者都向右转动,雷达将向右转(45+20)=65度。同样的道理炮和机器人也是方向同相加,方向反相减。5、积分规则:RobotName-机器人的名字;TotalScroe-为这次比赛你的总共得分;Survival-是你存活率的得分;LastSurvivorBonus:你是赢的次数相对对手的分红得分;BulletDmg:是你的子弹损失得分也即发射的子弹数的得分;Bonus:是子弹数的分红得分;RamDmg*2是你的撞击得分;Bonus:是你撞击得分分红;最后两项Survival1sts,是你赢的次数,不算做分数。所有分数加起来就是你的总分。记住在联赛并不是总分越高越好,它是算综合平均分的。其中撞击分和子弹损失分就要越少越好。你如果观察两大高手比赛的记分牌,你会发现他们的RamDmg和RamDmg中的Bonus一般都为0。6、基本术语在细究API之前,让我们先来了解一些术语。机器人基本上是一些小型的坦克。这些坦克可以旋转,向前或向后移动。它们的顶部有一个用于射击的火炮。在火炮上面还有一个雷达系统,用于侦测其它机器人。机器人的底盘、火炮和雷达系统都可以独立运动,也可以相互“锁定”,一起移动。换句话说,如果将雷达向下锁定,那么它将随火炮一起移动;如果火炮向下锁定,它将随机器人的底盘一起移动。下面是一些你在编写机器人之初用的最多的方法函数:ahead(),back()——向前和向后移动fire()——开火setAdjustGunForRobotTurn()——控制火炮是否向下锁定setAdjustRadarForGunTurn()——控制雷达是否向下锁定turnRight(),turnLeft()——实现机器人的旋转turnGunRight(),turnGunLeft()——旋转火炮turnRadarLeft(),turnRadarRight()-旋转雷达反射镜4、你所做的就是为你的机器人坦克编写智能程序,让它能够移动、进攻、防御、躲避、开火;四、实训报告撰写实训报告,总结此系统开发的基本方法与步骤;并就开发过程中遇到的问题以及解决的方法进行总结与归纳。四、考核方法与评分标准该项目采取过程考核和提交实训项目、实训报告的方式进行考核,项目所占实训成绩的总分数为6分,其中:1、系统功能的实现(3分)2、程序的开发调试能力(3分)