最终分数:821202
一、前言
在游戏开发者的角度来看这道题目的时候,我先想到的是上手打一打看看跟平常的俄罗斯方块有什么不同。结果发现不仅方块出现的顺序是一样的,而且感觉并不是通过随机得到的这一组序列。然后在F12里面看到了具体的规则和一些API,然后就想到可以把核心代码和game代码直接拷贝出来在本机运行,因为最后的答案只需要提交一个操作序列就可以。
二、搞起
虽然之前没写过JS,但是看过一点点基础的语法,下载个nodejs就开始了构建能在本地运行的一个js程序,但是我并没有去写UI相关的代码。所以游戏过程就变成了一个黑盒,但是可以从脑子里面去想它运行时的状态,官方给的js代码里面的API写的非常清晰,到开发结束没有什么卡点。
构建的思路是:因为这是一个游戏,所以游戏一般都是一个tick一个tick来运行的,所以我就在每一个tick中添加了处理下一步该怎么走的函数,当做代码来去玩这个游戏。在最后添加上一些分数和操作队列的输出,这样架构就完成了。
处理下一步该怎么走的函数:这个我是去网上找的一个搞俄罗斯方块的算法,并不是人工智能算法而是传统算法,名字叫:Pierre Dellacherie。然后稍微看了看发现这个算法主要是通过枚举出所有的下落情况,并给每一种情况赋予一个权值,挑选最高权值的下落状态。
在没有更改算法逻辑的基础之上跑了一下结果,发现虽然1w块都可以跑完,但是只有20w分,所以还是需要写一些策略来去跑这个代码,根据规则,一次性消的越多,加分越多,场上方块数越多,消行加分越多,所以根据这两个规则我修改了权值的构成。
增加权值构成:消行个数,获得分数,当前最高的块的高度,场上块的个数
三、调参
然后根据当前的状态来去使用不同的参数来跑算法,最终通过调整策略获得了还可以的分数。
策略就是类似于:如果最高行为15行一下就尽量不去消行,如果15行以上就去消行,那么这个思路还可以不断的细分下去,然后通过调整参数来达到一个较好的状态。
四、结语
整个过程还是很好玩的,希望以后还能有更多类似于这种的比赛,能够拓展一些眼界和一些在业务中不常见的代码思路。不过对于之前打ACM的我来说还是传统算法更拿手一些,倒是也想过用AI来跑,但是迫于时间问题还是没有选择用AI来完成这件事情。