构建你的第一个Robocode坦克

  版权信息:
● 本博客使用CC 3.0协议,转载请保留该信息。
● 原文作者: 戴晓天 @ 云飞机器人实验室
● 原文地址: 构建你的第一个Robocode坦克

上次向大家简单介绍了一下Robocode的安装,但却没有具体说明如何创建一个Robocode项目。要开发Robocode,需要正确安装JVM(Java Virtual Machine),Robocode程序,以及Visual Studio2008。当然你也可以使用JAVA环境开发,这里假设你使用的是Robocode的.Net版本。

打开Visual Studio2008,点击File->New->Project,在弹出的窗口中选择Visual C#中的Class Library:

 
图1. 新建一个C# Class Library工程

输入工程名,比如”MyTank”。这时会生成一个工程,并默认包含了一个Class1.cs文件。因为我们需要使用Robocode的开发库,所以需要添加相关引用,右键点击工程树中的”References”选择”Add Reference”:

 
图2. 
添加引用  

在弹出的窗口中选择”Browse”选项卡,选择Robocode安装目录->libs->robocode.dll:

 
图3. 
选择robocode.dll

你可以重命名Class1.cs,比如Tank.cs。在弹出的窗口中选择“是”,这个名字将是你的机器人在战场中显示的名字。

打开Tank.cs,在开始几行using下添加一句:using robocode,以便可以引用robocode的API。namespace将决定坦克的前缀,防止机器人命名重复,这里比如说改为YunFei。为了获得一些坦克的基础属性与动作,我们需要让我们创造的坦克类继承robocode中坦克的基类Robot,这时候,我们的代码看上去就像这样:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Robocode;

namespace YunFei

{

public class Tank : Robot

{

}

}

为了能让我们的机器人动起来,我们需要定义Run()函数。Run()函数决定我们机器人的行为,在该函数中对我们的机器人进行初始化,之后进入一个无限循环,在该循环中处理机器人的行为,比如移动、开火、或是躲避敌人的子弹。一个Run()函数可以是这样的:

public override void Run()

{

// Todo:在这里添加初始化变量

// 开始无限循环

while (true)

{

Ahead(5000);    // 向前5000个单位

TurnRight(90);  // 向右旋转90度

}

}

有时候,光有主循环还不够,我们需要对一些事件做出反应,比如被击中、比如检测到敌人,这就需要覆盖事件函数。这里举两个例子,比如发生被敌人击中事件时就移动,发生发现敌人事件时就开火:

public override void OnScannedRobot(ScannedRobotEvent e)

{

Fire(1);

}

public override void OnHitByBullet(HitByBulletEvent evnt)

{

TurnRight(10);

Ahead(10);

}

Fire()函数的参数表示子弹的火力,火力越大敌人的伤害越大,但自己消耗的能量也越大。在Robocode中,发射子弹消耗能量,击中别人获得能量,一旦能量耗尽,机器人也就死亡了。Robocode中还有很多的事件,大家可以阅读相关手册,按照以上模式进行添加。

至此,一个具有简单行为的坦克机器人也就完成了。这个机器人平时会一直前进,之后右转;当检测到敌人时,发射子弹;被别人击中时,偏移一个小角度之后继续移动。整个tank.cs如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Robocode;

namespace YunFei

{

public class Tank : Robot

{

public override void Run()

{

// Todo:在这里添加初始化变量

// 开始无限循环

while (true)

{

Ahead(5000);    // 向前5000个单位

TurnRight(90);  // 向右旋转90度

}

}

public override void OnScannedRobot(ScannedRobotEvent e)

{

Fire(1);

}

public override void OnHitByBullet(HitByBulletEvent evnt)

{

TurnRight(10);

Ahead(10);

}

}

}

在编译之前,我们需要先进行一下配置,右键点击工程文件,右键选择Properties:

 
图4. 选择Properties

  需要改变的选项有两项,一是Assembly_name一项,这个决定输出文件的名字,可以以”队伍名.坦克名_版本号”的方式命名,Default namespace是默认的命名空间,与项目中的namespace一致就行了。

 
图5. 修改Properties设置

点击Build->Build Solution或按下F7就可以编译项目了,如果没有错误,会在工程目录/bin/debug下看到生成的dll文件,其文件名与你填写的Assembly Name一致。

现在,我们要将我们编写的坦克添加到Robocode的战场中。首先打开Robocode主程序,点击Options->Preferences->Development Options选项卡,点击add按钮:

 
图6. 添加工作环境路径

添加我们刚才生成的.dll文件所在路径,如D:\Projects\MyTank\MyTank\bin\debug。这样Robocode就可以找到我们的机器人了。

这时点击Battle->New,在选择机器人的界面中应该已经能看到我们的机器人了:

 
图7. 新建战场

点击”Add->”将我们的机器人加入战场,之后可以在sample中随便添加几个对手,点击底部的”Start Batlle”,一场惊心动魄的比赛就开始了!

不用多想,最后的结果一定是惨烈的…因为这个只会乱窜的家伙需要你给它更多的智能。

马上在云飞社区起步你的Robocode之旅吧!

%d bloggers like this: