今天看到一个特别有意思的东西,叫做CODE GAME,你可以通过Javascripe语言来给你的小坦克写AI,然后与其他人的AI坦克对战。

传统的游戏,都是人们来操作游戏元素,而这个游戏不同,你要写一套算法,用这套算法去控制你的坦克,游戏开始之后,你能做的就只是看着两台坦克对战,他们的灵活性,战斗力以至于『智能』都取决于你的算法。

这让我想到了多年前的『磁芯大战』,这是最古老的游戏,也是计算机病毒的前身,两个科学家互相用汇编语言编写能够破坏对方程序的程序,生存到最后即为胜者。今天我们鲜有人再有能力用汇编语言去编写程序了,但是CODEGAME却给了我们一种『创造』的可能。

CODEGAME的世界由一片由16×12的『格』组成,这些格子中有些是畅通无阻的大路,有些是子弹和坦克都无法穿越的石头,还有些是柔软而富有隐蔽性的草坪,坦克如果处在草坪中,就不会对对方发现。坦克可以发射子弹,也可以前进,还可以朝左或朝右转向。事实上,这几乎就是你能有的所有操作了。

这些操作都是由指令来构成的,比如

坦克前进:me.go()

坦克转向:me.turn(n) n=left or right

坦克发射子弹:me.fire()

这是我们能做的所有操作,但是我们还可以通过一些函数来感知自身或周围的情况,比如

己方坦克坐标:me.tank.position

己方坦克朝向:me.tank.direction

敌方坦克坐标:enemy.tank.position

敌方坦克朝向:enemy.tank。position

地图:game.map[x][y] x为横坐标,y为竖坐标,返回的是那一点是『石头』『草坪』还是什么都没有

星星坐标:star.position

我们的目的就是让我们的小坦克吃尽可能多的星星,或者消灭敌方坦克,同时注意不要被地方击中,在以上前提下,还要使算法尽可能高效。

这个上手非常容易,官方的指南中的代码直接贴上去,就得到了一个可以转向可以发射子弹的坦克,但是如果你希望你的坦克更加聪明一些,那就需要自己动手了。

我首先给我的坦克加上了探路系统,这个系统的算法由一系列语句实现,它可以让我的坦克在遇到障碍物之前就及时转向,并且能够在死胡同里面很快的走出来:

 

紧接着我又编写了攻击系统,这个系统能让我追踪并在合适的时候发射子弹。

这两个系统基本上保证了我的小坦克初具威严了,它可以边走边射什么的。但是作为一台聪明的坦克,它还应该有找星星的算法,因为尽可能多的吃星星也是获胜条件之一,于是我写了找星星算法

找星星是优先级不太高的,当能打敌人的时候是冲敌人去的,但是如果没事,坦克还会去找找星星。到这基本上就差不多了,但是我注意到在对战中我还是经常被别人的坦克击中,于是我又加了闪避系统,使得我的小坦克在发现敌人的子弹的时候能快速逃离,这样又增加了一些胜算。

至此,一个『聪明』的小坦克就诞生了,这个坦克会主动发现敌人,然后转到正确的方向开炮,遇到对方的子弹还会躲闪,同时它会在整个地图寻找星星,虽然我为它写了所有AI,但是我还是赞叹它的灵活和智慧,简单的『左转』『前进』『右转』『射击』结合对状态的感知,居然会让死物变得灵活。这种灵活并非『控制』的灵活,而是不受控制的灵活。你不能操作你的坦克,你只能看着它走来走去。

这真是人工智能的乐趣。

生命和智慧有时候并非我们想象的那么复杂,也许它们更像是一种由简单演变而来的精巧,生物的每个基因都并不复杂,可是却组合成了叹为观止的生命体系。而程序中的简单指令可以在某种程度上还原这种精巧。

我的坦克虽然有六百行代码,可是在很多方面还是做的不够,比如对障碍物的高级判断,预先计算敌方坦克路线来发射子弹等等,这些都是可以完善的。值得一提的是,这并非『程序员』的游戏,它所需要的编程知识非常少,官方的文档可以让所有人在十分钟内入门,而这些也就足够了。这个游戏更需要的是对行为的思考和对算法的考虑。我认为它适合每个极客,每个对人工智能,计算机与生物感兴趣的人。

如果你编写了你的小坦克,欢迎你挑战我,我的用户名是wdkwdkwdk,在对手用户名那里填写我的名字,即可与我的坦克对战~


我的微信公众号~