你需要准备的东西:
1.c语言的知识和一点点的java知识,robocode意在学习java,不要要太深的java水平,你只要理解java和c的区别就可以了。
2.robocode API,这个以后会经常用到,几乎不能离开,相当于方法字典,robocode的所有方法都在里面。下载地址:http://115.com/file/e765xcsb#javadoc.zip
网页版:http://robocode.sourceforge.net/docs/robocode/
好了,兴趣是最好的老师,我们先抛开那些繁琐的参数、坐标、算法,先建立一个简单的robo试试。
打开robocode,选择【Robot】->【Editor】,打开editor后,选择【new】->【Robot】,给robo取个好名字吧,比如Tiny,那是因为我玩dota游戏喜欢小小,robo也很小,可是功能却很强大的。
下面是输入机器人的包,包是java中的一个概念,这里我们暂且把它当成文件夹来看吧。我们就输入自己的名字就ok了。
package cm;
import robocode.*; //cm 就是我的包, import 是告诉 java 你要在在你的工程中使用 robocode
import java.awt.Color;
public class Tiny extends Robot // 告诉 java ,我写的这个是一种 “Robot” ,叫做 “Tiny”
{
public void run() { //run() 方法是战斗开始时默认调用的,我们在这里写自己的代码
while(true){
ahead(100);// 向前 100 像素
turnGunRight(360);// 把 gun 向右转动 360 度
back(100);// 后退 100 像素
turnGunRight(360);// 把 gun 向右转动 360 度
}
}
/* 以 on 开头的方法都是事件触发方法,熟悉单片机的同学可能知道,这相当于单片机里面的中断 , 每当程序遇到一个触发事件时,将停止主方法的运行而运行触发方法,运行后再返回主方法。
*/
public voidonScannedRobot(ScannedRobotEvent e) { // 每当雷达扫描到敌人
fire(1);
}
public voidonHitByBullet(HitByBulletEvent e) {// 每当被子弹击中
back(10);
}
public voidonHitWall(HitWallEvent e) {// 每当撞墙
back(20);
}
}
package 为机器人建立包 “cm” ,以后我这个机器人的源文件就存放在这个包里面了,然后导 Robocode.* 这是编写机器人必不可少的一句代码。因为所有机器人都是在 Robocode 平台下运行, Robocode 包为我们提供了所有编写机器人的应用程序接口。接下来被注释掉的一句是导入 java.awt.Color ,当你要为机器人设置颜色的时候: setColors(Color bodyColor,Color gunColor,ColorradarColor) ,它就必不可少,如果少了导入 Color 这一句,编译是不会通过的。 setColors 参数有三个,分别是指定车身,炮,雷达各自的颜色。 public classTiny extends Robot {...} 机器人的名字是 Tiny ,代码表明建立了一个公有类 Tiny 继承 Robot ,必须建立公有的类,现在的 Tiny 是一个简单机器人。而我们将要打造的不仅仅是继承简单机器
人,而是高级机器人( AdvancedRobot )。能够高效率运行的机器人都是继承的 AdvancedRobot ,因为 Robot 是线程阻塞式的, AdvancedRobot 是线程非阻塞式的。他们的区别比较明显,分析 while(true){} 里面的代码来理解线程阻塞与非阻塞就比较容易了。
在 Robocode 中每一个机器人都是一个独立的线程,我们知道不管是 extends Thread 还是 implementsRunnable 都要实现 public void run() 方法,这是必不可少的。为了保证机器人不断的运行自己的程序,所以线程中用了 while(true) 循环。在每一次循环中, ahead(100) 机器人向前运动 100 象素,接着 turnGunRight(360) 右转炮 360 度,因为没有使用 setAdjustRadarForGunTurn(true), 所以雷达会随着炮的转动而同步转动,雷达在转动的时候自动扫描周围的敌人,如果发现敌人,那么 ScannedRobotEvent 事件发生。系统默认写好的代码只有一句: fire(1) 发射能量为 1 的炮弹,如果敌人在炮弹到达时还在原地,恭喜!命中目标了。接下来,机器人就会执行 back(100) 后退 100 象素,然后 turnGunRight(360) 扫描敌人。继续下一次的循环。
最后这个机器人还写了一个事件: onHitByBullet(HitByBulletEvent e) 机器人被敌人的炮弹击中后就发生了这个事件。 turnLeft(90-e.getBearing()) 车身左传一个角度,这个角度的值是 90-e.getBearing(),e.getBearing() 是获得炮弹与车身的相对角度,左转后,车身的角度会与炮弹飞来的直线成直角,这样有利于躲避下一次的炮弹攻击。
好了,我们的第一个 robo 就完成了,是不是很简单呢?只要移动,扫描,发现目标, fire !
选择【 compiler 】 -> 【 compile 】编译就 ok 了。
最后进入战斗界面,新建一个战斗,看看我们的 Tiny 是不是在里面呢? Tiny , its your show time !