会员登录 | 注册

来去留技术信息资源

来去留技术信息资源
来去留网 > 来学技术 > 用游戏来学习java技术(robocode攻略)(2)

用游戏来学习java技术(robocode攻略)(2)

2012-02-08 14:10来源:来去留知道网发布者:laiquliu 查看:

现在单击菜单的complie下的complie进行编译,保存好,我们的机器人已经生产出来咯~
现在关闭editor,在进入new battle,pakeage下选择你刚才的包的名字,robot下就有了我们新建的xforce机器人了~添加进去吧,然后选择多几个其他的机器人,开始战斗!

看~我们的xforce在战斗了!

是否觉得它太蠢了点呢?来,继续来学习~~

robocode 机器人是一个图形化的坦克,请注意,机器人有一门可以旋转的炮,炮上面的雷达也是可以旋转的。机器人坦克车(vehicle)、炮(gun)以及雷达(radar)都可以单独旋转,也就是说,在任何时刻,机器人坦克车、炮以及雷达都可以转向不同的方向。缺省情况下,这些方向是一致的,都指向坦克车运动的方向。

附:robot 命令
  robocode 机器人的命令集都收录在 robocode api javadoc 中。这些命令都是 robocode.robot 类的公共方法。

(1)移动机器人、炮和雷达

  移动机器人及其装备的基本命令:

  这些命令都是在执行完毕后才把控制权交还给程序。此外,转动坦克车的时候,除非通过调用下列方法分别指明炮(和雷达)的方向,否则炮(和雷达)的指向也将移动。

(2)获取关于机器人的信息

(3)射击命令

  一旦掌握了移动机器人以及相关的武器装备的方法,我们就该考虑射击和控制损害的任务了。每个机器人在开始时都有一个缺省的“能量级别”,当它的能量级别减小到零的时候,我们就认为这个机器人已经被消灭了。射击的时候,机器人最多可以用掉三个能量单位。提供给炮弹的能量越多,对目标机器人所造成的损害也就越大。 fire(double power) 和 firebullet(double power) 用来发射指定能量(火力)的炮弹。调用的 firebullet() 版本返回 robocode.bullet 对象的一个引用,该引用可以用于高级机器人。(也就是说,当你确定能击中对方,火力越大越好咯^_^)

(4)事件

  每当机器人在移动或转动时,雷达一直处于激活状态,如果雷达检测到有机器人在它的范围内,就会触发一个事件。作为机器人创建者,我们有权选择处理可能在战斗中发生的各类事件。基本的 robot 类中包括了所有这些事件的缺省处理程序。但是,们可以覆盖其中任何一个“什么也不做的”缺省处理程序,然后实现自己的定制行为。下面是一些较为常用的事件:

很多研究robocode的 玩家都被其中的方向及坐标弄糊涂了。整个屏幕哪个是0度角,整个是坐标原点呢? 顺时针与逆时针的方向如何区分?

一段英文的翻译及说明:

几个在robocode中很重要的概念:

  再次提醒:heading是个静态角度,正上方总为0.不管是取heading,还是取方向。bearing是个角度差值,是由参照的heading和发现时的heading的差值。方向的问题就说到这,欢迎大家讨论。

我看了robocode的基础知识,自己写了个bot,放到battlefield上却是屡战屡败……伤心ing。

  bot对于周围环境的了解非常有限。它可以知道其它机器人的距离、方位、方向、速度和能量等级。但是,它看不到子弹。怎么才可以有效的躲避对方的子弹呢?

  bot虽然看不到子弹,但是对方的能量等级还是可以scan到了。对方只要发射子弹就会耗损能量,并且耗损的能量介于0和3之间。根据这些线索,如何发现其它机器人正向它开炮对于“笨笨”的bot不就易如反掌了? ^_^

  当bot检测到对方发射子弹的信息时,向左或向右移动一小步,嘿嘿,子弹就打不到咯~并且大多数bot的瞄准方法是要么直接向目标开炮,要么试着根据bot的速度和方向来推算位置。如果我的bot不移动,两种算法都会正好冲着这个bot的当前位置开炮。哈哈哈,这时我的bot再移动,不就全部都打不到啦。(是不是颇有武侠小说里以静制动的高手味道?^_^)

  下面是部分代码和注释:

double previousenergy = 100; //初始状态对方能量为100
int movementdirection = 1; //移动方向
int gundirection = 1; //炮管方向

/**
* 当检测到对方bot,触发事件
* @param e
*/
public void onscannedrobot(scannedrobotevent e) {
//调整自己和对方之间的角度
setturnright(e.getbearing()+90-30*movementdirection);

//如果对方的能量损耗一定值,进行躲避动作
double changeinenergy = previousenergy - e.getenergy();
if (changeinenergy>0 && changeinenergy= 0) ? 25: -25));
}
//避免撞墙
double heading = getheadingradians(); //取得bot方向的弧度数
double x = getx() + move*math.sin(heading); //移动move后将要达到的x坐标
double y = gety() + move*math.cos(heading); //移动move后将要达到的y坐标
double dwidth = getbattlefieldwidth(); //战场的宽度
double dheight = getbattlefieldheight(); //战场的长度
//当(x,y)超过指定的范围,则反向移动move
if(x < 30 || x > dwidth-30 || y < 30 || y > dheight-30){
setback(move);
}
turnradarleft(radarmove); //转动雷达
}
}//end run()

(责任编辑:laiquliu)

关注技术,信息,资源,扫描来去留网微信二维码交流。

来去留我李俊

搜索

------分隔线----------------------------
相关栏目

热点推荐
来去留技术信息资源
来去留网为您提供平台咨询交流学习方法及各类热门技术;电器,服装,保健,行业快讯等二十几个类别的资讯