在技术主导的比赛中靠着手打拿了奖,被要求写笔记,感觉自己弱爆了
参与这个比赛的时候,最初的想法也是想依靠算法去实现的,毕竟手打得无论多好,最优解肯定得依靠算法实现,但是由于种种原因(比如大学被ACM折磨过一段时间之类的...)不想写算法,就以最单纯的玩家心态去解决这个问题了。
玩家的游戏水平肯定是有所差异的,包括这个游戏,想要在8天之内成为高手也是不太现实的。但是方法总比困难多,玩家群体中有一种神奇的游戏攻略方法,让玩家只要付出足够的耐心,就能在游戏中做出各种高手都做不出的操作——TAS。
TAS,全称Tool-Assisted Speedrun,即“工具辅助竞速”,亦称Tool-Assisted Superplay。简称为TA(工具辅助)。是指以完全不变动游戏本体为前提,利用模拟器的辅助功能,以极高的精度完成游戏的一种游戏方式。早期TAS视频以通关竞速类为主,随着TAS创作范畴的扩大,S也采用为了superplay的缩写。(摘自百度百科,如果有兴趣可以看看B站上各种游戏TAS视频)
从规则上看,这个游戏非常适合TAS,原因有如下两点:
1、游戏序列固定,规则开源。因为存在固定的随机数种子和随机数算法,可以轻松地使用其他工具复现出整个方块序列,又因为规则开源,实现起来可以基本照搬代码。一般来说TAS需要类似模拟器和SL大法作为基础,而这两个特性相当可以使用极低的成本快速开发一款SL模拟器,TAS的实现成为了可能。
2、分数提交只需提交序列。既然只提交序列,就说明时间这个因素被完全忽略了,这意味着开发TAS工具更加简单,不用写任何定时器,同时由于时间影响不存在,玩家无需被快速下落的方块打乱心思,可以让方块落在任何合法的地方,不满意随时撤销,然后生成相应的序列代码即可。
因此,经过TAS处理后,这个游戏通关的门槛只剩下了两个因素——耐心和时间。
工具的开发
好在之前开发过俄罗斯方块游戏,这次开发节省了非常多的时间。因为是个人使用,开发效率优先,不需要多么漂亮,所以使用了C 和Qt进行快速开发。
图中的网格和方块都是简单画出来的
由于用的不是JS,无法照搬原版代码,因此实际上是根据规则自己重新实现了一遍。但是由于是本地实现,我可以开发额外的辅助功能,主要由如下几点:
1、未来方块提示。在web版中,只显示出未来的一个方块(那么多S和Z方块,预测一个怎么够用啊)显示出未来的8个方块,可以提前进行贪心部署。
2、方块预测。这个游戏的方块序列是一言难尽的,因此绝对有必要为下一次各种方块的来临(以及长期不来临)做出准备。
3、方块数量统计和分数预测。因为目标是10000个方块,玩家拥有自己的“效率”,因此使用当前得分除以方块数量可以大致估算出效率,方便实时调整路径,以及探索更优的摆放方法。
4、键位修改。这个没什么好说的,但是合适的键位可以提高玩家的操作效率。
游戏过程
不得不说,游戏过程是很.....不太好的。虽然有一两百小时的《噗哟噗哟俄罗斯方块》的游戏经验,但是由于S和Z的方块比例过大,加上没有Hold机制救命,整个过程可以看做是人为的DFS。
整个游戏采用的技巧期初是右边留空(空一列用I或L方块消除,空两列用S或O方块消除),但是并不是很理想,有时候想要的方块迟迟不来,导致没办法无缝拼接,最后用完所有方块打到了86w的分数(然后马上被超过了)。但是也留下了很多经验,比如适当的留几行一列和几行两列可以增加未来方块的可控性,T方块可以让阶梯和平地互相转换等。
后来根据统计发现,Z方块的数量比S方块要多,因此换成左边留空的策略,在监视效率系数的情况下,加上第一次玩的经验,打到了112w分。(实际上效率有一段时间达到了116w分,但是由于保证效率需要耗费大量的精力,因此选择了降低一些分数快点打完)。
总结
手打毕竟是手打,拿到最优路径肯定要靠算法(其实就是菜....)。总的来说,看到最后的排名还是挺有成就感的,努力也没有白费,还是挺好的。