1.比赛总结
七月底的时候在网络上看到了这样一个赛事,赛题大概总结起来就是用代码玩一款十分经典的游戏俄罗斯方块,通过游戏得分来排名评比,觉得挺有意思,抱着随便试试的想法就参加了,结果最后获得了全国第49名,最终获得的最高分数是31万多一点,虽然和第一名的一百多万还是有不小的差距,需要改进反省的地方还有很多,但这一成绩还是基本达到了我的预期的,同时我也是成功获得了腾讯招聘的绿色通道,丰富了自己的履历。
2.比赛复盘
在赛事官网可以找到俄罗斯方块游戏的比赛入口,进入游戏之后可以发现游戏的界面是一下这样的:
光看这个游戏界面,这就是一个普通的俄罗斯方块游戏,但其实玄机藏在浏览器的控制台中,打开浏览器的控制台,很容易就可以找到这个游戏的源码,因为腾讯官方在控制台的代码资源中用注释告诉你了源码的网址。我们将整个游戏项目拉到本地之后,就可以“魔改代码”,大展身手了。
在本地用IDE打开这个游戏项目,可以看到游戏使用JavaScript写的,而且是基于vue.js框架。虽然我的“主战场”是后端Java Web,但对前端JS还是比较熟悉的,特别是vue框架,“魔改代码”基本上还是绰绰有余的,所以我选择了直接在源码上进行代码添加,实现用算法跑俄罗斯方块。
经过上网查询俄罗斯方块算法相关资料后,我了解到目前的主流俄罗斯方块AI算法是基于A*算法的启发式搜索。基本思路就是定义一个启发函数对当前局面进行评估,对于每一个当前即将下落的方块,遍历方块下落的所有情况——以各个形状在所有位置下落的情况,对于每一种情况,通过启发函数算出局面评估的评分,在所有情况中,评分最高的就是当前最优的下落情况,然后将当前方块旋转到该最优情况所对应的形状,再移动到对应最佳位置,下落即可。
我的算法思路基本上就是以上所阐释