Robocode  编写机器人

来源:互联网 发布:巨杉数据库 吹牛 编辑:程序博客网 时间:2024/05/16 01:00
在上一篇文章(Robocode入门)中我们已经和大家介绍了Robocode,我相信大家都觉得那中软件自带的那种机器人太没有战斗力了,这样才可以拥有自己编写的更具有战斗力的机器人呢?下面我将为大家解决这个问题。
战场是机器人之间进行战斗直至分出胜负的场地。主要的仿真引擎被置于其中,并且允许在这里创建战斗、保存战斗以及打开新建的或现有的战斗。通过界面区域内的控件,可以暂停或继续战斗、终止战斗、消灭任何机器人个体或获取任何机器人的统计数据。此外,我们可以在此屏幕上的Robot菜单打开Editor,就是我们机器人的代码编辑器了!Robot Editor 是一个定制的文本编辑器,它可以用于编辑生成机器人的 Java源文件。在它的菜单里集成了 Java 编译器(用于编译机器人代码)以及定制的 Robot 打包器。由 Robot Editor创建并成功编译的所有机器人都会处于战场上一个部署就绪的位置。我们就是要在这里编写机器人了。
选择“File”->“New”->“Robot”来新建一个机器人。它会首先要你输入这个机器人的名字(注意名字首字母要大写),然后要你输入包的名字(就是保存这个机器人的文件夹名称),这样就生成了一个蠢蠢的机器人XForce的代码了,因为我们还没替它加上人工智能。现在单击菜单的Complie下的Complie进行编译,保存好,我们的机器人已经生产出来了。现在关闭Editor,在进入NewBattle,Pakeage下选择你刚才的包的名字,Robot下就有了我们新建的XForce机器人了,添加进去吧,然后选择多几个其他的机器人,开始战斗!
看!我们的XForce在战斗了!是否觉得它太蠢了点呢?来,继续来学习。Robocode机器人是一个图形化的坦克,请注意,机器人有一门可以旋转的炮,炮上面的雷达也是可以旋转的。机器人坦克车(Vehicle)、炮(Gun)以及雷达(Radar)都可以单独旋转,也就是说,在任何时刻,机器人坦克车、炮以及雷达都可以转向不同的方向。缺省情况下,这些方向是一致的,都指向坦克车运动的方向。
附:Robot 命令
Robocode 机器人的命令集都收录在 Robocode API Javadoc中。这些命令都是 robocode.Robot 类的公共方法。
(1)移动机器人、炮和雷达
移动机器人及其装备的基本命令
* turnRight(double degree) 和 turnLeft(doubledegree) 使机器人转过一个指定的角度。
* ahead(double distance) 和 back(doubledistance) 使机器人移动指定的像素点距离;这两个方法在机器人碰到墙或另外一个机器人时即告完成。
* turnGunRight(double degree) 和turnGunLeft(double degree) 使炮可以独立于坦克车的方向转动。
* turnRadarRight(double degree) 和turnRadarLeft(double degree)使炮上面的雷达转动,转动的方向也独立于炮的方向(以及坦克车的方向)。
这些命令都是在执行完毕后才把控制权交还给程序。此外,转动坦克车的时候,除非通过调用下列方法分别指明炮(和雷达)的方向,否则炮(和雷达)的指向也将移动。
* setAdjustGunForRobotTurn(booleanflag):如果 flag 被设置成 true,那么坦克车转动时,炮保持原来的方向。
* setAdjustRadarForRobotTurn(booleanflag):如果 flag 被设置成 true,那么坦克车(和炮)转动时,雷达会保持原来的方向。
* setAdjustRadarForGunTurn(booleanflag):如果 flag 被设置成 true,那么炮转动时,雷达会保持原来的方向。而且,它执行的动作如同调用了setAdjustRadarForRobotTurn(true)。
(2)获取关于机器人的信息
* getX() 和 getY() 可以捕捉到机器人当前的坐标。
* getHeading()、getGunHeading() 和getRadarHeading() 可以得出坦克车、炮或雷达当前的方向,该方向是以角度表示的。
* getBattleFieldWidth() 和getBattleFieldHeight() 可以得到当前这一回合的战场尺寸。
(3)射击命令
一旦掌握了移动机器人以及相关的武器装备的方法,我们就该考虑射击和控制损害的任务了。每个机器人在开始时都有一个缺省的“能量级别”,当它的能量级别减小到零的时候,我们就认为这个机器人已经被消灭了。射击的时候,机器人最多可以用掉三个能量单位。提供给炮弹的能量越多,对目标机器人所造成的损害也就越大。fire(doublepower) 和 fireBullet(double power) 用来发射指定能量(火力)的炮弹。调用的 fireBullet()版本返回 robocode.Bullet对象的一个引用,该引用可以用于高级机器人。(也就是说,当你确定能击中对方,火力越大越好咯)