假如您一直在关注 developerWorks 和 alphaWorks 的话,您会看到一个名为 Robocode 的小东西的巨大能量:Robocode 是一个比较上瘾的游戏,刚好可以用于 Java 编程教学。Mat Nelson 在过去 18 月内已经付出了一段宝贵的时间来开发 Robocode。起初是为了自己娱乐,后来就成了一份认真的工作,把他心爱的这个项目放到了 IBM alphaWorks 上。现在已经到了他收获的时候。Robocode 的成功用“爆炸性”来描述一点也不过分 — 而这才只是个开头。
早在 1995 年,也就是 Mat Nelson 开始在 IBM 做全职工作之前,他就开始使用 Java 语言了。随着这种语言的成熟,这个狂热的玩家看到了创建这个“他一直想玩”的游戏的机会。2000 年后期 Robocode 刚开始时只是个人的努力,2001 年 7 月以 alphaWorks 下载的形式带入 IBM 后就成了一种职业工作。在这个游戏(下载次数超过了 121,000 次)和它的创始人的名声渐大之际,我们请 developerWorks 的通讯记者 Dana Triplett 对 Mat 进行了一次采访,请他谈谈是什么激发了他创建 Robocode 的灵感,以及他对 Robocode 未来发展的看法。
developerWorks:Robocode 背后的中心思想是什么?
Nelson:Robocode 是一种有趣的竞赛性编程,而“有趣”在这里绝对是要害词。使用几行简单的代码,您就可以看着您的机器人在屏幕上四处奔驰,碾碎一切挡道的东西。在做这件事时,您将学习到一种解决目前真实问题的真实的语言。
dW:哪些游戏曾经是您最喜欢的,您最喜欢它们的哪些方面?
Nelson:Worms 的 Commodore 64 版(不要与目前同名的游戏混淆)是我看到的第一个游戏,它让我“教”一些东西在游戏中如何行动,然后看它们玩。我还非常喜欢战略和角色扮演游戏。这几年来令我上瘾的有哪些游戏?Civilization、Master of Orion、Sim City、Command and Conquer 系列、Warcraft/Starcraft 系列、Ultima 系列和 Diablo 系列。当然,我还玩过数百种其它的游戏,但我最喜欢的肯定是那些让我构建一样东西,然后在游戏环境中放开它,看它如何发展的游戏。
dW:这些游戏中有哪一个是您开始创建 Robocode 时的灵感来源吗?
Nelson:Worms,肯定是,其它的还有 C64 游戏 Mail Order Monsters。那些经典游戏中的其中一些非常棒。那时还没有图形,所以一切东西都必须可玩。那正是我正设法在 Robocode 中采用的方法:轻易开始,玩起来有趣,并且让人很上瘾。
然而 Robocode 的主要灵感来源于 Brad Schick 创建的一个名为 Robot Battle 的游戏(这个游戏本身的灵感来源于 Robot Wars 的 Apple 2 版)。我在 1995 年发现了 Robot Battle,并花费了无数的时间创建我自己的机器人“The Cleaner”。它实在是太有趣了。我看着其他人创建的机器人把它淘汰出局,然后设计了我自己的战略。那时主要的挑战是一类被称为 seesaw bot 的机器人,它们会往返移动,很难击中。 Cleaner 在试图击中它们时碰到了很多麻烦。我的解决办法?我用了一点三角知识来估算 seesaw 的角度,然后向那个角度猛烈开火。我一鼓作气完成了编写,然后开心地看着 Cleaner 3 爬上比赛排行榜。
dW:当您开始开发 Robocode 时,您心目中的观众是谁?
Nelson:开始时,只是我自己。Robocode 是我一直想玩的游戏,所以我写了它。
我希望即使您什么也不知道也可以玩 Robocode,而当您了解得更多时它可以与您一起成长。学起来简单,但很难精通,就象国际象棋。我把 API 设计得尽可能简单,并提供了几个样本机器人说明如何使用它。我希望任何人,从建筑师到中学生到动物园治理员,都能够让一个简单的机器人运行,并说“嗨,我写了一个 Java 程序!”。另一方面,高级用户很快意识到他们可以使用 Java 编程语言的整套功能,随心所欲地使用它为自己的机器人构建行为。
dW:现实生活中玩 Robocode 的人们让您感到过惊奇吗?
Nelson:最大的惊奇是成功本身。我很有把握人们会有爱好玩它,因为我 ...... 但我没想到有那么多人!现在的下载次数超过了 100,000,真让我大吃一惊。我一直能够很惊异(兴奋)地看到人们用不同的方式使用 Robocode,而社区也一直让我感到惊喜。
dW:Robocode 玩家建立了哪些具独创性的机器人示例?
Nelson:有很多种,包括猜测目标(不是直接向机器人开火,而是向机器人即将到达的地方开火)、跟踪和记录敌人的行为、多线程控制机器人的不同方面、即时(just-in-time)算法、躲避子弹、僵持、最优化的雷达跟踪 ......,还有很多很多。其中最优秀的机器人简直让人吃惊。我最近引入了一个全新型的战略,也就是组,所以我非常期待看到接下来还会有什么东西出现。
dW:您想为 Robocode 添加些什么功能?
Nelson:我想做的第一件事是把 API 重新构建为更简单、更面向对象、更具扩展性和更开放的 API。例如,我更希望看到 radar.setTurn() 而非 setTurnRadarRight()。一旦 Radar 成了一个对象,我们就可以拥有不同类型的 Radar:setRadar(new Radar(range,speed))。
作为 API 重设计的一部分,我预备解决两个突出的大问题:度数对弧度和单位圆数学(Unit circle math)。机器人将有一个单独的调用,该调用确定它们是想使用度数,还是使用弧度,而另一个调用在单位圆数学或罗盘数学(Compass math)间切换。单位圆数学用于 Java 中的所有三角方法,它的 0 度指向右,逆时针方向为正。而罗盘数学的 0 度指向上,顺时针为正。不同的程序员喜欢不同的东西,我希望在使 API 简单的同时支持它们中的全部。
另一个大问题是物理学问题。目前 Robocode 的物理学原理极其简单。为增加真实感,我预备引入力矢量。例如,加速度将会被空气阻力和滚动摩擦力抵消一部分,而不只受到“最大速率”的限制。根据摩擦力和半弹性碰撞原理,机器人撞到另一个机器人的一侧时会把它推到一边去。我以前对这些的试验使游戏比以前“酷”了许多。猛烈地撞向一个机器人并使其发出尖利的声音滑向一边,这是很有趣的。另外,前后加速将会更改;机器人向前移动时速度可以更快。
目前,撞击(Ramming)还未被充分利用,所以,我想引入机器人各部分不同的装甲力量 — 仍然是可配置的。击中机器人的一侧将会造成更大的伤害。
我还想在竞技场中引入墙和障碍物,以及不同外形的竞技场、这将产生许多全新的战略。
因为这些更改要引入一些复杂的编程,我计划使它更轻易扩充机器人。一个专家可以写一个查找墙四周路径的可重用的机器人类,而一个新手可以只使用它来快速创建一个不错的机器人(同时学习如何重用代码)。
dW:您认为将来 Robocode 会变成一个由 alphaWorks 主持的分布式游戏吗?
Nelson:现在我主要关心简单性;引入一定程度的复杂性却不能使游戏玩起来更有趣是没有必要的。Robocode 在分布式环境中会比现在更有趣吗(现在的 Robocode 只是一种单机游戏,可以从中下载其它的机器人)?我还不确信。我的确认为有一个空间可以容纳一个趣味无穷的分布式 Java 编程游戏...... 但我认为那就是一个新游戏,不是 Robocode。
dW:为什么您选择用 Java 编写 Robocode?
Nelson:当我在 1995 年发现 Java 时,我马上就被迷住了。它是一种简洁、优雅的语言。使用 Java 可以比用其它语言节省一半的时间,并且做出来的东西可以在完全不同的系统上运行。 例如,Robocode 可以在 Mac OS X 上运行,而我甚至从来没接触过 Mac。
目前,Java 速度很快,尽管许多人仍没有意识到这一点。计算机的处理速度正以惊人的速度增长,JVM 的速度比以前任何时候都快,Java 已经成熟了,我们甚至可以用硬件加速生成图形。Java 现在已经用于客户机了,我希望 Robocode 可以帮忙促进这一点。
dW:是什么使您想使用自己的编程技巧为程序员创建一个教育性游戏而不是创建只用于娱乐的浮华的游戏?
Nelson:没有任何东西。我的确只是为了好玩而编写了一个浮华的游戏。我们是后来才发现它的教学用途的。
在 25 年的玩游戏生涯中,我已经花费了无数的时间来学习如何玩游戏。我阅读手册、看帮助菜单、查阅游戏参考资料、还在 Web 上看技巧和提示。当然,与任何其它游戏一样,对 Robocode 也要做相同的事。但有一点很大的不同:手册是关于 Java 的。参考资料是 Javadoc。帮助菜单是 Java 教程。学习玩 Robocode 就是学习 Java,刚开始时我没有意识到这一点。
我希望担任编程入门课程的教授和教师能够发现 Robocode 是一种使学习变得很有趣的好方法,并推广 Java,使人们选择使用 Java。使用几篇教程(游戏内部和外部皆可),我相信我们可以使 Robocode 成为一个更好的自学工具。我将尝试用几个简单的任务来完成我们的游戏内教程(就象“完成这 10 个任务您就能够很好地理解 Java 一样”)。稍微利用些指导,任何人都可以成为 Java 程序员。
回头看一下,很明显;它当然是一个教育工具。但 Robocode 是从一个全新的角度达到了现在的程度。Robocode 是一个游戏。但在您学习玩 Robocode 时,哦,哇唔!您学会了 Java。我的确是把 Robocode 作为一个有趣的游戏而不是教育工具来写的,而且我还将继续以这种精神开发它。但假如您在得到乐趣的同时又学会了 Java,那就太妙了!