数据加载中...
Welcome to javafans club
网站刚开 , 谢谢大家的到来..
当前位置| 主页>Java技术资讯>GUI设计>

用JAVA编写自己的机器人一起“厮杀”

2008-07-14 作者:佚名 来源:网络 阅读

什么是Robocode?

最近我在阅读一个关于极限编程(XP)的邮件列表,有人提议为对学习更多的XP方法学知识感兴趣的开发人员构建一个工作间。这位作者还建议,把一群人凑到一起,分成小组研究该方法学。 然后要有一个经验丰富的XP教练对工作间进行管理,帮助参加者理解其原理。

而建议各小组采用的项目就是创建Robocode机器人。

我停下来,把这段话重新看了一遍。 其实我对机器人一直很感兴趣。在我还是个孩子是时候,我记得Aplle Ⅱ上有一个程序,我们用它来编写简单的机器人程序,然后相互作战。

Robocode就是这样一个东西,但是更好一些。它是一个基于Java的机器人作战游戏。 其代码的编写和建模都不错,玩起来也很有趣。

如果你阅读这个时事通讯比较久的话,你可能会问你自己“他会Java吗?”。是的,我会。虽然我常常抱怨Java,但我并非真正讨厌Java这一语言。我所讨厌的只是该语言与生俱来的平台和可升级性问题。 我总认为,作为一种语言,Java是目前最优越的轻量级的C++,这种想法直到我发现C#之后才改变,而这又是另外一个故事了。


Robocode的API

Robocode是由IBM的Alphaworks项目成员Matthew Nelson编写的。从第一个版本开始,Matthew 已对该软件的API做了相当多的改进,我以为该软件为机器人的编写提供了一套完美的框架。 用于创建机器人的基类称作Robot。你的机器人都继承自这个类。 Robot类提供了所有与游戏进行交互所需的方法函数。

在细究API之前,让我们先来了解一些术语。机器人基本上是一些小型的坦克。这些坦克可以旋转,向前或向后移动。它们的顶部有一个用于射击的火炮。在火炮上面还有一个雷达系统,用于侦测其它机器人。机器人的底盘、火炮和雷达系统都可以独立运动,也可以相互“锁定”,一起移动。换句话说,如果将雷达向下锁定,那么它将随火炮一起移动;如果火炮向下锁定,它将随机器人的底盘一起移动。有意思吧?

下面是一些你在编写机器人之初用的最多的方法函数:
ahead(), back() ——向前和向后移动
fire() ——开火
setAdjustGunForRobotTurn() —— 控制火炮是否向下锁定
setAdjustRadarForGunTurn() ——控制雷达是否向下锁定  
turnRight(), turnLeft() —— 实现机器人的旋转
turnGunRight(), turnGunLeft() —— 旋转火炮
turnRadarLeft(), turnRadarRight() - 旋转雷达反射镜

当然,这并不是全部的API,但却是你创建第一个机器人所需的最重要的方法。到现在为止,我们仅仅讨论了你可以触发的动作而已。 我们还未讨论如何去发现你的机器人周围所发生的事。Robot类提供了多个事件,你可以利用这些事件来判断你的机器人是否用雷达扫描到了其它机器人,是否被击中,是否与另外一个机器人向撞以及是否与墙向撞等。你可以覆盖下列任一方法函数来为你的机器人提供事件处理函数。

onHitByBullet() —— 当你的机器人被击中时
onHitRobot() ——当你的机器人与其它机器人向撞时
onHitWall() —— 当你的机器人撞到墙上时
onScannedRobot() ——当用雷达扫描到其它机器人时

通过上面谈到的简单的事件和动作,可以编写出我们的第一个机器人。(可从Robocode附带的文档中获得完整的API。)


编写你的第一个机器人

准备好了吗?启动Robocode,调出Robot编辑器。(实际上,我并不使用Robocode自带的编辑器,这里用只是为了解释起来容易一些。)

要创建机器人,你可以选择File菜单的New Robot命令。这时,系统会要求你输入机器人的名称。你可以输入SimpleRobot并点击OK按钮。然后,你需要输入一个package名,Robocode建议使用
姓名的首字母缩写,不过我们在这里使用“newsletter”。之后,会打开一个包含新机器人初始代码的窗口。

花一点时间阅读一下这些自动生成的代码。 这个机器人并非世界上最聪明的机器人,但是它却对如何组装一个Robocode机器人作了很好的演示。

我们的机器人中定义的第一个方法是public void run()。这是机器人的心脏所在。游戏引擎最初启动之时将调用这个方法。一般,你可以用一个无穷的While循环来定义机器人的动作。

机器人SimpleRobot中的while循环做四件事情:

ahead(100); 向前移动100个象素
turnGunRight(360); 将火炮向右旋转360度
back(100); 向后移动100个象素
turnGunRight(360); 将火炮向右旋转360度

这些命令简单的说就是“向前移动100个象素并四周查看一番,再后退100象素,四周查看一番。然后,不断重复”。

注意我们从未明确执行一个雷达扫描动作。那是因为默认情况下,雷达反射镜与火炮一起移动,一直处于扫描状态中。所以,转动火炮可以实现雷达的扫描。 当雷达侦测到目标后,会调用我们的机器人中定义的第二个方法函数public void onSannedRobot(...)。

这个事件处理函数也不做什么事情。只执行“射击”动作。 由于雷达与火炮的方向始终保持一致,所以这个函数被调用时,我们应该正好瞄准了目标。

唯一的另一个方法是onHitByBullet事件处理函数。这个函数在我们被其它机器人击中时调用。代码的作用是旋转机器人与子弹来向成90度角,这样,当我们前后移动时,就可避开子弹第二次射来的方向。

保存并选择compile命令编译你的机器人。因为我们没有对代码做任何改动,所以应该不会有任何错误。


上一篇:关于Eclipse中UI程序的线程的讨论

下一篇:Java秘史:隐藏在SWT/Swing背后的故事
最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,请自觉遵守互联网相关政策法规。违者移交公安机关处理
用户名: 密码:
匿名?
注册
Sitemap Links Contcat us
© 2008 Javafans.Net 苏ICP备06044966号