Robocode教程2——你的第一个robo,取个好名字哦
摘自:http://site.douban.com/widget/notes/7736245/note/210029011/
你需要准备的东西:
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 void onScannedRobot(ScannedRobotEvent e) { //每当雷达扫描到敌人
fire(1);
}
public void onHitByBullet(HitByBulletEvent e) {//每当被子弹击中
back(10);
}
public void onHitWall(HitWallEvent e) {//每当撞墙
back(20);
}
}
package为机器人建立包“cm”,以后我这个机器人的源文件就存放在这个包里面了,然后导Robocode.* 这是编写机器人必不可少的一句代码。因为所有机器人都是在Robocode平台下运行,Robocode包为我们提供了所有编写机器人的应用程序接口。接下来被注释掉的一句是导入java.awt.Color,当你要为机器人设置颜色的时候:setColors(Color bodyColor,Color gunColor,ColorradarColor),它就必不可少,如果少了导入Color这一句,编译是不会通过的。setColors参数有三个,分别是指定车身,炮,雷达各自的颜色。public class Tiny 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!