Codingame Rift 归来

Rift,这是我既Pokerchips之后,参加的第二个codingame组织的比赛,淋漓尽致的释放了我对编程的热爱的同时,收获颇丰。

除了获得了,在1028名来自世界各地的参赛者中,名列前2%的成绩之外,这次参赛经历,首先使我对Scala有了更加实际的应用,加深了对这个语言的了解,也体会到了面相函数式编程在人工智能方面的优势。

其次,更加意识到,单元测试,特别是行为驱动开发(BDD),在软件开发中所发挥的巨大作用。再然后,就是大大培养了对人工智能游戏开发的兴趣,也慢慢开始开窍了。

最后,从学习方发方式来讲,更加深信不疑,一个好的学习习惯可以帮助一个人以最快的速度获取事物的本质和他们的内在联系,进而抓住解决问题的突破口。

Scala

从上一年接触了Scala之后,就一直想练练手。只是苦于一直没有找到能吸引我的项目。这次经历,通过实战运用,使我对这个语言有了更加深入的认识。

相对于Java来说,Scala有几个让我爱不释手的特点。

宣告式编程(Declarative programming)

宣告式编程,是一种编程方式。它给解释计算机想解决什么问题,而不是简单的给计算发送一条又一条的控制指令,告诉它如何解决问题。宣告式编程的最大好处,就是它帮助写一些没有副作用的优美函数,这对程序的确定性及可预见性有特别大的帮助。这个我可以另开一帖专门讨论。

不可变性 (Immutability)

不可变性,说的是一旦一个物体被创建了,他就不会再变了。这样做的好处是你把一个创建的对象,放在哪里,不管你把它给了谁,也不管你多长时间之后再来看它,它都会像你创建时的那样,纹丝不动。

简洁

Scala去除了一切不必要的冗繁的代码。我们可以把更多的精力放在问题本身,而不是语言本身。就像case class, type infer 等种种功能。


单元测试

有人说Codingame应该开发一个调试的功能,我觉得是完全没有必要的。反而是不应该受到鼓励的。正确的方法是写测试,写测试有很多好处,特别是在Codingame比赛的这个环境下,更应该写单元测试。

高效的反馈

为了验证程序设计的正确与否,很多人都是把它跑起来,然后看看结果对不对。这样以来,就大大延长了反馈的时间,比赛的长短先不说,从把代码粘贴过去,到跑起来,再到最后得到结果,也得花近一分钟的时间。而单元测试,则是实时的。特别是Scala的SBT工具,测试是持续在跑的,只要发现代码变化,测试就会重新跑一遍。

回归测试

单元测试的另外一个好处,就是有了它,你可以毫无后顾之忧的搞重构。重构是为了,优化代码的结构,使得它更灵活的朝更有利的方向发展,既不加新功能,也不能破坏已有的行为。不破坏已有的行为,是单元测试来保证的。

除了重构之外,无法避免的就要加新的行为,一个新的行为加入,是要保证回归测试的,不能拾个芝麻,留个西瓜。

不论是重构,还是要加新功能,我们关注的都是对已有行为的保护,所以这就要求测试要以测试行为为主。测试行为,不仅可以从行为的层面清晰的阐明问题的需求,又可以避免受到细节的变化对测试的影响。

具体结合Rift本身来讲,比赛进展到中程的时候,地图变了,游戏的策略也必须与时俱进。之前只关注1v1的竞赛着,之后就必须考虑1v2和1v3了。如此一来,就会有重构,有新行为的添加,但又得保证之前的1v1策略不受影响。测试就发挥的巨大的作用。


人工智能

两个比赛比完之后,我对人工智能产生了浓厚的兴趣。之前我之所以很痴迷于电脑游戏,是因为在游戏里我可以发挥我的创造性,自由的尝试我的各种想法。人工智能,有同样的魅力,并且有更大的空间去发挥想象力,去尝试和探索不同的策略,就像玩游戏一样。不同的是,人工智能的策略,不是玩出来的,是自己用手和大脑,一行一行,编出来的,就像你在开发一个机器人,机器人会完全服从你,执行你的想法。

同样,我想在写一篇文章来谈我对制定人工智能游戏策略的体会。


学习方式方法

这是我体会最为深刻的一点。又让我想起了之前的一些困惑,上大学的时候,我总是在问学那么多课,做那么多将来都用不上的光学试验,究竟是为了什么。现在我开始慢慢明白了,那是为了锻炼我们学习的方式方法,锻炼我门的观察能力,锻炼我门发现问题的能力,提高我门推断事物内部联系的能力,进而找到问题的关键点。

编好Rift这种多人人工智能对战游戏,就必须有这些能力。知己知彼,百战不怠。了解别人,要从观察它门的行为开始,之后要对他们的行为进行分析,进而推敲出来他们的战法和策略。好的策略,要学来自己用,不好的要抓住他们的弱点,一举拿下。

结语

收获和体会是多方面的,有很多都需要做更详细的解释。接下来,我会分享我在这个对战游戏里,所用的策略,以及如何更加高效的参加Codingame的比赛。最后,能顺利的参加完这个比赛,特别需要感谢小微的大力支持,小微,谢谢你。