marshel的专栏

首页博文目录订阅
正 文

【技术贴】报告老板:双十一的凌晨,我玩了一晚上最强连一连!

(2018-11-15 13:53)

11月10号晚上,窗外一片万人空巷的诡异气氛,网络上却暗流涌动,我知道即将要发生的事情。在这个温柔的良夜,作为一名没钱又舍不得卖肾剁手的双十一编外人员,我此刻只想赶在0点领居们撑爆小区路由器之前看完上期落下的《蒙面唱将猜什么猜》,还有,喝完手边这瓶肥宅快乐水。



然而微信群突然发来一条微信小游戏挑战消息打破了寂静:



打开之后发现游戏规则还蛮简单,从给定的一点开始走线不交叉一笔画填满所有灰色的方块就可以了,就像这样:



毕竟哥也是画过PCB的人,这样在一个平面上走线的问题难倒我的,于是乎洋洋洒洒就过了300关,轻而易举称霸了好友排行:



玩了300关甚至都不需要提示,我果然是玩这个游戏的天选之子,那么世界排行里也应该有我一席之地了吧?打开一看,现实打脸总是猝不及防,这个最强连一连的世界主流意识形态大概是空虚寂寞冷,我能玩300关是因为我的耐心只能支持我玩300关,而他们能玩3527关是因为他们的空虚程度远在我之上,然而游戏却只有3527关。



于是我陷入了小小的道德困境:我知道这个游戏的通用解法,却没有心力玩下去,如果写一个自动程序来实施我的解法,这样算自动化还是算作弊?


开发自(zuo)动(bi)化游戏程序是不对的,然而这是一个炫技的好机会呢!老板动员我们要提高自动化水平的话语又在耳边响起,而对于PC和手机之间的互操作是我司自动化业务中的重要一环,所以这个程序也算是练习对吧?


所以我不是为了作弊也不是为了炫技,是为了 提高工作效率 啊!!



诗人狄兰·托马斯劝诫我们,不要温柔地走进这个双十一良夜,于是,我就选择出来搞!事!!情!!!





首先把图形题面抽象成代码易处理的格式,即用0、1、2、3表示几种状态的方块,然后用二维列表表示方块的相对位置,像这样:



接下来,要有一个用来评估局面的函数,即评估当前局面是普通局面、死局还是已完成:


事儿就这样成了!


然后开始写解算函数,先写出第一步的走法,即尝试从当前位置(起始点)依次尝试向上下左右一步,若出现死局,则换个方向,若没有出现死局,则调用这个解算函数本身,直到局面变为完成或者尝试了所有可能证明了不可完成之后逐层退出,这种方法叫递归。


至此程序的核心算法写完了,接下来要解决输入输出问题。于是我们要用到Android调试桥,也就是adb,以及万能的python


Adb是谷歌发布的命令行程序,可以通过USB或者WiFi实现上位机对Android设备的控制和调试。另一方面通过Python的os.system()函数,可以直接实现windows命令行键入命令的效果,所以该函数可以用来调用adb程序,比如以下几条命令把游戏截图抓取到工作目录:



使用python的图片处理模块matplotlib.image分析图片,通过方块的颜色提取题面和坐标信息,用解算函数算出路径,输出用adb shell input命令模拟点击屏幕进行游戏操作。


虽然最终完成了游戏,但是由于对解算过程中的尝试步骤也进行了实时操作,导致耗费太多时间,可以去掉过程,直接输出结算结果,这样就快多了!


最后还是用adb shell input命令模拟点击屏幕用来关闭广告和点击下一关按钮,实现全自动化:


用比例而不是绝对坐标可以使程序兼容不同分辨率的手机,至此,最强连一连变成最省心连一连,通关指日可待。


原码下载:

pan.baidu.com/s/1SF0fHEG21Ufy3rUkNncDeA

本文重在技术交流而不是作弊,以上代码请读者自行斟酌,谨慎使用。



最后是毫无痕迹的广告植入



艾为电子射频FAE团队

为客户提供

高效的FM灵敏度自动化测试支持

欢迎客户莅临指导


评 论
还没有网友评论,欢迎您第一个评论!
博 主
进入marshel的首页
博客名称:艾为之家
日志总数:902
评论数量:2790
访问次数:2070257
建立时间:2009-2-3 13:15
导 航
公 告
You win, we win, all win! 客户需求是艾为存在的唯一理由! 新浪围脖:http://t.sina.com.cn/awinic 有空来看看
评 论