用python来自动玩类似跳一跳的小游戏
最近春节,qq上出了一个叫穿越福城的小游戏。游戏的玩法类似挑一挑,也是通过一个个木桩。只不过把跳的过程变成了搭梯子。按的时间越长,梯子越长。梯子过长或者过短小企鹅都会掉下去,游戏失败。我的目的是用python来实现自动玩游戏。(主要原因是我手残。。没办法,只好另辟蹊径,技术开挂)。在刚开始构思的时候,我其实是觉得挺简单的一个小脚本就能搞定。但是在实际编码和测试的过程中,我越发觉得想要完成一个简陋版本,勉强能用的版本非常容易。但是想要做到稳定性好,准确率高实在是不容易。下面我就把我这两天的编码和完善过程记录下来。
先说说我的总体思路。通过adb的截图功能获得截图,然后根据获得的截图计算出应该按压多少毫秒,再通过adb shell input swipe来按压指定毫秒数。循环往复,理论上可以一直刷到无限分。
这里面的难点显然是在第二步,即怎样根据截图计算毫秒数呢?
那我们首先要思考毫秒数和什么变量有关,再从图片中提取或者计算出变量即可。梯子是按得时间越长就越长,所以可以认为按得时间t应该和木桩之间的距离成线性关系。那我们怎样从图片上计算起始木桩和目标木桩之间的距离呢?第一想法肯定是在图片中找到起始点x0,y0,再找到目的点x1,y1.计算这两个点的欧氏距离。但是玩这个游戏会发现,如果木桩之间的距离很长,游戏中会拉高视角。所以要想获得木桩之间的实际距离,不能光考虑像素之间的距离,还要考虑视角高度。视角越高,一个像素点代表的实际距离就越长。所以综上,时间和两个因素有关,一是像素距离,而是视角高度。
第一个因素像素距离,想要获取这个参数的关键在于怎样确定起点和终点。一个图片在计算机中就是一个矩阵,在矩阵中怎样找到起点和终点?这就需要明确起点和终点的特征。根据特征找到满足特征的像素,进而就可以找到起点和终点。从截图可以发现,起点的明显特征就是深色的小企鹅,在明艳的背景中,只有小企鹅是深色的。所以找图片中rgb均小于50的像素点,就可以定位小企鹅所在的位置。终点就更好确定了,每个木桩的中心都有一块红色菱形。这些红色菱形的rgb都是一样的。找这个rgb值就可以找到这些菱形,那么怎么知道哪个菱形是目标点呢?观察可知,在小企鹅上方的,且满足红色菱形的是目标点。找到了起点和终点,我们就可以算出来dis(distance)
第二个因素是视角高度。这个就比较抽象了,改用什么表示呢?视角高度不好直接计算,但是有办法体现出来。视角高度越高,相同面积的东西所占的像素数量就越少,也就是近大远小。而观察游戏可知,每个木桩上的红色菱形的面积是一定的。所以我们可以用目标点红色菱形的像素数(size)来表示视角高度。像素数越多,视角高度越低;像素数越少,视角高度越高。
现在找到了计算dis和size的方法,那么按压时间t怎么计算呢?首先设置一个参数a,用于调整系数。
t = a*dis/sqrt(size)
dis越大,显然按压时间应该越长。size越大,说明视角越低,显然按压时间应该越短。那么为什么size要开一个平方根呢?这是因为dis是一次的长度,而size是二次的面积。所以要开一个平方根,保证量纲一致。a由实验测得。经过实验我发现a=30左右的时候,程序运行良好,虽然做不到每次都非常精准,但是大部分时候都是可以通过的。
到这里为止,我的小程序已经基本可以大部分时候100+了。运气比较好的时候我还拿到了273分。但是在一次次测试中也暴露出了很多问题。接下来开始我的调试之路。
1、广告干扰
观察上图,本来我的起始点是根据颜色判断的。结果广告中也出现了相同的色彩,从颜色来确定起始点的路子走不通了,怎么办?那只好找其他特征。什么特征呢?那就是
1、企鹅是实心的
2、企鹅是近似圆形的
我之前都是用PIL的,现在不根据颜色了,就需要用更加高级和复杂的python-opencv了。先二值化,只保留深色部分,然后用findContours找边缘,然后筛选出满足条件的contour即可。这样一来找对起点的准确率就极高啦。
第二个问题:准确率不高。显然我建立的模型和游戏的内部逻辑还是有一定的差距。
怎么解决?从数学上来说,就是要确定一个二元函数time=f(dis,size).为了找到这个函数到底是啥,我首先得采集足够多的样本点。
采集了300个样本点后,绘制出dis-size函数,发现如下图所示
这说明和我原先想的不一样,这不是一个连续函数,而是一个离散的函数。(dis,size)一共只有十六中组合。
既然这样就好办了。先kmeans聚类,划分成16类,找到每一类的dis,size,time,作为table记录到程序中。每次获得一个dis和size,查找table,找到最先进的dis和size所对应的time,然后用adb按相应的time即可。
经过这么已改进,准确率极高。几乎每一次都是三分。当然其中的time参数由于是取得平均数,和真正的准确值还有一定的差距,在偶尔不是三分的情况下还要对time进行改进。
经过这些改进这个程序可以说已经基本可以跑了。我写了两个版本的代码,一个是aaa.py,这个是使用t=dis/sqrt(size)方法的;另一个是bbb.py,这个是使用table版本的。table版本的正确率更加高。
代码放在github上:https://github.com/blacksungrass/pythons/tree/master/qq%E6%96%B0%E5%B9%B4%E5%B0%8F%E6%B8%B8%E6%88%8F%E8%87%AA%E5%8A%A8%E5%8C%96
即使经过了改进,还是有一些问题,不过出现的次数很少
1、这个小企鹅有时候会跳起来转个圈,截图如果截取的是小企鹅挑起来的图会造成误判断
2、有时候游戏中的一些背景建筑,尤其是塔之类的,会把小企鹅挡住一小块,导致findContours函数无法将小企鹅识别为一个整体。
,
用python来自动玩类似跳一跳的小游戏的更多相关文章
- Python 帮你玩微信跳一跳 GitHub Python脚本
前言想自己搞游戏小程序的 在github 有人已经利用 python程序, 通过adb 获取不同型号安卓手机的系统截图,然后通过计算小人与目标位置距离之后得到准确的触摸时间,再通过 开发者模式里的 a ...
- 教你用.Net来玩微信跳一跳
目前开发的所有代码都已经上传到了GitHub.欢迎大家来Star https://github.com/GiantLiu/AutoJump 目前程序分为“全自动版本”和“半自动版本” 全自动版本 We ...
- 用python实现自动玩21点小游戏
1. 背景 前段时间发现一个论坛上(https://npupt.com/blackjack.php)有21点小游戏. 这个21点小游戏的规则是每个人开局都会获得随机点数,如果觉得点数小,可以继续摸牌. ...
- 用Python来玩微信跳一跳
微信2017年12月28日发布了新版本,在小程序里面有一个跳一跳小游戏,试着点一点玩了下.第二天刚好在一篇技术公众号中,看到有大神用Python代码计算出按压时间,向手机发送android adb命令 ...
- 利用Python玩微信跳一跳
创建python项目jump_weixin,新建python程序jump.py 需要4个辅助文件[adb.exe,AdbWinApi.dll,AdbWinUsbApi.dll,fastboot.exe ...
- Python程序,辅助微信跳一跳游戏介绍
一.思路介绍 1. 通过Python自动手机截屏,并保存到电脑 2. 通过PhotoShop测量要跳的距离 3. 通过Excel计算按压时间 4. 通过CMD命令控制手机按压时间 二.实现方法详解 1 ...
- 了解python,利用python来制作日常猜拳,猜价小游戏
初次接触python,便被它简洁优美的语言所吸引,正所谓人生苦短,python当歌.python之所以在最近几年越发的炽手可热,离不开它的一些特点: 1.易于学习:Python有相对较少的关键字,结构 ...
- python学习笔记(五) 200行实现2048小游戏
用前文提到的基础知识,和网上流行的2048源码,用python实现该游戏. 先将用户操作和游戏逻辑绑定. WASD分别对应移动方向上.左.下.右 然后实现矩阵的转置和逆置,这样只要实现一个方向的移动, ...
- 用 Python 编写剪刀、石头、布的小游戏(快速学习python语句)
import random#定义手势类型allList = ['石头','剪刀','布']#定义获胜的情况winList = [['石头','剪刀'],['剪刀','布'],['步','石头']]pr ...
随机推荐
- 使用walle部署laravel的时候问题记录
1.使用walle部署laravel的时候检出后执行composer update提示 [RuntimeException]The HOME or COMPOSER_HOME environment ...
- easyui combobox模糊搜索
combobox实现模糊搜索功能 <input class="easyui-combobox" id="hybq_PADD" name="hyb ...
- matplotlib图表组成元素
一.函数 1.plot() -- 展示变量的趋势与变化 用法: plt.plot(x,y,ls="-",lw=2,label="plot figure" ...
- 活代码LINQ——08
一.模块代码 ' Fig. 9.6: ListCollection.vb ' Generic List collection demonstration. Module ListCollection ...
- R语言预测实战(游浩麟)笔记1
预测流程 确定主题.指标.主体.精度.周期.用户.成本和数据七要素. 收集数据.内容划分.收集原则. 选择方法.主要方法有自相关分析.偏相关分析.频谱分析.趋势分析.聚类分析.关联分析.相关分析.互相 ...
- 详细介绍Ubuntu 16.04系统环境安装Docker CE容器的过程
由于项目的需要,我们在很多软件配置环境中需要用到Docker容器,这个时候我们可以用自己的VPS主机搭建.在这篇文章中,笔者将会利用Ubuntu 16.04系统环境安装Docker CE容器的过程.如 ...
- Python——字符串、文件操作,英文词频统计预处理
一.字符串操作: 解析身份证号:生日.性别.出生地等. 凯撒密码编码与解码 网址观察与批量生成 2.凯撒密码编码与解码 凯撒加密法的替换方法是通过排列明文和密文字母表,密文字母表示通过将明文字母表向左 ...
- CDN原理介绍(转)
内容分发网络(Content delivery network或Content distribution network,缩写:CDN)是指一种通过互联网互相连接的电脑网络系统,利用最靠近每位用户的服 ...
- Django中STATIC_URL、STATIC_ROOT、STATICFILES_DIRS 的区别关系
首先,我们配置静态文件,要在setting.py里面加入如下几行代码: settings.py # the settings above # STATIC SETTINGS STATIC_URL = ...
- 剑指offer用位运算实现两个数相加,及python相关的位操作
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 代码: # -*- coding:utf-8 -*-class Solution: def Add(self ...