在繁忙的中世纪征服间隙,我找到了 CodeRuler 的创作者 Tim deBoer,向他提问了几个问题。Tim 工作于 IBM WebSphere Tools 小组。
developerWorks:为什么创作 CodeRuler?
deBoer:我总是喜欢玩计算机游戏,作为一名程序员,我喜欢尽可能多地创作游戏。
dW:CodeRuler 是一个正式项目吗?开发小组规模有多大?
deBoer:CodeRuler 是专门为 ACM-ICPC 开发的,并且是在数年中对 ACM-ICPC 系统小组的思想进行提炼的结果。特别是,John Clevenger (共同设计者)和 Sam Ashoo 给予了很大帮助。
CodeRuler 是由一个非常小的小组设计和部署的,为的是使它成为一个意外惊喜。从这个小组到世界上 200 多位最聪明的计算机科学学生会有很大的压力,这还是很保守的说法。即使经过数小时对游戏、API 和文档的完善,我们仍然会接到没有想到过的问题,人们会用我们没有预料到的方法玩这个游戏。
dW:除了ACM-ICPC,CodeRuler 还举办过什么锦标赛或者竞赛?
deBoer:有几个比赛使用了 CodeRuler,包括在圣地亚哥的加利福尼亚大学的编程大赛和美国计算机奥林匹克大会。我们希望 Java 团体的玩家和教师继续使用它,我期待着看到更棒的 CodeRuler。
dW:请介绍 CodeRuler 背后的一些设计思想。
deBoer:这个游戏设计为单有一个好的战略不足以取胜。它需要以协调和精心设计的方法综合使用农民、骑士、甚至是城堡。在大多数情况下,取胜的小组为他们的农民和骑士设计了不同的战略,并设法使他们的实现不会相互干扰、使他们的工作不会重复。例如,一个占据土地的农民的简单实现可以使农民多次经过其他农民的路径而不是占据新的土地。并且不要忘记小的细节,如让农民避开敌对的骑士以免被俘获!
dW:您是否鼓励后来出现的未料到的创新战略?
deBoer:在 ACM-ICPC Java Challenge 中的 68 个小组中,来自卡尔加里大学的取胜的 Leilu Tarawa 小组使用了最原创的解决方案。
每一个小组都在其骑士赢得对农民、骑士和城堡的战斗时得到分数。当他们认识到城堡不会战斗或者逃跑,也不能摧毁时,它们就成了“可更新的”分数来源。他们的战略是让其他小组征服他们的城堡,然后自己征服它夺回城堡。他们会在建立自己的军队和赢得其他战斗时有所损失,但是使用这种技术他们会在每次比赛中获得大量分数。 这也使征服他们的城堡的其他小组获得大量分数。但是多场比赛平均下来,只要有多个小组试图征服这个城堡,他们就可维持领先地位。
dW:我们的一些高级读者对 CodeRuler 背后的模拟引擎感兴趣。您是否可以对这一技术作一些介绍?
deBoer:CodeRuler 模拟引擎基于 CodeRally 中使用的同样引擎。它使模拟可以在几种不同的模式下运行——与开发 UI 同时显示模拟、或者运行一个锦标赛并将它保存到磁盘中以便以后回放。它还有几种模式用于运行测试锦标用以在竞争者的计算机中进行调试、从提交者中进行随机比赛的观众显示和完整的锦标赛,它有多场比赛和回合以决定胜利者。
模拟器是基于状态的游戏:它依次调用每个小组以确定它们下一次的移动。然后它通过遍历游戏中的每一个“角色”计算下一步的状态并依次移动他们,然后在屏幕上显示结果。
dW:在 CodeRuler 的设计中,您是如何保证游戏的公平的呢?
deBoer:CodeRuler 可以让多个小组在实时竞赛中彼此对抗。为了保证引擎的安全,需要保证几件事:
- 每一个小组都不能直接访问或者影响其他小组的代码。(所有交互都通过游戏引擎。)
- 其他小组的代码拷贝到本地计算机中进行测试的时候,它应当是加密的,这样本地小组就没有机会利用源代码或者编译的代码。
- 某个小组编写的不好的代码不应当导致游戏的崩溃。
- 每个小组使用的 CPU 时间都不应当多于其他小组。
用 Java 编写游戏在这里是有一个很大的好处,因为 Java 语言天然支持其中许多要求。使用了 Java 语言的以下部分:
- Java 语言支持让每个小组的代码在其自己的名称空间中,这样它就不会被其他小组直接访问。通过 CodeRuler API 传递引用时,小组总是通过代码到达其他小组而不是直接引用。
- 当其他小组的代码拷贝到本地计算机中时,它已经是加密过的。创建了一个特殊的 ClassLoader,它从加密的文件中直接装载类并在内存中运行它们,这样就不会看到解密的代码。
- 因为我们提供了自己的 SecurityManager,所以每一个小组都不能创线程、终止游戏等。
- 同时运行所有小组可能会使一个小组占据 CPU,如果他们有一个使游戏停顿的无限循环让,则让他们运行主线程可能是危险的。为了解决这个问题,创建了一个线程以依次启动每一个小组的代码,主线程监视这些线程并在其超过了设置的超时时间后停止它。
dW:对于正在参与的 CodeRuler 有什么话说么?
deBoer:让最好的代码取胜!
回到文章。
|